blueloveTH 3 лет назад
Родитель
Сommit
71050fc4bb
5 измененных файлов с 18 добавлено и 11 удалено
  1. 1 1
      build_cpp.sh
  2. 0 8
      src/builtins.h
  3. 4 0
      src/main.cpp
  4. 11 2
      src/pocketpy.h
  5. 2 0
      src/vm.h

+ 1 - 1
build_cpp.sh

@@ -1 +1 @@
-g++ -o pocketpy src/main.cpp --std=c++17 -O1 -Wall -Wno-sign-compare -Wno-unused-variable -fno-rtti
+g++ -o pocketpy src/main.cpp --std=c++17 -O2 -Wall -Wno-sign-compare -Wno-unused-variable -fno-rtti

+ 0 - 8
src/builtins.h

@@ -183,14 +183,6 @@ def __list4pop(self, i=-1):
 list.pop = __list4pop
 del __list4pop
 
-def __list4__mul__(self, n):
-    a = []
-    for i in range(n):
-        a.extend(self)
-    return a
-list.__mul__ = __list4__mul__
-del __list4__mul__
-
 def __iterable4__eq__(self, other):
     if len(self) != len(other):
         return False

+ 4 - 0
src/main.cpp

@@ -35,6 +35,10 @@ 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;
     }

+ 11 - 2
src/pocketpy.h

@@ -392,11 +392,20 @@ void init_builtins(VM* _vm) {
 
     /************ PyList ************/
     _vm->bind_method<1>("list", "append", [](VM* vm, const pkpy::Args& args) {
-        pkpy::List& _self = vm->PyList_AS_C(args[0]);
-        _self.push_back(args[1]);
+        pkpy::List& self = vm->PyList_AS_C(args[0]);
+        self.push_back(args[1]);
         return vm->None;
     });
 
+    _vm->bind_method<1>("list", "__mul__", [](VM* vm, const pkpy::Args& args) {
+        const pkpy::List& self = vm->PyList_AS_C(args[0]);
+        int n = (int)vm->PyInt_AS_C(args[1]);
+        pkpy::List result;
+        result.reserve(self.size() * n);
+        for(int i = 0; i < n; i++) result.insert(result.end(), self.begin(), self.end());
+        return vm->PyList(std::move(result));
+    });
+
     _vm->bind_method<2>("list", "insert", [](VM* vm, const pkpy::Args& args) {
         pkpy::List& _self = vm->PyList_AS_C(args[0]);
         int _index = (int)vm->PyInt_AS_C(args[1]);

+ 2 - 0
src/vm.h

@@ -12,6 +12,7 @@
         return new_object(ptype, value);                        \
     }
 
+// static std::map<Str, int> _stats;
 
 class VM {
     std::stack< std::unique_ptr<Frame> > callstack;
@@ -452,6 +453,7 @@ 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;