From 449e4bd42598b8151d4e357659b36d2f7a63ee2e Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Wed, 29 Jan 2020 17:55:45 -0500 Subject: [PATCH] Cleanup --- include/cyclone/runtime.h | 12 ++-- runtime.c | 124 ++++++++++++++++++++-------------- scheme/cyclone/primitives.sld | 8 +-- 3 files changed, 84 insertions(+), 60 deletions(-) diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index 61469bfe..6284b6c1 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -494,8 +494,10 @@ object Cyc_vector_length(void *data, object v); object Cyc_vector_ref(void *d, object v, object k); #define Cyc_vector_ref_unsafe(d, v, k) \ ((vector) v)->elements[obj_obj2int(k)] -//object Cyc_vector_set(void *d, object v, object k, object obj); -//object Cyc_vector_set_unsafe(void *d, object v, object k, object obj); +object Cyc_vector_set(void *d, object v, object k, object obj); +object Cyc_vector_set_unsafe(void *d, object v, object k, object obj); +object Cyc_vector_set_cps(void *d, object cont, object v, object k, object obj); +object Cyc_vector_set_unsafe_cps(void *d, object cont, object v, object k, object obj); object Cyc_vector_set2(void *d, object cont, object v, object k, object obj); object Cyc_vector_set_unsafe2(void *d, object cont, object v, object k, object obj); object Cyc_make_vector(void *data, object cont, int argc, object len, ...); @@ -842,8 +844,10 @@ static inline object Cyc_cdr(void *data, object lis) list malloc_make_pair(object, object); object Cyc_set_cell(void *, object l, object val); -//object Cyc_set_car(void *, object l, object val); -//object Cyc_set_cdr(void *, object l, object val); +object Cyc_set_car(void *, object l, object val); +object Cyc_set_cdr(void *, object l, object val); +object Cyc_set_car_cps(void *, object cont, object l, object val); +object Cyc_set_cdr_cps(void *, object cont, object l, object val); object Cyc_set_car2(void *, object cont, object l, object val); object Cyc_set_cdr2(void *, object cont, object l, object val); object Cyc_length(void *d, object l); diff --git a/runtime.c b/runtime.c index 193b06a0..62c12f07 100644 --- a/runtime.c +++ b/runtime.c @@ -2124,62 +2124,67 @@ object Cyc_set_cell(void *data, object l, object val) return l; } -//object Cyc_set_car(void *data, object l, object val) -//{ -// if (Cyc_is_pair(l) == boolean_f) { -// Cyc_invalid_type_error(data, pair_tag, l); -// } -// Cyc_verify_mutable(data, l); -// gc_mut_update((gc_thread_data *) data, car(l), val); -// car(l) = val; -// add_mutation(data, l, -1, val); -// return l; -//} -// -//object Cyc_set_cdr(void *data, object l, object val) -//{ -// if (Cyc_is_pair(l) == boolean_f) { -// Cyc_invalid_type_error(data, pair_tag, l); -// } -// Cyc_verify_mutable(data, l); -// gc_mut_update((gc_thread_data *) data, cdr(l), val); -// cdr(l) = val; -// add_mutation(data, l, -1, val); -// return l; -//} -// -//object Cyc_vector_set(void *data, object v, object k, object obj) -//{ -// int idx; -// Cyc_check_vec(data, v); -// Cyc_check_fixnum(data, k); -// Cyc_verify_mutable(data, v); -// idx = unbox_number(k); -// -// if (idx < 0 || idx >= ((vector) v)->num_elements) { -// Cyc_rt_raise2(data, "vector-set! - invalid index", k); -// } -// -// gc_mut_update((gc_thread_data *) data, ((vector) v)->elements[idx], obj); -// -// ((vector) v)->elements[idx] = obj; -// add_mutation(data, v, idx, obj); -// return v; -//} -// -//object Cyc_vector_set_unsafe(void *data, object v, object k, object obj) -//{ -// int idx = unbox_number(k); -// gc_mut_update((gc_thread_data *) data, ((vector) v)->elements[idx], obj); -// ((vector) v)->elements[idx] = obj; -// add_mutation(data, v, idx, obj); -// return v; -//} +object Cyc_set_car(void *data, object l, object val) +{ + if (Cyc_is_pair(l) == boolean_f) { + Cyc_invalid_type_error(data, pair_tag, l); + } + Cyc_verify_mutable(data, l); + gc_mut_update((gc_thread_data *) data, car(l), val); + car(l) = val; + add_mutation(data, l, -1, val); + return l; +} -// +object Cyc_set_cdr(void *data, object l, object val) +{ + if (Cyc_is_pair(l) == boolean_f) { + Cyc_invalid_type_error(data, pair_tag, l); + } + Cyc_verify_mutable(data, l); + gc_mut_update((gc_thread_data *) data, cdr(l), val); + cdr(l) = val; + add_mutation(data, l, -1, val); + return l; +} + +object Cyc_vector_set(void *data, object v, object k, object obj) +{ + int idx; + Cyc_check_vec(data, v); + Cyc_check_fixnum(data, k); + Cyc_verify_mutable(data, v); + idx = unbox_number(k); + + if (idx < 0 || idx >= ((vector) v)->num_elements) { + Cyc_rt_raise2(data, "vector-set! - invalid index", k); + } + + gc_mut_update((gc_thread_data *) data, ((vector) v)->elements[idx], obj); + + ((vector) v)->elements[idx] = obj; + add_mutation(data, v, idx, obj); + return v; +} + +object Cyc_vector_set_unsafe(void *data, object v, object k, object obj) +{ + int idx = unbox_number(k); + gc_mut_update((gc_thread_data *) data, ((vector) v)->elements[idx], obj); + ((vector) v)->elements[idx] = obj; + add_mutation(data, v, idx, obj); + return v; +} + +// JAE TODO: comment below in progress // TODO: rename these as (EG) Cyc_set_car_cps. Uncomment non-CPS above and we can use them for unsafe compilation // object Cyc_set_car2(void *data, object cont, object l, object val) +{ + return Cyc_set_car_cps(data, cont, l, val); +} + +object Cyc_set_car_cps(void *data, object cont, object l, object val) { if (Cyc_is_pair(l) == boolean_f) { Cyc_invalid_type_error(data, pair_tag, l); @@ -2203,6 +2208,11 @@ object Cyc_set_car2(void *data, object cont, object l, object val) } object Cyc_set_cdr2(void *data, object cont, object l, object val) +{ + return Cyc_set_cdr_cps(data, cont, l, val); +} + +object Cyc_set_cdr_cps(void *data, object cont, object l, object val) { if (Cyc_is_pair(l) == boolean_f) { Cyc_invalid_type_error(data, pair_tag, l); @@ -2226,6 +2236,11 @@ object Cyc_set_cdr2(void *data, object cont, object l, object val) } object Cyc_vector_set2(void *data, object cont, object v, object k, object obj) +{ + return Cyc_vector_set_cps(data, cont, v, k, obj); +} + +object Cyc_vector_set_cps(void *data, object cont, object v, object k, object obj) { int idx; Cyc_check_vec(data, v); @@ -2254,6 +2269,11 @@ object Cyc_vector_set2(void *data, object cont, object v, object k, object obj) } object Cyc_vector_set_unsafe2(void *data, object cont, object v, object k, object obj) +{ + return Cyc_vector_set_unsafe_cps(data, cont, v, k, obj); +} + +object Cyc_vector_set_unsafe_cps(void *data, object cont, object v, object k, object obj) { int idx = unbox_number(k); int do_gc = 0; diff --git a/scheme/cyclone/primitives.sld b/scheme/cyclone/primitives.sld index bbaf2bfb..0d268a8d 100644 --- a/scheme/cyclone/primitives.sld +++ b/scheme/cyclone/primitives.sld @@ -634,8 +634,8 @@ "Cyc_vector_ref")) ((eq? p 'vector-set!) (if emit-unsafe - "Cyc_vector_set_unsafe2" - "Cyc_vector_set2")) + "Cyc_vector_set_unsafe_cps" + "Cyc_vector_set_cps")) ((eq? p 'string-append) "Cyc_string_append") ((eq? p 'string-cmp) "Cyc_string_cmp") ((eq? p 'string->symbol) "Cyc_string2symbol") @@ -653,8 +653,8 @@ (if emit-unsafe "Cyc_length_unsafe" "Cyc_length")) - ((eq? p 'set-car!) "Cyc_set_car2") - ((eq? p 'set-cdr!) "Cyc_set_cdr2") + ((eq? p 'set-car!) "Cyc_set_car_cps") + ((eq? p 'set-cdr!) "Cyc_set_cdr_cps") ((eq? p 'eq?) "Cyc_eq") ((eq? p 'eqv?) "Cyc_eq") ((eq? p 'equal?) "equalp")