mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 12:00:18 +00:00
...
This commit is contained in:
parent
3738d07941
commit
37c46fda68
@ -141,7 +141,6 @@ __NEXT_STEP:;
|
|||||||
_0 = vm->builtins->attr().try_get(_name);
|
_0 = vm->builtins->attr().try_get(_name);
|
||||||
if(_0 != nullptr) { PUSH(_0); DISPATCH(); }
|
if(_0 != nullptr) { PUSH(_0); DISPATCH(); }
|
||||||
vm->NameError(_name);
|
vm->NameError(_name);
|
||||||
DISPATCH();
|
|
||||||
} DISPATCH();
|
} DISPATCH();
|
||||||
TARGET(LOAD_GLOBAL)
|
TARGET(LOAD_GLOBAL)
|
||||||
heap._auto_collect();
|
heap._auto_collect();
|
||||||
|
@ -707,8 +707,8 @@ __SUBSCR_END:
|
|||||||
// stack size is n+1
|
// stack size is n+1
|
||||||
Expr_ val = ctx()->s_expr.popx();
|
Expr_ val = ctx()->s_expr.popx();
|
||||||
val->emit(ctx());
|
val->emit(ctx());
|
||||||
for(int i=1; i<n; i++) ctx()->emit(OP_DUP_TOP, BC_NOARG, BC_KEEPLINE);
|
for(int j=1; j<n; j++) ctx()->emit(OP_DUP_TOP, BC_NOARG, BC_KEEPLINE);
|
||||||
for(int i=0; i<n; i++){
|
for(int j=0; j<n; j++){
|
||||||
auto e = ctx()->s_expr.popx();
|
auto e = ctx()->s_expr.popx();
|
||||||
if(e->is_starred()) SyntaxError();
|
if(e->is_starred()) SyntaxError();
|
||||||
bool ok = e->emit_store(ctx());
|
bool ok = e->emit_store(ctx());
|
||||||
|
10
src/expr.h
10
src/expr.h
@ -28,10 +28,16 @@ struct Expr{
|
|||||||
bool is_starred() const { return star_level() > 0; }
|
bool is_starred() const { return star_level() > 0; }
|
||||||
|
|
||||||
// for OP_DELETE_XXX
|
// for OP_DELETE_XXX
|
||||||
[[nodiscard]] virtual bool emit_del(CodeEmitContext* ctx) { return false; }
|
[[nodiscard]] virtual bool emit_del(CodeEmitContext* ctx) {
|
||||||
|
PK_UNUSED(ctx);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// for OP_STORE_XXX
|
// for OP_STORE_XXX
|
||||||
[[nodiscard]] virtual bool emit_store(CodeEmitContext* ctx) { return false; }
|
[[nodiscard]] virtual bool emit_store(CodeEmitContext* ctx) {
|
||||||
|
PK_UNUSED(ctx);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CodeEmitContext{
|
struct CodeEmitContext{
|
||||||
|
15
src/vm.h
15
src/vm.h
@ -962,6 +962,7 @@ inline PyObject* VM::format(Str spec, PyObject* obj){
|
|||||||
}
|
}
|
||||||
}catch(...){
|
}catch(...){
|
||||||
ValueError("invalid format specifer");
|
ValueError("invalid format specifer");
|
||||||
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(type != 'f' && dot >= 0) ValueError("precision not allowed in the format specifier");
|
if(type != 'f' && dot >= 0) ValueError("precision not allowed in the format specifier");
|
||||||
@ -1307,18 +1308,18 @@ inline PyObject* VM::vectorcall(int ARGC, int KWARGC, bool op_call){
|
|||||||
vkwargs = nullptr;
|
vkwargs = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i=0; i<kwargs.size(); i+=2){
|
for(int j=0; j<kwargs.size(); j+=2){
|
||||||
StrName key(CAST(int, kwargs[i]));
|
StrName key(CAST(int, kwargs[j]));
|
||||||
int index = co->varnames_inv.try_get(key);
|
int index = co->varnames_inv.try_get(key);
|
||||||
if(index < 0){
|
if(index < 0){
|
||||||
if(vkwargs == nullptr){
|
if(vkwargs == nullptr){
|
||||||
TypeError(fmt(key.escape(), " is an invalid keyword argument for ", co->name, "()"));
|
TypeError(fmt(key.escape(), " is an invalid keyword argument for ", co->name, "()"));
|
||||||
}else{
|
}else{
|
||||||
Dict& dict = _CAST(Dict&, vkwargs);
|
Dict& dict = _CAST(Dict&, vkwargs);
|
||||||
dict.set(VAR(key.sv()), kwargs[i+1]);
|
dict.set(VAR(key.sv()), kwargs[j+1]);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
buffer[index] = kwargs[i+1];
|
buffer[index] = kwargs[j+1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1332,7 +1333,7 @@ inline PyObject* VM::vectorcall(int ARGC, int KWARGC, bool op_call){
|
|||||||
|
|
||||||
// copy buffer back to stack
|
// copy buffer back to stack
|
||||||
s_data.reset(args.begin());
|
s_data.reset(args.begin());
|
||||||
for(int i=0; i<co_nlocals; i++) PUSH(buffer[i]);
|
for(int j=0; j<co_nlocals; j++) PUSH(buffer[j]);
|
||||||
callstack.emplace(&s_data, p0, co, fn._module, callable, FastLocals(co, args.begin()));
|
callstack.emplace(&s_data, p0, co, fn._module, callable, FastLocals(co, args.begin()));
|
||||||
if(op_call) return PY_OP_CALL;
|
if(op_call) return PY_OP_CALL;
|
||||||
return _run_top_frame();
|
return _run_top_frame();
|
||||||
@ -1357,8 +1358,8 @@ inline PyObject* VM::vectorcall(int ARGC, int KWARGC, bool op_call){
|
|||||||
PUSH(new_f);
|
PUSH(new_f);
|
||||||
PUSH(PY_NULL);
|
PUSH(PY_NULL);
|
||||||
PUSH(callable); // cls
|
PUSH(callable); // cls
|
||||||
for(PyObject* obj: args) PUSH(obj);
|
for(PyObject* o: args) PUSH(o);
|
||||||
for(PyObject* obj: kwargs) PUSH(obj);
|
for(PyObject* o: kwargs) PUSH(o);
|
||||||
// if obj is not an instance of callable, the behavior is undefined
|
// if obj is not an instance of callable, the behavior is undefined
|
||||||
obj = vectorcall(ARGC+1, KWARGC);
|
obj = vectorcall(ARGC+1, KWARGC);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user