fixed a gc error not fixed in the previous commit
This commit is contained in:
		| @ -64,7 +64,6 @@ static HCL_INLINE const char* proc_state_to_string (int state) | |||||||
| 	(HCL_OOP_TO_SMOOI((x)->heap_ftime_sec) == HCL_OOP_TO_SMOOI((y)->heap_ftime_sec) && HCL_OOP_TO_SMOOI((x)->heap_ftime_nsec) < HCL_OOP_TO_SMOOI((y)->heap_ftime_nsec)) \ | 	(HCL_OOP_TO_SMOOI((x)->heap_ftime_sec) == HCL_OOP_TO_SMOOI((y)->heap_ftime_sec) && HCL_OOP_TO_SMOOI((x)->heap_ftime_nsec) < HCL_OOP_TO_SMOOI((y)->heap_ftime_nsec)) \ | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  |  | ||||||
| #define LOAD_IP(hcl, v_ctx) ((hcl)->ip = HCL_OOP_TO_SMOOI((v_ctx)->ip)) | #define LOAD_IP(hcl, v_ctx) ((hcl)->ip = HCL_OOP_TO_SMOOI((v_ctx)->ip)) | ||||||
| #define STORE_IP(hcl, v_ctx) ((v_ctx)->ip = HCL_SMOOI_TO_OOP((hcl)->ip)) | #define STORE_IP(hcl, v_ctx) ((v_ctx)->ip = HCL_SMOOI_TO_OOP((hcl)->ip)) | ||||||
|  |  | ||||||
| @ -1356,6 +1355,7 @@ static int start_initial_process_and_context (hcl_t* hcl, hcl_ooi_t initial_ip) | |||||||
|  |  | ||||||
| 	HCL_ASSERT (hcl, proc == hcl->processor->active); | 	HCL_ASSERT (hcl, proc == hcl->processor->active); | ||||||
| 	hcl->initial_context = proc->initial_context; | 	hcl->initial_context = proc->initial_context; | ||||||
|  |  | ||||||
| 	return activate_context(hcl, 0); | 	return activate_context(hcl, 0); | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -1671,7 +1671,8 @@ static int execute (hcl_t* hcl) | |||||||
| 				b1 = bcode & 0x7; /* low 3 bits */ | 				b1 = bcode & 0x7; /* low 3 bits */ | ||||||
| 			push_literal: | 			push_literal: | ||||||
| 				LOG_INST_1 (hcl, "push_literal @%zu", b1); | 				LOG_INST_1 (hcl, "push_literal @%zu", b1); | ||||||
| 				HCL_STACK_PUSH (hcl, hcl->active_function->literal_frame[b1]); | 				//HCL_STACK_PUSH (hcl, hcl->active_function->literal_frame[b1]); | ||||||
|  | 				HCL_STACK_PUSH (hcl, hcl->code.lit.arr->slot[b1]); | ||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 			/* ------------------------------------------------- */ | 			/* ------------------------------------------------- */ | ||||||
| @ -1698,6 +1699,7 @@ static int execute (hcl_t* hcl) | |||||||
|  |  | ||||||
| 				b1 = bcode & 0x3; /* low 2 bits */ | 				b1 = bcode & 0x3; /* low 2 bits */ | ||||||
| 			handle_object: | 			handle_object: | ||||||
|  | 				/*ass = hcl->code.lit.arr->slot[b1];*/ | ||||||
| 				ass = (hcl_oop_cons_t)hcl->active_function->literal_frame[b1]; | 				ass = (hcl_oop_cons_t)hcl->active_function->literal_frame[b1]; | ||||||
| 				HCL_ASSERT (hcl, HCL_IS_CONS(hcl, ass)); | 				HCL_ASSERT (hcl, HCL_IS_CONS(hcl, ass)); | ||||||
|  |  | ||||||
| @ -1935,6 +1937,7 @@ static int execute (hcl_t* hcl) | |||||||
| 				FETCH_BYTE_CODE_TO (hcl, b2); | 				FETCH_BYTE_CODE_TO (hcl, b2); | ||||||
|  |  | ||||||
| 			handle_objvar: | 			handle_objvar: | ||||||
|  | 				/*t = hcl->code.lit.arr->slot[b2];*/ | ||||||
| 				t = (hcl_oop_oop_t)hcl->active_function->literal_frame[b2]; | 				t = (hcl_oop_oop_t)hcl->active_function->literal_frame[b2]; | ||||||
| 				HCL_ASSERT (hcl, HCL_OBJ_GET_FLAGS_TYPE(t) == HCL_OBJ_TYPE_OOP); | 				HCL_ASSERT (hcl, HCL_OBJ_GET_FLAGS_TYPE(t) == HCL_OBJ_TYPE_OOP); | ||||||
| 				HCL_ASSERT (hcl, b1 < HCL_OBJ_GET_SIZE(t)); | 				HCL_ASSERT (hcl, b1 < HCL_OBJ_GET_SIZE(t)); | ||||||
|  | |||||||
							
								
								
									
										32
									
								
								hcl/lib/gc.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								hcl/lib/gc.c
									
									
									
									
									
								
							| @ -120,7 +120,6 @@ static HCL_INLINE hcl_oow_t get_payload_bytes (hcl_t* hcl, hcl_oop_t oop) | |||||||
