Forráskód Böngészése

fix: super class can be an expression

BLUELOVETH 2 éve
szülő
commit
b520abf7a2
2 módosított fájl, 11 hozzáadás és 7 törlés
  1. 9 5
      src/compiler.cpp
  2. 2 2
      tests/40_class.py

+ 9 - 5
src/compiler.cpp

@@ -830,15 +830,19 @@ __SUBSCR_END:
     void Compiler::compile_class(){
         consume(TK("@id"));
         int namei = StrName(prev().str()).index;
-        int super_namei = -1;
+        Expr_ base = nullptr;
         if(match(TK("("))){
-            if(match(TK("@id"))){
-                super_namei = StrName(prev().str()).index;
+            if(is_expression()){
+                EXPR();
+                base = ctx()->s_expr.popx();
             }
             consume(TK(")"));
         }
-        if(super_namei == -1) ctx()->emit(OP_LOAD_NONE, BC_NOARG, prev().line);
-        else ctx()->emit(OP_LOAD_GLOBAL, super_namei, prev().line);
+        if(base == nullptr){
+            ctx()->emit(OP_LOAD_NONE, BC_NOARG, prev().line);
+        }else {
+            base->emit(ctx());
+        }
         ctx()->emit(OP_BEGIN_CLASS, namei, BC_KEEPLINE);
         ctx()->is_compiling_class = true;
         compile_block_body();

+ 2 - 2
tests/40_class.py

@@ -92,9 +92,9 @@ class B(A):
 assert B.b == 3
 assert B.c == 4
 
-from c import void_p
+import c
 
-class A(void_p):
+class A(c.void_p):
     pass
     
 a = A()