added reader & compiler check to filter out special symbols when processing argument and variable names in more contexts
This commit is contained in:
		| @ -797,7 +797,7 @@ static int compile_lambda (hcl_t* hcl, hcl_oop_t src, int defun) | |||||||
| 			return -1; | 			return -1; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if (HCL_OBJ_GET_FLAGS_SYNCODE(defun_name)) | 		if (HCL_OBJ_GET_FLAGS_SYNCODE(defun_name) || HCL_OBJ_GET_FLAGS_KERNEL(defun_name)) | ||||||
| 		{ | 		{ | ||||||
| 			hcl_setsynerrbfmt (hcl, HCL_SYNERR_BANNEDVARNAME, HCL_NULL, HCL_NULL,  | 			hcl_setsynerrbfmt (hcl, HCL_SYNERR_BANNEDVARNAME, HCL_NULL, HCL_NULL,  | ||||||
| 				"special symbol not to be used as a defun name - %O", defun_name); /* TOOD: error location */ | 				"special symbol not to be used as a defun name - %O", defun_name); /* TOOD: error location */ | ||||||
| @ -854,10 +854,10 @@ static int compile_lambda (hcl_t* hcl, hcl_oop_t src, int defun) | |||||||
| 				return -1; | 				return -1; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if (HCL_OBJ_GET_FLAGS_SYNCODE(arg)) | 			if (HCL_OBJ_GET_FLAGS_SYNCODE(arg) || HCL_OBJ_GET_FLAGS_KERNEL(arg)) | ||||||
| 			{ | 			{ | ||||||
| 				hcl_setsynerrbfmt (hcl, HCL_SYNERR_BANNEDARGNAME, HCL_NULL, HCL_NULL, | 				hcl_setsynerrbfmt (hcl, HCL_SYNERR_BANNEDARGNAME, HCL_NULL, HCL_NULL, | ||||||
| 					"special symbol not to be declared as an argument name - %O", arg); /* TOOD: error location */ | 					"special symbol not to be declared as an argument - %O", arg); /* TOOD: error location */ | ||||||
| 				return -1; | 				return -1; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| @ -914,10 +914,11 @@ static int compile_lambda (hcl_t* hcl, hcl_oop_t src, int defun) | |||||||
| 			sz = HCL_OBJ_GET_SIZE(dcl); | 			sz = HCL_OBJ_GET_SIZE(dcl); | ||||||
| 			for (i = 0; i < sz; i++) | 			for (i = 0; i < sz; i++) | ||||||
| 			{ | 			{ | ||||||
| 				if (HCL_OBJ_GET_FLAGS_SYNCODE(((hcl_oop_oop_t)dcl)->slot[i])) | 				if (HCL_OBJ_GET_FLAGS_SYNCODE(((hcl_oop_oop_t)dcl)->slot[i]) || | ||||||
|  | 				    HCL_OBJ_GET_FLAGS_KERNEL(((hcl_oop_oop_t)dcl)->slot[i])) | ||||||
| 				{ | 				{ | ||||||
| 					hcl_setsynerrbfmt (hcl, HCL_SYNERR_BANNEDVARNAME, HCL_NULL, HCL_NULL,  | 					hcl_setsynerrbfmt (hcl, HCL_SYNERR_BANNEDVARNAME, HCL_NULL, HCL_NULL,  | ||||||
| 						"special symbol not to be declared as a variable name - %O", obj); /* TOOD: error location */ | 						"special symbol not to be declared as a variable - %O", obj); /* TOOD: error location */ | ||||||
| 					return -1; | 					return -1; | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| @ -1063,7 +1064,7 @@ static int compile_set (hcl_t* hcl, hcl_oop_t src) | |||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (HCL_OBJ_GET_FLAGS_SYNCODE(var)) | 	if (HCL_OBJ_GET_FLAGS_SYNCODE(var) || HCL_OBJ_GET_FLAGS_KERNEL(var)) | ||||||
| 	{ | 	{ | ||||||
| 		hcl_setsynerrbfmt (hcl, HCL_SYNERR_BANNEDVARNAME, HCL_NULL, HCL_NULL, "special symbol not to be used as a variable name - %O", var); /* TOOD: error location */ | 		hcl_setsynerrbfmt (hcl, HCL_SYNERR_BANNEDVARNAME, HCL_NULL, HCL_NULL, "special symbol not to be used as a variable name - %O", var); /* TOOD: error location */ | ||||||
| 		return -1; | 		return -1; | ||||||
|  | |||||||
| @ -395,6 +395,7 @@ int hcl_addbuiltinprims (hcl_t* hcl) | |||||||
| { | { | ||||||
| 	hcl_oow_t i; | 	hcl_oow_t i; | ||||||
| 	hcl_oop_t prim, name; | 	hcl_oop_t prim, name; | ||||||
|  | 	hcl_oop_cons_t cons; | ||||||
|  |  | ||||||
| 	for (i = 0; i < HCL_COUNTOF(builtin_prims); i++) | 	for (i = 0; i < HCL_COUNTOF(builtin_prims); i++) | ||||||
| 	{ | 	{ | ||||||
| @ -406,7 +407,15 @@ int hcl_addbuiltinprims (hcl_t* hcl) | |||||||
| 		hcl_poptmp (hcl); | 		hcl_poptmp (hcl); | ||||||
| 		if (!name) return -1; | 		if (!name) return -1; | ||||||
|  |  | ||||||
| 		if (!hcl_putatsysdic(hcl, name, prim)) return -1; | 		hcl_pushtmp (hcl, &name); | ||||||
|  | 		cons = hcl_putatsysdic(hcl, name, prim); | ||||||
|  | 		hcl_poptmp (hcl); | ||||||
|  | 		if (!cons) return -1; | ||||||
|  |  | ||||||
|  | 		/* turn on the kernel bit in the symbol associated with a primitive  | ||||||
|  | 		 * function. 'set' prevents this symbol from being used as a variable | ||||||
|  | 		 * name */  | ||||||
|  | 		HCL_OBJ_SET_FLAGS_KERNEL (name, 1); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
|  | |||||||
| @ -1646,11 +1646,18 @@ static int get_symbol_array_literal (hcl_t* hcl, hcl_oop_t* xlit) | |||||||
| 	HCL_ASSERT (hcl, TOKEN_TYPE(hcl) == HCL_IOTOK_VBAR); | 	HCL_ASSERT (hcl, TOKEN_TYPE(hcl) == HCL_IOTOK_VBAR); | ||||||
| 	GET_TOKEN(hcl); /* skip #[ */ | 	GET_TOKEN(hcl); /* skip #[ */ | ||||||
|  |  | ||||||
| 	while (TOKEN_TYPE(hcl) == HCL_IOTOK_IDENT) | 	while (TOKEN_TYPE(hcl) == HCL_IOTOK_IDENT /* || TOKEN_TYPE(hcl) == HCL_IOTOK_IDENT_DOTTED */) | ||||||
| 	{ | 	{ | ||||||
| 		sym = hcl_makesymbol (hcl, TOKEN_NAME_PTR(hcl), TOKEN_NAME_LEN(hcl)); | 		sym = hcl_makesymbol(hcl, TOKEN_NAME_PTR(hcl), TOKEN_NAME_LEN(hcl)); | ||||||
| 		if (!sym) return -1; | 		if (!sym) return -1; | ||||||
|  |  | ||||||
|  | 		if (HCL_OBJ_GET_FLAGS_SYNCODE(sym) || HCL_OBJ_GET_FLAGS_KERNEL(sym)) | ||||||
|  | 		{ | ||||||
|  | 			hcl_setsynerrbfmt (hcl, HCL_SYNERR_BANNEDVARNAME, HCL_NULL, HCL_NULL, | ||||||
|  | 				"special symbol not to be declared as a variable - %O", sym); /* TOOD: error location */ | ||||||
|  | 			return -1; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		if (add_to_symbol_array_literal_buffer(hcl, sym) <= -1) return -1; | 		if (add_to_symbol_array_literal_buffer(hcl, sym) <= -1) return -1; | ||||||
| 		GET_TOKEN (hcl); | 		GET_TOKEN (hcl); | ||||||
| 	} | 	} | ||||||
| @ -1934,6 +1941,7 @@ static int read_object (hcl_t* hcl) | |||||||
|  |  | ||||||
| 					hcl_poptmp (hcl); | 					hcl_poptmp (hcl); | ||||||
|  |  | ||||||
|  | 					HCL_OBJ_SET_FLAGS_KERNEL (obj, 1); | ||||||
| 				} | 				} | ||||||
| 				break; | 				break; | ||||||
| 		} | 		} | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user