support list slice

This commit is contained in:
pikastech 2022-09-05 16:31:30 +08:00
parent 45c70ffe79
commit 4486de76e9
3 changed files with 38 additions and 1 deletions

View File

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

View File

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

View File

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