ref.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #pragma once
  2. #include "obj.h"
  3. struct BaseRef {
  4. virtual PyVar get(VM*, Frame*) const = 0;
  5. virtual void set(VM*, Frame*, PyVar) const = 0;
  6. virtual void del(VM*, Frame*) const = 0;
  7. virtual ~BaseRef() = default;
  8. };
  9. enum NameScope {
  10. NAME_LOCAL = 0,
  11. NAME_GLOBAL,
  12. NAME_ATTR,
  13. NAME_SPECIAL,
  14. };
  15. struct NameRef : BaseRef {
  16. std::pair<Str, NameScope>* _pair;
  17. inline const Str& name() const { return _pair->first; }
  18. inline NameScope scope() const { return _pair->second; }
  19. NameRef(std::pair<Str, NameScope>& pair) : _pair(&pair) {}
  20. PyVar get(VM* vm, Frame* frame) const;
  21. void set(VM* vm, Frame* frame, PyVar val) const;
  22. void del(VM* vm, Frame* frame) const;
  23. };
  24. struct AttrRef : BaseRef {
  25. mutable PyVar obj;
  26. NameRef attr;
  27. AttrRef(PyVar obj, NameRef attr) : obj(obj), attr(attr) {}
  28. PyVar get(VM* vm, Frame* frame) const;
  29. void set(VM* vm, Frame* frame, PyVar val) const;
  30. void del(VM* vm, Frame* frame) const;
  31. };
  32. struct IndexRef : BaseRef {
  33. mutable PyVar obj;
  34. PyVar index;
  35. IndexRef(PyVar obj, PyVar index) : obj(obj), index(index) {}
  36. PyVar get(VM* vm, Frame* frame) const;
  37. void set(VM* vm, Frame* frame, PyVar val) const;
  38. void del(VM* vm, Frame* frame) const;
  39. };
  40. struct TupleRef : BaseRef {
  41. pkpy::Tuple objs;
  42. TupleRef(pkpy::Tuple&& objs) : objs(std::move(objs)) {}
  43. PyVar get(VM* vm, Frame* frame) const;
  44. void set(VM* vm, Frame* frame, PyVar val) const;
  45. void del(VM* vm, Frame* frame) const;
  46. };