mirror of
https://github.com/pocketpy/pocketpy
synced 2026-05-06 18:23:38 +00:00
44 lines
1.2 KiB
C
44 lines
1.2 KiB
C
#include "pocketpy/interpreter/frame.h"
|
|
#include "pocketpy/interpreter/vm.h"
|
|
|
|
const char* py_Frame_sourceloc(py_Frame* self, int* lineno) {
|
|
SourceLocation loc = Frame__source_location(self);
|
|
*lineno = loc.lineno;
|
|
return loc.src->filename->data;
|
|
}
|
|
|
|
void py_Frame_newglobals(py_Frame* frame, py_OutRef out) {
|
|
if(!frame) {
|
|
pk_mappingproxy__namedict(out, pk_current_vm->main);
|
|
return;
|
|
}
|
|
if(frame->globals->type == tp_module) {
|
|
pk_mappingproxy__namedict(out, frame->globals);
|
|
} else {
|
|
*out = *frame->globals; // dict
|
|
}
|
|
}
|
|
|
|
void py_Frame_newlocals(py_Frame* frame, py_OutRef out) {
|
|
if(!frame) {
|
|
py_newdict(out);
|
|
return;
|
|
}
|
|
if(frame->is_locals_special) {
|
|
switch(frame->locals->type) {
|
|
case tp_locals: frame = frame->locals->_ptr; break;
|
|
case tp_dict: *out = *frame->locals; return;
|
|
case tp_nil: py_newdict(out); return;
|
|
default: c11__unreachable();
|
|
}
|
|
}
|
|
FastLocals__to_dict(frame->locals, frame->co);
|
|
py_assign(out, py_retval());
|
|
}
|
|
|
|
py_StackRef py_Frame_function(py_Frame* self) {
|
|
if(self->is_locals_special) return NULL;
|
|
assert(self->p0->type == tp_function);
|
|
return self->p0;
|
|
}
|