diff options
Diffstat (limited to 'asmrun/array.c')
-rw-r--r-- | asmrun/array.c | 77 |
1 files changed, 31 insertions, 46 deletions
diff --git a/asmrun/array.c b/asmrun/array.c index 74a2692d9..45b0e30a0 100644 --- a/asmrun/array.c +++ b/asmrun/array.c @@ -33,8 +33,7 @@ value make_vect(len, init) else if (Is_block(init) && Tag_val(init) == Double_tag) { d = Double_val(init); wsize = size * Double_wosize; - if (wsize > Max_wosize) - invalid_argument("Array.new"); + if (wsize > Max_wosize) invalid_argument("Array.new"); if (wsize < Max_young_wosize) { res = alloc(wsize, Double_array_tag); } else { @@ -45,33 +44,24 @@ value make_vect(len, init) Store_double_field(res, i, d); } } else { - Push_roots(root, 1); - if (size > Max_wosize) { - Pop_roots(); - invalid_argument("Array.new"); - } - if (size < Max_young_wosize) { - root[0] = init; - res = alloc(size, 0); - init = root[0]; - for (i = 0; i < size; i++) Field(res, i) = init; - } - else if (Is_block(init) && Is_young(init)) { - root[0] = init; - minor_collection(); - res = alloc_shr(size, 0); - init = root[0]; - for (i = 0; i < size; i++) Field(res, i) = init; - res = check_urgent_gc (res); - } - else { - root[0] = init; - res = alloc_shr(size, 0); - init = root[0]; - for (i = 0; i < size; i++) initialize(&Field(res, i), init); - res = check_urgent_gc (res); - } - Pop_roots(); + if (size > Max_wosize) invalid_argument("Array.new"); + Begin_root(init); + if (size < Max_young_wosize) { + res = alloc(size, 0); + for (i = 0; i < size; i++) Field(res, i) = init; + } + else if (Is_block(init) && Is_young(init)) { + minor_collection(); + res = alloc_shr(size, 0); + for (i = 0; i < size; i++) Field(res, i) = init; + res = check_urgent_gc (res); + } + else { + res = alloc_shr(size, 0); + for (i = 0; i < size; i++) initialize(&Field(res, i), init); + res = check_urgent_gc (res); + } + End_roots(); } return res; } @@ -90,24 +80,19 @@ value make_array(init) if (Is_long(v) || Tag_val(v) != Double_tag) { return init; } else { - Push_roots(root, 1); - root[0] = init; wsize = size * Double_wosize; - if (wsize > Max_wosize) { - Pop_roots(); - invalid_argument("Array.new"); - } - if (wsize < Max_young_wosize) { - res = alloc(wsize, Double_array_tag); - } else { - res = alloc_shr(wsize, Double_array_tag); - res = check_urgent_gc (res); - } - init = root[0]; - for (i = 0; i < size; i++) { - Store_double_field(res, i, Double_val(Field(init, i))); - } - Pop_roots(); + if (wsize > Max_wosize) invalid_argument("Array.new"); + Begin_root(init); + if (wsize < Max_young_wosize) { + res = alloc(wsize, Double_array_tag); + } else { + res = alloc_shr(wsize, Double_array_tag); + res = check_urgent_gc (res); + } + for (i = 0; i < size; i++) { + Store_double_field(res, i, Double_val(Field(init, i))); + } + End_roots(); return res; } } |