! Copyright (C) 2009 Matthew Willis. ! See http://factorcode.org/license.txt for BSD license. USING: accessors alien.c-types alien.strings io.encodings.utf8 destructors kernel llvm.core llvm.engine ; IN: llvm.wrappers : llvm-throw ( char* -- ) [ utf8 alien>string ] [ LLVMDisposeMessage ] bi throw ; : ( alien class -- disposable ) new swap >>value ; TUPLE: module value disposed ; M: module dispose* value>> LLVMDisposeModule ; : ( name -- module ) LLVMModuleCreateWithName module ; TUPLE: provider value module disposed ; M: provider dispose* value>> LLVMDisposeModuleProvider ; : (provider) ( module -- provider ) [ value>> LLVMCreateModuleProviderForExistingModule provider ] [ t >>disposed value>> ] bi >>module ; : ( module -- provider ) [ (provider) ] with-disposal ; TUPLE: engine value disposed ; M: engine dispose* value>> LLVMDisposeExecutionEngine ; : (engine) ( provider -- engine ) [ value>> f f [ swapd 0 swap LLVMCreateJITCompiler drop ] 2keep *void* [ llvm-throw ] when* *void* ] [ t >>disposed drop ] bi engine ; : ( provider -- engine ) [ (engine) ] with-disposal ; : (add-block) ( name -- basic-block ) "function" swap LLVMAppendBasicBlock ; TUPLE: builder value disposed ; M: builder dispose* value>> LLVMDisposeBuilder ; : ( name -- builder ) (add-block) LLVMCreateBuilder [ swap LLVMPositionBuilderAtEnd ] keep builder ; TUPLE: buffer value disposed ; M: buffer dispose* value>> LLVMDisposeMemoryBuffer ; : ( path -- module ) f f [ LLVMCreateMemoryBufferWithContentsOfFile drop ] 2keep *void* [ llvm-throw ] when* *void* buffer ;