diff --git a/port/linux/.vscode/launch.json b/port/linux/.vscode/launch.json index 731de052d..3a92acf72 100644 --- a/port/linux/.vscode/launch.json +++ b/port/linux/.vscode/launch.json @@ -18,9 +18,10 @@ // "--gtest_filter=packtool.packread" // "--gtest_filter=thread.test1" // "--gtest_filter=eventloop.test1" - "--gtest_filter=parser.tuple_single" + // "--gtest_filter=parser.tuple_single" // "--gtest_filter=parser.*" // "--gtest_filter=parser.page_add" + "--gtest_filter=builtin.fn_default1" ], "stopAtEntry": false, "cwd": "${workspaceFolder}", diff --git a/src/PikaVM.c b/src/PikaVM.c index 53bccce63..53f40d3e9 100644 --- a/src/PikaVM.c +++ b/src/PikaVM.c @@ -1124,51 +1124,52 @@ Arg* obj_runMethodArg(PikaObj* self, } static char* _kw_pos_to_default_all(FunctionArgsInfo* f, - char* arg_name, + char* sArgName, int* argc, Arg* argv[], - Arg* call_arg) { + Arg* aCall) { #if PIKA_NANO_ENABLE return arg_name; #endif - int n_default_skip = 0; - int n_default_skiped = 0; + int iDefaultSkip = 0; + int iDefaultSkiped = 0; if (f->i_arg == f->n_arg) { - n_default_skip = f->n_default - f->n_arg; + iDefaultSkip = f->n_default - f->n_arg + f->n_positional; } - while (strIsContain(arg_name, '=')) { - strPopLastToken(arg_name, '='); - Arg* kw_arg = NULL; + while (strIsContain(sArgName, '=')) { + strPopLastToken(sArgName, '='); + Arg* aKeyword = NULL; /* load default arg from kws */ if (f->kw != NULL) { - kw_arg = pikaDict_getArg(f->kw, arg_name); - if (kw_arg != NULL) { - Arg* arg_new = arg_copy(kw_arg); - argv[(*argc)++] = arg_new; - pikaDict_removeArg(f->kw, kw_arg); + aKeyword = pikaDict_getArg(f->kw, sArgName); + if (aKeyword != NULL) { + Arg* aNew = arg_copy(aKeyword); + argv[(*argc)++] = aNew; + pikaDict_removeArg(f->kw, aKeyword); + goto __next; } } - if (f->kw == NULL || kw_arg == NULL) { - /* can not load defalut from kw */ - if (NULL != call_arg && f->is_default) { - /* load pos to default with right order */ - if (n_default_skiped < n_default_skip) { - n_default_skiped++; - arg_name = strPopLastToken(f->type_list, ','); - continue; - } - /* load default from pos */ - if (f->i_arg > f->n_positional) { - arg_setNameHash(call_arg, - hash_time33EndWith(arg_name, ':')); - argv[(*argc)++] = call_arg; - return (char*)1; - } + + /* load default arg from pos */ + if (NULL != aCall && f->is_default) { + /* load pos to default with right order */ + if (iDefaultSkiped < iDefaultSkip) { + iDefaultSkiped++; + sArgName = strPopLastToken(f->type_list, ','); + continue; + } + /* load default from pos */ + if (f->i_arg > f->n_positional) { + arg_setNameHash(aCall, hash_time33EndWith(sArgName, ':')); + argv[(*argc)++] = aCall; + return (char*)1; } } - arg_name = strPopLastToken(f->type_list, ','); + + __next: + sArgName = strPopLastToken(f->type_list, ','); } - return arg_name; + return sArgName; } static int _kw_to_pos_one(FunctionArgsInfo* f, diff --git a/test/builtin-test.cpp b/test/builtin-test.cpp index 3520a69d7..d4078e34d 100644 --- a/test/builtin-test.cpp +++ b/test/builtin-test.cpp @@ -188,9 +188,14 @@ TEST(builtin, int_extern) { EXPECT_EQ(pikaMemNow(), 0); } -TEST_RUN_SINGLE_FILE_PASS(builtin, list_tuple_equ, "test/python/builtin/list_tuple_equ.py") +TEST_RUN_SINGLE_FILE_PASS(builtin, + list_tuple_equ, + "test/python/builtin/list_tuple_equ.py") + +TEST_RUN_SINGLE_FILE_PASS(builtin, + fn_default1, + "test/python/builtin/fn_default1.py") #endif - TEST_END \ No newline at end of file diff --git a/test/python/builtin/fn_default1.py b/test/python/builtin/fn_default1.py new file mode 100644 index 000000000..c325cfd54 --- /dev/null +++ b/test/python/builtin/fn_default1.py @@ -0,0 +1,45 @@ + +class Test: + def test_default(self, + dev: str, + baudrate=115200, + bytesize=8, + parity='N', + stopbits=1, + xonxoff=0 + ): + return dev, baudrate, bytesize, parity, stopbits, xonxoff + + +def test_default( + dev: str, + baudrate=115200, + bytesize=8, + parity='N', + stopbits=1, + xonxoff=0 +): + return dev, baudrate, bytesize, parity, stopbits, xonxoff + + +dev, baudrate, bytesize, parity, stopbits, xonxoff = test_default( + 'uart3', 9600) + +assert dev == 'uart3' +assert baudrate == 9600 +assert bytesize == 8 +assert parity == 'N' +assert stopbits == 1 +assert xonxoff == 0 + +test = Test() +dev, baudrate, bytesize, parity, stopbits, xonxoff = test.test_default( + 'uart3', 9600) + +assert dev == 'uart3' +assert baudrate == 9600 +assert bytesize == 8 +assert parity == 'N' +assert stopbits == 1 +assert xonxoff == 0 +print('PASS')