mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-22 20:40:18 +00:00
up
This commit is contained in:
parent
6bd05dede8
commit
c3b9a8b3c5
@ -60,7 +60,7 @@ os.system("rm pocketpy")
|
|||||||
|
|
||||||
os.system("cp amalgamated/pocketpy.h plugins/flutter/src/pocketpy.h")
|
os.system("cp amalgamated/pocketpy.h plugins/flutter/src/pocketpy.h")
|
||||||
|
|
||||||
unity_ios_header = 'plugins/unity/My project/Assets/com.bl.pocketpy/Plugins/iOS/pocketpy.h'
|
unity_ios_header = 'plugins/unity/PocketPyUnityPlugin/Assets/com.bl.pocketpy/Plugins/Src/pocketpy.h'
|
||||||
os.system(f'cp amalgamated/pocketpy.h "{unity_ios_header}"')
|
os.system(f'cp amalgamated/pocketpy.h "{unity_ios_header}"')
|
||||||
|
|
||||||
if os.path.exists("plugins/godot/godot-cpp/pocketpy"):
|
if os.path.exists("plugins/godot/godot-cpp/pocketpy"):
|
||||||
|
@ -1857,9 +1857,7 @@ namespace pkpy{
|
|||||||
shared_ptr(shared_ptr&& other) noexcept : counter(other.counter) {
|
shared_ptr(shared_ptr&& other) noexcept : counter(other.counter) {
|
||||||
other.counter = nullptr;
|
other.counter = nullptr;
|
||||||
}
|
}
|
||||||
~shared_ptr() {
|
~shared_ptr() { _dec_counter(); }
|
||||||
_dec_counter();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const shared_ptr& other) const {
|
bool operator==(const shared_ptr& other) const {
|
||||||
return counter == other.counter;
|
return counter == other.counter;
|
||||||
@ -1891,18 +1889,11 @@ namespace pkpy{
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
T& operator*() const {
|
T& operator*() const { return *_t(); }
|
||||||
return *_t();
|
T* operator->() const { return _t(); }
|
||||||
}
|
T* get() const { return _t(); }
|
||||||
T* operator->() const {
|
int use_count() const { return counter ? *counter : 0; }
|
||||||
return _t();
|
|
||||||
}
|
|
||||||
T* get() const {
|
|
||||||
return _t();
|
|
||||||
}
|
|
||||||
int use_count() const {
|
|
||||||
return counter ? *counter : 0;
|
|
||||||
}
|
|
||||||
void reset(){
|
void reset(){
|
||||||
_dec_counter();
|
_dec_counter();
|
||||||
counter = nullptr;
|
counter = nullptr;
|
||||||
@ -1915,7 +1906,8 @@ namespace pkpy{
|
|||||||
|
|
||||||
template <typename T, typename U, typename... Args>
|
template <typename T, typename U, typename... Args>
|
||||||
shared_ptr<T> make_shared(Args&&... args) {
|
shared_ptr<T> make_shared(Args&&... args) {
|
||||||
static_assert(std::is_base_of<T, U>::value, "U must be derived from T");
|
static_assert(std::is_base_of_v<T, U>, "U must be derived from T");
|
||||||
|
static_assert(std::has_virtual_destructor_v<T>, "T must have virtual destructor");
|
||||||
int* p = (int*)malloc(sizeof(int) + sizeof(U));
|
int* p = (int*)malloc(sizeof(int) + sizeof(U));
|
||||||
*p = 1;
|
*p = 1;
|
||||||
new(p+1) U(std::forward<Args>(args)...);
|
new(p+1) U(std::forward<Args>(args)...);
|
||||||
@ -2898,15 +2890,16 @@ struct PyObject {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct Py_ : PyObject {
|
struct Py_ : PyObject {
|
||||||
T _valueT;
|
T _value;
|
||||||
|
|
||||||
Py_(T val, const PyVar& type) : PyObject(type), _valueT(val) {}
|
Py_(const PyVar& type, T val) : PyObject(type), _value(val) {}
|
||||||
virtual void* value() override { return &_valueT; }
|
virtual void* value() override { return &_value; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#define UNION_GET(T, obj) (((Py_<T>*)((obj).get()))->_valueT)
|
//#define OBJ_GET(T, obj) (((Py_<T>*)((obj).get()))->_value)
|
||||||
#define UNION_NAME(obj) UNION_GET(_Str, (obj)->attribs[__name__])
|
#define OBJ_GET(T, obj) (*static_cast<T*>((obj)->value()))
|
||||||
#define UNION_TP_NAME(obj) UNION_GET(_Str, (obj)->type->attribs[__name__])
|
#define OBJ_NAME(obj) OBJ_GET(_Str, (obj)->attribs[__name__])
|
||||||
|
#define OBJ_TP_NAME(obj) OBJ_GET(_Str, (obj)->type->attribs[__name__])
|
||||||
|
|
||||||
|
|
||||||
class RangeIterator : public BaseIterator {
|
class RangeIterator : public BaseIterator {
|
||||||
@ -2915,7 +2908,7 @@ private:
|
|||||||
_Range r;
|
_Range r;
|
||||||
public:
|
public:
|
||||||
RangeIterator(VM* vm, PyVar _ref) : BaseIterator(vm, _ref) {
|
RangeIterator(VM* vm, PyVar _ref) : BaseIterator(vm, _ref) {
|
||||||
this->r = UNION_GET(_Range, _ref);
|
this->r = OBJ_GET(_Range, _ref);
|
||||||
this->current = r.start;
|
this->current = r.start;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2936,7 +2929,7 @@ private:
|
|||||||
const PyVarList* vec;
|
const PyVarList* vec;
|
||||||
public:
|
public:
|
||||||
VectorIterator(VM* vm, PyVar _ref) : BaseIterator(vm, _ref) {
|
VectorIterator(VM* vm, PyVar _ref) : BaseIterator(vm, _ref) {
|
||||||
vec = &UNION_GET(PyVarList, _ref);
|
vec = &OBJ_GET(PyVarList, _ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasNext(){
|
bool hasNext(){
|
||||||
@ -2954,7 +2947,7 @@ private:
|
|||||||
_Str str;
|
_Str str;
|
||||||
public:
|
public:
|
||||||
StringIterator(VM* vm, PyVar _ref) : BaseIterator(vm, _ref) {
|
StringIterator(VM* vm, PyVar _ref) : BaseIterator(vm, _ref) {
|
||||||
str = UNION_GET(_Str, _ref);
|
str = OBJ_GET(_Str, _ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasNext(){
|
bool hasNext(){
|
||||||
@ -3621,7 +3614,7 @@ struct Frame {
|
|||||||
_StrStream ss;
|
_StrStream ss;
|
||||||
ss << "[";
|
ss << "[";
|
||||||
for(int i=0; i<_data.size(); i++){
|
for(int i=0; i<_data.size(); i++){
|
||||||
ss << UNION_TP_NAME(_data[i]);
|
ss << OBJ_TP_NAME(_data[i]);
|
||||||
if(i != _data.size()-1) ss << ", ";
|
if(i != _data.size()-1) ss << ", ";
|
||||||
}
|
}
|
||||||
ss << "]";
|
ss << "]";
|
||||||
@ -3735,7 +3728,7 @@ struct Frame {
|
|||||||
#define __DEF_PY_AS_C(type, ctype, ptype) \
|
#define __DEF_PY_AS_C(type, ctype, ptype) \
|
||||||
inline ctype& Py##type##_AS_C(const PyVar& obj) { \
|
inline ctype& Py##type##_AS_C(const PyVar& obj) { \
|
||||||
check_type(obj, ptype); \
|
check_type(obj, ptype); \
|
||||||
return UNION_GET(ctype, obj); \
|
return OBJ_GET(ctype, obj); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __DEF_PY(type, ctype, ptype) \
|
#define __DEF_PY(type, ctype, ptype) \
|
||||||
@ -3982,7 +3975,7 @@ class VM {
|
|||||||
PyIter_AS_C(tmp)->var = var;
|
PyIter_AS_C(tmp)->var = var;
|
||||||
frame->push(std::move(tmp));
|
frame->push(std::move(tmp));
|
||||||
}else{
|
}else{
|
||||||
typeError("'" + UNION_TP_NAME(obj) + "' object is not iterable");
|
typeError("'" + OBJ_TP_NAME(obj) + "' object is not iterable");
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case OP_FOR_ITER:
|
case OP_FOR_ITER:
|
||||||
@ -4111,7 +4104,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
PyVar asRepr(const PyVar& obj){
|
PyVar asRepr(const PyVar& obj){
|
||||||
if(obj->is_type(_tp_type)) return PyStr("<class '" + UNION_GET(_Str, obj->attribs[__name__]) + "'>");
|
if(obj->is_type(_tp_type)) return PyStr("<class '" + OBJ_GET(_Str, obj->attribs[__name__]) + "'>");
|
||||||
return call(obj, __repr__);
|
return call(obj, __repr__);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4181,7 +4174,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if((*callable)->is_type(_tp_native_function)){
|
if((*callable)->is_type(_tp_native_function)){
|
||||||
const auto& f = UNION_GET(_CppFunc, *callable);
|
const auto& f = OBJ_GET(_CppFunc, *callable);
|
||||||
// _CppFunc do not support kwargs
|
// _CppFunc do not support kwargs
|
||||||
return f(this, args);
|
return f(this, args);
|
||||||
} else if((*callable)->is_type(_tp_function)){
|
} else if((*callable)->is_type(_tp_function)){
|
||||||
@ -4241,7 +4234,7 @@ public:
|
|||||||
}
|
}
|
||||||
return _exec(fn->code, _module, _locals);
|
return _exec(fn->code, _module, _locals);
|
||||||
}
|
}
|
||||||
typeError("'" + UNION_TP_NAME(*callable) + "' object is not callable");
|
typeError("'" + OBJ_TP_NAME(*callable) + "' object is not callable");
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4315,10 +4308,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
PyVar new_user_type_object(PyVar mod, _Str name, PyVar base){
|
PyVar new_user_type_object(PyVar mod, _Str name, PyVar base){
|
||||||
PyVar obj = pkpy::make_shared<PyObject, Py_<i64>>(DUMMY_VAL, _tp_type);
|
PyVar obj = pkpy::make_shared<PyObject, Py_<i64>>(_tp_type, DUMMY_VAL);
|
||||||
setattr(obj, __base__, base);
|
setattr(obj, __base__, base);
|
||||||
_Str fullName = name;
|
_Str fullName = name;
|
||||||
if(mod != builtins) fullName = UNION_NAME(mod) + "." + name;
|
if(mod != builtins) fullName = OBJ_NAME(mod) + "." + name;
|
||||||
setattr(obj, __name__, PyStr(fullName));
|
setattr(obj, __name__, PyStr(fullName));
|
||||||
setattr(mod, name, obj);
|
setattr(mod, name, obj);
|
||||||
return obj;
|
return obj;
|
||||||
@ -4326,7 +4319,7 @@ public:
|
|||||||
|
|
||||||
PyVar new_type_object(_Str name, PyVar base=nullptr) {
|
PyVar new_type_object(_Str name, PyVar base=nullptr) {
|
||||||
if(base == nullptr) base = _tp_object;
|
if(base == nullptr) base = _tp_object;
|
||||||
PyVar obj = pkpy::make_shared<PyObject, Py_<i64>>(DUMMY_VAL, _tp_type);
|
PyVar obj = pkpy::make_shared<PyObject, Py_<i64>>(_tp_type, DUMMY_VAL);
|
||||||
setattr(obj, __base__, base);
|
setattr(obj, __base__, base);
|
||||||
_types[name] = obj;
|
_types[name] = obj;
|
||||||
return obj;
|
return obj;
|
||||||
@ -4335,7 +4328,7 @@ public:
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
inline PyVar new_object(PyVar type, T _value) {
|
inline PyVar new_object(PyVar type, T _value) {
|
||||||
if(!type->is_type(_tp_type)) UNREACHABLE();
|
if(!type->is_type(_tp_type)) UNREACHABLE();
|
||||||
return pkpy::make_shared<PyObject, Py_<T>>(_value, type);
|
return pkpy::make_shared<PyObject, Py_<T>>(type, _value);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename... Args>
|
template<typename T, typename... Args>
|
||||||
@ -4364,7 +4357,7 @@ public:
|
|||||||
const PyVar* root = &obj;
|
const PyVar* root = &obj;
|
||||||
int depth = 1;
|
int depth = 1;
|
||||||
while(true){
|
while(true){
|
||||||
root = &UNION_GET(PyVar, *root);
|
root = &OBJ_GET(PyVar, *root);
|
||||||
if(!(*root)->is_type(_tp_super)) break;
|
if(!(*root)->is_type(_tp_super)) break;
|
||||||
depth++;
|
depth++;
|
||||||
}
|
}
|
||||||
@ -4398,7 +4391,7 @@ public:
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
inline void setattr(PyVar& obj, const _Str& name, T&& value) {
|
inline void setattr(PyVar& obj, const _Str& name, T&& value) {
|
||||||
PyObject* p = obj.get();
|
PyObject* p = obj.get();
|
||||||
while(p->is_type(_tp_super)) p = ((Py_<PyVar>*)p)->_valueT.get();
|
while(p->is_type(_tp_super)) p = static_cast<PyVar*>(p->value())->get();
|
||||||
p->attribs[name] = std::forward<T>(value);
|
p->attribs[name] = std::forward<T>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4439,7 +4432,7 @@ public:
|
|||||||
}else if(obj->is_type(_tp_float)){
|
}else if(obj->is_type(_tp_float)){
|
||||||
return PyFloat_AS_C(obj);
|
return PyFloat_AS_C(obj);
|
||||||
}
|
}
|
||||||
typeError("expected int or float, got " + UNION_TP_NAME(obj));
|
typeError("expected int or float, got " + OBJ_TP_NAME(obj));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4566,8 +4559,8 @@ public:
|
|||||||
inline const PyVar& PyBool(bool value){return value ? True : False;}
|
inline const PyVar& PyBool(bool value){return value ? True : False;}
|
||||||
|
|
||||||
void initializeBuiltinClasses(){
|
void initializeBuiltinClasses(){
|
||||||
_tp_object = pkpy::make_shared<PyObject, Py_<i64>>(DUMMY_VAL, nullptr);
|
_tp_object = pkpy::make_shared<PyObject, Py_<i64>>(nullptr, DUMMY_VAL);
|
||||||
_tp_type = pkpy::make_shared<PyObject, Py_<i64>>(DUMMY_VAL, nullptr);
|
_tp_type = pkpy::make_shared<PyObject, Py_<i64>>(nullptr, DUMMY_VAL);
|
||||||
_types["object"] = _tp_object;
|
_types["object"] = _tp_object;
|
||||||
_types["type"] = _tp_type;
|
_types["type"] = _tp_type;
|
||||||
|
|
||||||
@ -4629,7 +4622,7 @@ public:
|
|||||||
}
|
}
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
typeError("unhashable type: " + UNION_TP_NAME(obj));
|
typeError("unhashable type: " + OBJ_TP_NAME(obj));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4662,11 +4655,11 @@ public:
|
|||||||
void nameError(const _Str& name){ _error("NameError", "name '" + name + "' is not defined"); }
|
void nameError(const _Str& name){ _error("NameError", "name '" + name + "' is not defined"); }
|
||||||
|
|
||||||
void attributeError(PyVar obj, const _Str& name){
|
void attributeError(PyVar obj, const _Str& name){
|
||||||
_error("AttributeError", "type '" + UNION_TP_NAME(obj) + "' has no attribute '" + name + "'");
|
_error("AttributeError", "type '" + OBJ_TP_NAME(obj) + "' has no attribute '" + name + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void check_type(const PyVar& obj, const PyVar& type){
|
inline void check_type(const PyVar& obj, const PyVar& type){
|
||||||
if(!obj->is_type(type)) typeError("expected '" + UNION_NAME(type) + "', but got '" + UNION_TP_NAME(obj) + "'");
|
if(!obj->is_type(type)) typeError("expected '" + OBJ_NAME(type) + "', but got '" + OBJ_TP_NAME(obj) + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
~VM() {
|
~VM() {
|
||||||
@ -4769,7 +4762,7 @@ void TupleRef::set(VM* vm, Frame* frame, PyVar val) const{
|
|||||||
if(!val->is_type(vm->_tp_tuple) && !val->is_type(vm->_tp_list)){
|
if(!val->is_type(vm->_tp_tuple) && !val->is_type(vm->_tp_list)){
|
||||||
vm->typeError("only tuple or list can be unpacked");
|
vm->typeError("only tuple or list can be unpacked");
|
||||||
}
|
}
|
||||||
const PyVarList& args = UNION_GET(PyVarList, val);
|
const PyVarList& args = OBJ_GET(PyVarList, val);
|
||||||
if(args.size() > varRefs.size()) vm->valueError("too many values to unpack");
|
if(args.size() > varRefs.size()) vm->valueError("too many values to unpack");
|
||||||
if(args.size() < varRefs.size()) vm->valueError("not enough values to unpack");
|
if(args.size() < varRefs.size()) vm->valueError("not enough values to unpack");
|
||||||
for (int i = 0; i < varRefs.size(); i++) {
|
for (int i = 0; i < varRefs.size(); i++) {
|
||||||
@ -6063,7 +6056,7 @@ void __initializeBuiltinFunctions(VM* _vm) {
|
|||||||
PyVar _self = args[0];
|
PyVar _self = args[0];
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << std::hex << (uintptr_t)_self.get();
|
ss << std::hex << (uintptr_t)_self.get();
|
||||||
_Str s = "<" + UNION_TP_NAME(_self) + " object at 0x" + ss.str() + ">";
|
_Str s = "<" + OBJ_TP_NAME(_self) + " object at 0x" + ss.str() + ">";
|
||||||
return vm->PyStr(s);
|
return vm->PyStr(s);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -6511,16 +6504,16 @@ struct ReMatch {
|
|||||||
|
|
||||||
static PyVar _bind(VM* vm){
|
static PyVar _bind(VM* vm){
|
||||||
PyVar _tp_match = vm->new_user_type_object(vm->_modules["re"], "Match", vm->_tp_object);
|
PyVar _tp_match = vm->new_user_type_object(vm->_modules["re"], "Match", vm->_tp_object);
|
||||||
vm->bindMethod<0>(_tp_match, "start", CPP_LAMBDA(vm->PyInt(UNION_GET(ReMatch, args[0]).start)));
|
vm->bindMethod<0>(_tp_match, "start", CPP_LAMBDA(vm->PyInt(OBJ_GET(ReMatch, args[0]).start)));
|
||||||
vm->bindMethod<0>(_tp_match, "end", CPP_LAMBDA(vm->PyInt(UNION_GET(ReMatch, args[0]).end)));
|
vm->bindMethod<0>(_tp_match, "end", CPP_LAMBDA(vm->PyInt(OBJ_GET(ReMatch, args[0]).end)));
|
||||||
|
|
||||||
vm->bindMethod<0>(_tp_match, "span", [](VM* vm, const pkpy::Args& args) {
|
vm->bindMethod<0>(_tp_match, "span", [](VM* vm, const pkpy::Args& args) {
|
||||||
auto& m = UNION_GET(ReMatch, args[0]);
|
auto& m = OBJ_GET(ReMatch, args[0]);
|
||||||
return vm->PyTuple({ vm->PyInt(m.start), vm->PyInt(m.end) });
|
return vm->PyTuple({ vm->PyInt(m.start), vm->PyInt(m.end) });
|
||||||
});
|
});
|
||||||
|
|
||||||
vm->bindMethod<1>(_tp_match, "group", [](VM* vm, const pkpy::Args& args) {
|
vm->bindMethod<1>(_tp_match, "group", [](VM* vm, const pkpy::Args& args) {
|
||||||
auto& m = UNION_GET(ReMatch, args[0]);
|
auto& m = OBJ_GET(ReMatch, args[0]);
|
||||||
int index = (int)vm->PyInt_AS_C(args[1]);
|
int index = (int)vm->PyInt_AS_C(args[1]);
|
||||||
index = vm->normalized_index(index, m.m.size());
|
index = vm->normalized_index(index, m.m.size());
|
||||||
return vm->PyStr(m.m[index].str());
|
return vm->PyStr(m.m[index].str());
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 2c358833fee58406c777d02c80e540e9b6030367
|
Subproject commit 41884cdc2770bca9e9b3feb5d277d5fb0176454c
|
Loading…
x
Reference in New Issue
Block a user