mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
...
This commit is contained in:
parent
bb5978da04
commit
bf1c1bd678
@ -82,8 +82,20 @@ void _bind(VM* vm, PyObject* obj, const char* sig, Ret(T::*func)(Params...)){
|
|||||||
}, \
|
}, \
|
||||||
[](VM* vm, ArgsView args){ \
|
[](VM* vm, ArgsView args){ \
|
||||||
T& self = PK_OBJ_GET(T, args[0]); \
|
T& self = PK_OBJ_GET(T, args[0]); \
|
||||||
self.REF()->EXPR = CAST(decltype(self.REF()->EXPR), args[1]); \
|
self.REF()->EXPR = CAST(decltype(self.REF()->EXPR), args[1]); \
|
||||||
return vm->None; \
|
return vm->None; \
|
||||||
|
});
|
||||||
|
|
||||||
|
#define PY_FIELD_VIRTUAL(T, NAME, REF, EXPR) \
|
||||||
|
vm->bind_property(type, NAME, \
|
||||||
|
[](VM* vm, ArgsView args){ \
|
||||||
|
T& self = *(reinterpret_cast<T*>(args[0]->_value_ptr())); \
|
||||||
|
return VAR(self.REF()->EXPR); \
|
||||||
|
}, \
|
||||||
|
[](VM* vm, ArgsView args){ \
|
||||||
|
T& self = *(reinterpret_cast<T*>(args[0]->_value_ptr())); \
|
||||||
|
self.REF()->EXPR = CAST(decltype(self.REF()->EXPR), args[1]); \
|
||||||
|
return vm->None; \
|
||||||
});
|
});
|
||||||
|
|
||||||
#define PY_READONLY_FIELD(T, NAME, REF, EXPR) \
|
#define PY_READONLY_FIELD(T, NAME, REF, EXPR) \
|
||||||
@ -93,6 +105,13 @@ void _bind(VM* vm, PyObject* obj, const char* sig, Ret(T::*func)(Params...)){
|
|||||||
return VAR(self.REF()->EXPR); \
|
return VAR(self.REF()->EXPR); \
|
||||||
});
|
});
|
||||||
|
|
||||||
|
#define PY_READONLY_FIELD_VIRTUAL(T, NAME, REF, EXPR) \
|
||||||
|
vm->bind_property(type, NAME, \
|
||||||
|
[](VM* vm, ArgsView args){ \
|
||||||
|
T& self = *(reinterpret_cast<T*>(args[0]->_value_ptr())); \
|
||||||
|
return VAR(self.REF()->EXPR); \
|
||||||
|
});
|
||||||
|
|
||||||
#define PY_PROPERTY(T, NAME, REF, FGET, FSET) \
|
#define PY_PROPERTY(T, NAME, REF, FGET, FSET) \
|
||||||
vm->bind_property(type, NAME, \
|
vm->bind_property(type, NAME, \
|
||||||
[](VM* vm, ArgsView args){ \
|
[](VM* vm, ArgsView args){ \
|
||||||
|
@ -201,6 +201,10 @@ struct Py_<Function> final: PyObject {
|
|||||||
if(_value._module != nullptr) PK_OBJ_MARK(_value._module);
|
if(_value._module != nullptr) PK_OBJ_MARK(_value._module);
|
||||||
if(_value._closure != nullptr) gc_mark_namedict(*_value._closure);
|
if(_value._closure != nullptr) gc_mark_namedict(*_value._closure);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* _value_ptr() override {
|
||||||
|
return &_value;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -215,6 +219,9 @@ struct Py_<NativeFunc> final: PyObject {
|
|||||||
_value.decl->_gc_mark();
|
_value.decl->_gc_mark();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void* _value_ptr() override {
|
||||||
|
return &_value;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -112,7 +112,9 @@ struct PyObject{
|
|||||||
bool is_attr_valid() const noexcept { return _attr != nullptr; }
|
bool is_attr_valid() const noexcept { return _attr != nullptr; }
|
||||||
NameDict& attr() noexcept { return *_attr; }
|
NameDict& attr() noexcept { return *_attr; }
|
||||||
PyObject* attr(StrName name) const noexcept { return (*_attr)[name]; }
|
PyObject* attr(StrName name) const noexcept { return (*_attr)[name]; }
|
||||||
|
|
||||||
virtual void _obj_gc_mark() = 0;
|
virtual void _obj_gc_mark() = 0;
|
||||||
|
virtual void* _value_ptr() = 0;
|
||||||
|
|
||||||
PyObject(Type type) : type(type), _attr(nullptr) {}
|
PyObject(Type type) : type(type), _attr(nullptr) {}
|
||||||
|
|
||||||
@ -128,6 +130,7 @@ struct PySignalObject: PyObject {
|
|||||||
gc.enabled = false;
|
gc.enabled = false;
|
||||||
}
|
}
|
||||||
void _obj_gc_mark() override {}
|
void _obj_gc_mark() override {}
|
||||||
|
void* _value_ptr() override { return nullptr; }
|
||||||
};
|
};
|
||||||
|
|
||||||
inline PyObject* const PY_NULL = new PySignalObject();
|
inline PyObject* const PY_NULL = new PySignalObject();
|
||||||
@ -172,6 +175,8 @@ struct Py_ final: PyObject {
|
|||||||
_value._gc_mark();
|
_value._gc_mark();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* _value_ptr() override { return &_value; }
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
Py_(Type type, Args&&... args) : PyObject(type), _value(std::forward<Args>(args)...) { }
|
Py_(Type type, Args&&... args) : PyObject(type), _value(std::forward<Args>(args)...) { }
|
||||||
@ -255,6 +260,7 @@ struct Py_<i64> final: PyObject {
|
|||||||
i64 _value;
|
i64 _value;
|
||||||
Py_(Type type, i64 val): PyObject(type), _value(val) {}
|
Py_(Type type, i64 val): PyObject(type), _value(val) {}
|
||||||
void _obj_gc_mark() override {}
|
void _obj_gc_mark() override {}
|
||||||
|
void* _value_ptr() override { return &_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool try_cast_int(PyObject* obj, i64* val) noexcept {
|
inline bool try_cast_int(PyObject* obj, i64* val) noexcept {
|
||||||
@ -278,6 +284,7 @@ struct Py_<List> final: PyObject {
|
|||||||
void _obj_gc_mark() override {
|
void _obj_gc_mark() override {
|
||||||
for(PyObject* obj: _value) PK_OBJ_MARK(obj);
|
for(PyObject* obj: _value) PK_OBJ_MARK(obj);
|
||||||
}
|
}
|
||||||
|
void* _value_ptr() override { return &_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -289,6 +296,7 @@ struct Py_<Tuple> final: PyObject {
|
|||||||
void _obj_gc_mark() override {
|
void _obj_gc_mark() override {
|
||||||
for(PyObject* obj: _value) PK_OBJ_MARK(obj);
|
for(PyObject* obj: _value) PK_OBJ_MARK(obj);
|
||||||
}
|
}
|
||||||
|
void* _value_ptr() override { return &_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -298,6 +306,7 @@ struct Py_<MappingProxy> final: PyObject {
|
|||||||
void _obj_gc_mark() override {
|
void _obj_gc_mark() override {
|
||||||
PK_OBJ_MARK(_value.obj);
|
PK_OBJ_MARK(_value.obj);
|
||||||
}
|
}
|
||||||
|
void* _value_ptr() override { return &_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -308,6 +317,7 @@ struct Py_<BoundMethod> final: PyObject {
|
|||||||
PK_OBJ_MARK(_value.self);
|
PK_OBJ_MARK(_value.self);
|
||||||
PK_OBJ_MARK(_value.func);
|
PK_OBJ_MARK(_value.func);
|
||||||
}
|
}
|
||||||
|
void* _value_ptr() override { return &_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -317,6 +327,7 @@ struct Py_<StarWrapper> final: PyObject {
|
|||||||
void _obj_gc_mark() override {
|
void _obj_gc_mark() override {
|
||||||
PK_OBJ_MARK(_value.obj);
|
PK_OBJ_MARK(_value.obj);
|
||||||
}
|
}
|
||||||
|
void* _value_ptr() override { return &_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -327,6 +338,7 @@ struct Py_<Property> final: PyObject {
|
|||||||
PK_OBJ_MARK(_value.getter);
|
PK_OBJ_MARK(_value.getter);
|
||||||
PK_OBJ_MARK(_value.setter);
|
PK_OBJ_MARK(_value.setter);
|
||||||
}
|
}
|
||||||
|
void* _value_ptr() override { return &_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -338,6 +350,7 @@ struct Py_<Slice> final: PyObject {
|
|||||||
PK_OBJ_MARK(_value.stop);
|
PK_OBJ_MARK(_value.stop);
|
||||||
PK_OBJ_MARK(_value.step);
|
PK_OBJ_MARK(_value.step);
|
||||||
}
|
}
|
||||||
|
void* _value_ptr() override { return &_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -348,6 +361,7 @@ struct Py_<Super> final: PyObject {
|
|||||||
void _obj_gc_mark() override {
|
void _obj_gc_mark() override {
|
||||||
PK_OBJ_MARK(_value.first);
|
PK_OBJ_MARK(_value.first);
|
||||||
}
|
}
|
||||||
|
void* _value_ptr() override { return &_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -356,6 +370,7 @@ struct Py_<DummyInstance> final: PyObject {
|
|||||||
enable_instance_dict();
|
enable_instance_dict();
|
||||||
}
|
}
|
||||||
void _obj_gc_mark() override {}
|
void _obj_gc_mark() override {}
|
||||||
|
void* _value_ptr() override { return nullptr; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -365,6 +380,7 @@ struct Py_<Type> final: PyObject {
|
|||||||
enable_instance_dict(kTypeAttrLoadFactor);
|
enable_instance_dict(kTypeAttrLoadFactor);
|
||||||
}
|
}
|
||||||
void _obj_gc_mark() override {}
|
void _obj_gc_mark() override {}
|
||||||
|
void* _value_ptr() override { return &_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
@ -373,6 +389,7 @@ struct Py_<DummyModule> final: PyObject {
|
|||||||
enable_instance_dict(kTypeAttrLoadFactor);
|
enable_instance_dict(kTypeAttrLoadFactor);
|
||||||
}
|
}
|
||||||
void _obj_gc_mark() override {}
|
void _obj_gc_mark() override {}
|
||||||
|
void* _value_ptr() override { return nullptr; }
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace pkpy
|
} // namespace pkpy
|
Loading…
x
Reference in New Issue
Block a user