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
|
||||
PyObject* (*m__getitem__)(VM* vm, PyObject*, PyObject*) = nullptr;
|
||||
PyObject* (*m__setitem__)(VM* vm, PyObject*, PyObject*, PyObject*) = nullptr;
|
||||
PyObject* (*m__delitem__)(VM* vm, PyObject*, PyObject*) = nullptr;
|
||||
void (*m__setitem__)(VM* vm, PyObject*, PyObject*, PyObject*) = nullptr;
|
||||
void (*m__delitem__)(VM* vm, PyObject*, PyObject*) = nullptr;
|
||||
};
|
||||
|
||||
struct FrameId{
|
||||
@ -322,6 +322,28 @@ public:
|
||||
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) \
|
||||
void bind##name(Type type, bool (*f)(VM* vm, PyObject* lhs, PyObject* rhs)){ \
|
||||
PyObject* obj = _t(type); \
|
||||
@ -356,6 +378,44 @@ public:
|
||||
BIND_BINARY_SPECIAL(__sub__)
|
||||
BIND_BINARY_SPECIAL(__mul__)
|
||||
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){
|
||||
if(lhs == rhs) return true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user