This commit is contained in:
blueloveTH 2024-08-06 15:25:26 +08:00
parent b6993532fa
commit 8264f125d6
9 changed files with 51 additions and 35 deletions

View File

@ -65,6 +65,9 @@ bool pk__normalize_index(int* index, int length);
void pk_list__mark(void* ud, void (*marker)(py_TValue*));
void pk_dict__mark(void* ud, void (*marker)(py_TValue*));
bool pk_wrapper__self(int argc, py_Ref argv);
bool pk_wrapper__NotImplementedError(int argc, py_Ref argv);
typedef enum FrameResult {
RES_RETURN,
RES_CALL,
@ -122,5 +125,6 @@ py_Type pk_super__register();
py_Type pk_property__register();
py_Type pk_staticmethod__register();
py_Type pk_classmethod__register();
py_Type pk_generator__register();
py_TValue pk_builtins__register();

View File

@ -386,7 +386,6 @@ void py_clearexc(py_StackRef p0);
#define IndexError(...) py_exception(tp_IndexError, __VA_ARGS__)
#define ImportError(...) py_exception(tp_ImportError, __VA_ARGS__)
#define ZeroDivisionError(...) py_exception(tp_ZeroDivisionError, __VA_ARGS__)
#define NotImplementedError() py_exception(tp_NotImplementedError, "")
#define AttributeError(self, n) \
py_exception(tp_AttributeError, "'%t' object has no attribute '%n'", (self)->type, (n))
#define UnboundLocalError(n) \

View File

@ -1,8 +1,22 @@
#include "pocketpy/interpreter/generator.h"
#include "pocketpy/interpreter/frame.h"
#include "pocketpy/interpreter/vm.h"
#include "pocketpy/pocketpy.h"
void pk_newgenerator(py_Ref out, Frame* frame, int slots) {
Generator* ud = py_newobject(out, tp_generator, slots, sizeof(Generator));
ud->frame = frame;
ud->state = 0;
}
static bool generator__next__(int argc, py_Ref argv){
return true;
}
py_Type pk_generator__register() {
py_Type type = pk_newtype("generator", tp_object, NULL, NULL, false, true);
py_bindmagic(type, __iter__, pk_wrapper__self);
py_bindmagic(type, __next__, generator__next__);
return type;
}

View File

@ -127,7 +127,7 @@ void VM__ctor(VM* self) {
validate(tp_NotImplementedType,
pk_newtype("NotImplementedType", tp_object, NULL, NULL, false, true));
validate(tp_ellipsis, pk_newtype("ellipsis", tp_object, NULL, NULL, false, true));
validate(tp_generator, pk_newtype("generator", tp_object, NULL, NULL, false, true));
validate(tp_generator, pk_generator__register());
self->builtins = pk_builtins__register();
@ -648,3 +648,13 @@ void pk_print_stack(VM* self, Frame* frame, Bytecode byte) {
stack_str->data);
c11_string__delete(stack_str);
}
bool pk_wrapper__self(int argc, py_Ref argv) {
PY_CHECK_ARGC(1);
py_assign(py_retval(), argv);
return true;
}
bool pk_wrapper__NotImplementedError(int argc, py_Ref argv){
return py_exception(tp_NotImplementedError, "");
}

View File

@ -252,11 +252,6 @@ static bool builtins_print(int argc, py_Ref argv) {
return true;
}
static bool NoneType__repr__(int argc, py_Ref argv) {
py_newstr(py_retval(), "None");
return true;
}
static bool builtins_exec(int argc, py_Ref argv) {
PY_CHECK_ARGC(1);
PY_CHECK_ARG_TYPE(0, tp_str);
@ -372,6 +367,21 @@ static bool builtins_ord(int argc, py_Ref argv) {
return true;
}
static bool NoneType__repr__(int argc, py_Ref argv) {
py_newstr(py_retval(), "None");
return true;
}
static bool ellipsis__repr__(int argc, py_Ref argv) {
py_newstr(py_retval(), "Ellipsis");
return true;
}
static bool NotImplementedType__repr__(int argc, py_Ref argv) {
py_newstr(py_retval(), "NotImplemented");
return true;
}
py_TValue pk_builtins__register() {
py_Ref builtins = py_newmodule("builtins");
py_bindfunc(builtins, "repr", builtins_repr);
@ -400,8 +410,10 @@ py_TValue pk_builtins__register() {
py_bindfunc(builtins, "chr", builtins_chr);
py_bindfunc(builtins, "ord", builtins_ord);
// None __repr__
// some patches
py_bindmagic(tp_NoneType, __repr__, NoneType__repr__);
py_bindmagic(tp_ellipsis, __repr__, ellipsis__repr__);
py_bindmagic(tp_NotImplementedType, __repr__, NotImplementedType__repr__);
return *builtins;
}

View File

@ -457,12 +457,6 @@ py_Type pk_dict__register() {
}
//////////////////////////
static bool dict_items__iter__(int argc, py_Ref argv) {
PY_CHECK_ARGC(1);
*py_retval() = *argv;
return true;
}
static bool dict_items__next__(int argc, py_Ref argv) {
PY_CHECK_ARGC(1);
DictIterator* iter = py_touserdata(py_arg(0));
@ -478,7 +472,7 @@ static bool dict_items__next__(int argc, py_Ref argv) {
py_Type pk_dict_items__register() {
py_Type type = pk_newtype("dict_items", tp_object, NULL, NULL, false, true);
py_bindmagic(type, __iter__, dict_items__iter__);
py_bindmagic(type, __iter__, pk_wrapper__self);
py_bindmagic(type, __next__, dict_items__next__);
return type;
}

View File

@ -36,10 +36,6 @@ py_Type pk_classmethod__register(){
}
/* boundmethod */
static bool boundmethod__new__(int argc, py_Ref argv) {
return NotImplementedError();
}
static bool boundmethod__self__getter(int argc, py_Ref argv) {
PY_CHECK_ARGC(1);
py_assign(py_retval(), py_getslot(argv, 0));
@ -55,7 +51,6 @@ static bool boundmethod__func__getter(int argc, py_Ref argv) {
py_Type pk_boundmethod__register(){
py_Type type = pk_newtype("boundmethod", tp_object, NULL, NULL, false, true);
py_bindmagic(type, __new__, boundmethod__new__);
py_bindproperty(type, "__self__", boundmethod__self__getter, NULL);
py_bindproperty(type, "__func__", boundmethod__func__getter, NULL);
return type;

View File

@ -68,12 +68,6 @@ static bool range_iterator__new__(int argc, py_Ref argv) {
return true;
}
static bool range_iterator__iter__(int argc, py_Ref argv) {
PY_CHECK_ARGC(1);
*py_retval() = *py_arg(0);
return true;
}
static bool range_iterator__next__(int argc, py_Ref argv) {
PY_CHECK_ARGC(1);
RangeIterator* ud = py_touserdata(py_arg(0));
@ -91,7 +85,7 @@ py_Type pk_range_iterator__register() {
py_Type type = pk_newtype("range_iterator", tp_object, NULL, NULL, false, true);
py_bindmagic(type, __new__, range_iterator__new__);
py_bindmagic(type, __iter__, range_iterator__iter__);
py_bindmagic(type, __iter__, pk_wrapper__self);
py_bindmagic(type, __next__, range_iterator__next__);
return type;
}

View File

@ -495,12 +495,6 @@ py_Type pk_str__register() {
return type;
}
static bool str_iterator__iter__(int argc, py_Ref argv) {
PY_CHECK_ARGC(1);
*py_retval() = argv[0];
return true;
}
static bool str_iterator__next__(int argc, py_Ref argv) {
PY_CHECK_ARGC(1);
int* ud = py_touserdata(&argv[0]);
@ -517,7 +511,7 @@ static bool str_iterator__next__(int argc, py_Ref argv) {
py_Type pk_str_iterator__register() {
py_Type type = pk_newtype("str_iterator", tp_object, NULL, NULL, false, true);
py_bindmagic(type, __iter__, str_iterator__iter__);
py_bindmagic(type, __iter__, pk_wrapper__self);
py_bindmagic(type, __next__, str_iterator__next__);
return type;
}