From 7215f48007dcc56d75b80e289db2538e0fd3718f Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Mon, 5 Aug 2024 13:40:23 +0800 Subject: [PATCH] ... --- src/interpreter/ceval.c | 2 +- src/public/modules.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/interpreter/ceval.c b/src/interpreter/ceval.c index a53c1692..4d7bb989 100644 --- a/src/interpreter/ceval.c +++ b/src/interpreter/ceval.c @@ -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()); } diff --git a/src/public/modules.c b/src/public/modules.c index 5d50a846..45d6ab08 100644 --- a/src/public/modules.c +++ b/src/public/modules.c @@ -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; }