]> gitweb.factorcode.org Git - factor.git/blob - vm/arrays.cpp
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / vm / arrays.cpp
1 #include "master.hpp"
2
3 namespace factor
4 {
5
6 array *factor_vm::allot_array(cell capacity, cell fill_)
7 {
8         data_root<object> fill(fill_,this);
9         array *new_array = allot_uninitialized_array<array>(capacity);
10         memset_cell(new_array->data(),fill.value(),capacity * sizeof(cell));
11         return new_array;
12 }
13
14 void factor_vm::primitive_array()
15 {
16         data_root<object> fill(dpop(),this);
17         cell capacity = unbox_array_size();
18         array *new_array = allot_uninitialized_array<array>(capacity);
19         memset_cell(new_array->data(),fill.value(),capacity * sizeof(cell));
20         dpush(tag<array>(new_array));
21 }
22
23 cell factor_vm::allot_array_1(cell obj_)
24 {
25         data_root<object> obj(obj_,this);
26         data_root<array> a(allot_uninitialized_array<array>(1),this);
27         set_array_nth(a.untagged(),0,obj.value());
28         return a.value();
29 }
30
31 cell factor_vm::allot_array_2(cell v1_, cell v2_)
32 {
33         data_root<object> v1(v1_,this);
34         data_root<object> v2(v2_,this);
35         data_root<array> a(allot_uninitialized_array<array>(2),this);
36         set_array_nth(a.untagged(),0,v1.value());
37         set_array_nth(a.untagged(),1,v2.value());
38         return a.value();
39 }
40
41 cell factor_vm::allot_array_4(cell v1_, cell v2_, cell v3_, cell v4_)
42 {
43         data_root<object> v1(v1_,this);
44         data_root<object> v2(v2_,this);
45         data_root<object> v3(v3_,this);
46         data_root<object> v4(v4_,this);
47         data_root<array> a(allot_uninitialized_array<array>(4),this);
48         set_array_nth(a.untagged(),0,v1.value());
49         set_array_nth(a.untagged(),1,v2.value());
50         set_array_nth(a.untagged(),2,v3.value());
51         set_array_nth(a.untagged(),3,v4.value());
52         return a.value();
53 }
54
55 void factor_vm::primitive_resize_array()
56 {
57         data_root<array> a(dpop(),this);
58         a.untag_check(this);
59         cell capacity = unbox_array_size();
60         dpush(tag<array>(reallot_array(a.untagged(),capacity)));
61 }
62
63 void growable_array::add(cell elt_)
64 {
65         factor_vm *parent = elements.parent;
66         data_root<object> elt(elt_,parent);
67         if(count == array_capacity(elements.untagged()))
68                 elements = parent->reallot_array(elements.untagged(),count * 2);
69
70         parent->set_array_nth(elements.untagged(),count++,elt.value());
71 }
72
73 void growable_array::append(array *elts_)
74 {
75         factor_vm *parent = elements.parent;
76         data_root<array> elts(elts_,parent);
77         cell capacity = array_capacity(elts.untagged());
78         if(count + capacity > array_capacity(elements.untagged()))
79         {
80                 elements = parent->reallot_array(elements.untagged(),
81                         (count + capacity) * 2);
82         }
83
84         for(cell index = 0; index < capacity; index++)
85                 parent->set_array_nth(elements.untagged(),count++,array_nth(elts.untagged(),index));
86 }
87
88 void growable_array::trim()
89 {
90         factor_vm *parent = elements.parent;
91         elements = parent->reallot_array(elements.untagged(),count);
92 }
93
94 }