diff options
author | Damien Doligez <damien.doligez-inria.fr> | 1997-05-26 17:16:31 +0000 |
---|---|---|
committer | Damien Doligez <damien.doligez-inria.fr> | 1997-05-26 17:16:31 +0000 |
commit | 8555ce8fe79fbf54924845a608054306733eeeba (patch) | |
tree | dd5b22190a08dcf3c1d8c16adc89988b60d982f1 /asmrun/array.c | |
parent | ff13e60cd68933428c60c10680c82c3cd91ea8c2 (diff) |
Changement de Push/Pop_roots en Begin/End_roots
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@1572 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
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; } } |