#pragma once #include "obj.h" class Frame; struct BasePointer { virtual PyVar get(VM*, Frame*) const = 0; virtual void set(VM*, Frame*, PyVar) const = 0; virtual void del(VM*, Frame*) const = 0; }; enum NameScope { NAME_LOCAL = 0, NAME_GLOBAL = 1, NAME_ATTR = 2, }; struct NamePointer : BasePointer { const _Str name; const NameScope scope; NamePointer(const _Str& name, NameScope scope) : name(name), scope(scope) {} bool operator==(const NamePointer& other) const { return name == other.name && scope == other.scope; } PyVar get(VM* vm, Frame* frame) const; void set(VM* vm, Frame* frame, PyVar val) const; void del(VM* vm, Frame* frame) const; }; struct AttrPointer : BasePointer { mutable PyVar obj; const NamePointer* attr; AttrPointer(PyVar obj, const NamePointer* attr) : obj(obj), attr(attr) {} PyVar get(VM* vm, Frame* frame) const; void set(VM* vm, Frame* frame, PyVar val) const; void del(VM* vm, Frame* frame) const; }; struct IndexPointer : BasePointer { mutable PyVar obj; const PyVar index; IndexPointer(PyVar obj, PyVar index) : obj(obj), index(index) {} PyVar get(VM* vm, Frame* frame) const; void set(VM* vm, Frame* frame, PyVar val) const; void del(VM* vm, Frame* frame) const; }; struct CompoundPointer : BasePointer { const std::vector<_Pointer> pointers; CompoundPointer(const std::vector<_Pointer>& pointers) : pointers(pointers) {} CompoundPointer(std::vector<_Pointer>&& pointers) : pointers(pointers) {} PyVar get(VM* vm, Frame* frame) const; void set(VM* vm, Frame* frame, PyVar val) const; void del(VM* vm, Frame* frame) const; }; struct UserPointer : BasePointer { const _Pointer p; uint64_t f_id; UserPointer(_Pointer p, uint64_t f_id) : p(p), f_id(f_id) {} PyVar get(VM* vm, Frame* frame) const; void set(VM* vm, Frame* frame, PyVar val) const; void del(VM* vm, Frame* frame) const; };