mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-22 12:30:19 +00:00
...
This commit is contained in:
parent
aa3be3b63d
commit
7215f48007
@ -137,7 +137,7 @@ FrameResult VM__run_top_frame(VM* self) {
|
||||
Function__ctor(ud, decl, &frame->module);
|
||||
if(decl->nested) {
|
||||
ud->closure = FastLocals__to_namedict(frame->locals, frame->locals_co);
|
||||
py_Name name = py_namev(c11_string__sv(decl->code.name));
|
||||
py_Name name = py_name(decl->code.name->data);
|
||||
// capture itself to allow recursion
|
||||
NameDict__set(ud->closure, name, *SP());
|
||||
}
|
||||
|
@ -382,9 +382,35 @@ py_TValue pk_builtins__register() {
|
||||
return *builtins;
|
||||
}
|
||||
|
||||
static bool function__closure__getter(int argc, py_Ref argv) {
|
||||
PY_CHECK_ARGC(1);
|
||||
Function* ud = py_touserdata(argv);
|
||||
if(!ud->closure) {
|
||||
py_newnone(py_retval());
|
||||
return true;
|
||||
}
|
||||
py_Ref r0 = py_pushtmp();
|
||||
py_Ref retval = py_pushtmp();
|
||||
py_newdict(retval);
|
||||
c11__foreach(NameDict_KV, ud->closure, it) {
|
||||
// printf("%s -> %s\n", py_name2str(it->key), py_tpname(it->value.type));
|
||||
py_newstr(r0, py_name2str(it->key));
|
||||
py_dict__setitem(retval, r0, &it->value);
|
||||
if(py_checkexc()) {
|
||||
py_shrink(2);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
py_assign(py_retval(), retval);
|
||||
py_shrink(2);
|
||||
return true;
|
||||
}
|
||||
|
||||
py_Type pk_function__register() {
|
||||
py_Type type =
|
||||
pk_newtype("function", tp_object, NULL, (void (*)(void*))Function__dtor, false, true);
|
||||
|
||||
py_bindproperty(type, "__closure__", function__closure__getter, NULL);
|
||||
return type;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user