mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-19 19:10:17 +00:00
64 lines
1.9 KiB
C
64 lines
1.9 KiB
C
#include "pocketpy/interpreter/vm.h"
|
|
|
|
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 py_Ref py_retval() { return &pk_current_vm->last_retval; }
|
|
|
|
PK_INLINE py_Ref py_getdict(py_Ref self, py_Name name) {
|
|
assert(self && self->is_ptr);
|
|
return NameDict__try_get(PyObject__dict(self->_obj), name);
|
|
}
|
|
|
|
PK_INLINE void py_setdict(py_Ref self, py_Name name, py_Ref val) {
|
|
assert(self && self->is_ptr);
|
|
NameDict__set(PyObject__dict(self->_obj), name, val);
|
|
}
|
|
|
|
bool py_deldict(py_Ref self, py_Name name) {
|
|
assert(self && self->is_ptr);
|
|
return NameDict__del(PyObject__dict(self->_obj), name);
|
|
}
|
|
|
|
py_ItemRef py_emplacedict(py_Ref self, py_Name name) {
|
|
py_setdict(self, name, py_NIL());
|
|
return py_getdict(self, name);
|
|
}
|
|
|
|
bool py_applydict(py_Ref self, bool (*f)(py_Name, py_Ref, void*), void* ctx) {
|
|
assert(self && self->is_ptr);
|
|
NameDict* dict = PyObject__dict(self->_obj);
|
|
for(int i = 0; i < dict->capacity; i++) {
|
|
NameDict_KV* kv = &dict->items[i];
|
|
if(kv->key == NULL) continue;
|
|
bool ok = f(kv->key, &kv->value, ctx);
|
|
if(!ok) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void py_cleardict(py_Ref self) {
|
|
assert(self && self->is_ptr);
|
|
NameDict* dict = PyObject__dict(self->_obj);
|
|
NameDict__clear(dict);
|
|
}
|
|
|
|
py_Ref py_getslot(py_Ref self, int i) {
|
|
assert(self && self->is_ptr);
|
|
assert(i >= 0 && i < self->_obj->slots);
|
|
return PyObject__slots(self->_obj) + i;
|
|
}
|
|
|
|
void py_setslot(py_Ref self, int i, py_Ref val) {
|
|
assert(self && self->is_ptr);
|
|
assert(i >= 0 && i < self->_obj->slots);
|
|
PyObject__slots(self->_obj)[i] = *val;
|
|
}
|
|
|
|
py_Ref py_getbuiltin(py_Name name) { return py_getdict(pk_current_vm->builtins, name); }
|
|
|
|
py_Ref py_getglobal(py_Name name) { return py_getdict(pk_current_vm->main, name); }
|
|
|
|
void py_setglobal(py_Name name, py_Ref val) { py_setdict(pk_current_vm->main, name, val); }
|