diff --git a/include/pocketpy/interpreter/vm.h b/include/pocketpy/interpreter/vm.h index 7b3512de..a124bae5 100644 --- a/include/pocketpy/interpreter/vm.h +++ b/include/pocketpy/interpreter/vm.h @@ -58,8 +58,8 @@ typedef struct VM { int recursion_depth; int max_recursion_depth; - py_TValue reg[8]; // users' registers - void* ctx; // user-defined context + py_TValue reg[14]; // users' registers + void* ctx; // user-defined context CachedNames cached_names; diff --git a/include/pocketpy/pocketpy.h b/include/pocketpy/pocketpy.h index f42a7799..5cbf5fe8 100644 --- a/include/pocketpy/pocketpy.h +++ b/include/pocketpy/pocketpy.h @@ -441,6 +441,13 @@ PK_API py_GlobalRef py_retval(); #define py_r6() py_getreg(6) #define py_r7() py_getreg(7) +#define py_tmpr0() py_getreg(8) +#define py_tmpr1() py_getreg(9) +#define py_tmpr2() py_getreg(10) +#define py_tmpr3() py_getreg(11) +#define py_sysr0() py_getreg(12) // for debugger +#define py_sysr1() py_getreg(13) // for pybind11 + /// Get an item from the object's `__dict__`. /// Return `NULL` if not found. PK_API py_ItemRef py_getdict(py_Ref self, py_Name name); diff --git a/include/pybind11/internal/kernel.h b/include/pybind11/internal/kernel.h index ddabe830..fdfb7ee6 100644 --- a/include/pybind11/internal/kernel.h +++ b/include/pybind11/internal/kernel.h @@ -44,8 +44,7 @@ struct object_pool { }; static void initialize(int size) noexcept { - // use 8th register. - pool = py_getreg(7); + pool = py_sysr1(); py_newtuple(pool, size); indices_ = new std::vector(size, 0); } diff --git a/src/debugger/core.c b/src/debugger/core.c index d4aeb485..f06d9219 100644 --- a/src/debugger/core.c +++ b/src/debugger/core.c @@ -46,7 +46,7 @@ static struct c11_debugger { c11_vector py_frames; c11_smallmap_d2index scopes_query_cache; -#define python_vars py_r7() +#define python_vars py_sysr0() } debugger; diff --git a/src/interpreter/vm.c b/src/interpreter/vm.c index 89e38ea8..22852942 100644 --- a/src/interpreter/vm.c +++ b/src/interpreter/vm.c @@ -99,6 +99,8 @@ void VM__ctor(VM* self) { self->recursion_depth = 0; self->max_recursion_depth = 1000; + memset(self->reg, 0, sizeof(self->reg)); + self->ctx = NULL; self->curr_class = NULL; self->curr_decl_based_function = NULL; diff --git a/src/interpreter/vmx.c b/src/interpreter/vmx.c index 75e1960f..28d19c5f 100644 --- a/src/interpreter/vmx.c +++ b/src/interpreter/vmx.c @@ -114,10 +114,8 @@ py_Ref py_name2ref(py_Name name) { py_Ref res = CachedNames__try_get(d, name); if(res != NULL) return res; // not found, create a new one - py_StackRef tmp = py_pushtmp(); - py_newstrv(tmp, py_name2sv(name)); - CachedNames__set(d, name, tmp); - py_pop(); + py_newstrv(py_tmpr0(), py_name2sv(name)); + CachedNames__set(d, name, py_tmpr0()); return CachedNames__try_get(d, name); } diff --git a/src/public/DictSlots.c b/src/public/DictSlots.c index 620df4fd..0aca4482 100644 --- a/src/public/DictSlots.c +++ b/src/public/DictSlots.c @@ -1,8 +1,8 @@ #include "pocketpy/interpreter/vm.h" -py_Ref py_getreg(int i) { return pk_current_vm->reg + i; } +PK_INLINE py_Ref py_getreg(int i) { return pk_current_vm->reg + i; } -void py_setreg(int i, py_Ref val) { pk_current_vm->reg[i] = *val; } +PK_INLINE void py_setreg(int i, py_Ref val) { pk_current_vm->reg[i] = *val; } PK_INLINE py_Ref py_retval() { return &pk_current_vm->last_retval; }