mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
fix function call err with pos and default args
This commit is contained in:
parent
6af2347973
commit
44c23ee10f
3
port/linux/.vscode/launch.json
vendored
3
port/linux/.vscode/launch.json
vendored
@ -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}",
|
||||
|
63
src/PikaVM.c
63
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,
|
||||
|
@ -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
|
45
test/python/builtin/fn_default1.py
Normal file
45
test/python/builtin/fn_default1.py
Normal 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')
|
Loading…
x
Reference in New Issue
Block a user