| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | #include "master.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:46:08 -04:00
										 |  |  | namespace factor { | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-16 01:00:08 -04:00
										 |  |  | /* Allocates memory */ | 
					
						
							| 
									
										
										
										
											2013-05-11 21:46:08 -04:00
										 |  |  | byte_array* factor_vm::allot_byte_array(cell size) { | 
					
						
							|  |  |  |   byte_array* array = allot_uninitialized_array<byte_array>(size); | 
					
						
							|  |  |  |   memset(array + 1, 0, size); | 
					
						
							|  |  |  |   return array; | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-16 01:00:08 -04:00
										 |  |  | /* Allocates memory */ | 
					
						
							| 
									
										
										
										
											2013-05-11 21:46:08 -04:00
										 |  |  | void factor_vm::primitive_byte_array() { | 
					
						
							|  |  |  |   cell size = unbox_array_size(); | 
					
						
							|  |  |  |   ctx->push(tag<byte_array>(allot_byte_array(size))); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-16 01:00:08 -04:00
										 |  |  | /* Allocates memory */ | 
					
						
							| 
									
										
										
										
											2013-05-11 21:46:08 -04:00
										 |  |  | void factor_vm::primitive_uninitialized_byte_array() { | 
					
						
							|  |  |  |   cell size = unbox_array_size(); | 
					
						
							|  |  |  |   ctx->push(tag<byte_array>(allot_uninitialized_array<byte_array>(size))); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-16 01:00:08 -04:00
										 |  |  | /* Allocates memory */ | 
					
						
							| 
									
										
										
										
											2013-05-11 21:46:08 -04:00
										 |  |  | void factor_vm::primitive_resize_byte_array() { | 
					
						
							|  |  |  |   data_root<byte_array> array(ctx->pop(), this); | 
					
						
							|  |  |  |   array.untag_check(this); | 
					
						
							|  |  |  |   cell capacity = unbox_array_size(); | 
					
						
							|  |  |  |   ctx->push(tag<byte_array>(reallot_array(array.untagged(), capacity))); | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-16 01:00:08 -04:00
										 |  |  | /* Allocates memory */ | 
					
						
							| 
									
										
										
										
											2013-05-11 21:46:08 -04:00
										 |  |  | void growable_byte_array::grow_bytes(cell len) { | 
					
						
							|  |  |  |   count += len; | 
					
						
							|  |  |  |   if (count >= array_capacity(elements.untagged())) | 
					
						
							|  |  |  |     elements = elements.parent->reallot_array(elements.untagged(), count * 2); | 
					
						
							| 
									
										
										
										
											2010-06-11 20:06:00 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-16 01:00:08 -04:00
										 |  |  | /* Allocates memory */ | 
					
						
							| 
									
										
										
										
											2013-05-11 21:46:08 -04:00
										 |  |  | void growable_byte_array::append_bytes(void* elts, cell len) { | 
					
						
							|  |  |  |   cell old_count = count; | 
					
						
							|  |  |  |   grow_bytes(len); | 
					
						
							| 
									
										
										
										
											2013-05-13 00:28:25 -04:00
										 |  |  |   memcpy(&elements->data<uint8_t>()[old_count], elts, len); | 
					
						
							| 
									
										
										
										
											2009-05-02 10:19:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-16 01:00:08 -04:00
										 |  |  | /* Allocates memory */ | 
					
						
							| 
									
										
										
										
											2013-05-11 21:46:08 -04:00
										 |  |  | void growable_byte_array::append_byte_array(cell byte_array_) { | 
					
						
							|  |  |  |   data_root<byte_array> byte_array(byte_array_, elements.parent); | 
					
						
							| 
									
										
										
										
											2009-05-02 10:19:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:46:08 -04:00
										 |  |  |   cell len = array_capacity(byte_array.untagged()); | 
					
						
							|  |  |  |   cell new_size = count + len; | 
					
						
							|  |  |  |   factor_vm* parent = elements.parent; | 
					
						
							|  |  |  |   if (new_size >= array_capacity(elements.untagged())) | 
					
						
							|  |  |  |     elements = parent->reallot_array(elements.untagged(), new_size * 2); | 
					
						
							| 
									
										
										
										
											2009-05-02 10:19:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-13 00:28:25 -04:00
										 |  |  |   memcpy(&elements->data<uint8_t>()[count], byte_array->data<uint8_t>(), len); | 
					
						
							| 
									
										
										
										
											2009-05-02 10:19:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:46:08 -04:00
										 |  |  |   count += len; | 
					
						
							| 
									
										
										
										
											2009-05-02 10:19:09 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-16 01:00:08 -04:00
										 |  |  | /* Allocates memory */ | 
					
						
							| 
									
										
										
										
											2013-05-11 21:46:08 -04:00
										 |  |  | void growable_byte_array::trim() { | 
					
						
							|  |  |  |   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
										 |  |  | 
 | 
					
						
							|  |  |  | } |