added bytearray compilation code
This commit is contained in:
		
							
								
								
									
										137
									
								
								hcl/lib/comp.c
									
									
									
									
									
								
							
							
						
						
									
										137
									
								
								hcl/lib/comp.c
									
									
									
									
									
								
							| @ -265,7 +265,9 @@ static int emit_single_param_instruction (hcl_t* hcl, int cmd, hcl_oow_t param_1 | |||||||
|  |  | ||||||
| 		case HCL_CODE_MAKE_DIC: /* TODO: don't these need write_long2? */ | 		case HCL_CODE_MAKE_DIC: /* TODO: don't these need write_long2? */ | ||||||
| 		case HCL_CODE_MAKE_ARRAY: | 		case HCL_CODE_MAKE_ARRAY: | ||||||
|  | 		case HCL_CODE_MAKE_BYTEARRAY: | ||||||
| 		case HCL_CODE_POP_INTO_ARRAY: | 		case HCL_CODE_POP_INTO_ARRAY: | ||||||
|  | 		case HCL_CODE_POP_INTO_BYTEARRAY: | ||||||
| 			bc = cmd; | 			bc = cmd; | ||||||
| 			goto write_long; | 			goto write_long; | ||||||
| 	} | 	} | ||||||
| @ -616,6 +618,7 @@ enum | |||||||
| 	COP_COMPILE_IF_OBJECT_LIST_TAIL, | 	COP_COMPILE_IF_OBJECT_LIST_TAIL, | ||||||
|  |  | ||||||
| 	COP_COMPILE_ARRAY_LIST, | 	COP_COMPILE_ARRAY_LIST, | ||||||
|  | 	COP_COMPILE_BYTEARRAY_LIST, | ||||||
| 	COP_COMPILE_DIC_LIST, | 	COP_COMPILE_DIC_LIST, | ||||||
|  |  | ||||||
| 	COP_SUBCOMPILE_ELIF, | 	COP_SUBCOMPILE_ELIF, | ||||||
| @ -624,8 +627,10 @@ enum | |||||||
| 	COP_EMIT_CALL, | 	COP_EMIT_CALL, | ||||||
|  |  | ||||||
| 	COP_EMIT_MAKE_ARRAY, | 	COP_EMIT_MAKE_ARRAY, | ||||||
|  | 	COP_EMIT_MAKE_BYTEARRAY, | ||||||
| 	COP_EMIT_MAKE_DIC, | 	COP_EMIT_MAKE_DIC, | ||||||
| 	COP_EMIT_POP_INTO_ARRAY, | 	COP_EMIT_POP_INTO_ARRAY, | ||||||
|  | 	COP_EMIT_POP_INTO_BYTEARRAY, | ||||||
| 	COP_EMIT_POP_INTO_DIC, | 	COP_EMIT_POP_INTO_DIC, | ||||||
|  |  | ||||||
| 	COP_EMIT_LAMBDA, | 	COP_EMIT_LAMBDA, | ||||||
| @ -1124,7 +1129,7 @@ static int compile_cons_array_expression (hcl_t* hcl, hcl_oop_t obj) | |||||||
| 	cf = GET_SUBCFRAME(hcl); | 	cf = GET_SUBCFRAME(hcl); | ||||||
| 	cf->u.array_list.index = 0; | 	cf->u.array_list.index = 0; | ||||||
|  |  | ||||||
| 	/* patch the argument count in the operand field of the COP_MAKE_ARRAY frame */ | 	/* patch the argument count in the operand field of the COP_EMIT_MAKE_ARRAY frame */ | ||||||
| 	cf = GET_TOP_CFRAME(hcl); | 	cf = GET_TOP_CFRAME(hcl); | ||||||
| 	HCL_ASSERT (hcl, cf->opcode == COP_EMIT_MAKE_ARRAY); | 	HCL_ASSERT (hcl, cf->opcode == COP_EMIT_MAKE_ARRAY); | ||||||
| 	cf->operand = HCL_SMOOI_TO_OOP(nargs); | 	cf->operand = HCL_SMOOI_TO_OOP(nargs); | ||||||
| @ -1132,6 +1137,37 @@ static int compile_cons_array_expression (hcl_t* hcl, hcl_oop_t obj) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int compile_cons_bytearray_expression (hcl_t* hcl, hcl_oop_t obj) | ||||||
|  | { | ||||||
|  | 	/* #[ ] */ | ||||||
|  | 	hcl_ooi_t nargs; | ||||||
|  | 	hcl_cframe_t* cf; | ||||||
|  |  | ||||||
|  | 	/* NOTE: cframe management functions don't use the object memory. | ||||||
|  | 	 *       many operations can be performed without taking GC into account */ | ||||||
|  | 	SWITCH_TOP_CFRAME (hcl, COP_EMIT_MAKE_BYTEARRAY, HCL_SMOOI_TO_OOP(0)); | ||||||
|  |  | ||||||
|  | 	nargs = hcl_countcons(hcl, obj); | ||||||
|  | 	if (nargs > MAX_CODE_PARAM)  | ||||||
|  | 	{ | ||||||
|  | 		/* TODO: change to syntax error */ | ||||||
|  | 		hcl_setsynerrbfmt (hcl, HCL_SYNERR_ARGFLOOD, HCL_NULL, HCL_NULL, "too many(%zd) elements into byte-array - %O", nargs, obj);  | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* redundant cdr check is performed inside compile_object_list() */ | ||||||
|  | 	PUSH_SUBCFRAME (hcl, COP_COMPILE_BYTEARRAY_LIST, obj); | ||||||
|  | 	cf = GET_SUBCFRAME(hcl); | ||||||
|  | 	cf->u.bytearray_list.index = 0; | ||||||
|  |  | ||||||
|  | 	/* patch the argument count in the operand field of the COP_EMIT_MAKE_BYTEARRAY frame */ | ||||||
|  | 	cf = GET_TOP_CFRAME(hcl); | ||||||
|  | 	HCL_ASSERT (hcl, cf->opcode == COP_EMIT_MAKE_BYTEARRAY); | ||||||
|  | 	cf->operand = HCL_SMOOI_TO_OOP(nargs); | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| static int compile_cons_dic_expression (hcl_t* hcl, hcl_oop_t obj) | static int compile_cons_dic_expression (hcl_t* hcl, hcl_oop_t obj) | ||||||
| { | { | ||||||
| 	/* #{ } */ | 	/* #{ } */ | ||||||
| @ -1151,7 +1187,7 @@ static int compile_cons_dic_expression (hcl_t* hcl, hcl_oop_t obj) | |||||||
| 	/* redundant cdr check is performed inside compile_object_list() */ | 	/* redundant cdr check is performed inside compile_object_list() */ | ||||||
| 	PUSH_SUBCFRAME (hcl, COP_COMPILE_DIC_LIST, obj); | 	PUSH_SUBCFRAME (hcl, COP_COMPILE_DIC_LIST, obj); | ||||||
|  |  | ||||||
| 	/* patch the argument count in the operand field of the COP_MAKE_DIC frame */ | 	/* patch the argument count in the operand field of the COP_EMIT_MAKE_DIC frame */ | ||||||
| 	cf = GET_TOP_CFRAME(hcl); | 	cf = GET_TOP_CFRAME(hcl); | ||||||
| 	HCL_ASSERT (hcl, cf->opcode == COP_EMIT_MAKE_DIC); | 	HCL_ASSERT (hcl, cf->opcode == COP_EMIT_MAKE_DIC); | ||||||
| 	cf->operand = HCL_SMOOI_TO_OOP(nargs); | 	cf->operand = HCL_SMOOI_TO_OOP(nargs); | ||||||
| @ -1406,11 +1442,11 @@ static int compile_object (hcl_t* hcl) | |||||||
| 				case HCL_CONCODE_ARRAY: | 				case HCL_CONCODE_ARRAY: | ||||||
| 					if (compile_cons_array_expression(hcl, cf->operand) <= -1) return -1; | 					if (compile_cons_array_expression(hcl, cf->operand) <= -1) return -1; | ||||||
| 					break; | 					break; | ||||||
| /* |  | ||||||
| 				case HCL_CONCODE_BYTEARRA: | 				case HCL_CONCODE_BYTEARRAY: | ||||||
| 					if (compile_cons_bytearray_expression (hcl, cf->operand) <= -1) return -1; | 					if (compile_cons_bytearray_expression (hcl, cf->operand) <= -1) return -1; | ||||||
| 					break; | 					break; | ||||||
| */ |  | ||||||
| 				case HCL_CONCODE_DIC: | 				case HCL_CONCODE_DIC: | ||||||
| 					if (compile_cons_dic_expression(hcl, cf->operand) <= -1) return -1; | 					if (compile_cons_dic_expression(hcl, cf->operand) <= -1) return -1; | ||||||
| 					break; | 					break; | ||||||
| @ -1597,6 +1633,54 @@ static int compile_array_list (hcl_t* hcl) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | static int compile_bytearray_list (hcl_t* hcl) | ||||||
|  | { | ||||||
|  | 	hcl_cframe_t* cf; | ||||||
|  | 	hcl_oop_t coperand; | ||||||
|  |  | ||||||
|  | 	cf = GET_TOP_CFRAME(hcl); | ||||||
|  | 	HCL_ASSERT (hcl, cf->opcode == COP_COMPILE_BYTEARRAY_LIST); | ||||||
|  |  | ||||||
|  | 	coperand = cf->operand; | ||||||
|  |  | ||||||
|  | 	if (HCL_IS_NIL(hcl, coperand)) | ||||||
|  | 	{ | ||||||
|  | 		POP_CFRAME (hcl); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		hcl_oop_t car, cdr; | ||||||
|  | 		hcl_ooi_t oldidx; | ||||||
|  |  | ||||||
|  | 		if (!HCL_IS_CONS(hcl, coperand)) | ||||||
|  | 		{ | ||||||
|  | 			hcl_setsynerrbfmt ( | ||||||
|  | 				hcl, HCL_SYNERR_DOTBANNED, HCL_NULL, HCL_NULL,  | ||||||
|  |  				"redundant cdr in the byte-array list - %O", coperand); /* TODO: error location */ | ||||||
|  | 			return -1; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		car = HCL_CONS_CAR(coperand); | ||||||
|  | 		cdr = HCL_CONS_CDR(coperand); | ||||||
|  |  | ||||||
|  | 		oldidx = cf->u.bytearray_list.index; | ||||||
|  |  | ||||||
|  | 		SWITCH_TOP_CFRAME (hcl, COP_COMPILE_OBJECT, car); | ||||||
|  | 		if (!HCL_IS_NIL(hcl, cdr)) | ||||||
|  | 		{ | ||||||
|  | 			PUSH_SUBCFRAME (hcl, COP_COMPILE_BYTEARRAY_LIST, cdr); | ||||||
|  | 			cf = GET_SUBCFRAME(hcl); | ||||||
|  | 			cf->u.bytearray_list.index = oldidx + 1; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		PUSH_SUBCFRAME (hcl, COP_EMIT_POP_INTO_BYTEARRAY, HCL_SMOOI_TO_OOP(oldidx)); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static int compile_dic_list (hcl_t* hcl) | static int compile_dic_list (hcl_t* hcl) | ||||||
| { | { | ||||||
| 	hcl_cframe_t* cf; | 	hcl_cframe_t* cf; | ||||||
| @ -1976,6 +2060,20 @@ static HCL_INLINE int emit_make_array (hcl_t* hcl) | |||||||
| 	return n; | 	return n; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static HCL_INLINE int emit_make_bytearray (hcl_t* hcl) | ||||||
|  | { | ||||||
|  | 	hcl_cframe_t* cf; | ||||||
|  | 	int n; | ||||||
|  |  | ||||||
|  | 	cf = GET_TOP_CFRAME(hcl); | ||||||
|  | 	HCL_ASSERT (hcl, cf->opcode == COP_EMIT_MAKE_BYTEARRAY); | ||||||
|  | 	HCL_ASSERT (hcl, HCL_OOP_IS_SMOOI(cf->operand)); | ||||||
|  |  | ||||||
|  | 	n = emit_single_param_instruction (hcl, HCL_CODE_MAKE_BYTEARRAY, HCL_OOP_TO_SMOOI(cf->operand)); | ||||||
|  |  | ||||||
|  | 	POP_CFRAME (hcl); | ||||||
|  | 	return n; | ||||||
|  | } | ||||||
|  |  | ||||||
| static HCL_INLINE int emit_make_dic (hcl_t* hcl) | static HCL_INLINE int emit_make_dic (hcl_t* hcl) | ||||||
| { | { | ||||||
| @ -2007,6 +2105,21 @@ static HCL_INLINE int emit_pop_into_array (hcl_t* hcl) | |||||||
| 	return n; | 	return n; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static HCL_INLINE int emit_pop_into_bytearray (hcl_t* hcl) | ||||||
|  | { | ||||||
|  | 	hcl_cframe_t* cf; | ||||||
|  | 	int n; | ||||||
|  |  | ||||||
|  | 	cf = GET_TOP_CFRAME(hcl); | ||||||
|  | 	HCL_ASSERT (hcl, cf->opcode == COP_EMIT_POP_INTO_BYTEARRAY); | ||||||
|  | 	HCL_ASSERT (hcl, HCL_OOP_IS_SMOOI(cf->operand)); | ||||||
|  |  | ||||||
|  | 	n = emit_single_param_instruction (hcl, HCL_CODE_POP_INTO_BYTEARRAY, HCL_OOP_TO_SMOOI(cf->operand)); | ||||||
|  |  | ||||||
|  | 	POP_CFRAME (hcl); | ||||||
|  | 	return n; | ||||||
|  | } | ||||||
|  |  | ||||||
| static HCL_INLINE int emit_pop_into_dic (hcl_t* hcl) | static HCL_INLINE int emit_pop_into_dic (hcl_t* hcl) | ||||||
| { | { | ||||||
| 	hcl_cframe_t* cf; | 	hcl_cframe_t* cf; | ||||||
| @ -2177,6 +2290,10 @@ int hcl_compile (hcl_t* hcl, hcl_oop_t obj) | |||||||
| 				if (compile_array_list(hcl) <= -1) goto oops; | 				if (compile_array_list(hcl) <= -1) goto oops; | ||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
|  | 			case COP_COMPILE_BYTEARRAY_LIST: | ||||||
|  | 				if (compile_bytearray_list(hcl) <= -1) goto oops; | ||||||
|  | 				break; | ||||||
|  |  | ||||||
| 			case COP_COMPILE_DIC_LIST: | 			case COP_COMPILE_DIC_LIST: | ||||||
| 				if (compile_dic_list(hcl) <= -1) goto oops; | 				if (compile_dic_list(hcl) <= -1) goto oops; | ||||||
| 				break; | 				break; | ||||||
| @ -2189,6 +2306,10 @@ int hcl_compile (hcl_t* hcl, hcl_oop_t obj) | |||||||
| 				if (emit_make_array(hcl) <= -1) goto oops; | 				if (emit_make_array(hcl) <= -1) goto oops; | ||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
|  | 			case COP_EMIT_MAKE_BYTEARRAY: | ||||||
|  | 				if (emit_make_bytearray(hcl) <= -1) goto oops; | ||||||
|  | 				break; | ||||||
|  |  | ||||||
| 			case COP_EMIT_MAKE_DIC: | 			case COP_EMIT_MAKE_DIC: | ||||||
| 				if (emit_make_dic(hcl) <= -1) goto oops; | 				if (emit_make_dic(hcl) <= -1) goto oops; | ||||||
| 				break; | 				break; | ||||||
| @ -2197,6 +2318,10 @@ int hcl_compile (hcl_t* hcl, hcl_oop_t obj) | |||||||
| 				if (emit_pop_into_array(hcl) <= -1) goto oops; | 				if (emit_pop_into_array(hcl) <= -1) goto oops; | ||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
|  | 			case COP_EMIT_POP_INTO_BYTEARRAY: | ||||||
|  | 				if (emit_pop_into_bytearray(hcl) <= -1) goto oops; | ||||||
|  | 				break; | ||||||
|  |  | ||||||
| 			case COP_EMIT_POP_INTO_DIC: | 			case COP_EMIT_POP_INTO_DIC: | ||||||
| 				if (emit_pop_into_dic(hcl) <= -1) goto oops; | 				if (emit_pop_into_dic(hcl) <= -1) goto oops; | ||||||
| 				break; | 				break; | ||||||
| @ -2249,7 +2374,7 @@ int hcl_compile (hcl_t* hcl, hcl_oop_t obj) | |||||||
|  |  | ||||||
| 			default: | 			default: | ||||||
| 				HCL_DEBUG1 (hcl, "Internal error - invalid compiler opcode %d\n", cf->opcode); | 				HCL_DEBUG1 (hcl, "Internal error - invalid compiler opcode %d\n", cf->opcode); | ||||||
| 				hcl_seterrnum (hcl, HCL_EINTERN); | 				hcl_seterrbfmt (hcl, HCL_EINTERN, "invalid compiler opcode %d", cf->opcode); | ||||||
| 				goto oops; | 				goto oops; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -503,6 +503,16 @@ int hcl_decode (hcl_t* hcl, hcl_ooi_t start, hcl_ooi_t end) | |||||||
| 				LOG_INST_1 (hcl, "pop_into_array %zu", b1); | 				LOG_INST_1 (hcl, "pop_into_array %zu", b1); | ||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
|  | 			case HCL_CODE_MAKE_BYTEARRAY: | ||||||
|  | 				FETCH_PARAM_CODE_TO (hcl, b1); | ||||||
|  | 				LOG_INST_1 (hcl, "make_bytearray %zu", b1); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
|  | 			case HCL_CODE_POP_INTO_BYTEARRAY: | ||||||
|  | 				FETCH_PARAM_CODE_TO (hcl, b1); | ||||||
|  | 				LOG_INST_1 (hcl, "pop_into_bytearray %zu", b1); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
| 			case HCL_CODE_MAKE_DIC: | 			case HCL_CODE_MAKE_DIC: | ||||||
| 				FETCH_PARAM_CODE_TO (hcl, b1); | 				FETCH_PARAM_CODE_TO (hcl, b1); | ||||||
| 				LOG_INST_1 (hcl, "make_dic %zu", b1); | 				LOG_INST_1 (hcl, "make_dic %zu", b1); | ||||||
|  | |||||||
							
								
								
									
										228
									
								
								hcl/lib/err.c
									
									
									
									
									
								
							
							
						
						
									
										228
									
								
								hcl/lib/err.c
									
									
									
									
									
								
							| @ -26,9 +26,6 @@ | |||||||
|  |  | ||||||
| #include "hcl-prv.h" | #include "hcl-prv.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| /* BEGIN: GENERATED WITH generr.hcl */ |  | ||||||
|  |  | ||||||
| static hcl_ooch_t errstr_0[] = {'n','o',' ','e','r','r','o','r','\0'}; | static hcl_ooch_t errstr_0[] = {'n','o',' ','e','r','r','o','r','\0'}; | ||||||
| static hcl_ooch_t errstr_1[] = {'g','e','n','e','r','i','c',' ','e','r','r','o','r','\0'}; | static hcl_ooch_t errstr_1[] = {'g','e','n','e','r','i','c',' ','e','r','r','o','r','\0'}; | ||||||
| static hcl_ooch_t errstr_2[] = {'n','o','t',' ','i','m','p','l','e','m','e','n','t','e','d','\0'}; | static hcl_ooch_t errstr_2[] = {'n','o','t',' ','i','m','p','l','e','m','e','n','t','e','d','\0'}; | ||||||
| @ -71,95 +68,57 @@ static hcl_ooch_t* errstr[] = | |||||||
| 	errstr_32  | 	errstr_32  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #if defined(HCL_INCLUDE_COMPILER) |  | ||||||
| static hcl_ooch_t synerrstr_0[] = {'n','o',' ','e','r','r','o','r','\0'}; | static char* synerrstr[] =  | ||||||
| static hcl_ooch_t synerrstr_1[] = {'i','l','l','e','g','a','l',' ','c','h','a','r','a','c','t','e','r','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_2[] = {'c','o','m','m','e','n','t',' ','n','o','t',' ','c','l','o','s','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_3[] = {'s','t','r','i','n','g',' ','n','o','t',' ','c','l','o','s','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_4[] = {'n','o',' ','c','h','a','r','a','c','t','e','r',' ','a','f','t','e','r',' ','$','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_5[] = {'n','o',' ','v','a','l','i','d',' ','c','h','a','r','a','c','t','e','r',' ','a','f','t','e','r',' ','#','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_6[] = {'w','r','o','n','g',' ','c','h','a','r','a','c','t','e','r',' ','l','i','t','e','r','a','l','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_7[] = {'c','o','l','o','n',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_8[] = {'s','t','r','i','n','g',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_9[] = {'i','n','v','a','l','i','d',' ','r','a','d','i','x','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_10[] = {'i','n','v','a','l','i','d',' ','n','u','m','e','r','i','c',' ','l','i','t','e','r','a','l','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_11[] = {'b','y','t','e',' ','t','o','o',' ','s','m','a','l','l',' ','o','r',' ','t','o','o',' ','l','a','r','g','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_12[] = {'w','r','o','n','g',' ','e','r','r','o','r',' ','l','i','t','e','r','a','l','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_13[] = {'{',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_14[] = {'}',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_15[] = {'(',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_16[] = {')',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_17[] = {']',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_18[] = {'.',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_19[] = {',',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_20[] = {'|',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_21[] = {'>',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_22[] = {':','=',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_23[] = {'i','d','e','n','t','i','f','i','e','r',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_24[] = {'i','n','t','e','g','e','r',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_25[] = {'p','r','i','m','i','t','i','v','e',':',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_26[] = {'w','r','o','n','g',' ','d','i','r','e','c','t','i','v','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_27[] = {'u','n','d','e','f','i','n','e','d',' ','c','l','a','s','s','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_28[] = {'d','u','p','l','i','c','a','t','e',' ','c','l','a','s','s','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_29[] = {'c','o','n','t','r','a','d','i','c','t','o','r','y',' ','c','l','a','s','s',' ','d','e','f','i','n','i','t','i','o','n','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_30[] = {'w','r','o','n','g',' ','c','l','a','s','s',' ','n','a','m','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_31[] = {'i','n','v','a','l','i','d',' ','n','o','n','-','p','o','i','n','t','e','r',' ','i','n','s','t','a','n','c','e',' ','s','i','z','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_32[] = {'p','r','o','h','i','b','i','t','e','d',' ','i','n','h','e','r','i','t','a','n','c','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_33[] = {'v','a','r','i','a','b','l','e',' ','d','e','c','l','a','r','a','t','i','o','n',' ','n','o','t',' ','a','l','l','o','w','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_34[] = {'m','o','d','i','f','i','e','r',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_35[] = {'w','r','o','n','g',' ','m','o','d','i','f','i','e','r','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_36[] = {'d','i','s','a','l','l','o','w','e','d',' ','m','o','d','i','f','i','e','r','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_37[] = {'d','u','p','l','i','c','a','t','e',' ','m','o','d','i','f','i','e','r','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_38[] = {'m','e','t','h','o','d',' ','n','a','m','e',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_39[] = {'d','u','p','l','i','c','a','t','e',' ','m','e','t','h','o','d',' ','n','a','m','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_40[] = {'i','n','v','a','l','i','d',' ','v','a','r','i','a','d','i','c',' ','m','e','t','h','o','d',' ','d','e','f','i','n','i','t','i','o','n','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_41[] = {'v','a','r','i','a','b','l','e',' ','n','a','m','e',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_42[] = {'d','u','p','l','i','c','a','t','e',' ','a','r','g','u','m','e','n','t',' ','n','a','m','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_43[] = {'d','u','p','l','i','c','a','t','e',' ','t','e','m','p','o','r','a','r','y',' ','v','a','r','i','a','b','l','e',' ','n','a','m','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_44[] = {'d','u','p','l','i','c','a','t','e',' ','v','a','r','i','a','b','l','e',' ','n','a','m','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_45[] = {'d','u','p','l','i','c','a','t','e',' ','b','l','o','c','k',' ','a','r','g','u','m','e','n','t',' ','n','a','m','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_46[] = {'u','n','d','e','c','l','a','r','e','d',' ','v','a','r','i','a','b','l','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_47[] = {'u','n','u','s','a','b','l','e',' ','v','a','r','i','a','b','l','e',' ','i','n',' ','c','o','m','p','i','l','e','d',' ','c','o','d','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_48[] = {'i','n','a','c','c','e','s','s','i','b','l','e',' ','v','a','r','i','a','b','l','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_49[] = {'a','m','b','i','g','u','o','u','s',' ','v','a','r','i','a','b','l','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_50[] = {'t','o','o',' ','m','a','n','y',' ','i','n','s','t','a','n','c','e','/','c','l','a','s','s',' ','v','a','r','i','a','b','l','e','s','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_51[] = {'i','n','a','c','c','e','s','s','i','b','l','e',' ','s','e','l','f','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_52[] = {'w','r','o','n','g',' ','e','x','p','r','e','s','s','i','o','n',' ','p','r','i','m','a','r','y','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_53[] = {'t','o','o',' ','m','a','n','y',' ','t','e','m','p','o','r','a','r','i','e','s','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_54[] = {'t','o','o',' ','m','a','n','y',' ','a','r','g','u','m','e','n','t','s','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_55[] = {'t','o','o',' ','m','a','n','y',' ','b','l','o','c','k',' ','t','e','m','p','o','r','a','r','i','e','s','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_56[] = {'t','o','o',' ','m','a','n','y',' ','b','l','o','c','k',' ','a','r','g','u','m','e','n','t','s','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_57[] = {'t','o','o',' ','l','a','r','g','e',' ','b','l','o','c','k','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_58[] = {'t','o','o',' ','l','a','r','g','e',' ','a','r','r','a','y',' ','e','x','p','r','e','s','s','i','o','n','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_59[] = {'w','r','o','n','g',' ','p','r','i','m','i','t','i','v','e',' ','f','u','n','c','t','i','o','n',' ','n','u','m','b','e','r','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_60[] = {'w','r','o','n','g',' ','p','r','i','m','i','t','i','v','e',' ','f','u','n','c','t','i','o','n',' ','i','d','e','n','t','i','f','i','e','r','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_61[] = {'w','r','o','n','g',' ','p','r','i','m','i','t','i','v','e',' ','f','u','n','c','t','i','o','n',' ','a','r','g','u','m','e','n','t',' ','d','e','f','i','n','i','t','i','o','n','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_62[] = {'w','r','o','n','g',' ','m','o','d','u','l','e',' ','n','a','m','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_63[] = {'f','a','i','l','e','d',' ','t','o',' ','i','m','p','o','r','t',' ','m','o','d','u','l','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_64[] = {'#','i','n','c','l','u','d','e',' ','e','r','r','o','r','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_65[] = {'w','r','o','n','g',' ','p','r','a','g','m','a',' ','n','a','m','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_66[] = {'w','r','o','n','g',' ','n','a','m','e','s','p','a','c','e',' ','n','a','m','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_67[] = {'w','r','o','n','g',' ','p','o','o','l',' ','d','i','c','t','i','o','n','a','r','y',' ','n','a','m','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_68[] = {'d','u','p','l','i','c','a','t','e',' ','p','o','o','l',' ','d','i','c','t','i','o','n','a','r','y',' ','n','a','m','e','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_69[] = {'l','i','t','e','r','a','l',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_70[] = {'b','r','e','a','k',' ','o','r',' ','c','o','n','t','i','n','u','e',' ','n','o','t',' ','w','i','t','h','i','n',' ','a',' ','l','o','o','p','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_71[] = {'b','r','e','a','k',' ','o','r',' ','c','o','n','t','i','n','u','e',' ','w','i','t','h','i','n',' ','a',' ','b','l','o','c','k','\0'}; |  | ||||||
| static hcl_ooch_t synerrstr_72[] = {'w','h','i','l','e',' ','e','x','p','e','c','t','e','d','\0'}; |  | ||||||
| static hcl_ooch_t* synerrstr[] = |  | ||||||
| { | { | ||||||
| 	synerrstr_0, synerrstr_1, synerrstr_2, synerrstr_3, synerrstr_4, synerrstr_5, synerrstr_6, synerrstr_7, | 	"no error", | ||||||
| 	synerrstr_8, synerrstr_9, synerrstr_10, synerrstr_11, synerrstr_12, synerrstr_13, synerrstr_14, synerrstr_15, | 	"illegal character", | ||||||
| 	synerrstr_16, synerrstr_17, synerrstr_18, synerrstr_19, synerrstr_20, synerrstr_21, synerrstr_22, synerrstr_23, | 	"comment not closed", | ||||||
| 	synerrstr_24, synerrstr_25, synerrstr_26, synerrstr_27, synerrstr_28, synerrstr_29, synerrstr_30, synerrstr_31, | 	"string not closed", | ||||||
| 	synerrstr_32, synerrstr_33, synerrstr_34, synerrstr_35, synerrstr_36, synerrstr_37, synerrstr_38, synerrstr_39, | 	"invalid hashed literal", | ||||||
| 	synerrstr_40, synerrstr_41, synerrstr_42, synerrstr_43, synerrstr_44, synerrstr_45, synerrstr_46, synerrstr_47, | 	"wrong character literal", | ||||||
| 	synerrstr_48, synerrstr_49, synerrstr_50, synerrstr_51, synerrstr_52, synerrstr_53, synerrstr_54, synerrstr_55, | 	"invalid numeric literal", | ||||||
| 	synerrstr_56, synerrstr_57, synerrstr_58, synerrstr_59, synerrstr_60, synerrstr_61, synerrstr_62, synerrstr_63, | 	"out of integer range", | ||||||
| 	synerrstr_64, synerrstr_65, synerrstr_66, synerrstr_67, synerrstr_68, synerrstr_69, synerrstr_70, synerrstr_71, |  | ||||||
| 	synerrstr_72  | 	"sudden end of input", | ||||||
|  | 	"( expected", | ||||||
|  | 	") expected", | ||||||
|  | 	"] expected", | ||||||
|  | 	"} expected", | ||||||
|  | 	"| expected", | ||||||
|  |  | ||||||
|  | 	"string expected", | ||||||
|  | 	"byte too small or too large", | ||||||
|  | 	"nesting level too deep", | ||||||
|  |  | ||||||
|  | 	"| disallowed", | ||||||
|  | 	". disallowed", | ||||||
|  | 	"#include error", | ||||||
|  |  | ||||||
|  | 	"loop body too big", | ||||||
|  | 	"if body too big", | ||||||
|  | 	"lambda block too big", | ||||||
|  | 	"lambda block too deep", | ||||||
|  | 	"argument name list expected", | ||||||
|  | 	"argument name expected", | ||||||
|  | 	"duplicate argument name", | ||||||
|  | 	"variable name expected", | ||||||
|  | 	"wrong number of arguments", | ||||||
|  | 	"too many arguments defined", | ||||||
|  | 	"too many variables defined", | ||||||
|  | 	"variable declaration disallowed", | ||||||
|  | 	"duplicate variable name", | ||||||
|  | 	"disallowed variable name", | ||||||
|  | 	"disallowed argument name", | ||||||
|  |  | ||||||
|  | 	"elif without if", | ||||||
|  | 	"else without if", | ||||||
|  | 	"break outside loop", | ||||||
|  |  | ||||||
|  | 	"invalid callable", | ||||||
|  | 	"unbalanced key/value pair", | ||||||
|  | 	"empty x-list" | ||||||
| }; | }; | ||||||
| #endif |  | ||||||
| /* END: GENERATED WITH generr.hcl */ |  | ||||||
|  |  | ||||||
| /* --------------------------------------------------------------------------  | /* --------------------------------------------------------------------------  | ||||||
|  * ERROR NUMBER TO STRING CONVERSION |  * ERROR NUMBER TO STRING CONVERSION | ||||||
| @ -170,13 +129,11 @@ const hcl_ooch_t* hcl_errnum_to_errstr (hcl_errnum_t errnum) | |||||||
| 	return (errnum >= 0 && errnum < HCL_COUNTOF(errstr))? errstr[errnum]: e_unknown; | 	return (errnum >= 0 && errnum < HCL_COUNTOF(errstr))? errstr[errnum]: e_unknown; | ||||||
| } | } | ||||||
|  |  | ||||||
| #if defined(HCL_INCLUDE_COMPILER) | static const hcl_bch_t* synerr_to_errstr (hcl_synerrnum_t errnum) | ||||||
| const hcl_ooch_t* hcl_synerrnum_to_errstr (hcl_synerrnum_t errnum) |  | ||||||
| { | { | ||||||
| 	static hcl_ooch_t e_unknown[] = {'u','n','k','n','o','w','n',' ','e','r','r','o','r','\0'}; | 	static hcl_bch_t e_unknown[] = "unknown error"; | ||||||
| 	return (errnum >= 0 && errnum < HCL_COUNTOF(synerrstr))? synerrstr[errnum]: e_unknown; | 	return (errnum >= 0 && errnum < HCL_COUNTOF(synerrstr))? synerrstr[errnum]: e_unknown; | ||||||
| } | } | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /* --------------------------------------------------------------------------  | /* --------------------------------------------------------------------------  | ||||||
|  * SYSTEM DEPENDENT FUNCTIONS  |  * SYSTEM DEPENDENT FUNCTIONS  | ||||||
| @ -301,6 +258,8 @@ hcl_errnum_t hcl_syserr_to_errnum (int e) | |||||||
| 		case EBADF: return HCL_EBADHND; | 		case EBADF: return HCL_EBADHND; | ||||||
| 	#endif | 	#endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 	#if defined(EIO) | 	#if defined(EIO) | ||||||
| 		case EIO: return HCL_EIOERR; | 		case EIO: return HCL_EIOERR; | ||||||
| 	#endif | 	#endif | ||||||
| @ -346,6 +305,87 @@ void hcl_seterrwithsyserr (hcl_t* hcl, int syserr) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void hcl_getsynerr (hcl_t* hcl, hcl_synerr_t* synerr) | ||||||
|  | { | ||||||
|  | 	HCL_ASSERT (hcl, hcl->c != HCL_NULL); | ||||||
|  | 	if (synerr) *synerr = hcl->c->synerr; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void hcl_setsynerrbfmt (hcl_t* hcl, hcl_synerrnum_t num, const hcl_ioloc_t* loc, const hcl_oocs_t* tgt, const hcl_bch_t* msgfmt, ...) | ||||||
|  | { | ||||||
|  | 	if (msgfmt)  | ||||||
|  | 	{ | ||||||
|  | 		va_list ap; | ||||||
|  | 		va_start (ap, msgfmt); | ||||||
|  | 		hcl_seterrbfmtv (hcl, HCL_ESYNERR, msgfmt, ap); | ||||||
|  | 		va_end (ap); | ||||||
|  | 	} | ||||||
|  | 	else  | ||||||
|  | 	{ | ||||||
|  | 		hcl_seterrbfmt (hcl, HCL_ESYNERR, "syntax error - %hs", synerr_to_errstr(num)); | ||||||
|  | 	} | ||||||
|  | 	hcl->c->synerr.num = num; | ||||||
|  |  | ||||||
|  | 	/* The SCO compiler complains of this ternary operation saying: | ||||||
|  | 	 *    error: operands have incompatible types: op ":"  | ||||||
|  | 	 * it seems to complain of type mismatch between *loc and | ||||||
|  | 	 * hcl->c->tok.loc due to 'const' prefixed to loc. */ | ||||||
|  | 	/*hcl->c->synerr.loc = loc? *loc: hcl->c->tok.loc;*/ | ||||||
|  | 	if (loc) | ||||||
|  | 	{ | ||||||
|  | 		hcl->c->synerr.loc = *loc; | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		hcl->c->synerr.loc = hcl->c->tok.loc; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (tgt)  | ||||||
|  | 	{ | ||||||
|  | 		hcl->c->synerr.tgt = *tgt; | ||||||
|  | 	} | ||||||
|  | 	else  | ||||||
|  | 	{ | ||||||
|  | 		hcl->c->synerr.tgt.ptr = HCL_NULL; | ||||||
|  | 		hcl->c->synerr.tgt.len = 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void hcl_setsynerrufmt (hcl_t* hcl, hcl_synerrnum_t num, const hcl_ioloc_t* loc, const hcl_oocs_t* tgt, const hcl_uch_t* msgfmt, ...) | ||||||
|  | { | ||||||
|  | 	if (msgfmt)  | ||||||
|  | 	{ | ||||||
|  | 		va_list ap; | ||||||
|  | 		va_start (ap, msgfmt); | ||||||
|  | 		hcl_seterrufmtv (hcl, HCL_ESYNERR, msgfmt, ap); | ||||||
|  | 		va_end (ap); | ||||||
|  | 	} | ||||||
|  | 	else  | ||||||
|  | 	{ | ||||||
|  | 		hcl_seterrbfmt (hcl, HCL_ESYNERR, "syntax error - %hs", synerr_to_errstr(num)); | ||||||
|  | 	} | ||||||
|  | 	hcl->c->synerr.num = num; | ||||||
|  |  | ||||||
|  | 	/* The SCO compiler complains of this ternary operation saying: | ||||||
|  | 	 *    error: operands have incompatible types: op ":"  | ||||||
|  | 	 * it seems to complain of type mismatch between *loc and | ||||||
|  | 	 * hcl->c->tok.loc due to 'const' prefixed to loc. */ | ||||||
|  | 	/*hcl->c->synerr.loc = loc? *loc: hcl->c->tok.loc;*/ | ||||||
|  | 	if (loc) | ||||||
|  | 		hcl->c->synerr.loc = *loc; | ||||||
|  | 	else | ||||||
|  | 		hcl->c->synerr.loc = hcl->c->tok.loc; | ||||||
|  | 	 | ||||||
|  | 	if (tgt) hcl->c->synerr.tgt = *tgt; | ||||||
|  | 	else  | ||||||
|  | 	{ | ||||||
|  | 		hcl->c->synerr.tgt.ptr = HCL_NULL; | ||||||
|  | 		hcl->c->synerr.tgt.len = 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* --------------------------------------------------------------------------  | /* --------------------------------------------------------------------------  | ||||||
|  * ASSERTION FAILURE HANDLERsemaphore heap full |  * ASSERTION FAILURE HANDLERsemaphore heap full | ||||||
|  * -------------------------------------------------------------------------- */ |  * -------------------------------------------------------------------------- */ | ||||||
|  | |||||||
| @ -1045,7 +1045,7 @@ static int start_initial_process_and_context (hcl_t* hcl) | |||||||
| 	ctx->method_or_nargs = HCL_SMOOI_TO_OOP(0); | 	ctx->method_or_nargs = HCL_SMOOI_TO_OOP(0); | ||||||
| /* TODO: XXXXX */ | /* TODO: XXXXX */ | ||||||
| 	ctx->ntmprs = HCL_SMOOI_TO_OOP(0); | 	ctx->ntmprs = HCL_SMOOI_TO_OOP(0); | ||||||
| 	ctx->home = ctx; /* // is this correct??? */ | 	ctx->home = ctx; /*  is this correct??? */ | ||||||
| /* END XXXXX */ | /* END XXXXX */ | ||||||
|  |  | ||||||
| 	/* [NOTE] | 	/* [NOTE] | ||||||
| @ -1842,6 +1842,42 @@ static int execute (hcl_t* hcl) | |||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | 			case HCL_CODE_MAKE_BYTEARRAY: | ||||||
|  | 			{ | ||||||
|  | 				hcl_oop_t t; | ||||||
|  |  | ||||||
|  | 				FETCH_PARAM_CODE_TO (hcl, b1); | ||||||
|  | 				LOG_INST_1 (hcl, "make_bytearray %zu", b1); | ||||||
|  |  | ||||||
|  | 				/* create an empty array */ | ||||||
|  | 				t = hcl_makebytearray (hcl, HCL_NULL, b1); | ||||||
|  | 				if (!t) return -1; | ||||||
|  |  | ||||||
|  | 				HCL_STACK_PUSH (hcl, t); /* push the byte array created */ | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			case HCL_CODE_POP_INTO_BYTEARRAY: | ||||||
|  | 			{ | ||||||
|  | 				hcl_oop_t t1, t2; | ||||||
|  | 				hcl_ooi_t bv; | ||||||
|  |  | ||||||
|  | 				FETCH_PARAM_CODE_TO (hcl, b1); | ||||||
|  | 				LOG_INST_1 (hcl, "pop_into_bytearray %zu", b1); | ||||||
|  |  | ||||||
|  | 				t1 = HCL_STACK_GETTOP(hcl); /* value to store */ | ||||||
|  | 				if (!HCL_OOP_IS_SMOOI(t1) || (bv = HCL_OOP_TO_SMOOI(t1)) < 0 || bv > 255) | ||||||
|  | 				{ | ||||||
|  | 					hcl_seterrbfmt (hcl, HCL_ERANGE, "not a byte or out of byte range - %O", t1); | ||||||
|  | 					return -1; | ||||||
|  | 				} | ||||||
|  | 				HCL_STACK_POP (hcl); | ||||||
|  | 				t2 = HCL_STACK_GETTOP(hcl); /* array */ | ||||||
|  | 				((hcl_oop_byte_t)t2)->slot[b1] = bv; | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  |  | ||||||
| 			case HCL_CODE_MAKE_DIC: | 			case HCL_CODE_MAKE_DIC: | ||||||
| 			{ | 			{ | ||||||
| 				hcl_oop_t t; | 				hcl_oop_t t; | ||||||
|  | |||||||
| @ -312,6 +312,11 @@ struct hcl_cframe_t | |||||||
| 		{ | 		{ | ||||||
| 			hcl_ooi_t index; | 			hcl_ooi_t index; | ||||||
| 		} array_list; | 		} array_list; | ||||||
|  |  | ||||||
|  | 		struct | ||||||
|  | 		{ | ||||||
|  | 			hcl_ooi_t index; | ||||||
|  | 		} bytearray_list; | ||||||
| 	} u; | 	} u; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @ -702,8 +707,14 @@ enum hcl_bcode_t | |||||||
| 	BCODE_STORE_INTO_OBJVAR_X         = 0xE8, /* 232 ## */ | 	BCODE_STORE_INTO_OBJVAR_X         = 0xE8, /* 232 ## */ | ||||||
| 	BCODE_POP_INTO_OBJVAR_X           = 0xEC, /* 236 ## */ | 	BCODE_POP_INTO_OBJVAR_X           = 0xEC, /* 236 ## */ | ||||||
|  |  | ||||||
|  | 	/* UNUSED 237 */ | ||||||
|  | 	HCL_CODE_MAKE_BYTEARRAY           = 0xEE, /* 238 */ | ||||||
|  | 	HCL_CODE_POP_INTO_BYTEARRAY       = 0xEF, /* 239 */ | ||||||
|  |  | ||||||
| 	BCODE_SEND_MESSAGE_X              = 0xF0, /* 240 ## */ | 	BCODE_SEND_MESSAGE_X              = 0xF0, /* 240 ## */ | ||||||
|  |  | ||||||
| 	/* UNUSED 241 */ | 	/* UNUSED 241 */ | ||||||
|  |  | ||||||
| 	HCL_CODE_MAKE_DIC                 = 0xF2, /* 242 */ | 	HCL_CODE_MAKE_DIC                 = 0xF2, /* 242 */ | ||||||
| 	HCL_CODE_POP_INTO_DIC             = 0xF3, /* 243 */ | 	HCL_CODE_POP_INTO_DIC             = 0xF3, /* 243 */ | ||||||
| 	BCODE_SEND_MESSAGE_TO_SUPER_X     = 0xF4, /* 244 ## */ | 	BCODE_SEND_MESSAGE_TO_SUPER_X     = 0xF4, /* 244 ## */ | ||||||
|  | |||||||
| @ -374,69 +374,3 @@ void hcl_freemem (hcl_t* hcl, void* ptr) | |||||||
| 	HCL_MMGR_FREE (hcl->mmgr, ptr); | 	HCL_MMGR_FREE (hcl->mmgr, ptr); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void hcl_getsynerr (hcl_t* hcl, hcl_synerr_t* synerr) |  | ||||||
| { |  | ||||||
| 	HCL_ASSERT (hcl, hcl->c != HCL_NULL); |  | ||||||
| 	if (synerr) *synerr = hcl->c->synerr; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void hcl_setsynerrbfmt (hcl_t* hcl, hcl_synerrnum_t num, const hcl_ioloc_t* loc, const hcl_oocs_t* tgt, const hcl_bch_t* msgfmt, ...) |  | ||||||
| { |  | ||||||
| 	if (msgfmt)  |  | ||||||
| 	{ |  | ||||||
| 		va_list ap; |  | ||||||
| 		va_start (ap, msgfmt); |  | ||||||
| 		hcl_seterrbfmtv (hcl, HCL_ESYNERR, msgfmt, ap); |  | ||||||
| 		va_end (ap); |  | ||||||
| 	} |  | ||||||
| 	else hcl_seterrnum (hcl, HCL_ESYNERR); |  | ||||||
| 	hcl->c->synerr.num = num; |  | ||||||
|  |  | ||||||
| 	/* The SCO compiler complains of this ternary operation saying: |  | ||||||
| 	 *    error: operands have incompatible types: op ":"  |  | ||||||
| 	 * it seems to complain of type mismatch between *loc and |  | ||||||
| 	 * hcl->c->tok.loc due to 'const' prefixed to loc. */ |  | ||||||
| 	/*hcl->c->synerr.loc = loc? *loc: hcl->c->tok.loc;*/ |  | ||||||
| 	if (loc) |  | ||||||
| 		hcl->c->synerr.loc = *loc; |  | ||||||
| 	else |  | ||||||
| 		hcl->c->synerr.loc = hcl->c->tok.loc; |  | ||||||
| 	 |  | ||||||
| 	if (tgt) hcl->c->synerr.tgt = *tgt; |  | ||||||
| 	else  |  | ||||||
| 	{ |  | ||||||
| 		hcl->c->synerr.tgt.ptr = HCL_NULL; |  | ||||||
| 		hcl->c->synerr.tgt.len = 0; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void hcl_setsynerrufmt (hcl_t* hcl, hcl_synerrnum_t num, const hcl_ioloc_t* loc, const hcl_oocs_t* tgt, const hcl_uch_t* msgfmt, ...) |  | ||||||
| { |  | ||||||
| 	if (msgfmt)  |  | ||||||
| 	{ |  | ||||||
| 		va_list ap; |  | ||||||
| 		va_start (ap, msgfmt); |  | ||||||
| 		hcl_seterrufmtv (hcl, HCL_ESYNERR, msgfmt, ap); |  | ||||||
| 		va_end (ap); |  | ||||||
| 	} |  | ||||||
| 	else hcl_seterrnum (hcl, HCL_ESYNERR); |  | ||||||
| 	hcl->c->synerr.num = num; |  | ||||||
|  |  | ||||||
| 	/* The SCO compiler complains of this ternary operation saying: |  | ||||||
| 	 *    error: operands have incompatible types: op ":"  |  | ||||||
| 	 * it seems to complain of type mismatch between *loc and |  | ||||||
| 	 * hcl->c->tok.loc due to 'const' prefixed to loc. */ |  | ||||||
| 	/*hcl->c->synerr.loc = loc? *loc: hcl->c->tok.loc;*/ |  | ||||||
| 	if (loc) |  | ||||||
| 		hcl->c->synerr.loc = *loc; |  | ||||||
| 	else |  | ||||||
| 		hcl->c->synerr.loc = hcl->c->tok.loc; |  | ||||||
| 	 |  | ||||||
| 	if (tgt) hcl->c->synerr.tgt = *tgt; |  | ||||||
| 	else  |  | ||||||
| 	{ |  | ||||||
| 		hcl->c->synerr.tgt.ptr = HCL_NULL; |  | ||||||
| 		hcl->c->synerr.tgt.len = 0; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -150,7 +150,8 @@ enum hcl_synerrnum_t | |||||||
| 	HCL_SYNERR_BREAK,         /* break outside loop */ | 	HCL_SYNERR_BREAK,         /* break outside loop */ | ||||||
|  |  | ||||||
| 	HCL_SYNERR_CALLABLE,      /* invalid callable */ | 	HCL_SYNERR_CALLABLE,      /* invalid callable */ | ||||||
| 	HCL_SYNERR_UNBALKV        /* unbalanced key/value pair */ | 	HCL_SYNERR_UNBALKV,       /* unbalanced key/value pair */ | ||||||
|  | 	HCL_SYNERR_EMPTYXLIST     /* empty x-list */ | ||||||
| }; | }; | ||||||
| typedef enum hcl_synerrnum_t hcl_synerrnum_t; | typedef enum hcl_synerrnum_t hcl_synerrnum_t; | ||||||
|  |  | ||||||
|  | |||||||
| @ -790,57 +790,6 @@ static void cancel_tick (void) | |||||||
|  |  | ||||||
| /* ========================================================================= */ | /* ========================================================================= */ | ||||||
|  |  | ||||||
|  |  | ||||||
| static char* syntax_error_msg[] =  |  | ||||||
| { |  | ||||||
| 	"no error", |  | ||||||
| 	"illegal character", |  | ||||||
| 	"comment not closed", |  | ||||||
| 	"string not closed", |  | ||||||
| 	"invalid hashed literal", |  | ||||||
| 	"wrong character literal", |  | ||||||
| 	"invalid numeric literal", |  | ||||||
| 	"out of integer range", |  | ||||||
|  |  | ||||||
| 	"sudden end of input", |  | ||||||
| 	"( expected", |  | ||||||
| 	") expected", |  | ||||||
| 	"] expected", |  | ||||||
| 	"} expected", |  | ||||||
| 	"| expected", |  | ||||||
|  |  | ||||||
| 	"string expected", |  | ||||||
| 	"byte too small or too large", |  | ||||||
| 	"nesting level too deep", |  | ||||||
|  |  | ||||||
| 	"| disallowed", |  | ||||||
| 	". disallowed", |  | ||||||
| 	"#include error", |  | ||||||
|  |  | ||||||
| 	"loop body too big", |  | ||||||
| 	"if body too big", |  | ||||||
| 	"lambda block too big", |  | ||||||
| 	"lambda block too deep", |  | ||||||
| 	"argument name list expected", |  | ||||||
| 	"argument name expected", |  | ||||||
| 	"duplicate argument name", |  | ||||||
| 	"variable name expected", |  | ||||||
| 	"wrong number of arguments", |  | ||||||
| 	"too many arguments defined", |  | ||||||
| 	"too many variables defined", |  | ||||||
| 	"variable declaration disallowed", |  | ||||||
| 	"duplicate variable name", |  | ||||||
| 	"disallowed variable name", |  | ||||||
| 	"disallowed argument name", |  | ||||||
|  |  | ||||||
| 	"elif without if", |  | ||||||
| 	"else without if", |  | ||||||
| 	"break outside loop", |  | ||||||
|  |  | ||||||
| 	"invalid callable", |  | ||||||
| 	"unbalanced key/value pair" |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| static void print_synerr (hcl_t* hcl) | static void print_synerr (hcl_t* hcl) | ||||||
| { | { | ||||||
| 	hcl_synerr_t synerr; | 	hcl_synerr_t synerr; | ||||||
| @ -859,19 +808,16 @@ static void print_synerr (hcl_t* hcl) | |||||||
| 		hcl_logbfmt (hcl, HCL_LOG_STDERR, "%s", xtn->read_path); | 		hcl_logbfmt (hcl, HCL_LOG_STDERR, "%s", xtn->read_path); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	hcl_logbfmt (hcl, HCL_LOG_STDERR, "[%zu,%zu] syntax error - %hs",  | 	hcl_logbfmt (hcl, HCL_LOG_STDERR, "[%zu,%zu] %js",  | ||||||
| 		synerr.loc.line, synerr.loc.colm, syntax_error_msg[synerr.num]); | 		synerr.loc.line, synerr.loc.colm, | ||||||
|  | 		(hcl_geterrmsg(hcl) != hcl_geterrstr(hcl)? hcl_geterrmsg(hcl): hcl_geterrstr(hcl)) | ||||||
|  | 	); | ||||||
|  |  | ||||||
| 	if (synerr.tgt.len > 0) | 	if (synerr.tgt.len > 0) | ||||||
| 	{ | 	{ | ||||||
| 		hcl_logbfmt (hcl, HCL_LOG_STDERR, " - %.*js", synerr.tgt.len, synerr.tgt.ptr); | 		hcl_logbfmt (hcl, HCL_LOG_STDERR, " - %.*js", synerr.tgt.len, synerr.tgt.ptr); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (hcl_geterrmsg(hcl) != hcl_geterrstr(hcl)) |  | ||||||
| 	{ |  | ||||||
| 		hcl_logbfmt (hcl, HCL_LOG_STDERR, " - %js", hcl_geterrmsg(hcl)); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	hcl_logbfmt (hcl, HCL_LOG_STDERR, "\n"); | 	hcl_logbfmt (hcl, HCL_LOG_STDERR, "\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -1282,7 +1282,7 @@ static HCL_INLINE hcl_oop_t leave_list (hcl_t* hcl, int* flagv, int* oldflagv) | |||||||
|  |  | ||||||
| #if 0 | #if 0 | ||||||
| 	/* TODO: literalize the list if all the elements are all literals */ | 	/* TODO: literalize the list if all the elements are all literals */ | ||||||
| 	if (concode == HCL_CONCODE_ARRAY) | 	if (concode == HCL_CONCODE_ARRAY || concode == HCL_CONCODE_BYTEARRAY /*|| concode == HCL_CONCODE_DIC*/) | ||||||
| 	{ | 	{ | ||||||
| 		/* convert a list to an array */ | 		/* convert a list to an array */ | ||||||
| 		hcl_oop_oop_t arr; | 		hcl_oop_oop_t arr; | ||||||
| @ -1350,6 +1350,10 @@ done: | |||||||
| 				return (hcl_oop_t)hcl_makebytearray(hcl, HCL_NULL, 0);  | 				return (hcl_oop_t)hcl_makebytearray(hcl, HCL_NULL, 0);  | ||||||
| 			case HCL_CONCODE_DIC: | 			case HCL_CONCODE_DIC: | ||||||
| 				return (hcl_oop_t)hcl_makedic(hcl, 100); /* TODO: default dictionary size for empty definition? */ | 				return (hcl_oop_t)hcl_makedic(hcl, 100); /* TODO: default dictionary size for empty definition? */ | ||||||
|  |  | ||||||
|  | 			case HCL_CONCODE_XLIST: | ||||||
|  | 				hcl_setsynerr (hcl, HCL_SYNERR_EMPTYXLIST, TOKEN_LOC(hcl), HCL_NULL); | ||||||
|  | 				return HCL_NULL; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user