mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-15 17:02:53 +08:00
support len() for object and __len__().
* list, dict, dict_keys is ok
This commit is contained in:
parent
410071a200
commit
865290df74
@ -21,6 +21,7 @@ class List(TinyObj):
|
|||||||
def __get__(self, __key: any) -> any: ...
|
def __get__(self, __key: any) -> any: ...
|
||||||
def __del__(self): ...
|
def __del__(self): ...
|
||||||
def __str__(self) -> str: ...
|
def __str__(self) -> str: ...
|
||||||
|
def __len__(self) -> int: ...
|
||||||
|
|
||||||
|
|
||||||
class Dict(TinyObj):
|
class Dict(TinyObj):
|
||||||
@ -40,12 +41,14 @@ class Dict(TinyObj):
|
|||||||
def __del__(self): ...
|
def __del__(self): ...
|
||||||
def __str__(self) -> str: ...
|
def __str__(self) -> str: ...
|
||||||
def keys(self) -> dict_keys: ...
|
def keys(self) -> dict_keys: ...
|
||||||
|
def __len__(self) -> int: ...
|
||||||
|
|
||||||
|
|
||||||
class dict_keys(TinyObj):
|
class dict_keys(TinyObj):
|
||||||
def __iter__(self) -> any: ...
|
def __iter__(self) -> any: ...
|
||||||
def __next__(self) -> any: ...
|
def __next__(self) -> any: ...
|
||||||
def __str__(self) -> str: ...
|
def __str__(self) -> str: ...
|
||||||
|
def __len__(self) -> int: ...
|
||||||
|
|
||||||
|
|
||||||
class String(TinyObj):
|
class String(TinyObj):
|
||||||
@ -60,6 +63,7 @@ class String(TinyObj):
|
|||||||
def __get__(self, __key: any) -> any: ...
|
def __get__(self, __key: any) -> any: ...
|
||||||
# support str()
|
# support str()
|
||||||
def __str__(self) -> str: ...
|
def __str__(self) -> str: ...
|
||||||
|
def __len__(self) -> int: ...
|
||||||
|
|
||||||
def startwith(self, prefix: str) -> int: ...
|
def startwith(self, prefix: str) -> int: ...
|
||||||
def endwith(self, suffix: str) -> int: ...
|
def endwith(self, suffix: str) -> int: ...
|
||||||
|
@ -119,7 +119,7 @@ char* PikaStdData_dict_keys___str__(PikaObj* self) {
|
|||||||
return obj_getStr(self, "_buf");
|
return obj_getStr(self, "_buf");
|
||||||
}
|
}
|
||||||
|
|
||||||
char* PikaStdData_Dict___str__(PikaObj *self){
|
char* PikaStdData_Dict___str__(PikaObj* self) {
|
||||||
Arg* str_arg = arg_setStr(NULL, "", "{");
|
Arg* str_arg = arg_setStr(NULL, "", "{");
|
||||||
|
|
||||||
PikaDict* keys = obj_getPtr(self, "_keys");
|
PikaDict* keys = obj_getPtr(self, "_keys");
|
||||||
@ -151,3 +151,15 @@ char* PikaStdData_Dict___str__(PikaObj *self){
|
|||||||
arg_deinit(str_arg);
|
arg_deinit(str_arg);
|
||||||
return obj_getStr(self, "_buf");
|
return obj_getStr(self, "_buf");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PikaStdData_Dict___len__(PikaObj* self) {
|
||||||
|
PikaDict* dict = obj_getPtr(self, "dict");
|
||||||
|
return args_getSize(&dict->super);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int PikaStdData_dict_keys___len__(PikaObj *self){
|
||||||
|
PikaObj* dictptr = obj_getPtr(self, "dictptr");
|
||||||
|
PikaDict* keys = obj_getPtr(dictptr, "_keys");
|
||||||
|
return args_getSize(&keys->super);
|
||||||
|
}
|
||||||
|
@ -106,3 +106,7 @@ char* PikaStdData_List___str__(PikaObj* self) {
|
|||||||
arg_deinit(str_arg);
|
arg_deinit(str_arg);
|
||||||
return obj_getStr(self, "_buf");
|
return obj_getStr(self, "_buf");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PikaStdData_List___len__(PikaObj *self){
|
||||||
|
return PikaStdData_List_len(self);
|
||||||
|
}
|
||||||
|
@ -172,3 +172,8 @@ PikaObj* PikaStdData_String_split(PikaObj* self, char* s) {
|
|||||||
strsDeinit(&buffs);
|
strsDeinit(&buffs);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PikaStdData_String___len__(PikaObj *self){
|
||||||
|
char* str = obj_getStr(self, "str");
|
||||||
|
return strGetSize(str);
|
||||||
|
}
|
||||||
|
@ -285,6 +285,31 @@ int PikaStdLib_SysObj_len(PikaObj* self, Arg* arg) {
|
|||||||
if (ARG_TYPE_BYTES == arg_getType(arg)) {
|
if (ARG_TYPE_BYTES == arg_getType(arg)) {
|
||||||
return arg_getBytesSize(arg);
|
return arg_getBytesSize(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (argType_isObject(arg_getType(arg))) {
|
||||||
|
PikaObj* arg_obj = arg_getPtr(arg);
|
||||||
|
Arg* method_arg = obj_getMethodArg(arg_obj, "__len__");
|
||||||
|
if (NULL != method_arg) {
|
||||||
|
arg_deinit(method_arg);
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
PIKA_PYTHON(
|
||||||
|
__res = __len__()
|
||||||
|
)
|
||||||
|
/* clang-format on */
|
||||||
|
const uint8_t bytes[] = {
|
||||||
|
0x08, 0x00, /* instruct array size */
|
||||||
|
0x00, 0x82, 0x01, 0x00, 0x00, 0x04, 0x09, 0x00, /* instruct
|
||||||
|
array */
|
||||||
|
0x0f, 0x00, /* const pool size */
|
||||||
|
0x00, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x5f, 0x00,
|
||||||
|
0x5f, 0x5f, 0x72, 0x65, 0x73, 0x00, /* const pool */
|
||||||
|
};
|
||||||
|
pikaVM_runByteCode(arg_obj, (uint8_t*)bytes);
|
||||||
|
return obj_getInt(arg_obj, "__res");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
obj_setErrorCode(self, 1);
|
obj_setErrorCode(self, 1);
|
||||||
__platform_printf("[Error] len: arg type not support\r\n");
|
__platform_printf("[Error] len: arg type not support\r\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -21,6 +21,7 @@ class List(TinyObj):
|
|||||||
def __get__(self, __key: any) -> any: ...
|
def __get__(self, __key: any) -> any: ...
|
||||||
def __del__(self): ...
|
def __del__(self): ...
|
||||||
def __str__(self) -> str: ...
|
def __str__(self) -> str: ...
|
||||||
|
def __len__(self) -> int: ...
|
||||||
|
|
||||||
|
|
||||||
class Dict(TinyObj):
|
class Dict(TinyObj):
|
||||||
@ -40,12 +41,14 @@ class Dict(TinyObj):
|
|||||||
def __del__(self): ...
|
def __del__(self): ...
|
||||||
def __str__(self) -> str: ...
|
def __str__(self) -> str: ...
|
||||||
def keys(self) -> dict_keys: ...
|
def keys(self) -> dict_keys: ...
|
||||||
|
def __len__(self) -> int: ...
|
||||||
|
|
||||||
|
|
||||||
class dict_keys(TinyObj):
|
class dict_keys(TinyObj):
|
||||||
def __iter__(self) -> any: ...
|
def __iter__(self) -> any: ...
|
||||||
def __next__(self) -> any: ...
|
def __next__(self) -> any: ...
|
||||||
def __str__(self) -> str: ...
|
def __str__(self) -> str: ...
|
||||||
|
def __len__(self) -> int: ...
|
||||||
|
|
||||||
|
|
||||||
class String(TinyObj):
|
class String(TinyObj):
|
||||||
@ -60,6 +63,7 @@ class String(TinyObj):
|
|||||||
def __get__(self, __key: any) -> any: ...
|
def __get__(self, __key: any) -> any: ...
|
||||||
# support str()
|
# support str()
|
||||||
def __str__(self) -> str: ...
|
def __str__(self) -> str: ...
|
||||||
|
def __len__(self) -> int: ...
|
||||||
|
|
||||||
def startwith(self, prefix: str) -> int: ...
|
def startwith(self, prefix: str) -> int: ...
|
||||||
def endwith(self, suffix: str) -> int: ...
|
def endwith(self, suffix: str) -> int: ...
|
||||||
|
@ -119,7 +119,7 @@ char* PikaStdData_dict_keys___str__(PikaObj* self) {
|
|||||||
return obj_getStr(self, "_buf");
|
return obj_getStr(self, "_buf");
|
||||||
}
|
}
|
||||||
|
|
||||||
char* PikaStdData_Dict___str__(PikaObj *self){
|
char* PikaStdData_Dict___str__(PikaObj* self) {
|
||||||
Arg* str_arg = arg_setStr(NULL, "", "{");
|
Arg* str_arg = arg_setStr(NULL, "", "{");
|
||||||
|
|
||||||
PikaDict* keys = obj_getPtr(self, "_keys");
|
PikaDict* keys = obj_getPtr(self, "_keys");
|
||||||
@ -151,3 +151,15 @@ char* PikaStdData_Dict___str__(PikaObj *self){
|
|||||||
arg_deinit(str_arg);
|
arg_deinit(str_arg);
|
||||||
return obj_getStr(self, "_buf");
|
return obj_getStr(self, "_buf");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PikaStdData_Dict___len__(PikaObj* self) {
|
||||||
|
PikaDict* dict = obj_getPtr(self, "dict");
|
||||||
|
return args_getSize(&dict->super);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int PikaStdData_dict_keys___len__(PikaObj *self){
|
||||||
|
PikaObj* dictptr = obj_getPtr(self, "dictptr");
|
||||||
|
PikaDict* keys = obj_getPtr(dictptr, "_keys");
|
||||||
|
return args_getSize(&keys->super);
|
||||||
|
}
|
||||||
|
@ -106,3 +106,7 @@ char* PikaStdData_List___str__(PikaObj* self) {
|
|||||||
arg_deinit(str_arg);
|
arg_deinit(str_arg);
|
||||||
return obj_getStr(self, "_buf");
|
return obj_getStr(self, "_buf");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PikaStdData_List___len__(PikaObj *self){
|
||||||
|
return PikaStdData_List_len(self);
|
||||||
|
}
|
||||||
|
@ -172,3 +172,8 @@ PikaObj* PikaStdData_String_split(PikaObj* self, char* s) {
|
|||||||
strsDeinit(&buffs);
|
strsDeinit(&buffs);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PikaStdData_String___len__(PikaObj *self){
|
||||||
|
char* str = obj_getStr(self, "str");
|
||||||
|
return strGetSize(str);
|
||||||
|
}
|
||||||
|
@ -285,6 +285,31 @@ int PikaStdLib_SysObj_len(PikaObj* self, Arg* arg) {
|
|||||||
if (ARG_TYPE_BYTES == arg_getType(arg)) {
|
if (ARG_TYPE_BYTES == arg_getType(arg)) {
|
||||||
return arg_getBytesSize(arg);
|
return arg_getBytesSize(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (argType_isObject(arg_getType(arg))) {
|
||||||
|
PikaObj* arg_obj = arg_getPtr(arg);
|
||||||
|
Arg* method_arg = obj_getMethodArg(arg_obj, "__len__");
|
||||||
|
if (NULL != method_arg) {
|
||||||
|
arg_deinit(method_arg);
|
||||||
|
|
||||||
|
/* clang-format off */
|
||||||
|
PIKA_PYTHON(
|
||||||
|
__res = __len__()
|
||||||
|
)
|
||||||
|
/* clang-format on */
|
||||||
|
const uint8_t bytes[] = {
|
||||||
|
0x08, 0x00, /* instruct array size */
|
||||||
|
0x00, 0x82, 0x01, 0x00, 0x00, 0x04, 0x09, 0x00, /* instruct
|
||||||
|
array */
|
||||||
|
0x0f, 0x00, /* const pool size */
|
||||||
|
0x00, 0x5f, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x5f, 0x00,
|
||||||
|
0x5f, 0x5f, 0x72, 0x65, 0x73, 0x00, /* const pool */
|
||||||
|
};
|
||||||
|
pikaVM_runByteCode(arg_obj, (uint8_t*)bytes);
|
||||||
|
return obj_getInt(arg_obj, "__res");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
obj_setErrorCode(self, 1);
|
obj_setErrorCode(self, 1);
|
||||||
__platform_printf("[Error] len: arg type not support\r\n");
|
__platform_printf("[Error] len: arg type not support\r\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -552,6 +552,12 @@ TEST(compiler, __str__) {
|
|||||||
EXPECT_EQ(pikaMemNow(), 0);
|
EXPECT_EQ(pikaMemNow(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(compiler, __len__) {
|
||||||
|
char* lines = "__res = __len__()";
|
||||||
|
Parser_compilePyToBytecodeArray(lines);
|
||||||
|
EXPECT_EQ(pikaMemNow(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
TEST(compiler, __del__) {
|
TEST(compiler, __del__) {
|
||||||
char* lines = "__del__()";
|
char* lines = "__del__()";
|
||||||
Parser_compilePyToBytecodeArray(lines);
|
Parser_compilePyToBytecodeArray(lines);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user