| { | { | ||||||
| 	hcl_oow_t nbytes_aligned; | 	hcl_oow_t nbytes_aligned; | ||||||
|  |  | ||||||
| #if defined(HCL_USE_OBJECT_TRAILER) |  | ||||||
| 	if (HCL_OBJ_GET_FLAGS_TRAILER(oop)) | 	if (HCL_OBJ_GET_FLAGS_TRAILER(oop)) | ||||||
| 	{ | 	{ | ||||||
| 		hcl_oow_t nbytes; | 		hcl_oow_t nbytes; | ||||||
| @ -146,12 +145,9 @@ static HCL_INLINE hcl_oow_t get_payload_bytes (hcl_t* hcl, hcl_oop_t oop) | |||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| #endif |  | ||||||
| 		/* calculate the payload size in bytes */ | 		/* calculate the payload size in bytes */ | ||||||
| 		nbytes_aligned = HCL_ALIGN(HCL_OBJ_BYTESOF(oop), HCL_SIZEOF(hcl_oop_t)); | 		nbytes_aligned = HCL_ALIGN(HCL_OBJ_BYTESOF(oop), HCL_SIZEOF(hcl_oop_t)); | ||||||
| #if defined(HCL_USE_OBJECT_TRAILER) |  | ||||||
| 	} | 	} | ||||||
| #endif |  | ||||||
|  |  | ||||||
| 	return nbytes_aligned; | 	return nbytes_aligned; | ||||||
| } | } | ||||||
| @ -214,32 +210,16 @@ static hcl_uint8_t* scan_new_heap (hcl_t* hcl, hcl_uint8_t* ptr) | |||||||
| 	{ | 	{ | ||||||
| 		hcl_oow_t i; | 		hcl_oow_t i; | ||||||
| 		hcl_oow_t nbytes_aligned; | 		hcl_oow_t nbytes_aligned; | ||||||
| 		hcl_oop_t oop; | 		hcl_oop_t oop, tmp; | ||||||
|  |  | ||||||
| 		oop = (hcl_oop_t)ptr; | 		oop = (hcl_oop_t)ptr; | ||||||
|  | 		HCL_ASSERT (hcl, HCL_OOP_IS_POINTER(oop)); | ||||||
|  |  | ||||||
| 	#if defined(HCL_USE_OBJECT_TRAILER) | 		nbytes_aligned = get_payload_bytes(hcl, oop); | ||||||
| 		if (HCL_OBJ_GET_FLAGS_TRAILER(oop)) |  | ||||||
| 		{ |  | ||||||
| 			hcl_oow_t nbytes; |  | ||||||
|  |  | ||||||
| 			HCL_ASSERT (hcl, HCL_OBJ_GET_FLAGS_TYPE(oop) == HCL_OBJ_TYPE_OOP); | 		tmp = hcl_moveoop(hcl, HCL_OBJ_GET_CLASS(oop)); | ||||||
| 			HCL_ASSERT (hcl, HCL_OBJ_GET_FLAGS_UNIT(oop) == HCL_SIZEOF(hcl_oow_t)); | 		HCL_OBJ_SET_CLASS (oop, tmp); | ||||||
| 			HCL_ASSERT (hcl, HCL_OBJ_GET_FLAGS_EXTRA(oop) == 0); /* no 'extra' for an OOP object */ |  | ||||||
|  |  | ||||||
| 			nbytes = HCL_OBJ_BYTESOF(oop) + HCL_SIZEOF(hcl_oow_t) + \ |  | ||||||
| 			         (hcl_oow_t)((hcl_oop_oop_t)oop)->slot[HCL_OBJ_GET_SIZE(oop)]; |  | ||||||
| 			nbytes_aligned = HCL_ALIGN (nbytes, HCL_SIZEOF(hcl_oop_t)); |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 	#endif |  | ||||||
| 			nbytes_aligned = HCL_ALIGN (HCL_OBJ_BYTESOF(oop), HCL_SIZEOF(hcl_oop_t)); |  | ||||||
| 	#if defined(HCL_USE_OBJECT_TRAILER) |  | ||||||
| 		} |  | ||||||
| 	#endif |  | ||||||
|  |  | ||||||
| 		HCL_OBJ_SET_CLASS (oop, hcl_moveoop(hcl, HCL_OBJ_GET_CLASS(oop))); |  | ||||||
| 		if (HCL_OBJ_GET_FLAGS_TYPE(oop) == HCL_OBJ_TYPE_OOP) | 		if (HCL_OBJ_GET_FLAGS_TYPE(oop) == HCL_OBJ_TYPE_OOP) | ||||||
| 		{ | 		{ | ||||||
| 			hcl_oop_oop_t xtmp; | 			hcl_oop_oop_t xtmp; | ||||||
| @ -356,6 +336,8 @@ void hcl_gc (hcl_t* hcl) | |||||||
| 		hcl->active_context = (hcl_oop_context_t)hcl_moveoop(hcl, (hcl_oop_t)hcl->active_context); | 		hcl->active_context = (hcl_oop_context_t)hcl_moveoop(hcl, (hcl_oop_t)hcl->active_context); | ||||||
| 	if (hcl->initial_function) | 	if (hcl->initial_function) | ||||||
| 		hcl->initial_function = (hcl_oop_function_t)hcl_moveoop(hcl, (hcl_oop_t)hcl->initial_function); | 		hcl->initial_function = (hcl_oop_function_t)hcl_moveoop(hcl, (hcl_oop_t)hcl->initial_function); | ||||||
|  | 	if (hcl->active_function) | ||||||
|  | 		hcl->active_function = (hcl_oop_function_t)hcl_moveoop(hcl, (hcl_oop_t)hcl->active_function); | ||||||
|  |  | ||||||
| 	if (hcl->last_retv) hcl->last_retv = hcl_moveoop(hcl, hcl->last_retv); | 	if (hcl->last_retv) hcl->last_retv = hcl_moveoop(hcl, hcl->last_retv); | ||||||
|  |  | ||||||
|  | |||||||
| @ -42,12 +42,6 @@ | |||||||
| #define HCL_KARATSUBA_CUTOFF 32 | #define HCL_KARATSUBA_CUTOFF 32 | ||||||
| #define HCL_KARATSUBA_CUTOFF_DEBUG 3 | #define HCL_KARATSUBA_CUTOFF_DEBUG 3 | ||||||
|  |  | ||||||
| /* define this to allow an pointer(OOP) object to have trailing bytes  |  | ||||||
|  * this is used to embed bytes codes into the back of a compile method |  | ||||||
|  * object instead of putting in in a separate byte array. */ |  | ||||||
| #define HCL_USE_OBJECT_TRAILER |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #if defined(HCL_BUILD_DEBUG) | #if defined(HCL_BUILD_DEBUG) | ||||||
| #define HCL_DEBUG_LEXER 1 | #define HCL_DEBUG_LEXER 1 | ||||||
| #define HCL_DEBUG_VM_PROCESSOR 1 | #define HCL_DEBUG_VM_PROCESSOR 1 | ||||||
| @ -715,7 +709,6 @@ hcl_oop_t hcl_allocoopobj ( | |||||||
| 	hcl_oow_t size | 	hcl_oow_t size | ||||||
| ); | ); | ||||||
|  |  | ||||||
| #if defined(HCL_USE_OBJECT_TRAILER) |  | ||||||
| hcl_oop_t hcl_allocoopobjwithtrailer ( | hcl_oop_t hcl_allocoopobjwithtrailer ( | ||||||
| 	hcl_t*           hcl, | 	hcl_t*           hcl, | ||||||
| 	int              brand, | 	int              brand, | ||||||
| @ -723,7 +716,6 @@ hcl_oop_t hcl_allocoopobjwithtrailer ( | |||||||
| 	const hcl_oob_t* tptr, | 	const hcl_oob_t* tptr, | ||||||
| 	hcl_oow_t        tlen | 	hcl_oow_t        tlen | ||||||
| ); | ); | ||||||
| #endif |  | ||||||
|  |  | ||||||
| hcl_oop_t hcl_alloccharobj ( | hcl_oop_t hcl_alloccharobj ( | ||||||
| 	hcl_t*            hcl, | 	hcl_t*            hcl, | ||||||
|  | |||||||
| @ -92,7 +92,6 @@ hcl_oop_t hcl_allocoopobj (hcl_t* hcl, int brand, hcl_oow_t size) | |||||||
| 	return alloc_oop_array(hcl, brand, size, 0); | 	return alloc_oop_array(hcl, brand, size, 0); | ||||||
| } | } | ||||||
|  |  | ||||||
| #if defined(HCL_USE_OBJECT_TRAILER) |  | ||||||
| hcl_oop_t hcl_allocoopobjwithtrailer (hcl_t* hcl, int brand, hcl_oow_t size, const hcl_oob_t* bptr, hcl_oow_t blen) | hcl_oop_t hcl_allocoopobjwithtrailer (hcl_t* hcl, int brand, hcl_oow_t size, const hcl_oob_t* bptr, hcl_oow_t blen) | ||||||
| { | { | ||||||
| 	hcl_oop_oop_t hdr; | 	hcl_oop_oop_t hdr; | ||||||
| @ -104,7 +103,7 @@ hcl_oop_t hcl_allocoopobjwithtrailer (hcl_t* hcl, int brand, hcl_oow_t size, con | |||||||
| 	nbytes_aligned = HCL_ALIGN(nbytes, HCL_SIZEOF(hcl_oop_t));  | 	nbytes_aligned = HCL_ALIGN(nbytes, HCL_SIZEOF(hcl_oop_t));  | ||||||
|  |  | ||||||
| 	hdr = (hcl_oop_oop_t)hcl_allocbytes(hcl, HCL_SIZEOF(hcl_obj_t) + nbytes_aligned); | 	hdr = (hcl_oop_oop_t)hcl_allocbytes(hcl, HCL_SIZEOF(hcl_obj_t) + nbytes_aligned); | ||||||
| 	if (!hdr) return HCL_NULL; | 	if (HCL_UNLIKELY(!hdr)) return HCL_NULL; | ||||||
|  |  | ||||||
| 	hdr->_flags = HCL_OBJ_MAKE_FLAGS(HCL_OBJ_TYPE_OOP, HCL_SIZEOF(hcl_oop_t), 0, 0, 0, 0, 1, 0); | 	hdr->_flags = HCL_OBJ_MAKE_FLAGS(HCL_OBJ_TYPE_OOP, HCL_SIZEOF(hcl_oop_t), 0, 0, 0, 0, 1, 0); | ||||||
| 	HCL_OBJ_SET_SIZE (hdr, size); | 	HCL_OBJ_SET_SIZE (hdr, size); | ||||||
| @ -127,7 +126,6 @@ hcl_oop_t hcl_allocoopobjwithtrailer (hcl_t* hcl, int brand, hcl_oow_t size, con | |||||||
|  |  | ||||||
| 	return (hcl_oop_t)hdr; | 	return (hcl_oop_t)hdr; | ||||||
| } | } | ||||||
| #endif |  | ||||||
|  |  | ||||||
| static HCL_INLINE hcl_oop_t alloc_numeric_array (hcl_t* hcl, int brand, const void* ptr, hcl_oow_t len, hcl_obj_type_t type, hcl_oow_t unit, int extra, int ngc) | static HCL_INLINE hcl_oop_t alloc_numeric_array (hcl_t* hcl, int brand, const void* ptr, hcl_oow_t len, hcl_obj_type_t type, hcl_oow_t unit, int extra, int ngc) | ||||||
| { | { | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user