mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 20:10:17 +00:00
71 lines
1.9 KiB
C++
71 lines
1.9 KiB
C++
#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(const 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;
|
|
}; |