| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- #pragma once
- #include "obj.h"
- 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,
- NAME_ATTR,
- NAME_SPECIAL,
- };
- 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;
- };
|