mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
support list slice
This commit is contained in:
parent
45c70ffe79
commit
4486de76e9
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=dict.in"
|
||||
// "--gtest_filter=dict.in"
|
||||
],
|
||||
"stopAtEntry": false,
|
||||
"cwd": "${workspaceFolder}",
|
||||
|
@ -141,5 +141,23 @@ TEST(dict, in){
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
TEST(list, slice){
|
||||
/* init */
|
||||
pikaMemInfo.heapUsedMax = 0;
|
||||
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
|
||||
/* run */
|
||||
__platform_printf("BEGIN\r\n");
|
||||
obj_run(pikaMain,
|
||||
"[1, 2, 3, 4][0:2]\n"
|
||||
"(5, 6, 7, 8)[1:4]\n"
|
||||
);
|
||||
/* collect */
|
||||
/* assert */
|
||||
EXPECT_STREQ(log_buff[0], "(6, 7, 8)\r\n");
|
||||
EXPECT_STREQ(log_buff[1], "[1, 2]\r\n");
|
||||
/* deinit */
|
||||
obj_deinit(pikaMain);
|
||||
EXPECT_EQ(pikaMemNow(), 0);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
19
src/PikaVM.c
19
src/PikaVM.c
@ -356,6 +356,25 @@ Arg* __vm_slice(PikaObj* self, Arg* end, Arg* obj, Arg* start, int step) {
|
||||
}
|
||||
return sliced_arg;
|
||||
}
|
||||
|
||||
if (argType_isObject(arg_getType(obj))){
|
||||
PikaObj* arg_obj = arg_getPtr(obj);
|
||||
PikaObj *New_PikaStdData_List(Args *args);
|
||||
PikaObj *New_PikaStdData_Tuple(Args *args);
|
||||
if (arg_obj->constructor == New_PikaStdData_List ||
|
||||
arg_obj->constructor == New_PikaStdData_Tuple) {
|
||||
PikaObj* sliced_obj = newNormalObj(arg_obj->constructor);
|
||||
__vm_List___init__(sliced_obj);
|
||||
for (int i = start_i; i < end_i; i++) {
|
||||
Arg* i_arg = arg_newInt(i);
|
||||
Arg* item_arg = __vm_get(self, i_arg, obj);
|
||||
__vm_List_append(sliced_obj, item_arg);
|
||||
arg_deinit(item_arg);
|
||||
arg_deinit(i_arg);
|
||||
}
|
||||
return arg_newPtr(ARG_TYPE_OBJECT, sliced_obj);
|
||||
}
|
||||
}
|
||||
return arg_newNull();
|
||||
#else
|
||||
return __vm_get(self, start, obj);
|
||||
|
Loading…
x
Reference in New Issue
Block a user