#pragma once #include "obj.h" class Frame; struct BaseRef { virtual PyVar get(VM*, Frame*) const = 0; virtual void set(VM*, Frame*, PyVar) const = 0; virtual void del(VM*, Frame*) const = 0; virtual ~BaseRef() = default; }; enum NameScope { NAME_LOCAL = 0, NAME_GLOBAL = 1, NAME_ATTR = 2, }; struct NameRef : BaseRef { const std::pair<_Str, NameScope>* pair; NameRef(const std::pair<_Str, NameScope>& pair) : pair(&pair) {} PyVar get(VM* vm, Frame* frame) const; void set(VM* vm, Frame* frame, PyVar val) const; void del(VM* vm, Frame* frame) const; }; struct AttrRef : BaseRef { mutable PyVar obj; const NameRef attr; AttrRef(PyVar obj, const NameRef 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 IndexRef : BaseRef { mutable PyVar obj; PyVar index; IndexRef(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 TupleRef : BaseRef { PyVarList varRefs; TupleRef(const PyVarList& varRefs) : varRefs(varRefs) {} TupleRef(PyVarList&& varRefs) : varRefs(std::move(varRefs)) {} PyVar get(VM* vm, Frame* frame) const; void set(VM* vm, Frame* frame, PyVar val) const; void del(VM* vm, Frame* frame) const; };