| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | #include "master.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | namespace factor | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-23 14:05:46 -04:00
										 |  |  | array *factor_vm::allot_array(cell capacity, cell fill_) | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-02 19:10:34 -05:00
										 |  |  | 	data_root<object> fill(fill_,this); | 
					
						
							| 
									
										
										
										
											2009-11-06 06:30:37 -05:00
										 |  |  | 	array *new_array = allot_uninitialized_array<array>(capacity); | 
					
						
							| 
									
										
										
										
											2009-10-31 03:30:48 -04:00
										 |  |  | 	memset_cell(new_array->data(),fill.value(),capacity * sizeof(cell)); | 
					
						
							| 
									
										
										
										
											2009-11-06 06:30:37 -05:00
										 |  |  | 	return new_array; | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-27 14:42:18 -04:00
										 |  |  | void factor_vm::primitive_array() | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-18 16:59:56 -05:00
										 |  |  | 	data_root<object> fill(ctx->pop(),this); | 
					
						
							| 
									
										
										
										
											2009-11-11 06:21:03 -05:00
										 |  |  | 	cell capacity = unbox_array_size(); | 
					
						
							|  |  |  | 	array *new_array = allot_uninitialized_array<array>(capacity); | 
					
						
							|  |  |  | 	memset_cell(new_array->data(),fill.value(),capacity * sizeof(cell)); | 
					
						
							| 
									
										
										
										
											2009-12-18 16:59:56 -05:00
										 |  |  | 	ctx->push(tag<array>(new_array)); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-23 14:05:46 -04:00
										 |  |  | cell factor_vm::allot_array_1(cell obj_) | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-02 19:10:34 -05:00
										 |  |  | 	data_root<object> obj(obj_,this); | 
					
						
							|  |  |  | 	data_root<array> a(allot_uninitialized_array<array>(1),this); | 
					
						
							| 
									
										
										
										
											2009-05-02 10:19:09 -04:00
										 |  |  | 	set_array_nth(a.untagged(),0,obj.value()); | 
					
						
							|  |  |  | 	return a.value(); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-23 14:05:46 -04:00
										 |  |  | cell factor_vm::allot_array_2(cell v1_, cell v2_) | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-02 19:10:34 -05:00
										 |  |  | 	data_root<object> v1(v1_,this); | 
					
						
							|  |  |  | 	data_root<object> v2(v2_,this); | 
					
						
							|  |  |  | 	data_root<array> a(allot_uninitialized_array<array>(2),this); | 
					
						
							| 
									
										
										
										
											2009-05-02 10:19:09 -04:00
										 |  |  | 	set_array_nth(a.untagged(),0,v1.value()); | 
					
						
							|  |  |  | 	set_array_nth(a.untagged(),1,v2.value()); | 
					
						
							|  |  |  | 	return a.value(); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-23 14:05:46 -04:00
										 |  |  | cell factor_vm::allot_array_4(cell v1_, cell v2_, cell v3_, cell v4_) | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-11-02 19:10:34 -05:00
										 |  |  | 	data_root<object> v1(v1_,this); | 
					
						
							|  |  |  | 	data_root<object> v2(v2_,this); | 
					
						
							|  |  |  | 	data_root<object> v3(v3_,this); | 
					
						
							|  |  |  | 	data_root<object> v4(v4_,this); | 
					
						
							|  |  |  | 	data_root<array> a(allot_uninitialized_array<array>(4),this); | 
					
						
							| 
									
										
										
										
											2009-05-02 10:19:09 -04:00
										 |  |  | 	set_array_nth(a.untagged(),0,v1.value()); | 
					
						
							|  |  |  | 	set_array_nth(a.untagged(),1,v2.value()); | 
					
						
							|  |  |  | 	set_array_nth(a.untagged(),2,v3.value()); | 
					
						
							|  |  |  | 	set_array_nth(a.untagged(),3,v4.value()); | 
					
						
							|  |  |  | 	return a.value(); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-27 14:42:18 -04:00
										 |  |  | void factor_vm::primitive_resize_array() | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-12-18 16:59:56 -05:00
										 |  |  | 	data_root<array> a(ctx->pop(),this); | 
					
						
							| 
									
										
										
										
											2009-11-11 06:21:03 -05:00
										 |  |  | 	a.untag_check(this); | 
					
						
							| 
									
										
										
										
											2009-05-04 05:50:24 -04:00
										 |  |  | 	cell capacity = unbox_array_size(); | 
					
						
							| 
									
										
										
										
											2009-12-18 16:59:56 -05:00
										 |  |  | 	ctx->push(tag<array>(reallot_array(a.untagged(),capacity))); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 07:46:17 -05:00
										 |  |  | cell factor_vm::std_vector_to_array(std::vector<cell> &elements) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	cell element_count = elements.size(); | 
					
						
							|  |  |  | 	data_roots.push_back(data_root_range(&elements[0],element_count)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tagged<array> objects(allot_uninitialized_array<array>(element_count)); | 
					
						
							|  |  |  | 	memcpy(objects->data(),&elements[0],element_count * sizeof(cell)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	data_roots.pop_back(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return objects.value(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 05:50:24 -04:00
										 |  |  | void growable_array::add(cell elt_) | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-18 21:31:59 -04:00
										 |  |  | 	factor_vm *parent = elements.parent; | 
					
						
							| 
									
										
										
										
											2009-11-02 19:10:34 -05:00
										 |  |  | 	data_root<object> elt(elt_,parent); | 
					
						
							| 
									
										
										
										
											2009-05-04 05:50:24 -04:00
										 |  |  | 	if(count == array_capacity(elements.untagged())) | 
					
						
							| 
									
										
										
										
											2009-10-18 21:31:59 -04:00
										 |  |  | 		elements = parent->reallot_array(elements.untagged(),count * 2); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-18 21:31:59 -04:00
										 |  |  | 	parent->set_array_nth(elements.untagged(),count++,elt.value()); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-14 20:24:23 -04:00
										 |  |  | void growable_array::append(array *elts_) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-18 21:31:59 -04:00
										 |  |  | 	factor_vm *parent = elements.parent; | 
					
						
							| 
									
										
										
										
											2009-11-02 19:10:34 -05:00
										 |  |  | 	data_root<array> elts(elts_,parent); | 
					
						
							| 
									
										
										
										
											2009-10-14 20:24:23 -04:00
										 |  |  | 	cell capacity = array_capacity(elts.untagged()); | 
					
						
							|  |  |  | 	if(count + capacity > array_capacity(elements.untagged())) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-10-18 21:31:59 -04:00
										 |  |  | 		elements = parent->reallot_array(elements.untagged(), | 
					
						
							| 
									
										
										
										
											2009-10-14 20:24:23 -04:00
										 |  |  | 			(count + capacity) * 2); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for(cell index = 0; index < capacity; index++) | 
					
						
							| 
									
										
										
										
											2009-10-18 21:31:59 -04:00
										 |  |  | 		parent->set_array_nth(elements.untagged(),count++,array_nth(elts.untagged(),index)); | 
					
						
							| 
									
										
										
										
											2009-10-14 20:24:23 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 10:19:09 -04:00
										 |  |  | void growable_array::trim() | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-10-18 21:31:59 -04:00
										 |  |  | 	factor_vm *parent = elements.parent; | 
					
						
							|  |  |  | 	elements = parent->reallot_array(elements.untagged(),count); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | } |