From e9ed4abcc5a44e5b3fcb92eec2de46ed30c60a40 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Thu, 24 Mar 2016 00:14:57 -0400 Subject: [PATCH] bytevector fixes --- bytevector-tests.scm | 1 + include/cyclone/runtime.h | 1 + runtime.c | 2 +- scheme/cyclone/cgen.sld | 50 +++++++++++++++++++++++++++++++++++ scheme/cyclone/transforms.sld | 1 + 5 files changed, 54 insertions(+), 1 deletion(-) diff --git a/bytevector-tests.scm b/bytevector-tests.scm index a739cb93..70e9b790 100644 --- a/bytevector-tests.scm +++ b/bytevector-tests.scm @@ -1,5 +1,6 @@ (import (scheme base) (scheme write)) +(write #u8(1 2 3 4 5)) (write (make-bytevector 2 12)) ; =⇒ #u8(12 12) ;(write (bytevector 1 3 5 1 3 5)) ; =⇒ #u8(1 3 5 1 3 5) ;(write (bytevector)) ;=⇒ #u8() diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index 11dc11b3..a09a5835 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -158,6 +158,7 @@ object Cyc_make_vector(void *data, object cont, int argc, object len, ...); object Cyc_make_bytevector(void *data, object cont, int argc, object len, ...); object Cyc_bytevector(void *data, object cont, int argc, object bval, ...); object Cyc_bytevector_length(void *data, object bv); +object Cyc_bytevector_append(void *data, object cont, int _argc, object bv, ...); object Cyc_bytevector_u8_ref(void *data, object bv, object k); object Cyc_bytevector_u8_set(void *data, object bv, object k, object b); object Cyc_list2vector(void *data, object cont, object l); diff --git a/runtime.c b/runtime.c index f865a82a..dc099ab7 100644 --- a/runtime.c +++ b/runtime.c @@ -1464,7 +1464,7 @@ void dispatch_bytevector_91append(void *data, int _argc, object clo, object cont Cyc_bytevector_append_va_list((_argc - 1)); } -object Cyc_bytevector_append(void *data, object cont, int _argc, object bval, ...) { +object Cyc_bytevector_append(void *data, object cont, int _argc, object bv, ...) { Cyc_bytevector_append_va_list(_argc); } diff --git a/scheme/cyclone/cgen.sld b/scheme/cyclone/cgen.sld index 0782cd3e..0021b054 100644 --- a/scheme/cyclone/cgen.sld +++ b/scheme/cyclone/cgen.sld @@ -391,6 +391,50 @@ (number->string len) ");"))))) (loop 0 code)))))) +(define (c-compile-bytevector exp) + (letrec ((cvar-name (mangle (gensym 'vec))) + (len (bytevector-length exp)) + ;; Generate code for each member of the vector + (loop + (lambda (i code) + (if (= i len) + code + (let ((byte-val (number->string (bytevector-u8-ref exp i)))) + (loop + (+ i 1) + (c-code/vars + ;; The bytevector's C variable + (c:body code) + ;; Allocations + (append + (c:allocs code) ;; Vector alloc + (list ;; Assign this member to vector + (string-append + cvar-name ".data[" (number->string i) "] = (unsigned char)" + byte-val + ";")))) + )))) + ) + ) + (cond + ((zero? len) + (c-code/vars + (string-append "&" cvar-name) ; Code is just the variable name + (list ; Allocate empty vector + (string-append + "make_empty_bytevector(" cvar-name ");")))) + (else + (let ((code + (c-code/vars + (string-append "&" cvar-name) ; Code body is just var name + (list ; Allocate the vector + (string-append + "make_empty_bytevector(" cvar-name ");" + cvar-name ".len = " (number->string len) ";" + cvar-name ".data = alloca(sizeof(char) * " + (number->string len) ");"))))) + (loop 0 code)))))) + ;; c-compile-const : const-exp -> c-pair ;; ;; Typically this function is used to compile constant values such as @@ -404,6 +448,8 @@ (c-compile-scalars exp)) ((vector? exp) (c-compile-vector exp)) + ((bytevector? exp) + (c-compile-bytevector exp)) ((integer? exp) ; (let ((cvar-name (mangle (gensym 'c)))) ; (c-code/vars @@ -671,6 +717,8 @@ ((eq? p 'symbol->string) "object") ((eq? p 'substring) "object") ((eq? p 'make-bytevector) "object") + ((eq? p 'bytevector) "object") + ((eq? p 'bytevector-append) "object") ((eq? p 'make-vector) "object") ((eq? p 'list->string) "object") ((eq? p 'list->vector) "object") @@ -690,6 +738,8 @@ string->number string-append list->string make-bytevector + bytevector + bytevector-append make-vector list->vector symbol->string number->string substring diff --git a/scheme/cyclone/transforms.sld b/scheme/cyclone/transforms.sld index 9b4e31f4..9a7a4828 100644 --- a/scheme/cyclone/transforms.sld +++ b/scheme/cyclone/transforms.sld @@ -277,6 +277,7 @@ (real? exp) (string? exp) (vector? exp) + (bytevector? exp) (char? exp) (boolean? exp)))