blueloveTH 3 лет назад
Родитель
Сommit
6067436e46
5 измененных файлов с 19 добавлено и 18 удалено
  1. 1 3
      src/codeobject.h
  2. 5 5
      src/compiler.h
  3. 4 4
      src/iter.h
  4. 0 4
      src/main.cpp
  5. 9 2
      src/vm.h

+ 1 - 3
src/codeobject.h

@@ -86,9 +86,7 @@ struct CodeObject {
         return consts.size() - 1;
     }
 
-    void optimize(){
-        for(int i=0; i<codes.size(); i++){}
-    }
+    void optimize(VM* vm);
 
     /************************************************/
     int _curr_block_i = 0;

+ 5 - 5
src/compiler.h

@@ -395,7 +395,7 @@ private:
         this->codes.push(func->code);
         EXPR_TUPLE();
         emit(OP_RETURN_VALUE);
-        func->code->optimize();
+        func->code->optimize(vm);
         this->codes.pop();
         emit(OP_LOAD_LAMBDA, co()->add_const(vm->PyFunction(func)));
     }
@@ -912,7 +912,7 @@ __LISTCOMP:
         } else if(match(TK("raise"))){
             consume(TK("@id"));
             int dummy_t = co()->add_name(parser->prev.str(), NAME_SPECIAL);
-            if(match(TK("("))){
+            if(match(TK("(")) && !match(TK(")"))){
                 EXPR(); consume(TK(")"));
             }else{
                 emit(OP_LOAD_NONE);
@@ -1020,7 +1020,7 @@ __LISTCOMP:
         func->code = pkpy::make_shared<CodeObject>(parser->src, func->name);
         this->codes.push(func->code);
         compile_block_body();
-        func->code->optimize();
+        func->code->optimize(vm);
         this->codes.pop();
         emit(OP_LOAD_CONST, co()->add_const(vm->PyFunction(func)));
         if(!is_compiling_class) emit(OP_STORE_FUNCTION);
@@ -1073,7 +1073,7 @@ public:
         if(mode()==EVAL_MODE) {
             EXPR_TUPLE();
             consume(TK("@eof"));
-            code->optimize();
+            code->optimize(vm);
             return code;
         }else if(mode()==JSON_MODE){
             PyVarOrNull value = read_literal();
@@ -1100,7 +1100,7 @@ public:
             }
             match_newlines();
         }
-        code->optimize();
+        code->optimize(vm);
         return code;
     }
 };

+ 4 - 4
src/iter.h

@@ -36,15 +36,15 @@ public:
 
 class StringIter : public BaseIter {
     int index = 0;
-    Str str;
+    Str* str;
 public:
     StringIter(VM* vm, PyVar _ref) : BaseIter(vm, _ref) {
-        str = OBJ_GET(Str, _ref);
+        str = &OBJ_GET(Str, _ref);
     }
 
     PyVar next() {
-        if(index == str.u8_length()) return nullptr;
-        return vm->PyStr(str.u8_getitem(index++));
+        if(index == str->u8_length()) return nullptr;
+        return vm->PyStr(str->u8_getitem(index++));
     }
 };
 

+ 0 - 4
src/main.cpp

@@ -35,10 +35,6 @@ int main(int argc, char** argv){
         std::string src((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
         PyVarOrNull ret = nullptr;
         ret = vm->exec(src.c_str(), filename, EXEC_MODE);
-
-        // for(auto& [k,v]: pkpy::_stats){
-        //     std::cout << k << ": " << v << std::endl;
-        // }
         pkpy_delete(vm);
         return ret != nullptr ? 0 : 1;
     }

+ 9 - 2
src/vm.h

@@ -12,7 +12,6 @@
         return new_object(ptype, value);                        \
     }
 
-// static std::map<Str, int> _stats;
 class Generator;
 
 class VM {
@@ -463,7 +462,6 @@ public:
             return f(this, args);
         } else if((*callable)->is_type(tp_function)){
             const pkpy::Function_& fn = PyFunction_AS_C((*callable));
-            // pkpy::_stats[fn->name] += 1;
             pkpy::shared_ptr<pkpy::NameDict> _locals = pkpy::make_shared<pkpy::NameDict>();
             pkpy::NameDict& locals = *_locals;
 
@@ -1127,4 +1125,13 @@ PyVar pkpy::NativeFunc::operator()(VM* vm, const pkpy::Args& args) const{
         vm->TypeError("expected " + std::to_string(argc) + " arguments, but got " + std::to_string(args_size));
     }
     return f(vm, args);
+}
+
+void CodeObject::optimize(VM* vm){
+    for(int i=1; i<codes.size(); i++){
+    if(codes[i].op == OP_UNARY_NEGATIVE && codes[i-1].op == OP_LOAD_CONST){
+        codes[i].op = OP_NO_OP;
+        int pos = codes[i-1].arg;
+        consts[pos] = vm->num_negated(consts[pos]);
+    }
 }