use __slice__ to call __get__ indirectly

This commit is contained in:
lyon 2022-05-26 17:03:58 +08:00
parent dad0a82b3a
commit ffe8e85db9
6 changed files with 86 additions and 8 deletions

View File

@ -19,6 +19,7 @@ class SysObj(BaseObj):
def range(self, a1: int, a2: int) -> any: ...
def __set__(self, obj: any, key: any, val: any, obj_str: str): ...
def __get__(self, obj: any, key: any) -> any: ...
def __slice__(self, obj: any, start: any, end: any, step: int) -> any: ...
def len(self, arg: any) -> int: ...
def list(self) -> any: ...
def dict(self) -> any: ...

View File

@ -316,3 +316,20 @@ Arg* PikaStdLib_SysObj_bytes(PikaObj* self, Arg* val) {
__platform_printf("Error: input arg type not supported.\r\n");
return arg_setNull(NULL);
}
Arg* PikaStdLib_SysObj___slice__(PikaObj* self,
Arg* end,
Arg* obj,
Arg* start,
int step) {
if ((arg_getType(start) == ARG_TYPE_INT) &&
(arg_getType(end) == ARG_TYPE_INT)) {
/* __slice__ is equal to __get__ */
if (arg_getInt(start) - arg_getInt(end) == 1) {
return PikaStdLib_SysObj___get__(self, start, obj);
}
}
/* No interger index only support __get__ */
return PikaStdLib_SysObj___get__(self, start, obj);
}

View File

@ -19,6 +19,7 @@ class SysObj(BaseObj):
def range(self, a1: int, a2: int) -> any: ...
def __set__(self, obj: any, key: any, val: any, obj_str: str): ...
def __get__(self, obj: any, key: any) -> any: ...
def __slice__(self, obj: any, start: any, end: any, step: int) -> any: ...
def len(self, arg: any) -> int: ...
def list(self) -> any: ...
def dict(self) -> any: ...

View File

@ -316,3 +316,20 @@ Arg* PikaStdLib_SysObj_bytes(PikaObj* self, Arg* val) {
__platform_printf("Error: input arg type not supported.\r\n");
return arg_setNull(NULL);
}
Arg* PikaStdLib_SysObj___slice__(PikaObj* self,
Arg* end,
Arg* obj,
Arg* start,
int step) {
if ((arg_getType(start) == ARG_TYPE_INT) &&
(arg_getType(end) == ARG_TYPE_INT)) {
/* __slice__ is equal to __get__ */
if (arg_getInt(start) - arg_getInt(end) == 1) {
return PikaStdLib_SysObj___get__(self, start, obj);
}
}
/* No interger index only support __get__ */
return PikaStdLib_SysObj___get__(self, start, obj);
}

View File

@ -1848,12 +1848,24 @@ TEST(parser, __get__3) {
"3 REF c\n"
"3 REF d\n"
"2 OPT +\n"
"1 RUN __get__\n"
"4 REF c\n"
"4 REF d\n"
"3 OPT +\n"
"3 NUM 1\n"
"2 OPT +\n"
"2 NUM 1\n"
"1 RUN __slice__\n"
"2 REF e\n"
"3 REF f\n"
"3 REF j\n"
"2 OPT *\n"
"1 RUN __get__\n"
"4 REF f\n"
"4 REF j\n"
"3 OPT *\n"
"3 NUM 1\n"
"2 OPT +\n"
"2 NUM 1\n"
"1 RUN __slice__\n"
"0 OPT +\n"
"0 OUT a\n");
args_deinit(buffs);
@ -1871,7 +1883,11 @@ TEST(parser, __get__) {
"B0\n"
"1 REF b\n"
"1 REF c\n"
"0 RUN __get__\n"
"2 REF c\n"
"2 NUM 1\n"
"1 OPT +\n"
"1 NUM 1\n"
"0 RUN __slice__\n"
"0 OUT a\n");
args_deinit(buffs);
EXPECT_EQ(pikaMemNow(), 0);
@ -1890,7 +1906,13 @@ TEST(parser, __get__2) {
"2 REF c\n"
"2 REF d\n"
"1 OPT +\n"
"0 RUN __get__\n"
"3 REF c\n"
"3 REF d\n"
"2 OPT +\n"
"2 NUM 1\n"
"1 OPT +\n"
"1 NUM 1\n"
"0 RUN __slice__\n"
"0 OUT a\n");
args_deinit(buffs);
EXPECT_EQ(pikaMemNow(), 0);
@ -2214,10 +2236,18 @@ TEST(parser, list_1_2) {
"B0\n"
"3 REF list\n"
"3 NUM 0\n"
"2 RUN __get__\n"
"4 NUM 0\n"
"4 NUM 1\n"
"3 OPT +\n"
"3 NUM 1\n"
"2 RUN __slice__\n"
"3 REF list\n"
"3 NUM 1\n"
"2 RUN __get__\n"
"4 NUM 1\n"
"4 NUM 1\n"
"3 OPT +\n"
"3 NUM 1\n"
"2 RUN __slice__\n"
"1 OPT +\n"
"0 RUN print\n");
args_deinit(buffs);
@ -2619,7 +2649,11 @@ TEST(parser, bytes_index) {
"B0\n"
"1 BYT eqrt\n"
"1 NUM 2\n"
"0 RUN __get__\n"
"2 NUM 2\n"
"2 NUM 1\n"
"1 OPT +\n"
"1 NUM 1\n"
"0 RUN __slice__\n"
"0 OUT res2\n");
args_deinit(buffs);
EXPECT_EQ(pikaMemNow(), 0);

View File

@ -804,14 +804,22 @@ char* Parser_solveBranckets(Args* outBuffs,
args_setStr(&buffs, "index", arg_getStr(index_arg));
arg_deinit(index_arg);
/* __slice__(obj, start, end, step) */
if (strEqu(mode, "right")) {
right_arg = arg_strAppend(right_arg, "__get__(");
right_arg = arg_strAppend(right_arg, "__slice__(");
} else if (strEqu(mode, "left")) {
right_arg = arg_strAppend(right_arg, "__set__(");
}
right_arg = arg_strAppend(right_arg, args_getStr(&buffs, "obj"));
right_arg = arg_strAppend(right_arg, ",");
right_arg = arg_strAppend(right_arg, args_getStr(&buffs, "index"));
/* __slice__(obj, index, indxe + 1, 1) */
if (strEqu(mode, "right")) {
right_arg = arg_strAppend(right_arg, ",");
right_arg =
arg_strAppend(right_arg, args_getStr(&buffs, "index"));
right_arg = arg_strAppend(right_arg, " + 1, 1");
}
if (strEqu(mode, "left")) {
right_arg = arg_strAppend(right_arg, ",");
right_arg = arg_strAppend(right_arg, stmt);