mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-23 04:50:17 +00:00
cleanup and light refactor (with some renames)
This commit is contained in:
parent
d4b9d354ed
commit
527a783d13
12
build_c.sh
12
build_c.sh
@ -1,12 +0,0 @@
|
|||||||
python3 preprocess.py
|
|
||||||
|
|
||||||
echo "compiling c++ lib"
|
|
||||||
clang++ -c -o pocketpy_c.o c_bindings/pocketpy_c.cpp -Wfatal-errors --std=c++17 -O2 -Wall -Wno-sign-compare -Wno-unused-variable -fno-rtti -stdlib=libc++ -I src/ -fsanitize=address -g
|
|
||||||
echo "compiling c executable"
|
|
||||||
clang -c -o main.o c_bindings/main.c -Wfatal-errors -O2 -Wall -Wno-sign-compare -Wno-unused-variable -I src/ -fsanitize=address -g
|
|
||||||
echo "linking"
|
|
||||||
clang++ -o pocketpy_c main.o pocketpy_c.o -stdlib=libc++ -fsanitize=address -g
|
|
||||||
echo "cleaning up"
|
|
||||||
rm pocketpy_c.o
|
|
||||||
rm main.o
|
|
||||||
|
|
@ -78,13 +78,13 @@ bool pkpy_clear_error(pkpy_vm vm_handle, char** message) {
|
|||||||
SAFEGUARD_CLOSE
|
SAFEGUARD_CLOSE
|
||||||
}
|
}
|
||||||
|
|
||||||
pkpy_vm pkpy_new_vm(bool use_stdio, bool enable_os) {
|
pkpy_vm pkpy_vm_create(bool use_stdio, bool enable_os) {
|
||||||
VM* vm = new VM(use_stdio, enable_os);
|
VM* vm = new VM(use_stdio, enable_os);
|
||||||
|
|
||||||
return (pkpy_vm) vm;
|
return (pkpy_vm) vm;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pkpy_vm_exec(pkpy_vm vm_handle, const char* source) {
|
bool pkpy_vm_run(pkpy_vm vm_handle, const char* source) {
|
||||||
VM* vm = (VM*) vm_handle;
|
VM* vm = (VM*) vm_handle;
|
||||||
ERRHANDLER_OPEN
|
ERRHANDLER_OPEN
|
||||||
|
|
||||||
@ -96,27 +96,11 @@ bool pkpy_vm_exec(pkpy_vm vm_handle, const char* source) {
|
|||||||
ERRHANDLER_CLOSE
|
ERRHANDLER_CLOSE
|
||||||
}
|
}
|
||||||
|
|
||||||
void pkpy_delete_vm(pkpy_vm vm_handle) {
|
void pkpy_vm_destroy(pkpy_vm vm_handle) {
|
||||||
VM* vm = (VM*) vm_handle;
|
VM* vm = (VM*) vm_handle;
|
||||||
delete vm;
|
delete vm;
|
||||||
}
|
}
|
||||||
|
|
||||||
pkpy_repl pkpy_new_repl(pkpy_vm vm_handle) {
|
|
||||||
VM* vm = (VM*) vm_handle;
|
|
||||||
REPL* repl = new REPL(vm);
|
|
||||||
return (pkpy_repl) repl;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool pkpy_repl_input(pkpy_repl repl_handle, const char* line) {
|
|
||||||
REPL* repl = (REPL*) repl_handle;
|
|
||||||
return repl->input(line);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pkpy_delete_repl(pkpy_repl repl_handle) {
|
|
||||||
REPL* repl = (REPL*) repl_handle;
|
|
||||||
delete repl;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void propagate_if_errored(VM* vm) {
|
static void propagate_if_errored(VM* vm) {
|
||||||
try {
|
try {
|
||||||
if (vm->c_data.top() != nullptr)
|
if (vm->c_data.top() != nullptr)
|
||||||
|
@ -23,17 +23,9 @@ typedef struct pkpy_repl_hande* pkpy_repl;
|
|||||||
//or else pass in null as message, and it will just print the message to stderr
|
//or else pass in null as message, and it will just print the message to stderr
|
||||||
bool pkpy_clear_error(pkpy_vm, char** message);
|
bool pkpy_clear_error(pkpy_vm, char** message);
|
||||||
|
|
||||||
|
pkpy_vm pkpy_vm_create(bool use_stdio, bool enable_os);
|
||||||
pkpy_vm pkpy_new_vm(bool use_stdio, bool enable_os);
|
bool pkpy_vm_run(pkpy_vm, const char* source);
|
||||||
bool pkpy_vm_exec(pkpy_vm, const char* source);
|
void pkpy_vm_destroy(pkpy_vm);
|
||||||
void pkpy_delete_vm(pkpy_vm);
|
|
||||||
|
|
||||||
pkpy_repl pkpy_new_repl(pkpy_vm);
|
|
||||||
//the repl does its own error management, so this method doesn't follow the ame
|
|
||||||
//error semantics, it is just a thin wrapper around the REPL classes input method
|
|
||||||
bool pkpy_repl_input(pkpy_repl, const char* line);
|
|
||||||
void pkpy_delete_repl(pkpy_repl);
|
|
||||||
|
|
||||||
|
|
||||||
typedef int (*pkpy_function)(pkpy_vm);
|
typedef int (*pkpy_function)(pkpy_vm);
|
||||||
|
|
||||||
|
@ -78,16 +78,16 @@ int test_error_propagate(pkpy_vm vm) {
|
|||||||
pkpy_vm vm;
|
pkpy_vm vm;
|
||||||
|
|
||||||
void cleanup(void) {
|
void cleanup(void) {
|
||||||
pkpy_delete_vm(vm);
|
pkpy_vm_destroy(vm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
|
||||||
vm = pkpy_new_vm(true, true);
|
vm = pkpy_vm_create(true, true);
|
||||||
atexit(cleanup);
|
atexit(cleanup);
|
||||||
|
|
||||||
//test exec
|
//test run
|
||||||
check(pkpy_vm_exec(vm, "print('hello world!')"));
|
check(pkpy_vm_run(vm, "print('hello world!')"));
|
||||||
|
|
||||||
error(pkpy_get_global(vm, "nonexistatn"));
|
error(pkpy_get_global(vm, "nonexistatn"));
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ int main(int argc, char** argv) {
|
|||||||
int r_int;
|
int r_int;
|
||||||
check(pkpy_push_int(vm, 11));
|
check(pkpy_push_int(vm, 11));
|
||||||
check(pkpy_set_global(vm, "eleven"));
|
check(pkpy_set_global(vm, "eleven"));
|
||||||
check(pkpy_vm_exec(vm, "print(eleven)"));
|
check(pkpy_vm_run(vm, "print(eleven)"));
|
||||||
check(pkpy_get_global(vm, "eleven"));
|
check(pkpy_get_global(vm, "eleven"));
|
||||||
check(pkpy_is_int(vm, -1));
|
check(pkpy_is_int(vm, -1));
|
||||||
check(pkpy_to_int(vm, -1, &r_int));
|
check(pkpy_to_int(vm, -1, &r_int));
|
||||||
@ -109,7 +109,7 @@ int main(int argc, char** argv) {
|
|||||||
double r_float;
|
double r_float;
|
||||||
check(pkpy_push_float(vm, 11.11));
|
check(pkpy_push_float(vm, 11.11));
|
||||||
check(pkpy_set_global(vm, "elevenf"));
|
check(pkpy_set_global(vm, "elevenf"));
|
||||||
check(pkpy_vm_exec(vm, "print(elevenf)"));
|
check(pkpy_vm_run(vm, "print(elevenf)"));
|
||||||
check(pkpy_get_global(vm, "elevenf"));
|
check(pkpy_get_global(vm, "elevenf"));
|
||||||
check(pkpy_is_float(vm, -1));
|
check(pkpy_is_float(vm, -1));
|
||||||
check(pkpy_to_float(vm, -1, &r_float));
|
check(pkpy_to_float(vm, -1, &r_float));
|
||||||
@ -123,7 +123,7 @@ int main(int argc, char** argv) {
|
|||||||
bool r_bool;
|
bool r_bool;
|
||||||
check(pkpy_push_bool(vm, false));
|
check(pkpy_push_bool(vm, false));
|
||||||
check(pkpy_set_global(vm, "false_test"));
|
check(pkpy_set_global(vm, "false_test"));
|
||||||
check(pkpy_vm_exec(vm, "print(false_test)"));
|
check(pkpy_vm_run(vm, "print(false_test)"));
|
||||||
check(pkpy_get_global(vm, "false_test"));
|
check(pkpy_get_global(vm, "false_test"));
|
||||||
check(pkpy_is_bool(vm, -1));
|
check(pkpy_is_bool(vm, -1));
|
||||||
check(pkpy_to_bool(vm, -1, &r_bool));
|
check(pkpy_to_bool(vm, -1, &r_bool));
|
||||||
@ -137,7 +137,7 @@ int main(int argc, char** argv) {
|
|||||||
char* r_string;
|
char* r_string;
|
||||||
check(pkpy_push_string(vm, "hello!"));
|
check(pkpy_push_string(vm, "hello!"));
|
||||||
check(pkpy_set_global(vm, "hello1"));
|
check(pkpy_set_global(vm, "hello1"));
|
||||||
check(pkpy_vm_exec(vm, "print(hello1)"));
|
check(pkpy_vm_run(vm, "print(hello1)"));
|
||||||
check(pkpy_push_stringn(vm, "hello!", 5));
|
check(pkpy_push_stringn(vm, "hello!", 5));
|
||||||
check(pkpy_is_string(vm, -1));
|
check(pkpy_is_string(vm, -1));
|
||||||
check(pkpy_to_string(vm, -1, &r_string));
|
check(pkpy_to_string(vm, -1, &r_string));
|
||||||
@ -151,7 +151,7 @@ int main(int argc, char** argv) {
|
|||||||
printf("\ntesting None methods\n");
|
printf("\ntesting None methods\n");
|
||||||
check(pkpy_push_none(vm));
|
check(pkpy_push_none(vm));
|
||||||
check(pkpy_set_global(vm, "none"));
|
check(pkpy_set_global(vm, "none"));
|
||||||
check(pkpy_vm_exec(vm, "print(none)"));
|
check(pkpy_vm_run(vm, "print(none)"));
|
||||||
check(pkpy_get_global(vm, "none"));
|
check(pkpy_get_global(vm, "none"));
|
||||||
check(pkpy_is_none(vm, -1));
|
check(pkpy_is_none(vm, -1));
|
||||||
fail(pkpy_is_int(vm, -1));
|
fail(pkpy_is_int(vm, -1));
|
||||||
@ -177,15 +177,15 @@ int main(int argc, char** argv) {
|
|||||||
check(pkpy_is_none(vm, -1));
|
check(pkpy_is_none(vm, -1));
|
||||||
|
|
||||||
printf("\ntesting error catching\n");
|
printf("\ntesting error catching\n");
|
||||||
error(pkpy_vm_exec(vm, "let's make sure syntax errors get caught"));
|
error(pkpy_vm_run(vm, "let's make sure syntax errors get caught"));
|
||||||
check(pkpy_stack_size(vm) == 0); //stack should be cleared after error is resolved
|
check(pkpy_stack_size(vm) == 0); //stack should be cleared after error is resolved
|
||||||
|
|
||||||
printf("\ntesting calls\n");
|
printf("\ntesting calls\n");
|
||||||
|
|
||||||
check(pkpy_vm_exec(vm, "def x(x, y) : return x - y"));
|
check(pkpy_vm_run(vm, "def x(x, y) : return x - y"));
|
||||||
check(pkpy_vm_exec(vm, "def vararg_x(*x) : return sum(x)"));
|
check(pkpy_vm_run(vm, "def vararg_x(*x) : return sum(x)"));
|
||||||
check(pkpy_vm_exec(vm, "def keyword_x(x=1, y=1) : return x+y"));
|
check(pkpy_vm_run(vm, "def keyword_x(x=1, y=1) : return x+y"));
|
||||||
check(pkpy_vm_exec(vm, "def retmany_x() : return 1, 2, 3"));
|
check(pkpy_vm_run(vm, "def retmany_x() : return 1, 2, 3"));
|
||||||
|
|
||||||
check(pkpy_get_global(vm, "x"));
|
check(pkpy_get_global(vm, "x"));
|
||||||
check(pkpy_push_int(vm, 2));
|
check(pkpy_push_int(vm, 2));
|
||||||
@ -231,28 +231,28 @@ int main(int argc, char** argv) {
|
|||||||
check(pkpy_get_global(vm, "x"));
|
check(pkpy_get_global(vm, "x"));
|
||||||
error(pkpy_call(vm, 0));
|
error(pkpy_call(vm, 0));
|
||||||
|
|
||||||
check(pkpy_vm_exec(vm, "l = []"));
|
check(pkpy_vm_run(vm, "l = []"));
|
||||||
|
|
||||||
check(pkpy_get_global(vm, "l"));
|
check(pkpy_get_global(vm, "l"));
|
||||||
check(pkpy_push_string(vm, "hello"));
|
check(pkpy_push_string(vm, "hello"));
|
||||||
check(pkpy_call_method(vm, "append", 1));
|
check(pkpy_call_method(vm, "append", 1));
|
||||||
check(pkpy_vm_exec(vm, "print(l)"));
|
check(pkpy_vm_run(vm, "print(l)"));
|
||||||
|
|
||||||
|
|
||||||
printf("\ntesting pushing functions\n");
|
printf("\ntesting pushing functions\n");
|
||||||
|
|
||||||
check(pkpy_push_function(vm, test_binding));
|
check(pkpy_push_function(vm, test_binding));
|
||||||
check(pkpy_set_global(vm, "test_binding"));
|
check(pkpy_set_global(vm, "test_binding"));
|
||||||
check(pkpy_vm_exec(vm, "print(test_binding())"));
|
check(pkpy_vm_run(vm, "print(test_binding())"));
|
||||||
|
|
||||||
check(pkpy_push_function(vm, test_multiple_return));
|
check(pkpy_push_function(vm, test_multiple_return));
|
||||||
check(pkpy_set_global(vm, "test_multiple_return"));
|
check(pkpy_set_global(vm, "test_multiple_return"));
|
||||||
check(pkpy_vm_exec(vm, "test_multiple_return()"));
|
check(pkpy_vm_run(vm, "test_multiple_return()"));
|
||||||
check(pkpy_stack_size(vm) == 2);
|
check(pkpy_stack_size(vm) == 2);
|
||||||
|
|
||||||
check(pkpy_push_function(vm, test_error_propagate));
|
check(pkpy_push_function(vm, test_error_propagate));
|
||||||
check(pkpy_set_global(vm, "test_error_propagate"));
|
check(pkpy_set_global(vm, "test_error_propagate"));
|
||||||
error(pkpy_vm_exec(vm, "test_error_propagate()"));
|
error(pkpy_vm_run(vm, "test_error_propagate()"));
|
||||||
|
|
||||||
check(pkpy_get_global(vm, "test_multiple_return"));
|
check(pkpy_get_global(vm, "test_multiple_return"));
|
||||||
check(pkpy_call(vm, 0));
|
check(pkpy_call(vm, 0));
|
||||||
|
@ -15,7 +15,7 @@ clang++ -o c_binding_test test.o pocketpy_c.o -stdlib=libc++ -fsanitize=address
|
|||||||
echo "running, no weird output should show up"
|
echo "running, no weird output should show up"
|
||||||
./c_binding_test > binding_test_scratch
|
./c_binding_test > binding_test_scratch
|
||||||
echo "checking results (they should be identical)"
|
echo "checking results (they should be identical)"
|
||||||
diff -s binding_test_scratch c_bindings/test_answers.txt
|
diff -q -s binding_test_scratch c_bindings/test_answers.txt
|
||||||
|
|
||||||
echo "cleaning up"
|
echo "cleaning up"
|
||||||
rm pocketpy_c.o
|
rm pocketpy_c.o
|
||||||
|
@ -102,3 +102,4 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
} // namespace pkpy
|
} // namespace pkpy
|
||||||
|
|
||||||
|
@ -219,3 +219,4 @@ struct Frame {
|
|||||||
};
|
};
|
||||||
|
|
||||||
}; // namespace pkpy
|
}; // namespace pkpy
|
||||||
|
|
||||||
|
11
src/main.cpp
11
src/main.cpp
@ -6,21 +6,21 @@
|
|||||||
#ifndef __EMSCRIPTEN__
|
#ifndef __EMSCRIPTEN__
|
||||||
|
|
||||||
int main(int argc, char** argv){
|
int main(int argc, char** argv){
|
||||||
pkpy::VM* vm = new pkpy::VM();
|
pkpy::VM* vm = pkpy_new_vm();
|
||||||
vm->bind_builtin_func<0>("input", [](pkpy::VM* vm, pkpy::ArgsView args){
|
vm->bind_builtin_func<0>("input", [](pkpy::VM* vm, pkpy::ArgsView args){
|
||||||
return VAR(pkpy::getline());
|
return VAR(pkpy::getline());
|
||||||
});
|
});
|
||||||
if(argc == 1){
|
if(argc == 1){
|
||||||
pkpy::REPL* repl = new pkpy::REPL(vm);
|
pkpy::REPL* repl = pkpy_new_repl(vm);
|
||||||
bool need_more_lines = false;
|
bool need_more_lines = false;
|
||||||
while(true){
|
while(true){
|
||||||
(*vm->_stdout) << (need_more_lines ? "... " : ">>> ");
|
(*vm->_stdout) << (need_more_lines ? "... " : ">>> ");
|
||||||
bool eof = false;
|
bool eof = false;
|
||||||
std::string line = pkpy::getline(&eof);
|
std::string line = pkpy::getline(&eof);
|
||||||
if(eof) break;
|
if(eof) break;
|
||||||
need_more_lines = repl->input(line.c_str());
|
need_more_lines = pkpy_repl_input(repl, line.c_str());
|
||||||
}
|
}
|
||||||
delete vm;
|
pkpy_delete(vm);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ int main(int argc, char** argv){
|
|||||||
|
|
||||||
pkpy::PyObject* ret = nullptr;
|
pkpy::PyObject* ret = nullptr;
|
||||||
ret = vm->exec(src.c_str(), argv_1, pkpy::EXEC_MODE);
|
ret = vm->exec(src.c_str(), argv_1, pkpy::EXEC_MODE);
|
||||||
delete vm;
|
pkpy_delete(vm);
|
||||||
return ret != nullptr ? 0 : 1;
|
return ret != nullptr ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,3 +57,4 @@ __HELP:
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -977,7 +977,6 @@ inline void VM::post_init(){
|
|||||||
} // namespace pkpy
|
} // namespace pkpy
|
||||||
|
|
||||||
/*************************GLOBAL NAMESPACE*************************/
|
/*************************GLOBAL NAMESPACE*************************/
|
||||||
/*
|
|
||||||
static std::map<void*, void(*)(void*)> _pk_deleter_map;
|
static std::map<void*, void(*)(void*)> _pk_deleter_map;
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -1050,4 +1049,5 @@ extern "C" {
|
|||||||
return strdup(json.c_str());
|
return strdup(json.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
}*/
|
}
|
||||||
|
|
||||||
|
@ -435,3 +435,4 @@ const StrName __or__ = StrName::get("__or__");
|
|||||||
const StrName __xor__ = StrName::get("__xor__");
|
const StrName __xor__ = StrName::get("__xor__");
|
||||||
|
|
||||||
} // namespace pkpy
|
} // namespace pkpy
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user