/ llvm / memory-buffer.scm
memory-buffer.scm
 1  (define-module (llvm memory-buffer)
 2    #:use-module (oop goops)
 3    #:use-module (rnrs bytevectors)
 4    #:use-module (system foreign)
 5    #:use-module (llvm utils)
 6    #:use-module (llvm types)
 7    #:use-module (llvm raw)
 8    #:export (create-memory-buffer
 9              call-with-memory-buffer))
10  
11  (define (%create-memory-buffer/path path)
12    (let ((p (make-double-pointer))
13          (sp (make-double-pointer)))
14      (if (zero?
15           (LLVMCreateMemoryBufferWithContentsOfFile
16            (string->pointer path) p sp))
17          (wrap-llvm-memory-buffer (dereference-pointer p))
18          (error 'system-error (pointer->string (dereference-pointer sp))))))
19  
20  (define (%create-memory-buffer/bv bv name)
21    (wrap-llvm-memory-buffer
22     (LLVMCreateMemoryBufferWithMemoryRangeCopy
23      (bytevector->pointer bv)
24      (bytevector-length bv)
25      (if name
26          (string->pointer name)
27          %null-pointer))))
28  
29  (define* (create-memory-buffer
30            path-or-bytevectory
31            #:key name)
32    (if (bytevector? path-or-bytevectory)
33        (%create-memory-buffer/bv path-or-bytevectory name)
34        (%create-memory-buffer/path path-or-bytevectory)))
35  
36  (define-public (memory-buffer-content buffer)
37    (let ((b-p (unwrap-llvm-memory-buffer buffer)))
38      (pointer->bytevector (LLVMGetBufferStart b-p)
39                           (LLVMGetBufferSize b-p))))
40  
41  ;; (define-public (dispose-memory-buffer buffer)
42  ;;   (let ((p (unwrap-llvm-memory-buffer buffer)))
43  ;;     (change-class buffer <llvm-freed>)
44  ;;     (LLVMDisposeMemoryBuffer p)))
45  
46  (define* (call-with-memory-buffer path-or-bv
47                                    proc
48                                    #:key (name #f))
49    (let ((mb #f))
50      (dynamic-wind
51        (lambda ()
52          (set! mb (create-memory-buffer path-or-bv #:name name)))
53        (lambda ()
54          (proc mb))
55        (lambda ()
56          ;(dispose-memory-buffer mb)
57          (set! mb #f)))))