diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 11f38752..2ce936af 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,39 +10,8 @@ jobs: shell: bash run: | CL -std:c++17 -GR- -EHsc -O2 -Fe:pocketpy src/main.cpp - mv src/pocketpy.h src/pocketpy.cpp - CL -std:c++17 -GR- -EHsc -O2 -LD -Fe:pocketpy src/pocketpy.cpp - mkdir -p output/windows/x86_64 - mv pocketpy.exe output/windows/x86_64 - mv pocketpy.dll output/windows/x86_64 - - uses: actions/upload-artifact@v3 - with: - path: output - build_web: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Setup emsdk - uses: mymindstorm/setup-emsdk@v11 - with: - version: 3.1.25 - actions-cache-folder: 'emsdk-cache' - - name: Verify emsdk - run: emcc -v - - name: Compiling - run: | - mkdir -p output/web/lib - bash build_wasm.sh - cp web/lib/* output/web/lib - - uses: crazy-max/ghaction-github-pages@v3 - with: - target_branch: gh-pages - build_dir: web - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - uses: actions/upload-artifact@v3 - with: - path: output + python3 scripts/run_tests.py + ./pocketpy tests/1.py build_test_linux: runs-on: ubuntu-latest steps: @@ -51,39 +20,4 @@ jobs: run: | bash build_cpp.sh python3 scripts/run_tests.py - ./pocketpy tests/1.py - mkdir -p output/linux/x86_64 - mv pocketpy output/linux/x86_64 - - uses: actions/upload-artifact@v3 - with: - path: output - build_android: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: subosito/flutter-action@v2 - with: - flutter-version: '3.0.0' - channel: 'stable' - - run: flutter --version - - name: Compiling - run: | - python3 amalgamate.py - cd plugins/flutter/example - flutter build apk --split-debug-info=.debug-info --split-per-abi - cd build/app/outputs/flutter-apk - mkdir -p output/android/arm64-v8a - mkdir -p output/android/armeabi-v7a - mkdir -p output/android/x86_64 - unzip -q app-arm64-v8a-release.apk -d tmp - mv tmp/lib/arm64-v8a/libpocketpy.so output/android/arm64-v8a/libpocketpy.so - rm -rf tmp - unzip -q app-armeabi-v7a-release.apk -d tmp - mv tmp/lib/armeabi-v7a/libpocketpy.so output/android/armeabi-v7a/libpocketpy.so - rm -rf tmp - unzip -q app-x86_64-release.apk -d tmp - mv tmp/lib/x86_64/libpocketpy.so output/android/x86_64/libpocketpy.so - rm -rf tmp - - uses: actions/upload-artifact@v3 - with: - path: plugins/flutter/example/build/app/outputs/flutter-apk/output \ No newline at end of file + ./pocketpy tests/1.py \ No newline at end of file diff --git a/.github/workflows/main.zip b/.github/workflows/main.zip new file mode 100644 index 00000000..98f58c52 Binary files /dev/null and b/.github/workflows/main.zip differ diff --git a/src/codeobject.h b/src/codeobject.h index 692ed42f..0d7fa0ee 100644 --- a/src/codeobject.h +++ b/src/codeobject.h @@ -264,8 +264,8 @@ public: if(new_size < 0) throw std::runtime_error("stack_size() < n"); pkpy::ArgList v(n); for(int i=n-1; i>=0; i--){ - v._index(i) = std::move(s_data[new_size + i]); - try_deref(vm, v._index(i)); + v[i] = std::move(s_data[new_size + i]); + try_deref(vm, v[i]); } s_data.resize(new_size); return v; @@ -279,7 +279,7 @@ public: pkpy::ArgList pop_n_reversed(int n){ pkpy::ArgList v(n); - for(int i=n-1; i>=0; i--) v._index(i) = pop(); + for(int i=n-1; i>=0; i--) v[i] = pop(); return v; } }; \ No newline at end of file diff --git a/src/pocketpy.h b/src/pocketpy.h index b5c08c1a..4ecd3453 100644 --- a/src/pocketpy.h +++ b/src/pocketpy.h @@ -19,10 +19,10 @@ _Code VM::compile(_Str source, _Str filename, CompileMode mode) { _vm->bindMethodMulti<1>({"int","float"}, #name, [](VM* vm, const pkpy::ArgList& args){ \ if(!vm->is_int_or_float(args[0], args[1])) \ vm->typeError("unsupported operand type(s) for " #op ); \ - if(args._index(0)->is_type(vm->_tp_int) && args._index(1)->is_type(vm->_tp_int)){ \ - return vm->PyInt(vm->PyInt_AS_C(args._index(0)) op vm->PyInt_AS_C(args._index(1))); \ + if(args[0]->is_type(vm->_tp_int) && args[1]->is_type(vm->_tp_int)){ \ + return vm->PyInt(vm->PyInt_AS_C(args[0]) op vm->PyInt_AS_C(args[1])); \ }else{ \ - return vm->PyFloat(vm->num_to_float(args._index(0)) op vm->num_to_float(args._index(1))); \ + return vm->PyFloat(vm->num_to_float(args[0]) op vm->num_to_float(args[1])); \ } \ }); @@ -32,7 +32,7 @@ _Code VM::compile(_Str source, _Str filename, CompileMode mode) { if constexpr(is_eq) return vm->PyBool(args[0] == args[1]); \ vm->typeError("unsupported operand type(s) for " #op ); \ } \ - return vm->PyBool(vm->num_to_float(args._index(0)) op vm->num_to_float(args._index(1))); \ + return vm->PyBool(vm->num_to_float(args[0]) op vm->num_to_float(args[1])); \ }); @@ -216,17 +216,17 @@ void __initializeBuiltinFunctions(VM* _vm) { _vm->bindMethod<1>("int", "__floordiv__", [](VM* vm, const pkpy::ArgList& args) { if(!args[0]->is_type(vm->_tp_int) || !args[1]->is_type(vm->_tp_int)) vm->typeError("unsupported operand type(s) for " "//" ); - i64 rhs = vm->PyInt_AS_C(args._index(1)); + i64 rhs = vm->PyInt_AS_C(args[1]); if(rhs == 0) vm->zeroDivisionError(); - return vm->PyInt(vm->PyInt_AS_C(args._index(0)) / rhs); + return vm->PyInt(vm->PyInt_AS_C(args[0]) / rhs); }); _vm->bindMethod<1>("int", "__mod__", [](VM* vm, const pkpy::ArgList& args) { if(!args[0]->is_type(vm->_tp_int) || !args[1]->is_type(vm->_tp_int)) vm->typeError("unsupported operand type(s) for " "%" ); - i64 rhs = vm->PyInt_AS_C(args._index(1)); + i64 rhs = vm->PyInt_AS_C(args[1]); if(rhs == 0) vm->zeroDivisionError(); - return vm->PyInt(vm->PyInt_AS_C(args._index(0)) % rhs); + return vm->PyInt(vm->PyInt_AS_C(args[0]) % rhs); }); _vm->bindMethod<0>("int", "__repr__", [](VM* vm, const pkpy::ArgList& args) { @@ -239,7 +239,7 @@ void __initializeBuiltinFunctions(VM* _vm) { #define __INT_BITWISE_OP(name,op) \ _vm->bindMethod<1>("int", #name, [](VM* vm, const pkpy::ArgList& args) { \ - return vm->PyInt(vm->PyInt_AS_C(args._index(0)) op vm->PyInt_AS_C(args._index(1))); \ + return vm->PyInt(vm->PyInt_AS_C(args[0]) op vm->PyInt_AS_C(args[1])); \ }); __INT_BITWISE_OP(__lshift__, <<) @@ -288,7 +288,7 @@ void __initializeBuiltinFunctions(VM* _vm) { /************ PyString ************/ _vm->bindStaticMethod<1>("str", "__new__", [](VM* vm, const pkpy::ArgList& args) { - return vm->asStr(args._index(0)); + return vm->asStr(args[0]); }); _vm->bindMethod<1>("str", "__add__", [](VM* vm, const pkpy::ArgList& args) { @@ -411,7 +411,7 @@ void __initializeBuiltinFunctions(VM* _vm) { _vm->bindMethod<1>("list", "append", [](VM* vm, const pkpy::ArgList& args) { PyVarList& _self = vm->PyList_AS_C(args[0]); - _self.push_back(args._index(1)); + _self.push_back(args[1]); return vm->None; }); diff --git a/src/safestl.h b/src/safestl.h index 7a3bc673..14540842 100644 --- a/src/safestl.h +++ b/src/safestl.h @@ -45,15 +45,6 @@ namespace pkpy { PyVar* _args = nullptr; uint8_t _size = 0; - inline void __checkIndex(uint8_t i) const { -#ifndef PKPY_NO_INDEX_CHECK - if (i >= _size){ - auto msg = "pkpy:ArgList index out of range, " + std::to_string(i) + " not in [0, " + std::to_string(size()) + ")"; - throw std::out_of_range(msg); - } -#endif - } - void __tryAlloc(size_t n){ if(n > 255) UNREACHABLE(); if(n >= MAX_POOLING_N || _poolArgList[n].empty()){ @@ -103,23 +94,8 @@ namespace pkpy { other.clear(); } - PyVar& operator[](uint8_t i){ - __checkIndex(i); - return _args[i]; - } - - const PyVar& operator[](uint8_t i) const { - __checkIndex(i); - return _args[i]; - } - - inline PyVar& _index(uint8_t i){ - return _args[i]; - } - - inline const PyVar& _index(uint8_t i) const { - return _args[i]; - } + PyVar& operator[](uint8_t i){ return _args[i]; } + const PyVar& operator[](uint8_t i) const { return _args[i]; } // overload = for && ArgList& operator=(ArgList&& other) noexcept { @@ -164,29 +140,18 @@ namespace pkpy { return ret; } - ArgList oneArg(PyVar&& a) { + template + ArgList oneArg(T&& a) { ArgList ret(1); - ret[0] = std::move(a); + ret[0] = std::forward(a); return ret; } - ArgList oneArg(const PyVar& a) { - ArgList ret(1); - ret[0] = a; - return ret; - } - - ArgList twoArgs(PyVar&& a, PyVar&& b) { + template + ArgList twoArgs(T1&& a, T2&& b) { ArgList ret(2); - ret[0] = std::move(a); - ret[1] = std::move(b); - return ret; - } - - ArgList twoArgs(const PyVar& a, const PyVar& b) { - ArgList ret(2); - ret[0] = a; - ret[1] = b; + ret[0] = std::forward(a); + ret[1] = std::forward(b); return ret; } } \ No newline at end of file diff --git a/src/vm.h b/src/vm.h index 67d819ab..2b237c36 100644 --- a/src/vm.h +++ b/src/vm.h @@ -135,8 +135,8 @@ protected: case OP_BINARY_OP: { pkpy::ArgList args(2); - args._index(1) = frame->pop_value(this); - args._index(0) = frame->top_value(this); + args[1] = frame->pop_value(this); + args[0] = frame->top_value(this); frame->top() = fast_call(BINARY_SPECIAL_METHODS[byte.arg], std::move(args)); } break; case OP_BITWISE_OP: @@ -522,7 +522,7 @@ public: // repl mode is only for setting `frame->id` to 0 - virtual PyVarOrNull exec(_Str source, _Str filename, CompileMode mode, PyVar _module=nullptr){ + PyVarOrNull exec(_Str source, _Str filename, CompileMode mode, PyVar _module=nullptr){ if(_module == nullptr) _module = _main; try { _Code code = compile(source, filename, mode); @@ -935,7 +935,7 @@ public: if(!obj->is_type(type)) typeError("expected '" + UNION_NAME(type) + "', but got '" + UNION_TP_NAME(obj) + "'"); } - virtual ~VM() { + ~VM() { if(!use_stdio){ delete _stdout; delete _stderr;