| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #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(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;
- };
|