blueloveTH 3 yıl önce
ebeveyn
işleme
eed743135f
8 değiştirilmiş dosya ile 180 ekleme ve 90 silme
  1. 1 1
      build_cpp.sh
  2. 1 1
      src/codeobject.h
  3. 3 3
      src/iter.h
  4. 16 9
      src/main.cpp
  5. 1 1
      src/obj.h
  6. 4 4
      src/pocketpy.h
  7. 145 64
      src/str.h
  8. 9 7
      src/vm.h

+ 1 - 1
build_cpp.sh

@@ -1 +1 @@
-g++ -o pocketpy src/main.cpp --std=c++17 -O1 -pthread
+g++ -o pocketpy src/main.cpp --std=c++17 -O1 -pthread -Wno-literal-suffix

+ 1 - 1
src/codeobject.h

@@ -112,7 +112,7 @@ struct CodeObject {
             auto fn = std::get_if<_Func>(&co_consts[i]->_native);
             if(fn) ss << '\n' << (*fn)->code->name << ":\n" << (*fn)->code->toString();
         }
-        return _Str(ss);
+        return _Str(ss.str());
     }
 };
 

+ 3 - 3
src/iter.h

@@ -44,14 +44,14 @@ public:
 class StringIterator : public _Iterator {
 private:
     size_t index = 0;
-    const _Str* str;
+    _Str str;
 public:
     StringIterator(VM* vm, PyVar _ref) : _Iterator(vm, _ref) {
-        str = &std::get<_Str>(_ref->_native);
+        str = std::get<_Str>(_ref->_native);
     }
 
     bool hasNext(){
-        return index < str->u8_length();
+        return index < str.u8_length();
     }
 
     PyVar next();

+ 16 - 9
src/main.cpp

@@ -42,6 +42,8 @@ extern "C" {
 int main(int argc, char** argv){
     if(argc == 1){
         VM* vm = pkpy_new_vm(true);
+        // for(auto& kv : _strIntern)
+        //     std::cout << kv.first << ", ";
         REPL repl(vm);
         while(true){
             std::string line;
@@ -69,17 +71,22 @@ int main(int argc, char** argv){
         });
         if(code == nullptr) return 1;
         //std::cout << code->toString() << std::endl;
+
         Timer("Running time").run([=]{
-            vm->startExec(code);
-            while(pkpy_tvm_get_state(vm) != THREAD_FINISHED){
-                if(pkpy_tvm_get_state(vm) == THREAD_SUSPENDED){
-                    std::string line;
-                    std::getline(std::cin, line);
-                    pkpy_tvm_write_stdin(vm, line.c_str());
-                    pkpy_tvm_resume(vm);
-                }
-            }
+            vm->exec(code);
         });
+
+        // Timer("Running time").run([=]{
+        //     vm->startExec(code);
+        //     while(pkpy_tvm_get_state(vm) != THREAD_FINISHED){
+        //         if(pkpy_tvm_get_state(vm) == THREAD_SUSPENDED){
+        //             std::string line;
+        //             std::getline(std::cin, line);
+        //             pkpy_tvm_write_stdin(vm, line.c_str());
+        //             pkpy_tvm_resume(vm);
+        //         }
+        //     }
+        // });
         return 0;
     }
 

+ 1 - 1
src/obj.h

@@ -91,7 +91,7 @@ struct PyObject {
 
     // currently __name__ is only used for 'type'
     _Str getName(){
-        _Value val = attribs["__name__"]->_native;
+        _Value val = attribs[__name__]->_native;
         return std::get<_Str>(val);
     }
 

+ 4 - 4
src/pocketpy.h

@@ -354,7 +354,7 @@ void __initializeBuiltinFunctions(VM* _vm) {
         const _Str& _self (vm->PyStr_AS_C(args[0]));
         _StrStream ss;
         for(auto c : _self.str()) ss << (char)toupper(c);
-        return vm->PyStr(ss);
+        return vm->PyStr(ss.str());
     });
 
     _vm->bindMethod("str", "lower", [](VM* vm, PyVarList args) {
@@ -362,7 +362,7 @@ void __initializeBuiltinFunctions(VM* _vm) {
         const _Str& _self (vm->PyStr_AS_C(args[0]));
         _StrStream ss;
         for(auto c : _self.str()) ss << (char)tolower(c);
-        return vm->PyStr(ss);
+        return vm->PyStr(ss.str());
     });
 
     _vm->bindMethod("str", "replace", [](VM* vm, PyVarList args) {
@@ -403,7 +403,7 @@ void __initializeBuiltinFunctions(VM* _vm) {
             if(i > 0) ss << _self;
             ss << vm->PyStr_AS_C(vm->asStr(_list[i]));
         }
-        return vm->PyStr(ss);
+        return vm->PyStr(ss.str());
     });
 
     /************ PyList ************/
@@ -713,7 +713,7 @@ extern "C" {
         _StrStream* s_out = dynamic_cast<_StrStream*>(vm->_stdout);
         _StrStream* s_err = dynamic_cast<_StrStream*>(vm->_stderr);
         if(s_out == nullptr || s_err == nullptr) UNREACHABLE();
-        PyOutputDump* dump = new PyOutputDump(*s_out, *s_err);
+        PyOutputDump* dump = new PyOutputDump(s_out->str(), s_err->str());
         s_out->str("");
         s_err->str("");
         return dump;

Dosya farkı çok büyük olduğundan ihmal edildi
+ 145 - 64
src/str.h


+ 9 - 7
src/vm.h

@@ -116,7 +116,7 @@ private:
                 PyVarList items = frame->popNValuesReversed(this, byte.arg);
                 _StrStream ss;
                 for(const auto& i : items) ss << PyStr_AS_C(asStr(i));
-                frame->push(PyStr(ss));
+                frame->push(PyStr(ss.str()));
             } break;
             case OP_LOAD_EVAL_FN: {
                 frame->push(builtins->attribs["eval"]);
@@ -375,7 +375,7 @@ public:
         if(tp == _tp_bool) return obj;
         if(tp == _tp_int) return PyBool(PyInt_AS_C(obj) != 0);
         if(tp == _tp_float) return PyBool(PyFloat_AS_C(obj) != 0.0);
-        PyVarOrNull len_fn = getAttr(obj, "__len__", false);
+        PyVarOrNull len_fn = getAttr(obj, __len__, false);
         if(len_fn != nullptr){
             PyVar ret = call(len_fn, {});
             return PyBool(PyInt_AS_C(ret) > 0);
@@ -516,7 +516,7 @@ public:
 
     PyVar newUserClassType(_Str name, PyVar base){
         PyVar obj = newClassType(name, base);
-        setAttr(obj, "__name__", PyStr(name));
+        setAttr(obj, __name__, PyStr(name));
         _types.erase(name);
         return obj;
     }
@@ -539,7 +539,7 @@ public:
 
     PyVar newModule(_Str name, bool saveToPath=true) {
         PyVar obj = newObject(_tp_module, (_Int)-2);
-        setAttr(obj, "__name__", PyStr(name));
+        setAttr(obj, __name__, PyStr(name));
         if(saveToPath) _modules[name] = obj;
         return obj;
     }
@@ -570,6 +570,7 @@ public:
     }
 
     void bindMethod(_Str typeName, _Str funcName, _CppFunc fn) {
+        funcName.intern();
         PyVar type = _types[typeName];
         PyVar func = PyNativeFunction(fn);
         setAttr(type, funcName, func);
@@ -586,6 +587,7 @@ public:
     }
 
     void bindFunc(PyVar module, _Str funcName, _CppFunc fn) {
+        funcName.intern();
         __checkType(module, _tp_module);
         PyVar func = PyNativeFunction(fn);
         setAttr(module, funcName, func);
@@ -691,7 +693,7 @@ public:
         this->True = newObject(_tp_bool, true);
         this->False = newObject(_tp_bool, false);
         this->builtins = newModule("builtins");
-        this->_main = newModule("__main__", false);
+        this->_main = newModule("__main__"c, false);
 
         setAttr(_tp_type, __base__, _tp_object);
         setAttr(_tp_type, __class__, _tp_type);
@@ -699,7 +701,7 @@ public:
         setAttr(_tp_object, __class__, _tp_type);
         
         for (auto& [name, type] : _types) {
-            setAttr(type, "__name__", PyStr(name));
+            setAttr(type, __name__, PyStr(name));
         }
 
         this->__py2py_call_signal = newObject(_tp_object, (_Int)7);
@@ -916,7 +918,7 @@ PyVar RangeIterator::next(){
 }
 
 PyVar StringIterator::next(){
-    return vm->PyStr(str->u8_getitem(index++));
+    return vm->PyStr(str.u8_getitem(index++));
 }
 
 enum ThreadState {

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor