]> gitweb.factorcode.org Git - factor.git/blobdiff - extra/llvm/wrappers/wrappers.factor
install functions from llvm bytecode, with test
[factor.git] / extra / llvm / wrappers / wrappers.factor
index 2a3e696edc2c5594af91d406c9ba4ce84a60f16e..22da1b36f467cc1f19269b79242824df8f047f89 100644 (file)
@@ -1,10 +1,11 @@
-USING: accessors alien.c-types alien.strings destructors kernel
+USING: accessors alien.c-types alien.strings
+io.encodings.utf8 destructors kernel
 llvm.core llvm.engine ;
 
 IN: llvm.wrappers
 
 : llvm-throw ( char* -- )
-    [ alien>string ] [ LLVMDisposeMessage ] bi throw ;
+    [ utf8 alien>string ] [ LLVMDisposeMessage ] bi throw ;
 
 : <dispose> ( alien class -- disposable ) new swap >>value ;
 
@@ -14,21 +15,21 @@ M: module dispose* value>> LLVMDisposeModule ;
 : <module> ( name -- module )
     LLVMModuleCreateWithName module <dispose> ;
 
-TUPLE: provider value disposed ;
+TUPLE: provider value module disposed ;
 M: provider dispose* value>> LLVMDisposeModuleProvider ;
 
-: <provider> ( module -- module-provider )
-    ! we don't want to dispose when an error occurs
-    ! for example, retries with the same module wouldn't work
-    ! but we do want to mark the module as disposed on success
-    [ value>> LLVMCreateModuleProviderForExistingModule ]
-    [ t >>disposed drop ] bi
-    provider <dispose> ;
+: (provider) ( module -- provider )
+    [ value>> LLVMCreateModuleProviderForExistingModule provider <dispose> ]
+    [ t >>disposed value>> ] bi
+    >>module ;
+
+: <provider> ( module -- provider )
+    [ (provider) ] with-disposal ;
 
 TUPLE: engine value disposed ;
 M: engine dispose* value>> LLVMDisposeExecutionEngine ;
 
-: <engine> ( provider -- engine )
+: (engine) ( provider -- engine )
     [
         value>> f <void*> f <void*>
         [ swapd 0 swap LLVMCreateJITCompiler drop ] 2keep
@@ -37,6 +38,9 @@ M: engine dispose* value>> LLVMDisposeExecutionEngine ;
     [ t >>disposed drop ] bi
     engine <dispose> ;
 
+: <engine> ( provider -- engine )
+    [ (engine) ] with-disposal ;
+
 : (add-block) ( name -- basic-block )
     "function" swap LLVMAppendBasicBlock ;
 
@@ -45,4 +49,12 @@ M: builder dispose* value>> LLVMDisposeBuilder ;
 
 : <builder> ( name -- builder )
     (add-block) LLVMCreateBuilder [ swap LLVMPositionBuilderAtEnd ] keep
-    builder <dispose> ;
\ No newline at end of file
+    builder <dispose> ;
+
+TUPLE: buffer value disposed ;
+M: buffer dispose* value>> LLVMDisposeMemoryBuffer ;
+
+: <buffer> ( path -- module )
+    f <void*> f <void*>
+    [ LLVMCreateMemoryBufferWithContentsOfFile drop ] 2keep
+    *void* [ llvm-throw ] when* *void* buffer <dispose> ;
\ No newline at end of file