mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
use __slice__ to call __get__ indirectly
This commit is contained in:
parent
dad0a82b3a
commit
ffe8e85db9
@ -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: ...
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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: ...
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user