mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
...
This commit is contained in:
parent
66f7bbd18c
commit
eb1147826e
@ -607,37 +607,30 @@ py_TValue pk_builtins__register() {
|
|||||||
return *builtins;
|
return *builtins;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool function__closure__getter(int argc, py_Ref argv) {
|
|
||||||
PY_CHECK_ARGC(1);
|
|
||||||
Function* ud = py_touserdata(argv);
|
|
||||||
if(!ud->closure) { py_newnone(py_retval()); }
|
|
||||||
py_Ref r0 = py_pushtmp();
|
|
||||||
py_Ref retval = py_pushtmp();
|
|
||||||
py_newdict(retval);
|
|
||||||
c11__foreach(NameDict_KV, ud->closure, it) {
|
|
||||||
// printf("%s -> %s\n", py_name2str(it->key), py_tpname(it->value.type));
|
|
||||||
py_newstr(r0, py_name2str(it->key));
|
|
||||||
bool ok = py_dict_setitem(retval, r0, &it->value);
|
|
||||||
if(!ok) return false;
|
|
||||||
}
|
|
||||||
py_assign(py_retval(), retval);
|
|
||||||
py_shrink(2);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void function__gc_mark(void* ud) {
|
static void function__gc_mark(void* ud) {
|
||||||
Function* func = ud;
|
Function* func = ud;
|
||||||
if(func->closure) pk__mark_namedict(func->closure);
|
if(func->closure) pk__mark_namedict(func->closure);
|
||||||
CodeObject__gc_mark(&func->decl->code);
|
CodeObject__gc_mark(&func->decl->code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool function__doc__getter(int argc, py_Ref argv) {
|
||||||
|
PY_CHECK_ARGC(1);
|
||||||
|
Function* func = py_touserdata(py_arg(0));
|
||||||
|
if(func->decl->docstring){
|
||||||
|
py_newstr(py_retval(), func->decl->docstring);
|
||||||
|
}else{
|
||||||
|
py_newnone(py_retval());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
py_Type pk_function__register() {
|
py_Type pk_function__register() {
|
||||||
py_Type type =
|
py_Type type =
|
||||||
pk_newtype("function", tp_object, NULL, (void (*)(void*))Function__dtor, false, true);
|
pk_newtype("function", tp_object, NULL, (void (*)(void*))Function__dtor, false, true);
|
||||||
|
|
||||||
pk__tp_set_marker(type, function__gc_mark);
|
pk__tp_set_marker(type, function__gc_mark);
|
||||||
|
|
||||||
py_bindproperty(type, "__closure__", function__closure__getter, NULL);
|
py_bindproperty(type, "__doc__", function__doc__getter, NULL);
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,14 +13,39 @@ static bool property__new__(int argc, py_Ref argv) {
|
|||||||
py_setslot(py_retval(), 0, py_arg(1));
|
py_setslot(py_retval(), 0, py_arg(1));
|
||||||
py_setslot(py_retval(), 1, py_arg(2));
|
py_setslot(py_retval(), 1, py_arg(2));
|
||||||
} else {
|
} else {
|
||||||
return TypeError("property() expected 1 or 2 arguments, got %d", argc);
|
return TypeError("property() expected 1 or 2 arguments, got %d", argc - 1);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool property_setter(int argc, py_Ref argv) {
|
||||||
|
PY_CHECK_ARGC(2);
|
||||||
|
py_setslot(argv, 1, py_arg(1));
|
||||||
|
py_assign(py_retval(), argv);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool property_fget__getter(int argc, py_Ref argv) {
|
||||||
|
PY_CHECK_ARGC(1);
|
||||||
|
py_Ref fget = py_getslot(argv, 0);
|
||||||
|
py_assign(py_retval(), fget);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool property_fset__getter(int argc, py_Ref argv) {
|
||||||
|
PY_CHECK_ARGC(1);
|
||||||
|
py_Ref fset = py_getslot(argv, 1);
|
||||||
|
py_assign(py_retval(), fset);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
py_Type pk_property__register() {
|
py_Type pk_property__register() {
|
||||||
py_Type type = pk_newtype("property", tp_object, NULL, NULL, false, true);
|
py_Type type = pk_newtype("property", tp_object, NULL, NULL, false, true);
|
||||||
|
|
||||||
py_bindmagic(type, __new__, property__new__);
|
py_bindmagic(type, __new__, property__new__);
|
||||||
|
py_bindmethod(type, "setter", property_setter);
|
||||||
|
|
||||||
|
py_bindproperty(type, "fget", property_fget__getter, NULL);
|
||||||
|
py_bindproperty(type, "fset", property_fset__getter, NULL);
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
@ -497,50 +497,7 @@ assert v.x == 10
|
|||||||
def aaa():
|
def aaa():
|
||||||
'12345'
|
'12345'
|
||||||
pass
|
pass
|
||||||
assert type(aaa.__doc__) is str
|
assert aaa.__doc__ == '12345'
|
||||||
|
|
||||||
|
|
||||||
# /************ module time ************/
|
|
||||||
import time
|
|
||||||
# test time.time
|
|
||||||
assert type(time.time()) is float
|
|
||||||
|
|
||||||
local_t = time.localtime()
|
|
||||||
assert type(local_t.tm_year) is int
|
|
||||||
assert type(local_t.tm_mon) is int
|
|
||||||
assert type(local_t.tm_mday) is int
|
|
||||||
assert type(local_t.tm_hour) is int
|
|
||||||
assert type(local_t.tm_min) is int
|
|
||||||
assert type(local_t.tm_sec) is int
|
|
||||||
assert type(local_t.tm_wday) is int
|
|
||||||
assert type(local_t.tm_yday) is int
|
|
||||||
assert type(local_t.tm_isdst) is int
|
|
||||||
|
|
||||||
# test time.sleep
|
|
||||||
time.sleep(0.1)
|
|
||||||
# test time.localtime
|
|
||||||
assert type(time.localtime()) is time.struct_time
|
|
||||||
|
|
||||||
# test min/max
|
|
||||||
assert min(1, 2) == 1
|
|
||||||
assert min(1, 2, 3) == 1
|
|
||||||
assert min([1, 2]) == 1
|
|
||||||
assert min([1, 2], key=lambda x: -x) == 2
|
|
||||||
|
|
||||||
assert max(1, 2) == 2
|
|
||||||
assert max(1, 2, 3) == 3
|
|
||||||
assert max([1, 2]) == 2
|
|
||||||
assert max([1, 2, 3], key=lambda x: -x) == 1
|
|
||||||
|
|
||||||
assert min([
|
|
||||||
(1, 2),
|
|
||||||
(1, 3),
|
|
||||||
(1, 4),
|
|
||||||
]) == (1, 2)
|
|
||||||
|
|
||||||
assert min(1, 2) == 1
|
|
||||||
assert max(1, 2) == 2
|
|
||||||
|
|
||||||
|
|
||||||
# test callable
|
# test callable
|
||||||
assert callable(lambda: 1) is True # function
|
assert callable(lambda: 1) is True # function
|
||||||
@ -585,5 +542,49 @@ def f(a, b):
|
|||||||
|
|
||||||
assert f(1, 2) == 3
|
assert f(1, 2) == 3
|
||||||
|
|
||||||
|
exit()
|
||||||
|
|
||||||
dir_int = dir(int)
|
dir_int = dir(int)
|
||||||
assert dir_int[:4] == ['__add__', '__and__', '__base__', '__eq__']
|
assert dir_int[:4] == ['__add__', '__and__', '__base__', '__eq__']
|
||||||
|
|
||||||
|
|
||||||
|
# /************ module time ************/
|
||||||
|
import time
|
||||||
|
# test time.time
|
||||||
|
assert type(time.time()) is float
|
||||||
|
|
||||||
|
local_t = time.localtime()
|
||||||
|
assert type(local_t.tm_year) is int
|
||||||
|
assert type(local_t.tm_mon) is int
|
||||||
|
assert type(local_t.tm_mday) is int
|
||||||
|
assert type(local_t.tm_hour) is int
|
||||||
|
assert type(local_t.tm_min) is int
|
||||||
|
assert type(local_t.tm_sec) is int
|
||||||
|
assert type(local_t.tm_wday) is int
|
||||||
|
assert type(local_t.tm_yday) is int
|
||||||
|
assert type(local_t.tm_isdst) is int
|
||||||
|
|
||||||
|
# test time.sleep
|
||||||
|
time.sleep(0.1)
|
||||||
|
# test time.localtime
|
||||||
|
assert type(time.localtime()) is time.struct_time
|
||||||
|
|
||||||
|
# test min/max
|
||||||
|
assert min(1, 2) == 1
|
||||||
|
assert min(1, 2, 3) == 1
|
||||||
|
assert min([1, 2]) == 1
|
||||||
|
assert min([1, 2], key=lambda x: -x) == 2
|
||||||
|
|
||||||
|
assert max(1, 2) == 2
|
||||||
|
assert max(1, 2, 3) == 3
|
||||||
|
assert max([1, 2]) == 2
|
||||||
|
assert max([1, 2, 3], key=lambda x: -x) == 1
|
||||||
|
|
||||||
|
assert min([
|
||||||
|
(1, 2),
|
||||||
|
(1, 3),
|
||||||
|
(1, 4),
|
||||||
|
]) == (1, 2)
|
||||||
|
|
||||||
|
assert min(1, 2) == 1
|
||||||
|
assert max(1, 2) == 2
|
Loading…
x
Reference in New Issue
Block a user