| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #include "pocketpy/pocketpy.h"
- #include "pocketpy/common/utils.h"
- #include "pocketpy/objects/object.h"
- #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; }
- py_Ref py_getdict(py_Ref self, py_Name name) {
- assert(self && self->is_ptr);
- if(!py_ismagicname(name) || self->type != tp_type) {
- return NameDict__try_get(PyObject__dict(self->_obj), name);
- } else {
- py_Type* ud = py_touserdata(self);
- py_Ref slot = py_tpmagic(*ud, name);
- return py_isnil(slot) ? NULL : slot;
- }
- }
- void py_setdict(py_Ref self, py_Name name, py_Ref val) {
- assert(self && self->is_ptr);
- if(!py_ismagicname(name) || self->type != tp_type) {
- NameDict__set(PyObject__dict(self->_obj), name, *val);
- } else {
- py_Type* ud = py_touserdata(self);
- *py_tpmagic(*ud, name) = *val;
- }
- }
- py_TmpRef py_emplacedict(py_Ref self, py_Name name){
- py_setdict(self, name, py_NIL);
- return py_getdict(self, name);
- }
- bool py_deldict(py_Ref self, py_Name name) {
- assert(self && self->is_ptr);
- if(!py_ismagicname(name) || self->type != tp_type) {
- return NameDict__del(PyObject__dict(self->_obj), name);
- } else {
- py_Type* ud = py_touserdata(self);
- py_newnil(py_tpmagic(*ud, name));
- return true;
- }
- }
- 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;
- }
- void py_assign(py_Ref dst, py_Ref src) { *dst = *src; }
- /* Stack References */
- py_Ref py_peek(int i) {
- assert(i <= 0);
- return pk_current_vm->stack.sp + i;
- }
- void py_pop() {
- VM* vm = pk_current_vm;
- vm->stack.sp--;
- }
- void py_shrink(int n) {
- VM* vm = pk_current_vm;
- vm->stack.sp -= n;
- }
- void py_push(py_Ref src) {
- VM* vm = pk_current_vm;
- *vm->stack.sp++ = *src;
- }
- void py_pushnil() {
- VM* vm = pk_current_vm;
- py_newnil(vm->stack.sp++);
- }
- py_Ref py_pushtmp() {
- VM* vm = pk_current_vm;
- py_newnil(vm->stack.sp++);
- return py_peek(-1);
- }
|