diff --git a/c_bindings/pocketpy_c.cpp b/c_bindings/pocketpy_c.cpp index aa5490e7..07d3ab93 100644 --- a/c_bindings/pocketpy_c.cpp +++ b/c_bindings/pocketpy_c.cpp @@ -614,4 +614,11 @@ bool pkpy_eval(pkpy_vm* vm_handle, const char* code) { vm->c_data->push(ret); ERRHANDLER_CLOSE return true; +} + +void* pkpy_get_id(pkpy_vm* vm_handle, int index) { + CVM* vm = (CVM*) vm_handle; + index = lua_to_cstack_index(index, vm->c_data->size()); + PyObject* o = vm->c_data->begin()[index]; + return (void*) o; } \ No newline at end of file diff --git a/c_bindings/pocketpy_c.h b/c_bindings/pocketpy_c.h index 22706e6e..f7f44ba8 100644 --- a/c_bindings/pocketpy_c.h +++ b/c_bindings/pocketpy_c.h @@ -114,6 +114,8 @@ PK_EXPORT bool pkpy_getattr(pkpy_vm*, const char* name); PK_EXPORT bool pkpy_setattr(pkpy_vm*, const char* name); PK_EXPORT bool pkpy_eval(pkpy_vm*, const char* source); +PK_EXPORT void* pkpy_get_id(pkpy_vm*, int index); + #ifdef __cplusplus } #endif diff --git a/src/cffi.h b/src/cffi.h index ce87a661..221e517e 100644 --- a/src/cffi.h +++ b/src/cffi.h @@ -75,6 +75,11 @@ struct VoidP{ return _CAST(VoidP&, lhs).ptr <= CAST(VoidP&, rhs).ptr; }); + vm->bind__hash__(OBJ_GET(Type, type), [](VM* vm, PyObject* obj){ + VoidP& self = _CAST(VoidP&, obj); + return reinterpret_cast(self.ptr); + }); + vm->bind_method<1>(type, "set_base_offset", [](VM* vm, ArgsView args){ VoidP& self = _CAST(VoidP&, args[0]); if(is_non_tagged_type(args[1], vm->tp_str)){ diff --git a/src/pocketpy.h b/src/pocketpy.h index 88e3763d..4191e77f 100644 --- a/src/pocketpy.h +++ b/src/pocketpy.h @@ -100,8 +100,8 @@ inline void init_builtins(VM* _vm) { _vm->bind_builtin_func<1>("id", [](VM* vm, ArgsView args) { PyObject* obj = args[0]; - if(is_tagged(obj)) return VAR((i64)0); - return VAR(BITS(obj)); + if(is_tagged(obj)) return vm->None; + return VAR_T(VoidP, obj); }); _vm->bind_builtin_func<2>("divmod", [](VM* vm, ArgsView args) {