mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 12:00:18 +00:00
...
This commit is contained in:
parent
1107cea256
commit
fb9e3976e7
64
src/vm.h
64
src/vm.h
@ -105,8 +105,8 @@ struct PyTypeInfo{
|
|||||||
|
|
||||||
// indexer
|
// indexer
|
||||||
PyObject* (*m__getitem__)(VM* vm, PyObject*, PyObject*) = nullptr;
|
PyObject* (*m__getitem__)(VM* vm, PyObject*, PyObject*) = nullptr;
|
||||||
PyObject* (*m__setitem__)(VM* vm, PyObject*, PyObject*, PyObject*) = nullptr;
|
void (*m__setitem__)(VM* vm, PyObject*, PyObject*, PyObject*) = nullptr;
|
||||||
PyObject* (*m__delitem__)(VM* vm, PyObject*, PyObject*) = nullptr;
|
void (*m__delitem__)(VM* vm, PyObject*, PyObject*) = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FrameId{
|
struct FrameId{
|
||||||
@ -322,6 +322,28 @@ public:
|
|||||||
return &_all_types[obj->type];
|
return &_all_types[obj->type];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define BIND_UNARY_SPECIAL(name) \
|
||||||
|
void bind##name(Type type, PyObject* (*f)(VM* vm, PyObject*)){ \
|
||||||
|
PyObject* obj = _t(type); \
|
||||||
|
_all_types[type].m##name = f; \
|
||||||
|
bind_method<0>(obj, #name, [](VM* vm, ArgsView args){ \
|
||||||
|
return vm->_inst_type_info(args[0])->m##name(vm, args[0]); \
|
||||||
|
}); \
|
||||||
|
}
|
||||||
|
|
||||||
|
BIND_UNARY_SPECIAL(__repr__)
|
||||||
|
BIND_UNARY_SPECIAL(__str__)
|
||||||
|
BIND_UNARY_SPECIAL(__hash__)
|
||||||
|
BIND_UNARY_SPECIAL(__len__)
|
||||||
|
BIND_UNARY_SPECIAL(__iter__)
|
||||||
|
BIND_UNARY_SPECIAL(__next__)
|
||||||
|
BIND_UNARY_SPECIAL(__json__)
|
||||||
|
BIND_UNARY_SPECIAL(__neg__)
|
||||||
|
BIND_UNARY_SPECIAL(__bool__)
|
||||||
|
|
||||||
|
#undef BIND_UNARY_SPECIAL
|
||||||
|
|
||||||
|
|
||||||
#define BIND_LOGICAL_SPECIAL(name) \
|
#define BIND_LOGICAL_SPECIAL(name) \
|
||||||
void bind##name(Type type, bool (*f)(VM* vm, PyObject* lhs, PyObject* rhs)){ \
|
void bind##name(Type type, bool (*f)(VM* vm, PyObject* lhs, PyObject* rhs)){ \
|
||||||
PyObject* obj = _t(type); \
|
PyObject* obj = _t(type); \
|
||||||
@ -356,6 +378,44 @@ public:
|
|||||||
BIND_BINARY_SPECIAL(__sub__)
|
BIND_BINARY_SPECIAL(__sub__)
|
||||||
BIND_BINARY_SPECIAL(__mul__)
|
BIND_BINARY_SPECIAL(__mul__)
|
||||||
BIND_BINARY_SPECIAL(__truediv__)
|
BIND_BINARY_SPECIAL(__truediv__)
|
||||||
|
BIND_BINARY_SPECIAL(__floordiv__)
|
||||||
|
BIND_BINARY_SPECIAL(__mod__)
|
||||||
|
BIND_BINARY_SPECIAL(__pow__)
|
||||||
|
BIND_BINARY_SPECIAL(__matmul__)
|
||||||
|
|
||||||
|
BIND_BINARY_SPECIAL(__lshift__)
|
||||||
|
BIND_BINARY_SPECIAL(__rshift__)
|
||||||
|
BIND_BINARY_SPECIAL(__and__)
|
||||||
|
BIND_BINARY_SPECIAL(__or__)
|
||||||
|
BIND_BINARY_SPECIAL(__xor__)
|
||||||
|
|
||||||
|
#undef BIND_BINARY_SPECIAL
|
||||||
|
|
||||||
|
void bind__getitem__(Type type, PyObject* (*f)(VM* vm, PyObject* lhs, PyObject* rhs)){
|
||||||
|
PyObject* obj = _t(type);
|
||||||
|
_all_types[type].m__getitem__ = f;
|
||||||
|
bind_method<1>(obj, "__getitem__", [](VM* vm, ArgsView args){
|
||||||
|
return vm->_inst_type_info(args[0])->m__getitem__(vm, args[0], args[1]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void bind__setitem__(Type type, void (*f)(VM* vm, PyObject* lhs, PyObject* rhs, PyObject* value)){
|
||||||
|
PyObject* obj = _t(type);
|
||||||
|
_all_types[type].m__setitem__ = f;
|
||||||
|
bind_method<2>(obj, "__setitem__", [](VM* vm, ArgsView args){
|
||||||
|
vm->_inst_type_info(args[0])->m__setitem__(vm, args[0], args[1], args[2]);
|
||||||
|
return vm->None;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void bind__delitem__(Type type, void (*f)(VM* vm, PyObject* lhs, PyObject* rhs)){
|
||||||
|
PyObject* obj = _t(type);
|
||||||
|
_all_types[type].m__delitem__ = f;
|
||||||
|
bind_method<1>(obj, "__delitem__", [](VM* vm, ArgsView args){
|
||||||
|
vm->_inst_type_info(args[0])->m__delitem__(vm, args[0], args[1]);
|
||||||
|
return vm->None;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
bool py_equals(PyObject* lhs, PyObject* rhs){
|
bool py_equals(PyObject* lhs, PyObject* rhs){
|
||||||
if(lhs == rhs) return true;
|
if(lhs == rhs) return true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user