update PikaStdData and PikaStdLib

This commit is contained in:
lyon 2021-12-28 01:21:47 +08:00
parent 56bc4deef7
commit 2d22ed170a
6 changed files with 120 additions and 6 deletions

View File

@ -21,6 +21,12 @@ class List(TinyObj):
def len() -> int:
pass
def __iter__() -> any:
pass
def __next__() -> any:
pass
class Dict(TinyObj):
def __init__():
@ -37,3 +43,9 @@ class Dict(TinyObj):
# remove an arg by the key
def remove(key: str):
pass
def __iter__() -> any:
pass
def __next__() -> any:
pass

View File

@ -14,4 +14,11 @@ void PikaStdData_Dict_set(PikaObj* self, Arg* arg, char* key) {
void PikaStdData_Dict_remove(PikaObj* self, char* key) {
PikaStdLib_SysObj_remove(self, key);
}
Arg * PikaStdData_Dict___iter__(PikaObj *self){
return NULL;
}
Arg * PikaStdData_Dict___next__(PikaObj *self){
return NULL;
}

View File

@ -1,10 +1,12 @@
#include "BaseObj.h"
#include "PikaObj.h"
void PikaStdData_List_append(PikaObj* self, Arg* arg) {
int top = obj_getInt(self, "top");
char buff[11];
char* topStr = fast_itoa(buff, top);
obj_setArg(self, topStr, arg);
PikaObj* pyload = obj_getObj(self, "pyload", 0);
obj_setArg(pyload, topStr, arg);
/* top++ */
obj_setInt(self, "top", top + 1);
}
@ -16,11 +18,13 @@ int PikaStdData_List_len(PikaObj* self) {
Arg* PikaStdData_List_get(PikaObj* self, int i) {
char buff[11];
char* index = fast_itoa(buff, i);
return arg_copy(obj_getArg(self, index));
PikaObj* pyload = obj_getObj(self, "pyload", 0);
return arg_copy(obj_getArg(pyload, index));
}
void PikaStdData_List___init__(PikaObj* self) {
/* set top index for append */
obj_setInt(self, "top", 0);
obj_newObj(self, "pyload", "", New_TinyObj);
}
void PikaStdData_List_set(PikaObj* self, Arg* arg, int i) {
@ -31,5 +35,21 @@ void PikaStdData_List_set(PikaObj* self, Arg* arg, int i) {
obj_setErrorCode(self, 1);
obj_setSysOut(self, "[error]: index exceeded lengh of list.");
}
obj_setArg(self, i_str, arg);
PikaObj* pyload = obj_getObj(self, "pyload", 0);
obj_setArg(pyload, i_str, arg);
}
Arg* PikaStdData_List___iter__(PikaObj* self) {
obj_setInt(self, "__iter_i", 0);
return arg_setPtr(NULL, "", TYPE_POINTER, self);
}
Arg* PikaStdData_List___next__(PikaObj* self) {
int __iter_i = args_getInt(self->list, "__iter_i");
Arg* res = PikaStdData_List_get(self, __iter_i);
if(NULL == res){
return arg_setNull(NULL);
}
args_setInt(self->list, "__iter_i", __iter_i + 1);
return res;
}

View File

@ -8,10 +8,10 @@ class MemChecker(TinyObj):
def now():
pass
def getMax()->float:
def getMax() -> float:
pass
def getNow()->float:
def getNow() -> float:
pass
def resetMax():
@ -31,4 +31,19 @@ class SysObj(BaseObj):
def float(arg: any) -> float:
pass
def iter(arg: any) -> any:
pass
def next(arg: any) -> any:
pass
def range(a1: int, a2: int, a3: int) -> any:
pass
class RangeObj(TinyObj):
def __iter__() -> any:
pass
def __next__() -> any:
pass

View File

@ -0,0 +1,31 @@
#include "PikaObj.h"
Arg* PikaStdLib_RangeObj___iter__(PikaObj* self) {
return arg_setPtr(NULL, "", TYPE_OBJECT, self);
;
}
Arg* PikaStdLib_RangeObj___next__(PikaObj* self) {
int a1 = obj_getInt(self, "a1");
int a2 = obj_getInt(self, "a2");
int a3 = obj_getInt(self, "a3");
int start = 0;
int end = 0;
int foot = 1;
/* only start and end */
if (-999999999 == a3) {
start = a1;
end = a2;
}
/* start */
int iter_i = obj_getInt(self, "iter_i");
/* iter_i is not inited */
if (-999999999 == iter_i) {
iter_i = start;
}
/* exit */
if (iter_i >= end) {
return arg_setNull(NULL);
}
obj_setInt(self, "iter_i", iter_i + foot);
return arg_setInt(NULL, "", iter_i);
}

View File

@ -1,4 +1,5 @@
#include "BaseObj.h"
#include "PikaStdLib_RangeObj.h"
#include "dataStrs.h"
void PikaStdLib_SysObj_remove(PikaObj* self, char* argPath) {
@ -73,4 +74,32 @@ int PikaStdLib_SysObj_int(PikaObj* self, Arg* arg) {
obj_setSysOut(self, "[error] convert to int type faild.");
obj_setErrorCode(self, 1);
return -999999999;
}
}
Arg* PikaStdLib_SysObj_iter(PikaObj* self, Arg* arg) {
/* a MATE object */
if (TYPE_MATE_OBJECT == arg_getType(arg)) {
return arg_copy(arg);
}
/* object */
if (TYPE_POINTER == arg_getType(arg)) {
PikaObj* arg_obj = arg_getPtr(arg);
obj_run(arg_obj, "__res = __iter__()");
return arg_copy(args_getArg(arg_obj->list, "__res"));
}
return arg_setNull(NULL);
}
Arg* PikaStdLib_SysObj_next(PikaObj* self, Arg* arg) {
PikaObj* arg_obj = arg_getPtr(arg);
obj_run(arg_obj, "__res = __next__()");
return arg_copy(args_getArg(arg_obj->list, "__res"));
}
Arg* PikaStdLib_SysObj_range(PikaObj* self, int a1, int a2, int a3) {
/* set template arg to create rangeObj */
obj_setInt(self, "__range_a1", a1);
obj_setInt(self, "__range_a2", a2);
obj_setInt(self, "__range_a3", a3);
return arg_setMetaObj("", "PikaStdLib_RangeObj", New_PikaStdLib_RangeObj);
}