pocketpy/src/public/DictSlots.c
2025-09-08 15:41:44 +08:00

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); }