mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +00:00
...
This commit is contained in:
parent
47a22c495f
commit
8079b82813
@ -276,9 +276,8 @@ struct SubscrExpr: Expr{
|
|||||||
|
|
||||||
struct AttribExpr: Expr{
|
struct AttribExpr: Expr{
|
||||||
Expr_ a;
|
Expr_ a;
|
||||||
Str b;
|
StrName b;
|
||||||
AttribExpr(Expr_ a, const Str& b): a(std::move(a)), b(b) {}
|
AttribExpr(Expr_ a, StrName b): a(std::move(a)), b(b) {}
|
||||||
AttribExpr(Expr_ a, Str&& b): a(std::move(a)), b(std::move(b)) {}
|
|
||||||
|
|
||||||
void emit_(CodeEmitContext* ctx) override;
|
void emit_(CodeEmitContext* ctx) override;
|
||||||
bool emit_del(CodeEmitContext* ctx) override;
|
bool emit_del(CodeEmitContext* ctx) override;
|
||||||
|
@ -415,7 +415,7 @@ namespace pkpy{
|
|||||||
void Compiler::exprAttrib() {
|
void Compiler::exprAttrib() {
|
||||||
consume(TK("@id"));
|
consume(TK("@id"));
|
||||||
ctx()->s_expr.push(
|
ctx()->s_expr.push(
|
||||||
make_expr<AttribExpr>(ctx()->s_expr.popx(), prev().str())
|
make_expr<AttribExpr>(ctx()->s_expr.popx(), StrName::get(prev().sv()))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
src/expr.cpp
12
src/expr.cpp
@ -533,28 +533,24 @@ namespace pkpy{
|
|||||||
|
|
||||||
void AttribExpr::emit_(CodeEmitContext* ctx){
|
void AttribExpr::emit_(CodeEmitContext* ctx){
|
||||||
a->emit_(ctx);
|
a->emit_(ctx);
|
||||||
int index = StrName(b).index;
|
ctx->emit_(OP_LOAD_ATTR, b.index, line);
|
||||||
ctx->emit_(OP_LOAD_ATTR, index, line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AttribExpr::emit_del(CodeEmitContext* ctx) {
|
bool AttribExpr::emit_del(CodeEmitContext* ctx) {
|
||||||
a->emit_(ctx);
|
a->emit_(ctx);
|
||||||
int index = StrName(b).index;
|
ctx->emit_(OP_DELETE_ATTR, b.index, line);
|
||||||
ctx->emit_(OP_DELETE_ATTR, index, line);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AttribExpr::emit_store(CodeEmitContext* ctx){
|
bool AttribExpr::emit_store(CodeEmitContext* ctx){
|
||||||
a->emit_(ctx);
|
a->emit_(ctx);
|
||||||
int index = StrName(b).index;
|
ctx->emit_(OP_STORE_ATTR, b.index, line);
|
||||||
ctx->emit_(OP_STORE_ATTR, index, line);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AttribExpr::emit_method(CodeEmitContext* ctx) {
|
void AttribExpr::emit_method(CodeEmitContext* ctx) {
|
||||||
a->emit_(ctx);
|
a->emit_(ctx);
|
||||||
int index = StrName(b).index;
|
ctx->emit_(OP_LOAD_METHOD, b.index, line);
|
||||||
ctx->emit_(OP_LOAD_METHOD, index, line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CallExpr::emit_(CodeEmitContext* ctx) {
|
void CallExpr::emit_(CodeEmitContext* ctx) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user