diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index 2d851eed..06793f1a 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -489,6 +489,7 @@ 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_make_vector(void *data, object cont, int argc, object len, ...); /**@}*/ diff --git a/runtime.c b/runtime.c index fd6ddaee..cea73af4 100644 --- a/runtime.c +++ b/runtime.c @@ -1939,6 +1939,15 @@ object Cyc_vector_set(void *data, object v, object k, object 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_vector_ref(void *data, object v, object k) { int idx; diff --git a/scheme/cyclone/primitives.sld b/scheme/cyclone/primitives.sld index 3a8facdf..480dea15 100644 --- a/scheme/cyclone/primitives.sld +++ b/scheme/cyclone/primitives.sld @@ -629,7 +629,10 @@ (if emit-unsafe "Cyc_vector_ref_unsafe" "Cyc_vector_ref")) - ((eq? p 'vector-set!) "Cyc_vector_set") + ((eq? p 'vector-set!) + (if emit-unsafe + "Cyc_vector_set_unsafe" + "Cyc_vector_set")) ((eq? p 'string-append) "Cyc_string_append") ((eq? p 'string-cmp) "Cyc_string_cmp") ((eq? p 'string->symbol) "Cyc_string2symbol")