mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-12 15:27:36 +02:00
Added CPS versions of mutation primitives
This commit is contained in:
parent
4fce12afb0
commit
ffaa9b263a
2 changed files with 55 additions and 0 deletions
|
@ -491,6 +491,8 @@ object Cyc_vector_ref(void *d, object v, object k);
|
||||||
((vector) v)->elements[obj_obj2int(k)]
|
((vector) v)->elements[obj_obj2int(k)]
|
||||||
object Cyc_vector_set(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_unsafe(void *d, 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, ...);
|
object Cyc_make_vector(void *data, object cont, int argc, object len, ...);
|
||||||
/**@}*/
|
/**@}*/
|
||||||
|
|
||||||
|
@ -837,6 +839,8 @@ list malloc_make_pair(object, object);
|
||||||
object Cyc_set_cell(void *, object l, object val);
|
object Cyc_set_cell(void *, object l, object val);
|
||||||
object Cyc_set_car(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_cdr(void *, 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);
|
object Cyc_length(void *d, object l);
|
||||||
object Cyc_length_unsafe(void *d, object l);
|
object Cyc_length_unsafe(void *d, object l);
|
||||||
object Cyc_list2vector(void *data, object cont, object l);
|
object Cyc_list2vector(void *data, object cont, object l);
|
||||||
|
|
51
runtime.c
51
runtime.c
|
@ -1981,6 +1981,57 @@ object Cyc_vector_set_unsafe(void *data, object v, object k, object obj)
|
||||||
add_mutation(data, v, idx, obj);
|
add_mutation(data, v, idx, obj);
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
object Cyc_set_car2(void *data, object cont, 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_closcall1(data, cont, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
object Cyc_set_cdr2(void *data, object cont, 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_closcall1(data, cont, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
object Cyc_vector_set2(void *data, object cont, 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_closcall1(data, cont, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
object Cyc_vector_set_unsafe2(void *data, object cont, 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_closcall1(data, cont, v);
|
||||||
|
}
|
||||||
|
|
||||||
object Cyc_vector_ref(void *data, object v, object k)
|
object Cyc_vector_ref(void *data, object v, object k)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue