Skip to content

Commit 9387a76

Browse files
committed
fix: preserve false default parameters
1 parent b8e03f5 commit 9387a76

3 files changed

Lines changed: 42 additions & 4 deletions

File tree

‎docs/MDTODO/pikapython-syntax-compatibility.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,3 +314,7 @@ P0 修复空 import 与 from-import 缺名称在 Suger_import 路径的解析崩
314314
### R14.5 [completed]
315315

316316
继续解决 [#348](https://github.com/pikasTech/PikaPython/issues/348) 的 VM 性能债务:优化 kwargs 名称恢复中的常量池重复扫描,在不扩大语法、不改变 VM 大架构且不增加常驻 RAM 的前提下完成同机 A/B、default/minimal 资源和语义回归,完成任务后将详细报告写入[任务报告](./details/pikapython-syntax-compatibility/R14.5_Task_Report.md)。
317+
318+
### R14.6 [in_progress]
319+
320+
修复 Linux Action 暴露的默认参数名被误记为未绑定局部变量问题,覆盖 False 默认值和方法参数,完成隔离 Linux 回归并确认不扩大语法或 VM 架构,完成任务后将详细报告写入[任务报告](./details/pikapython-syntax-compatibility/R14.6_Task_Report.md)。

‎port/linux/test/pikaMain-test.cpp‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,14 @@ TEST(pikaMain, python3_default_argument_definition_time) {
540540
"class DefaultOwner:\n"
541541
" def value(self, item=4):\n"
542542
" return item\n"
543-
"class_default = DefaultOwner().value()\n");
543+
" def enabled(self, stop_on_error: bool=False):\n"
544+
" return stop_on_error\n"
545+
"class_default = DefaultOwner().value()\n"
546+
"method_false_default = DefaultOwner().enabled()\n"
547+
"def false_default(stop_on_error=False):\n"
548+
" return stop_on_error\n"
549+
"false_default_value = false_default()\n"
550+
"false_default_override = false_default(True)\n");
544551

545552
EXPECT_EQ(obj_getInt(globals, "default_first"), 101);
546553
EXPECT_EQ(obj_getInt(globals, "default_second"), 102);
@@ -549,6 +556,9 @@ TEST(pikaMain, python3_default_argument_definition_time) {
549556
EXPECT_EQ(obj_getInt(globals, "global_before"), 7);
550557
EXPECT_EQ(obj_getInt(globals, "global_value"), 8);
551558
EXPECT_EQ(obj_getInt(globals, "class_default"), 4);
559+
EXPECT_EQ(obj_getInt(globals, "method_false_default"), 0);
560+
EXPECT_EQ(obj_getInt(globals, "false_default_value"), 0);
561+
EXPECT_EQ(obj_getInt(globals, "false_default_override"), 1);
552562

553563
obj_deinit(pikaMain);
554564
EXPECT_EQ(pikaMemNow(), 0);

‎src/PikaVM.c‎

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3636,7 +3636,8 @@ static pika_bool _methodLocalCandidate(char* name) {
36363636
static void _methodStoreDefinitionMeta(PikaObj* context,
36373637
PikaVMFrame* vm,
36383638
Method method,
3639-
int def_block_deepth) {
3639+
int def_block_deepth,
3640+
char* declaration) {
36403641
char key[2 + sizeof(uintptr_t) * 2 + 1] = {0};
36413642
MethodDefinitionMeta meta = {0};
36423643
uint32_t default_num = PikaVMFrame_getInputArgNum(vm);
@@ -3701,12 +3702,35 @@ static void _methodStoreDefinitionMeta(PikaObj* context,
37013702
}
37023703
}
37033704

3705+
Args parameter_names = {0};
3706+
Args parameter_buffs = {0};
3707+
char* parameters = strsCut(&parameter_buffs, declaration, '(', ')');
3708+
while (NULL != parameters && '\0' != parameters[0]) {
3709+
char* parameter = strPopFirstToken(&parameters, ',');
3710+
while ('*' == parameter[0]) {
3711+
parameter++;
3712+
}
3713+
char* end = strchr(parameter, ':');
3714+
if (NULL == end) {
3715+
end = strchr(parameter, '=');
3716+
}
3717+
if (NULL != end) {
3718+
end[0] = '\0';
3719+
}
3720+
if ('\0' != parameter[0]) {
3721+
args_setNone(&parameter_names, parameter);
3722+
}
3723+
}
37043724
for (int i = args_getSize(meta.local_names) - 1; i >= 0; i--) {
37053725
Arg* local_name = args_getArgByIndex(meta.local_names, i);
3706-
if (args_isArgExist_hash(global_names, arg_getNameHash(local_name))) {
3726+
Hash name_hash = arg_getNameHash(local_name);
3727+
if (args_isArgExist_hash(global_names, name_hash) ||
3728+
args_isArgExist_hash(&parameter_names, name_hash)) {
37073729
args_removeArg(meta.local_names, local_name);
37083730
}
37093731
}
3732+
args_deinit_stack(&parameter_names);
3733+
strsDeinit(&parameter_buffs);
37103734
args_deinit(global_names);
37113735

37123736
if (0 == args_getSize(meta.local_names)) {
@@ -3765,7 +3789,7 @@ static Arg* __VM_instruction_handler_DEF(PikaObj* self,
37653789
}
37663790

37673791
if (!is_class && NULL != method) {
3768-
_methodStoreDefinitionMeta(self, vm, method, thisBlockDeepth);
3792+
_methodStoreDefinitionMeta(self, vm, method, thisBlockDeepth, data);
37693793
}
37703794

37713795
return NULL;

0 commit comments

Comments
 (0)