mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
fix load err when fn(pos, kw=xxx)
This commit is contained in:
parent
3afd92608a
commit
1ceb015391
2
port/linux/.vscode/launch.json
vendored
2
port/linux/.vscode/launch.json
vendored
@ -11,7 +11,7 @@
|
||||
"program": "${workspaceFolder}/build/test/pikascript_test",
|
||||
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
|
||||
"args": [
|
||||
// "--gtest_filter=vm.class_keyword"
|
||||
// "--gtest_filter=vm.fn_pos_kw_issue1"
|
||||
],
|
||||
"stopAtEntry": false,
|
||||
"cwd": "${workspaceFolder}",
|
||||
|
34
src/PikaVM.c
34
src/PikaVM.c
@ -847,7 +847,8 @@ Arg* obj_runMethodArg(PikaObj* self,
|
||||
static char* _kw_to_default_all(FunctionArgsInfo* f,
|
||||
char* arg_name,
|
||||
int* argc,
|
||||
Arg* argv[]) {
|
||||
Arg* argv[],
|
||||
Arg* call_arg) {
|
||||
#if PIKA_NANO
|
||||
return arg_name;
|
||||
#endif
|
||||
@ -861,6 +862,17 @@ static char* _kw_to_default_all(FunctionArgsInfo* f,
|
||||
argv[(*argc)++] = arg_new;
|
||||
pikaDict_removeArg(f->kw, default_arg);
|
||||
}
|
||||
} else {
|
||||
/* can not load defalut from kw */
|
||||
if (NULL != call_arg && f->is_default) {
|
||||
/* 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
arg_name = strPopLastToken(f->type_list, ',');
|
||||
}
|
||||
@ -980,20 +992,12 @@ static void _load_call_arg(VMState* vm,
|
||||
}
|
||||
}
|
||||
char* arg_name = strPopLastToken(f->type_list, ',');
|
||||
/* load default from pos */
|
||||
if (f->i_arg > f->n_positional) {
|
||||
if (f->is_default) {
|
||||
if (arg_name[strlen(arg_name) - 1] == '=') {
|
||||
/* found default arg*/
|
||||
arg_name[strlen(arg_name) - 1] = '\0';
|
||||
arg_setNameHash(call_arg, hash_time33EndWith(arg_name, ':'));
|
||||
argv[(*argc)++] = call_arg;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* load default from kw */
|
||||
arg_name = _kw_to_default_all(f, arg_name, argc, argv);
|
||||
arg_name = _kw_to_default_all(f, arg_name, argc, argv, call_arg);
|
||||
if (((char*)1) == arg_name) {
|
||||
/* load default from pos */
|
||||
return;
|
||||
}
|
||||
/* load position arg */
|
||||
if (_kw_to_pos_one(f, arg_name, argc, argv)) {
|
||||
/* load pos from kw */
|
||||
@ -1235,7 +1239,7 @@ static int VMState_loadArgsFromMethodArg(VMState* vm,
|
||||
#if !PIKA_NANO_ENABLE
|
||||
if (strIsContain(f.type_list, '=')) {
|
||||
char* arg_name = strPopLastToken(f.type_list, ',');
|
||||
_kw_to_default_all(&f, arg_name, &argc, argv);
|
||||
_kw_to_default_all(&f, arg_name, &argc, argv, NULL);
|
||||
}
|
||||
/* load kw to pos */
|
||||
_kw_to_pos_all(&f, &argc, argv);
|
||||
|
@ -2452,11 +2452,13 @@ TEST(vm, fn_pos_kw_issue1) {
|
||||
"new(3, b = 2)\n");
|
||||
/* collect */
|
||||
/* assert */
|
||||
EXPECT_STREQ(log_buff[0], "3 2\r\n");
|
||||
/* deinit */
|
||||
obj_deinit(pikaMain);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
TEST_END
|
Loading…
x
Reference in New Issue
Block a user