__kwargs is ok

This commit is contained in:
pikastech 2022-08-31 00:15:23 +08:00
parent b569c4dc2e
commit 3b9f0112ed
7 changed files with 21 additions and 13 deletions

View File

@ -59,7 +59,9 @@ void PikaStdData_Dict___del__(PikaObj* self) {
PikaDict* dict = obj_getPtr(self, "dict");
PikaDict* keys = obj_getPtr(self, "_keys");
dict_deinit(dict);
dict_deinit(keys);
if (NULL != keys) {
dict_deinit(keys);
}
}
void PikaStdData_dict_keys___init__(PikaObj* self, PikaObj* dict) {

View File

@ -11,7 +11,7 @@
"program": "${workspaceFolder}/build/test/pikascript_test",
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
"args": [
"--gtest_filter=vm.keyword_2"
// "--gtest_filter=vm.keyword_2"
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",

View File

@ -59,7 +59,9 @@ void PikaStdData_Dict___del__(PikaObj* self) {
PikaDict* dict = obj_getPtr(self, "dict");
PikaDict* keys = obj_getPtr(self, "_keys");
dict_deinit(dict);
dict_deinit(keys);
if (NULL != keys) {
dict_deinit(keys);
}
}
void PikaStdData_dict_keys___init__(PikaObj* self, PikaObj* dict) {

View File

@ -1214,7 +1214,7 @@ TEST(VM, issue_I5OJQB) {
TEST(vm, keyword_2) {
char* line =
"def test(a, b):\n"
" print(a, b)\n"
" print(__kwargs['a'], __kwargs['b'])\n"
"test(a=1, b= 2)";
PikaObj* self = newRootObj("root", New_PikaStdLib_SysObj);
obj_run(self, line);

View File

@ -485,14 +485,6 @@ static Arg* VM_instruction_handler_GER(PikaObj* self,
return err_arg;
}
static int32_t __foreach_handler_deinitTuple(Arg* argEach, Args* context) {
if (arg_getType(argEach) == ARG_TYPE_TUPLE) {
PikaTuple* tuple = arg_getPtr(argEach);
tuple_deinit(tuple);
}
return PIKA_RES_OK;
}
Arg* _obj_runMethodArgWithState(PikaObj* self,
PikaObj* method_args_obj,
Arg* method_arg,
@ -542,7 +534,6 @@ Arg* _obj_runMethodArgWithState(PikaObj* self,
return_arg = arg_copy_noalloc(
args_getArg(method_args_obj->list, (char*)"return"), ret_arg_reg);
}
args_foreach(method_args_obj->list, __foreach_handler_deinitTuple, NULL);
return return_arg;
}
@ -719,6 +710,17 @@ static int VMState_loadArgsFromMethodArg(VMState* vm,
tuple_obj);
}
if (dict != NULL) {
if (NULL == keyword_dict_name) {
keyword_dict_name = "__kwargs";
}
/* load keyword dict */
PikaObj* New_PikaStdData_Dict(Args * args);
PikaObj* dict_obj = newNormalObj(New_PikaStdData_Dict);
obj_setPtr(dict_obj, "dict", dict);
args_setPtrWithType(args, keyword_dict_name, ARG_TYPE_OBJECT, dict_obj);
}
/* load 'self' as the first arg when call object method */
if (method_type == ARG_TYPE_METHOD_OBJECT) {
Arg* call_arg = arg_setRef(NULL, "self", method_host_obj);

View File

@ -34,6 +34,7 @@
#include "dataStrs.h"
void args_deinit(Args* self) {
pika_assert(self != NULL);
link_deinit(self);
}

View File

@ -41,6 +41,7 @@ void __link_deinit_pyload(Link* self) {
}
void link_deinit(Link* self) {
pika_assert(self != NULL);
__link_deinit_pyload(self);
pikaFree(self, sizeof(Link));
}