This commit is contained in:
blueloveTH 2024-01-19 18:09:42 +08:00
parent 47a22c495f
commit 8079b82813
3 changed files with 7 additions and 12 deletions

View File

@ -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;

View File

@ -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()))
); );
} }

View File

@ -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) {