summaryrefslogtreecommitdiffstats
path: root/asmrun/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'asmrun/array.c')
-rw-r--r--asmrun/array.c77
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;
}
}