diff --git a/scripts/moc.py b/scripts/moc.py index eef73a1f..5ee3b35c 100644 --- a/scripts/moc.py +++ b/scripts/moc.py @@ -28,6 +28,8 @@ for n in [4,3,2,1]: c_args = ['VM*'] + [mapping[i] for i in p_args] c_ret = mapping[p_ret] name = f'__f_{p_ret}__{"_".join(p_args)}' + # if c_ret == 'const char*': + # c_ret = 'char*' s = f'typedef {c_ret} (*{name})({", ".join(c_args)});' s += '\n' diff --git a/src/builtins.h b/src/builtins.h index b653ea25..dc18bc4b 100644 --- a/src/builtins.h +++ b/src/builtins.h @@ -270,42 +270,6 @@ class dict: a.append(k.__json__()+': '+v.__json__()) return '{'+ ', '.join(a) + '}' -import ffi - -def input(): - return ffi.input() - -class FileIO: - def __init__(self, path, mode): - assert type(path) is str - assert type(mode) is str - assert mode in ['r', 'w', 'rt', 'wt'] - self.path = path - self.mode = mode - self.fp = ffi.fopen(path, mode) - - def read(self): - assert self.mode in ['r', 'rt'] - return ffi.fread(self.fp) - - def write(self, s): - assert self.mode in ['w', 'wt'] - assert type(s) is str - ffi.fwrite(self.fp, s) - - def close(self): - ffi.fclose(self.fp) - - def __enter__(self): - pass - - def __exit__(self): - self.close() - -def open(path, mode='r'): - return FileIO(path, mode) - - class set: def __init__(self, iterable=None): iterable = iterable or [] diff --git a/src/main.cpp b/src/main.cpp index 6d92eed0..1a18ecb7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,31 +3,28 @@ #include "pocketpy.h" -#define PK_DEBUG_TIME - struct Timer{ const char* title; Timer(const char* title) : title(title) {} void run(std::function f){ -#ifdef PK_DEBUG_TIME auto start = std::chrono::high_resolution_clock::now(); f(); auto end = std::chrono::high_resolution_clock::now(); double elapsed = std::chrono::duration_cast(end - start).count() / 1000000.0; std::cout << title << ": " << elapsed << " s" << std::endl; -#else - f(); -#endif } }; - - #ifndef __NO_MAIN int main(int argc, char** argv){ + VM* vm = pkpy_new_vm(true); + pkpy_vm_bind__f_str__(vm, "builtins", "input", [](VM* vm){ + static std::string line; + std::getline(std::cin, line); + return line.c_str(); + }); if(argc == 1){ - VM* vm = pkpy_new_vm(true); REPL repl(vm); int result = -1; while(true){ @@ -36,6 +33,7 @@ int main(int argc, char** argv){ std::getline(std::cin, line); result = pkpy_repl_input(&repl, line.c_str()); } + pkpy_delete(vm); return 0; } @@ -49,13 +47,17 @@ int main(int argc, char** argv){ return 1; } std::string src((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + PyVarOrNull ret = nullptr; - VM* vm = pkpy_new_vm(true); - Timer("Running time").run([=]{ - vm->exec(src.c_str(), filename, EXEC_MODE); - }); + if(filename[0] != '_'){ + Timer("Running time").run([&]{ + ret = vm->exec(src.c_str(), filename, EXEC_MODE); + }); + }else{ + ret = vm->exec(src.c_str(), filename, EXEC_MODE); + } pkpy_delete(vm); - return 0; + return ret != nullptr ? 0 : 1; } __HELP: diff --git a/src/pocketpy.h b/src/pocketpy.h index a1885f75..94a5a65a 100644 --- a/src/pocketpy.h +++ b/src/pocketpy.h @@ -765,9 +765,6 @@ extern "C" { __add_module_math(vm); __add_module_re(vm); __add_module_dis(vm); - - - vm->new_module("ffi"); // add builtins | no exception handler | must succeed _Code code = vm->compile(__BUILTINS_CODE, "", EXEC_MODE);