basic proof of concept working

This commit is contained in:
Kolten Pearson 2023-04-29 17:49:26 -06:00
parent b4769d77ea
commit f701cc1e67
7 changed files with 49 additions and 20 deletions

View File

@ -1,11 +1,11 @@
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/
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/
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++
clang++ -o pocketpy_c main.o pocketpy_c.o -stdlib=libc++ -fsanitize=address -g
echo "cleaning up"
rm pocketpy_c.o
rm main.o

View File

@ -1,4 +1,5 @@
#include "pocketpy_c.h"
#include <stdio.h>
void test_binding(pkpy_vm vm) {
@ -20,7 +21,16 @@ int main(int argc, char** argv) {
pkpy_vm_exec(vm, "print(eleven)");
pkpy_vm_exec(vm, "print(binding())");
pkpy_vm_destroy(vm);
pkpy_vm_exec(vm, "x = lambda x : x + 1");
pkpy_get_global(vm, "x");
pkpy_push_null(vm);
pkpy_push_int(vm, 1);
pkpy_call(vm, 1);
int64_t r = pkpy_toint(vm, 1);
printf("%li\n", r);
pkpy_vm_destroy(vm);
return 0;
}

View File

@ -21,7 +21,7 @@ void pkpy_vm_destroy(pkpy_vm vm_handle) {
void pkpy_push_cfunction(pkpy_vm vm_handle, pkpy_cfunction f) {
pkpy::VM* vm = (pkpy::VM*) vm_handle;
vm->s_data.push(pkpy::py_var(vm, pkpy::StackFunc((pkpy::StackFuncC) f)));
vm->s_data.push(VAR((pkpy::StackFunc) f));
}
void pkpy_push_int(pkpy_vm vm_handle, int64_t value) {
@ -29,6 +29,12 @@ void pkpy_push_int(pkpy_vm vm_handle, int64_t value) {
vm->s_data.push(VAR(value));
}
void pkpy_push_null(pkpy_vm vm_handle) {
pkpy::VM* vm = (pkpy::VM*) vm_handle;
vm->s_data.push(pkpy::PY_NULL);
}
void pkpy_push_float(pkpy_vm vm_handle, double value) {
pkpy::VM* vm = (pkpy::VM*) vm_handle;
vm->s_data.push(VAR(value));
@ -42,4 +48,24 @@ void pkpy_set_global(pkpy_vm vm_handle, const char* name) {
vm->s_data.pop();
}
void pkpy_get_global(pkpy_vm vm_handle, const char* name) {
pkpy::VM* vm = (pkpy::VM*) vm_handle;
pkpy::PyObject* o = vm->_main->attr().try_get(name);
vm->s_data.push(o);
}
void pkpy_call(pkpy_vm vm_handle, int argc) {
pkpy::VM* vm = (pkpy::VM*) vm_handle;
pkpy::PyObject* o = vm->vectorcall(argc, 0, 0);
vm->s_data.push(o);
}
int pkpy_toint(pkpy_vm vm_handle, int index) {
pkpy::VM* vm = (pkpy::VM*) vm_handle;
pkpy::PyObject* o = vm->s_data.peek(index);
return pkpy::py_cast<int>(vm, o);
}

View File

@ -20,9 +20,13 @@ typedef void (*pkpy_cfunction)(pkpy_vm);
void pkpy_push_cfunction(pkpy_vm, pkpy_cfunction);
void pkpy_push_int(pkpy_vm, int64_t);
void pkpy_push_float(pkpy_vm, double);
void pkpy_push_null(pkpy_vm);
void pkpy_set_global(pkpy_vm, const char* name);
void pkpy_get_global(pkpy_vm vm_handle, const char* name);
void pkpy_call(pkpy_vm vm_handle, int argc);
int pkpy_toint(pkpy_vm vm_handle, int index);

View File

@ -24,14 +24,7 @@ struct NativeFunc {
};
typedef void (*StackFuncC)(VM*);
struct StackFunc {
StackFuncC f;
StackFunc(StackFuncC f) : f(f) {}
void operator()(VM* vm) const;
};
typedef void (*StackFunc)(VM*);
struct FuncDecl {
struct KwArg {

View File

@ -414,11 +414,6 @@ inline PyObject* NativeFunc::operator()(VM* vm, ArgsView args) const{
return f(vm, args);
}
inline void StackFunc::operator()(VM* vm) const{
return f(vm);
}
inline void CodeObject::optimize(VM* vm){
// uint32_t base_n = (uint32_t)(names.size() / kLocalsLoadFactor + 0.5);
// perfect_locals_capacity = std::max(find_next_capacity(base_n), NameDict::__Capacity);
@ -866,6 +861,7 @@ inline void VM::init_builtin_types(){
tp_module = _new_type_object("module");
tp_function = _new_type_object("function");
tp_native_func = _new_type_object("native_func");
tp_stack_func = _new_type_object("stack_func");
tp_iterator = _new_type_object("iterator");
tp_bound_method = _new_type_object("bound_method");
tp_super = _new_type_object("super");