fix function call err with pos and default args

This commit is contained in:
pikastech 2023-04-28 11:19:44 +08:00
parent 6af2347973
commit 44c23ee10f
4 changed files with 86 additions and 34 deletions

View File

@ -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}",

View File

@ -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,

View File

@ -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

View File

@ -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')