mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
add pointer support
This commit is contained in:
parent
24b2140959
commit
5b2e301fa7
@ -95,7 +95,7 @@ public:
|
|||||||
rules[TK(",")] = { nullptr, METHOD(exprComma), PREC_COMMA };
|
rules[TK(",")] = { nullptr, METHOD(exprComma), PREC_COMMA };
|
||||||
rules[TK("<<")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_SHIFT };
|
rules[TK("<<")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_SHIFT };
|
||||||
rules[TK(">>")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_SHIFT };
|
rules[TK(">>")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_SHIFT };
|
||||||
rules[TK("&")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_AND };
|
rules[TK("&")] = { METHOD(exprUnaryOp), METHOD(exprBinaryOp), PREC_BITWISE_AND };
|
||||||
rules[TK("|")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_OR };
|
rules[TK("|")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_OR };
|
||||||
rules[TK("^")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_XOR };
|
rules[TK("^")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_XOR };
|
||||||
#undef METHOD
|
#undef METHOD
|
||||||
@ -449,6 +449,7 @@ public:
|
|||||||
switch (op) {
|
switch (op) {
|
||||||
case TK("-"): emitCode(OP_UNARY_NEGATIVE); break;
|
case TK("-"): emitCode(OP_UNARY_NEGATIVE); break;
|
||||||
case TK("not"): emitCode(OP_UNARY_NOT); break;
|
case TK("not"): emitCode(OP_UNARY_NOT); break;
|
||||||
|
case TK("&"): emitCode(OP_UNARY_REF); break;
|
||||||
default: UNREACHABLE();
|
default: UNREACHABLE();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,5 +59,6 @@ OPCODE(BUILD_SMART_TUPLE) // if all elements are pointers, build a compound po
|
|||||||
OPCODE(BUILD_STRING) // arg is the expr count, build a string from the top of the stack
|
OPCODE(BUILD_STRING) // arg is the expr count, build a string from the top of the stack
|
||||||
|
|
||||||
OPCODE(GOTO)
|
OPCODE(GOTO)
|
||||||
|
OPCODE(UNARY_REF) // for &
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -56,6 +56,19 @@ void __initializeBuiltinFunctions(VM* _vm) {
|
|||||||
return vm->PyStr(tvm->readStdin());
|
return vm->PyStr(tvm->readStdin());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_vm->bindMethod("pointer", "set", [](VM* vm, const pkpy::ArgList& args) {
|
||||||
|
vm->__checkArgSize(args, 2, true);
|
||||||
|
_Pointer& p = std::get<_Pointer>(args[0]->_native);
|
||||||
|
p->set(vm, vm->topFrame(), args[1]);
|
||||||
|
return vm->None;
|
||||||
|
});
|
||||||
|
|
||||||
|
_vm->bindMethod("pointer", "get", [](VM* vm, const pkpy::ArgList& args) {
|
||||||
|
vm->__checkArgSize(args, 1, true);
|
||||||
|
_Pointer& p = std::get<_Pointer>(args[0]->_native);
|
||||||
|
return p->get(vm, vm->topFrame());
|
||||||
|
});
|
||||||
|
|
||||||
_vm->bindBuiltinFunc("eval", [](VM* vm, const pkpy::ArgList& args) {
|
_vm->bindBuiltinFunc("eval", [](VM* vm, const pkpy::ArgList& args) {
|
||||||
vm->__checkArgSize(args, 1);
|
vm->__checkArgSize(args, 1);
|
||||||
const _Str& expr = vm->PyStr_AS_C(args[0]);
|
const _Str& expr = vm->PyStr_AS_C(args[0]);
|
||||||
@ -115,8 +128,13 @@ void __initializeBuiltinFunctions(VM* _vm) {
|
|||||||
|
|
||||||
_vm->bindBuiltinFunc("dir", [](VM* vm, const pkpy::ArgList& args) {
|
_vm->bindBuiltinFunc("dir", [](VM* vm, const pkpy::ArgList& args) {
|
||||||
vm->__checkArgSize(args, 1);
|
vm->__checkArgSize(args, 1);
|
||||||
|
std::vector<_Str> names;
|
||||||
|
for (auto& [k, _] : args[0]->attribs) names.push_back(k);
|
||||||
|
for (auto& [k, _] : args[0]->_type->attribs) {
|
||||||
|
if (std::find(names.begin(), names.end(), k) == names.end()) names.push_back(k);
|
||||||
|
}
|
||||||
PyVarList ret;
|
PyVarList ret;
|
||||||
for (auto& [k, _] : args[0]->attribs) ret.push_back(vm->PyStr(k));
|
for (const auto& name : names) ret.push_back(vm->PyStr(name));
|
||||||
return vm->PyList(ret);
|
return vm->PyList(ret);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
10
src/vm.h
10
src/vm.h
@ -207,6 +207,12 @@ private:
|
|||||||
const PyVar& obj_bool = asBool(obj);
|
const PyVar& obj_bool = asBool(obj);
|
||||||
frame->push(PyBool(!PyBool_AS_C(obj_bool)));
|
frame->push(PyBool(!PyBool_AS_C(obj_bool)));
|
||||||
} break;
|
} break;
|
||||||
|
case OP_UNARY_REF:
|
||||||
|
{
|
||||||
|
PyVar obj = frame->__pop();
|
||||||
|
_Pointer p = PyPointer_AS_C(obj);
|
||||||
|
frame->push(newObject(_tp_user_pointer, p));
|
||||||
|
} break;
|
||||||
case OP_POP_JUMP_IF_FALSE:
|
case OP_POP_JUMP_IF_FALSE:
|
||||||
if(!PyBool_AS_C(asBool(frame->popValue(this)))) frame->jump(byte.arg);
|
if(!PyBool_AS_C(asBool(frame->popValue(this)))) frame->jump(byte.arg);
|
||||||
break;
|
break;
|
||||||
@ -659,12 +665,13 @@ public:
|
|||||||
PyVar _tp_list, _tp_tuple;
|
PyVar _tp_list, _tp_tuple;
|
||||||
PyVar _tp_function, _tp_native_function, _tp_native_iterator, _tp_bounded_method;
|
PyVar _tp_function, _tp_native_function, _tp_native_iterator, _tp_bounded_method;
|
||||||
PyVar _tp_slice, _tp_range, _tp_module, _tp_pointer;
|
PyVar _tp_slice, _tp_range, _tp_module, _tp_pointer;
|
||||||
|
PyVar _tp_user_pointer;
|
||||||
|
|
||||||
__DEF_PY_POOL(Int, _Int, _tp_int, 256);
|
__DEF_PY_POOL(Int, _Int, _tp_int, 256);
|
||||||
__DEF_PY_AS_C(Int, _Int, _tp_int)
|
__DEF_PY_AS_C(Int, _Int, _tp_int)
|
||||||
__DEF_PY_POOL(Float, _Float, _tp_float, 256);
|
__DEF_PY_POOL(Float, _Float, _tp_float, 256);
|
||||||
__DEF_PY_AS_C(Float, _Float, _tp_float)
|
__DEF_PY_AS_C(Float, _Float, _tp_float)
|
||||||
__DEF_PY_POOL(Pointer, _Pointer, _tp_pointer, 512)
|
__DEF_PY_POOL(Pointer, _Pointer, _tp_pointer, 256)
|
||||||
__DEF_PY_AS_C(Pointer, _Pointer, _tp_pointer)
|
__DEF_PY_AS_C(Pointer, _Pointer, _tp_pointer)
|
||||||
|
|
||||||
DEF_NATIVE(Str, _Str, _tp_str)
|
DEF_NATIVE(Str, _Str, _tp_str)
|
||||||
@ -698,6 +705,7 @@ public:
|
|||||||
_tp_range = newClassType("range");
|
_tp_range = newClassType("range");
|
||||||
_tp_module = newClassType("module");
|
_tp_module = newClassType("module");
|
||||||
_tp_pointer = newClassType("_pointer");
|
_tp_pointer = newClassType("_pointer");
|
||||||
|
_tp_user_pointer = newClassType("pointer");
|
||||||
|
|
||||||
newClassType("NoneType");
|
newClassType("NoneType");
|
||||||
newClassType("ellipsis");
|
newClassType("ellipsis");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user