Просмотр исходного кода

Added the ability to override the import handler in c.

Chukobyte 2 лет назад
Родитель
Сommit
075b9c776c
4 измененных файлов с 19 добавлено и 0 удалено
  1. 3 0
      .gitignore
  2. 2 0
      include/pocketpy/pocketpy_c.h
  3. 10 0
      src/pocketpy_c.cpp
  4. 4 0
      src2/pocketpy_c.c

+ 3 - 0
.gitignore

@@ -3,6 +3,7 @@ __pycache__/
 .ipynb_checkpoints
 .DS_Store
 .coverage
+.idea
 
 src/main
 gmon.out
@@ -35,5 +36,7 @@ main
 pypi/
 libpocketpy.dylib
 
+cmake-build-*
+
 .xmake/
 

+ 2 - 0
include/pocketpy/pocketpy_c.h

@@ -13,6 +13,7 @@ extern "C" {
 typedef struct pkpy_vm_handle pkpy_vm;
 typedef int (*pkpy_CFunction)(pkpy_vm*);
 typedef void (*pkpy_COutputHandler)(pkpy_vm*, const char*, int);
+typedef const char* (*pkpy_CImportHandler)(const char*);
 typedef int pkpy_CName;
 typedef int pkpy_CType;
 
@@ -95,6 +96,7 @@ PK_EXPORT pkpy_CName pkpy_name(const char* s);
 PK_EXPORT pkpy_CString pkpy_name_to_string(pkpy_CName name);
 PK_EXPORT void pkpy_compile_to_string(pkpy_vm*, const char* source, const char* filename, int mode, bool* ok, char** out);
 PK_EXPORT void pkpy_set_output_handler(pkpy_vm*, pkpy_COutputHandler handler);
+PK_EXPORT void pkpy_set_import_handler(pkpy_vm*, pkpy_CImportHandler handler);
 
 /* REPL */
 PK_EXPORT void* pkpy_new_repl(pkpy_vm*);

+ 10 - 0
src/pocketpy_c.cpp

@@ -584,6 +584,16 @@ void pkpy_set_output_handler(pkpy_vm* vm_handle, pkpy_COutputHandler handler){
     vm->_stdout = reinterpret_cast<PrintFunc>(handler);
 }
 
+void pkpy_set_import_handler(pkpy_vm* vm_handle, pkpy_CImportHandler handler){
+    VM* vm = (VM*) vm_handle;
+    static pkpy_CImportHandler activeHandler;
+    activeHandler = handler;
+    vm->_import_handler = [](const Str& str) -> pkpy::Bytes {
+        const char* returnString = activeHandler(str.c_str());
+        return { Str(returnString) };
+    };
+}
+
 void* pkpy_new_repl(pkpy_vm* vm_handle){
     return new REPL((VM*)vm_handle);
 }

+ 4 - 0
src2/pocketpy_c.c

@@ -246,6 +246,10 @@ void pkpy_set_output_handler(pkpy_vm* vm, pkpy_COutputHandler handler) {
 
 }
 
+void pkpy_set_import_handler(pkpy_vm* vm, pkpy_CImportHandler handler) {
+
+}
+
 void* pkpy_new_repl(pkpy_vm* vm) {
     void* returnValue;
     return returnValue;