mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 12:00:18 +00:00
up
This commit is contained in:
parent
83d6ac2e78
commit
b56978fd3d
@ -830,6 +830,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void compile_function(){
|
void compile_function(){
|
||||||
|
// TODO: bug, if there are multiple decorators, will cause error
|
||||||
bool has_decorator = !co()->codes.empty() && co()->codes.back().op == OP_SETUP_DECORATOR;
|
bool has_decorator = !co()->codes.empty() && co()->codes.back().op == OP_SETUP_DECORATOR;
|
||||||
Function func;
|
Function func;
|
||||||
StrName obj_name;
|
StrName obj_name;
|
||||||
|
69
src/expr.h
69
src/expr.h
@ -16,8 +16,8 @@ struct Expr{
|
|||||||
virtual void emit(CodeEmitContext* ctx) = 0;
|
virtual void emit(CodeEmitContext* ctx) = 0;
|
||||||
virtual Str str() const = 0;
|
virtual Str str() const = 0;
|
||||||
|
|
||||||
virtual void emit_lvalue(CodeEmitContext* ctx){
|
virtual void emit_ref(CodeEmitContext* ctx){
|
||||||
throw std::runtime_error("emit_lvalue() is not supported");
|
throw std::runtime_error("emit_ref() is not supported");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -108,8 +108,14 @@ struct NameExpr: Expr{
|
|||||||
int index = ctx->add_name(name, scope);
|
int index = ctx->add_name(name, scope);
|
||||||
ctx->emit(OP_LOAD_NAME, index, line);
|
ctx->emit(OP_LOAD_NAME, index, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void emit_ref(CodeEmitContext* ctx) override {
|
||||||
|
int index = ctx->add_name(name, scope);
|
||||||
|
ctx->emit(OP_LOAD_NAME_REF, index, line);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct StarredExpr: Expr{
|
struct StarredExpr: Expr{
|
||||||
Expr_ child;
|
Expr_ child;
|
||||||
StarredExpr(Expr_&& child): child(std::move(child)) {}
|
StarredExpr(Expr_&& child): child(std::move(child)) {}
|
||||||
@ -119,6 +125,11 @@ struct StarredExpr: Expr{
|
|||||||
child->emit(ctx);
|
child->emit(ctx);
|
||||||
ctx->emit(OP_UNARY_STAR, (int)false, line);
|
ctx->emit(OP_UNARY_STAR, (int)false, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void emit_ref(CodeEmitContext* ctx) override {
|
||||||
|
child->emit(ctx);
|
||||||
|
ctx->emit(OP_UNARY_STAR, (int)true, line);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NegatedExpr: Expr{
|
struct NegatedExpr: Expr{
|
||||||
@ -232,28 +243,58 @@ struct SliceExpr: Expr{
|
|||||||
Expr_ stop;
|
Expr_ stop;
|
||||||
Expr_ step;
|
Expr_ step;
|
||||||
Str str() const override { return "slice()"; }
|
Str str() const override { return "slice()"; }
|
||||||
|
|
||||||
|
void emit(CodeEmitContext* ctx) override {
|
||||||
|
if(start){
|
||||||
|
start->emit(ctx);
|
||||||
|
}else{
|
||||||
|
ctx->emit(OP_LOAD_NONE, BC_NOARG, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(stop){
|
||||||
|
stop->emit(ctx);
|
||||||
|
}else{
|
||||||
|
ctx->emit(OP_LOAD_NONE, BC_NOARG, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(step){
|
||||||
|
step->emit(ctx);
|
||||||
|
}else{
|
||||||
|
ctx->emit(OP_LOAD_NONE, BC_NOARG, line);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->emit(OP_BUILD_SLICE, BC_NOARG, line);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ListExpr: Expr{
|
struct SequenceExpr: Expr{
|
||||||
std::vector<Expr_> items;
|
std::vector<Expr_> items;
|
||||||
Str str() const override { return "[]"; }
|
virtual Opcode opcode() const = 0;
|
||||||
|
|
||||||
|
void emit(CodeEmitContext* ctx) override {
|
||||||
|
for(auto& item: items) item->emit(ctx);
|
||||||
|
ctx->emit(opcode(), items.size(), line);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DictExpr: Expr{
|
struct ListExpr: SequenceExpr{
|
||||||
std::vector<Expr_> items; // each item is a DictItemExpr
|
Str str() const override { return "list()"; }
|
||||||
DictExpr(std::vector<Expr_>&& items): items(std::move(items)) {}
|
Opcode opcode() const override { return OP_BUILD_LIST; }
|
||||||
Str str() const override { return "{}"; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SetExpr: Expr{
|
struct DictExpr: SequenceExpr{
|
||||||
std::vector<Expr_> items;
|
Str str() const override { return "dict()"; }
|
||||||
SetExpr(std::vector<Expr_>&& items): items(std::move(items)) {}
|
Opcode opcode() const override { return OP_BUILD_MAP; }
|
||||||
Str str() const override { return "{}"; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TupleExpr: Expr{
|
struct SetExpr: SequenceExpr{
|
||||||
std::vector<Expr_> items;
|
Str str() const override { return "set()"; }
|
||||||
|
Opcode opcode() const override { return OP_BUILD_SET; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TupleExpr: SequenceExpr{
|
||||||
Str str() const override { return "tuple()"; }
|
Str str() const override { return "tuple()"; }
|
||||||
|
Opcode opcode() const override { return OP_BUILD_TUPLE; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CompExpr: Expr{
|
struct CompExpr: Expr{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user