Ver código fonte

some optimize

blueloveTH 3 anos atrás
pai
commit
ad99bd5b21
3 arquivos alterados com 12 adições e 3 exclusões
  1. 8 1
      src/compiler.h
  2. 3 1
      src/pocketpy.h
  3. 1 1
      src/vm.h

+ 8 - 1
src/compiler.h

@@ -401,11 +401,18 @@ private:
     }
 
     void exprAssign() {
+        int lhs = co()->codes.empty() ? -1 : co()->codes.size() - 1;
         co()->_rvalue = true;
         TokenIndex op = parser->prev.type;
         if(op == TK("=")) {     // a = (expr)
             EXPR_TUPLE();
-            emit(OP_STORE_REF);
+            if(lhs!=-1 && co()->codes[lhs].op == OP_LOAD_NAME_REF){
+                emit(OP_STORE_NAME, co()->codes[lhs].arg);
+                co()->codes[lhs].op = OP_NO_OP;
+                co()->codes[lhs].arg = -1;
+            }else{
+                emit(OP_STORE_REF);
+            }
         }else{                  // a += (expr) -> a = a + (expr)
             EXPR();
             switch (op) {

+ 3 - 1
src/pocketpy.h

@@ -591,7 +591,9 @@ void add_module_math(VM* vm){
 void add_module_dis(VM* vm){
     PyVar mod = vm->new_module("dis");
     vm->bind_func<1>(mod, "dis", [](VM* vm, pkpy::Args& args) {
-        CodeObject_ code = vm->PyFunction_AS_C(args[0]).code;
+        PyVar f = args[0];
+        if(f->is_type(vm->tp_bound_method)) f = vm->PyBoundMethod_AS_C(args[0]).method;
+        CodeObject_ code = vm->PyFunction_AS_C(f).code;
         (*vm->_stdout) << vm->disassemble(code);
         return vm->None;
     });

+ 1 - 1
src/vm.h

@@ -483,7 +483,7 @@ public:
             if(byte.op == OP_LOAD_CONST){
                 argStr += " (" + PyStr_AS_C(asRepr(co->consts[byte.arg])) + ")";
             }
-            if(byte.op == OP_LOAD_NAME_REF || byte.op == OP_LOAD_NAME || byte.op == OP_RAISE){
+            if(byte.op == OP_LOAD_NAME_REF || byte.op == OP_LOAD_NAME || byte.op == OP_RAISE || byte.op == OP_STORE_NAME){
                 argStr += " (" + co->names[byte.arg].first.escape(true) + ")";
             }
             if(byte.op == OP_FAST_INDEX || byte.op == OP_FAST_INDEX_REF){