mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +00:00
up
This commit is contained in:
parent
2f38cadf27
commit
2cd5d46ee9
@ -41,7 +41,7 @@ struct CodeObject {
|
|||||||
|
|
||||||
std::vector<ByteCode> co_code;
|
std::vector<ByteCode> co_code;
|
||||||
PyVarList co_consts;
|
PyVarList co_consts;
|
||||||
std::vector<std::shared_ptr<NamePointer>> co_names;
|
std::vector<NamePointer> co_names;
|
||||||
std::vector<_Str> co_global_names;
|
std::vector<_Str> co_global_names;
|
||||||
|
|
||||||
// for goto use
|
// for goto use
|
||||||
@ -61,9 +61,9 @@ struct CodeObject {
|
|||||||
if(scope == NAME_LOCAL && std::find(co_global_names.begin(), co_global_names.end(), name) != co_global_names.end()){
|
if(scope == NAME_LOCAL && std::find(co_global_names.begin(), co_global_names.end(), name) != co_global_names.end()){
|
||||||
scope = NAME_GLOBAL;
|
scope = NAME_GLOBAL;
|
||||||
}
|
}
|
||||||
auto p = std::make_shared<NamePointer>(name, scope);
|
auto p = NamePointer(name, scope);
|
||||||
for(int i=0; i<co_names.size(); i++){
|
for(int i=0; i<co_names.size(); i++){
|
||||||
if(*co_names[i] == *p) return i;
|
if(co_names[i] == p) return i;
|
||||||
}
|
}
|
||||||
co_names.push_back(p);
|
co_names.push_back(p);
|
||||||
return co_names.size() - 1;
|
return co_names.size() - 1;
|
||||||
@ -108,7 +108,7 @@ struct CodeObject {
|
|||||||
_StrStream names;
|
_StrStream names;
|
||||||
names << "co_names: ";
|
names << "co_names: ";
|
||||||
for(int i=0; i<co_names.size(); i++){
|
for(int i=0; i<co_names.size(); i++){
|
||||||
names << co_names[i]->name;
|
names << co_names[i].name;
|
||||||
if(i != co_names.size() - 1) names << ", ";
|
if(i != co_names.size() - 1) names << ", ";
|
||||||
}
|
}
|
||||||
ss << '\n' << consts.str() << '\n' << names.str() << '\n';
|
ss << '\n' << consts.str() << '\n' << names.str() << '\n';
|
||||||
|
@ -10,7 +10,7 @@ struct BasePointer;
|
|||||||
class VM;
|
class VM;
|
||||||
class Frame;
|
class Frame;
|
||||||
|
|
||||||
typedef std::shared_ptr<const BasePointer> _Pointer;
|
typedef pkpy::shared_ptr<const BasePointer> _Pointer;
|
||||||
typedef PyVar (*_CppFunc)(VM*, const pkpy::ArgList&);
|
typedef PyVar (*_CppFunc)(VM*, const pkpy::ArgList&);
|
||||||
typedef std::shared_ptr<CodeObject> _Code;
|
typedef std::shared_ptr<CodeObject> _Code;
|
||||||
|
|
||||||
|
20
src/vm.h
20
src/vm.h
@ -55,28 +55,30 @@ protected:
|
|||||||
frame->push(obj);
|
frame->push(obj);
|
||||||
} break;
|
} break;
|
||||||
case OP_LOAD_NAME_PTR: {
|
case OP_LOAD_NAME_PTR: {
|
||||||
frame->push(PyPointer(frame->code->co_names[byte.arg]));
|
const BasePointer* p = new NamePointer(frame->code->co_names[byte.arg]);
|
||||||
|
frame->push(PyPointer(_Pointer(p)));
|
||||||
} break;
|
} break;
|
||||||
case OP_STORE_NAME_PTR: {
|
case OP_STORE_NAME_PTR: {
|
||||||
const auto& p = frame->code->co_names[byte.arg];
|
const auto& p = frame->code->co_names[byte.arg];
|
||||||
p->set(this, frame, frame->popValue(this));
|
p.set(this, frame, frame->popValue(this));
|
||||||
} break;
|
} break;
|
||||||
case OP_BUILD_ATTR_PTR: {
|
case OP_BUILD_ATTR_PTR: {
|
||||||
const auto& attr = frame->code->co_names[byte.arg];
|
const auto& attr = frame->code->co_names[byte.arg];
|
||||||
PyVar obj = frame->popValue(this);
|
PyVar obj = frame->popValue(this);
|
||||||
frame->push(PyPointer(std::make_shared<AttrPointer>(obj, attr.get())));
|
const BasePointer* p = new AttrPointer(obj, &attr);
|
||||||
|
frame->push(PyPointer(_Pointer(p)));
|
||||||
} break;
|
} break;
|
||||||
case OP_BUILD_ATTR_PTR_PTR: {
|
case OP_BUILD_ATTR_PTR_PTR: {
|
||||||
const auto& attr = frame->code->co_names[byte.arg];
|
const auto& attr = frame->code->co_names[byte.arg];
|
||||||
PyVar obj = frame->popValue(this);
|
PyVar obj = frame->popValue(this);
|
||||||
__checkType(obj, _tp_user_pointer);
|
__checkType(obj, _tp_user_pointer);
|
||||||
const _Pointer& p = std::get<_Pointer>(obj->_native);
|
const _Pointer& p = std::get<_Pointer>(obj->_native);
|
||||||
frame->push(PyPointer(std::make_shared<AttrPointer>(p->get(this, frame), attr.get())));
|
frame->push(PyPointer(_Pointer(new AttrPointer(p->get(this, frame), &attr))));
|
||||||
} break;
|
} break;
|
||||||
case OP_BUILD_INDEX_PTR: {
|
case OP_BUILD_INDEX_PTR: {
|
||||||
PyVar index = frame->popValue(this);
|
PyVar index = frame->popValue(this);
|
||||||
PyVar obj = frame->popValue(this);
|
PyVar obj = frame->popValue(this);
|
||||||
frame->push(PyPointer(std::make_shared<IndexPointer>(obj, index)));
|
frame->push(PyPointer(_Pointer(new IndexPointer(obj, index))));
|
||||||
} break;
|
} break;
|
||||||
case OP_STORE_PTR: {
|
case OP_STORE_PTR: {
|
||||||
PyVar obj = frame->popValue(this);
|
PyVar obj = frame->popValue(this);
|
||||||
@ -106,7 +108,7 @@ protected:
|
|||||||
std::vector<_Pointer> pointers(items.size());
|
std::vector<_Pointer> pointers(items.size());
|
||||||
for(int i=0; i<items.size(); i++)
|
for(int i=0; i<items.size(); i++)
|
||||||
pointers[i] = PyPointer_AS_C(items[i]);
|
pointers[i] = PyPointer_AS_C(items[i]);
|
||||||
frame->push(PyPointer(std::make_shared<CompoundPointer>(pointers)));
|
frame->push(PyPointer(_Pointer(new CompoundPointer(pointers))));
|
||||||
} break;
|
} break;
|
||||||
case OP_BUILD_STRING:
|
case OP_BUILD_STRING:
|
||||||
{
|
{
|
||||||
@ -133,7 +135,7 @@ protected:
|
|||||||
} break;
|
} break;
|
||||||
case OP_BUILD_CLASS:
|
case OP_BUILD_CLASS:
|
||||||
{
|
{
|
||||||
const _Str& clsName = frame->code->co_names[byte.arg]->name;
|
const _Str& clsName = frame->code->co_names[byte.arg].name;
|
||||||
PyVar clsBase = frame->popValue(this);
|
PyVar clsBase = frame->popValue(this);
|
||||||
if(clsBase == None) clsBase = _tp_object;
|
if(clsBase == None) clsBase = _tp_object;
|
||||||
__checkType(clsBase, _tp_type);
|
__checkType(clsBase, _tp_type);
|
||||||
@ -209,7 +211,7 @@ protected:
|
|||||||
{
|
{
|
||||||
// _pointer to pointer
|
// _pointer to pointer
|
||||||
const _Pointer p = PyPointer_AS_C(frame->__pop());
|
const _Pointer p = PyPointer_AS_C(frame->__pop());
|
||||||
_Pointer up = std::make_shared<UserPointer>(p, frame->id);
|
_Pointer up(new UserPointer(p, frame->id));
|
||||||
frame->push(newObject(_tp_user_pointer, std::move(up)));
|
frame->push(newObject(_tp_user_pointer, std::move(up)));
|
||||||
} break;
|
} break;
|
||||||
case OP_UNARY_DEREF:
|
case OP_UNARY_DEREF:
|
||||||
@ -318,7 +320,7 @@ protected:
|
|||||||
} break;
|
} break;
|
||||||
case OP_IMPORT_NAME:
|
case OP_IMPORT_NAME:
|
||||||
{
|
{
|
||||||
const _Str& name = frame->code->co_names[byte.arg]->name;
|
const _Str& name = frame->code->co_names[byte.arg].name;
|
||||||
auto it = _modules.find(name);
|
auto it = _modules.find(name);
|
||||||
if(it == _modules.end()){
|
if(it == _modules.end()){
|
||||||
auto it2 = _lazyModules.find(name);
|
auto it2 = _lazyModules.find(name);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user