pointer.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #pragma once
  2. #include "obj.h"
  3. class Frame;
  4. struct BasePointer {
  5. virtual PyVar get(VM*, Frame*) const = 0;
  6. virtual void set(VM*, Frame*, PyVar) const = 0;
  7. virtual void del(VM*, Frame*) const = 0;
  8. };
  9. enum NameScope {
  10. NAME_LOCAL = 0,
  11. NAME_GLOBAL = 1,
  12. NAME_ATTR = 2,
  13. };
  14. struct NamePointer : BasePointer {
  15. const _Str name;
  16. const NameScope scope;
  17. NamePointer(const _Str& name, NameScope scope) : name(name), scope(scope) {}
  18. bool operator==(const NamePointer& other) const {
  19. return name == other.name && scope == other.scope;
  20. }
  21. PyVar get(VM* vm, Frame* frame) const;
  22. void set(VM* vm, Frame* frame, PyVar val) const;
  23. void del(VM* vm, Frame* frame) const;
  24. };
  25. struct AttrPointer : BasePointer {
  26. mutable PyVar obj;
  27. const NamePointer* attr;
  28. AttrPointer(PyVar obj, const NamePointer* attr) : obj(obj), attr(attr) {}
  29. PyVar get(VM* vm, Frame* frame) const;
  30. void set(VM* vm, Frame* frame, PyVar val) const;
  31. void del(VM* vm, Frame* frame) const;
  32. };
  33. struct IndexPointer : BasePointer {
  34. mutable PyVar obj;
  35. const PyVar index;
  36. IndexPointer(PyVar obj, PyVar index) : obj(obj), index(index) {}
  37. PyVar get(VM* vm, Frame* frame) const;
  38. void set(VM* vm, Frame* frame, PyVar val) const;
  39. void del(VM* vm, Frame* frame) const;
  40. };
  41. struct CompoundPointer : BasePointer {
  42. const std::vector<_Pointer> pointers;
  43. CompoundPointer(std::vector<_Pointer> pointers) : pointers(pointers) {}
  44. CompoundPointer(std::vector<_Pointer>&& pointers) : pointers(pointers) {}
  45. PyVar get(VM* vm, Frame* frame) const;
  46. void set(VM* vm, Frame* frame, PyVar val) const;
  47. void del(VM* vm, Frame* frame) const;
  48. };
  49. struct UserPointer : BasePointer {
  50. const _Pointer p;
  51. uint64_t f_id;
  52. UserPointer(_Pointer p, uint64_t f_id) : p(p), f_id(f_id) {}
  53. PyVar get(VM* vm, Frame* frame) const;
  54. void set(VM* vm, Frame* frame, PyVar val) const;
  55. void del(VM* vm, Frame* frame) const;
  56. };