mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 20:10:17 +00:00
57 lines
1.5 KiB
C++
57 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include "obj.h"
|
|
|
|
class Frame;
|
|
|
|
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 = 1,
|
|
NAME_ATTR = 2,
|
|
};
|
|
|
|
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;
|
|
}; |