| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * $Id$ | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2018-02-07 14:13:13 +00:00
										 |  |  |     Copyright (c) 2016-2018 Chung, Hyung-Hwan. All rights reserved. | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |     modification, are permitted provided that the following conditions | 
					
						
							|  |  |  |     are met: | 
					
						
							|  |  |  |     1. Redistributions of source code must retain the above copyright | 
					
						
							|  |  |  |        notice, this list of conditions and the following disclaimer. | 
					
						
							|  |  |  |     2. Redistributions in binary form must reproduce the above copyright | 
					
						
							|  |  |  |        notice, this list of conditions and the following disclaimer in the | 
					
						
							|  |  |  |        documentation and/or other materials provided with the distribution. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR | 
					
						
							|  |  |  |     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WAfRRANTIES | 
					
						
							|  |  |  |     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | 
					
						
							|  |  |  |     IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | 
					
						
							|  |  |  |     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 
					
						
							|  |  |  |     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
					
						
							|  |  |  |     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
					
						
							|  |  |  |     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
					
						
							|  |  |  |     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 
					
						
							|  |  |  |     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "hcl-prv.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 15:59:32 +00:00
										 |  |  | #define DECODE_LOG_MASK (HCL_LOG_MNEMONIC | HCL_LOG_INFO)
 | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-21 09:30:18 +00:00
										 |  |  | #if defined(HCL_BUILD_RELEASE)
 | 
					
						
							| 
									
										
										
										
											2018-02-05 15:59:32 +00:00
										 |  |  | 	/* get rid of instruction logging regardless of the log mask
 | 
					
						
							|  |  |  | 	 * in the release build */ | 
					
						
							|  |  |  | #	define LOG_INST_0(hcl,fmt)
 | 
					
						
							|  |  |  | #	define LOG_INST_1(hcl,fmt,a1)
 | 
					
						
							|  |  |  | #	define LOG_INST_2(hcl,fmt,a1,a2)
 | 
					
						
							|  |  |  | #	define LOG_INST_3(hcl,fmt,a1,a2,a3)
 | 
					
						
							| 
									
										
										
										
											2020-10-04 18:21:05 +00:00
										 |  |  | #	define LOG_INST_4(hcl,fmt,a1,a2,a3,a4)
 | 
					
						
							| 
									
										
										
										
											2018-02-05 15:59:32 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #	define LOG_INST_0(hcl,fmt) HCL_LOG1(hcl, DECODE_LOG_MASK, " %06zd " fmt "\n", fetched_instruction_pointer)
 | 
					
						
							|  |  |  | #	define LOG_INST_1(hcl,fmt,a1) HCL_LOG2(hcl, DECODE_LOG_MASK, " %06zd " fmt "\n", fetched_instruction_pointer, a1)
 | 
					
						
							|  |  |  | #	define LOG_INST_2(hcl,fmt,a1,a2) HCL_LOG3(hcl, DECODE_LOG_MASK, " %06zd " fmt "\n", fetched_instruction_pointer, a1, a2)
 | 
					
						
							|  |  |  | #	define LOG_INST_3(hcl,fmt,a1,a2,a3) HCL_LOG4(hcl, DECODE_LOG_MASK, " %06zd " fmt "\n", fetched_instruction_pointer, a1, a2, a3)
 | 
					
						
							| 
									
										
										
										
											2020-10-04 18:21:05 +00:00
										 |  |  | #	define LOG_INST_4(hcl,fmt,a1,a2,a3,a4) HCL_LOG5(hcl, DECODE_LOG_MASK, " %06zd " fmt "\n", fetched_instruction_pointer, a1, a2, a3, a4)
 | 
					
						
							| 
									
										
										
										
											2018-02-05 15:59:32 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define FETCH_BYTE_CODE(hcl) (cdptr[ip++])
 | 
					
						
							|  |  |  | #define FETCH_BYTE_CODE_TO(hcl,v_ooi) (v_ooi = FETCH_BYTE_CODE(hcl))
 | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | #if (HCL_HCL_CODE_LONG_PARAM_SIZE == 2)
 | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | #	define FETCH_PARAM_CODE_TO(hcl,v_ooi) \
 | 
					
						
							|  |  |  | 		do { \ | 
					
						
							|  |  |  | 			v_ooi = FETCH_BYTE_CODE(hcl); \ | 
					
						
							|  |  |  | 			v_ooi = (v_ooi << 8) | FETCH_BYTE_CODE(hcl); \ | 
					
						
							|  |  |  | 		} while (0) | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #	define FETCH_PARAM_CODE_TO(hcl,v_ooi) (v_ooi = FETCH_BYTE_CODE(hcl))
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* TODO: check if ip shoots beyond the maximum length in fetching code and parameters */ | 
					
						
							| 
									
										
										
										
											2018-03-11 11:16:28 +00:00
										 |  |  | int hcl_decode (hcl_t* hcl, hcl_oow_t start, hcl_oow_t end) | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	hcl_oob_t bcode, * cdptr; | 
					
						
							| 
									
										
										
										
											2016-10-06 17:49:47 +00:00
										 |  |  | 	hcl_ooi_t ip = start, fetched_instruction_pointer; | 
					
						
							| 
									
										
										
										
											2020-10-04 18:21:05 +00:00
										 |  |  | 	hcl_oow_t b1, b2, b3, b4; | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* the instruction at the offset 'end' is not decoded.
 | 
					
						
							|  |  |  | 	 * decoding offset range is from start to end - 1. */ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 10:43:25 +00:00
										 |  |  | 	HCL_ASSERT (hcl, start >= 0 && end >= 0); | 
					
						
							|  |  |  | 	HCL_ASSERT (hcl, hcl->code.bc.len < HCL_SMOOI_MAX); /* asserted by the compiler */ | 
					
						
							|  |  |  | 	HCL_ASSERT (hcl, end <= hcl->code.bc.len); /* not harmful though this fails */ | 
					
						
							| 
									
										
										
										
											2018-03-11 11:16:28 +00:00
										 |  |  | 	if (start >= hcl->code.bc.len) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		hcl_seterrnum (hcl, HCL_EINVAL); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (end > hcl->code.bc.len) end = hcl->code.bc.len; | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ip = start; | 
					
						
							|  |  |  | 	cdptr = ((hcl_oop_byte_t)hcl->code.bc.arr)->slot; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* TODO: check if ip increases beyond bcode when fetching parameters too */ | 
					
						
							|  |  |  | 	while (ip < end) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2016-10-06 17:49:47 +00:00
										 |  |  | 		fetched_instruction_pointer = ip; | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 		FETCH_BYTE_CODE_TO(hcl, bcode); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		switch (bcode) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_PUSH_INSTVAR_X: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				goto push_instvar; | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_PUSH_INSTVAR_0: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_INSTVAR_1: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_INSTVAR_2: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_INSTVAR_3: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_INSTVAR_4: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_INSTVAR_5: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_INSTVAR_6: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_INSTVAR_7: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				b1 = bcode & 0x7; /* low 3 bits */ | 
					
						
							|  |  |  | 			push_instvar: | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "push_instvar %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* ------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_STORE_INTO_INSTVAR_X: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				goto store_instvar; | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_STORE_INTO_INSTVAR_0: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_INSTVAR_1: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_INSTVAR_2: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_INSTVAR_3: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_INSTVAR_4: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_INSTVAR_5: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_INSTVAR_6: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_INSTVAR_7: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				b1 = bcode & 0x7; /* low 3 bits */ | 
					
						
							|  |  |  | 			store_instvar: | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "store_into_instvar %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_POP_INTO_INSTVAR_X: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				goto pop_into_instvar; | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_POP_INTO_INSTVAR_0: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_INSTVAR_1: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_INSTVAR_2: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_INSTVAR_3: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_INSTVAR_4: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_INSTVAR_5: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_INSTVAR_6: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_INSTVAR_7: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				b1 = bcode & 0x7; /* low 3 bits */ | 
					
						
							|  |  |  | 			pop_into_instvar: | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "pop_into_instvar %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* ------------------------------------------------- */ | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_TEMPVAR_X: | 
					
						
							| 
									
										
										
										
											2016-09-29 13:20:09 +00:00
										 |  |  | 			case HCL_CODE_STORE_INTO_TEMPVAR_X: | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_POP_INTO_TEMPVAR_X: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				goto handle_tempvar; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_TEMPVAR_0: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_TEMPVAR_1: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_TEMPVAR_2: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_TEMPVAR_3: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_TEMPVAR_4: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_TEMPVAR_5: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_TEMPVAR_6: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_TEMPVAR_7: | 
					
						
							| 
									
										
										
										
											2016-09-29 13:20:09 +00:00
										 |  |  | 			case HCL_CODE_STORE_INTO_TEMPVAR_0: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_TEMPVAR_1: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_TEMPVAR_2: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_TEMPVAR_3: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_TEMPVAR_4: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_TEMPVAR_5: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_TEMPVAR_6: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_TEMPVAR_7: | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_POP_INTO_TEMPVAR_0: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_TEMPVAR_1: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_TEMPVAR_2: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_TEMPVAR_3: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_TEMPVAR_4: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_TEMPVAR_5: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_TEMPVAR_6: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_TEMPVAR_7: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				b1 = bcode & 0x7; /* low 3 bits */ | 
					
						
							|  |  |  | 			handle_tempvar: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if ((bcode >> 4) & 1) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					/* push - bit 4 on */ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 					LOG_INST_1 (hcl, "push_tempvar %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					/* store or pop - bit 5 off */ | 
					
						
							|  |  |  | 					if ((bcode >> 3) & 1) | 
					
						
							|  |  |  | 					{ | 
					
						
							|  |  |  | 						/* pop - bit 3 on */ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 						LOG_INST_1 (hcl, "pop_into_tempvar %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 					else | 
					
						
							|  |  |  | 					{ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 						LOG_INST_1 (hcl, "store_into_tempvar %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* ------------------------------------------------- */ | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_LITERAL_X2: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b2); | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 		#if (HCL_HCL_CODE_LONG_PARAM_SIZE == 2)
 | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				b1 = (b1 << 16) | b2; | 
					
						
							|  |  |  | 		#else
 | 
					
						
							|  |  |  | 				b1 = (b1 << 8) | b2; | 
					
						
							|  |  |  | 		#endif
 | 
					
						
							|  |  |  | 				goto push_literal; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_LITERAL_X: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				goto push_literal; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_LITERAL_0: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_LITERAL_1: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_LITERAL_2: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_LITERAL_3: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_LITERAL_4: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_LITERAL_5: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_LITERAL_6: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_LITERAL_7: | 
					
						
							|  |  |  | 				b1 = bcode & 0x7; /* low 3 bits */ | 
					
						
							|  |  |  | 			push_literal: | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "push_literal @%zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* ------------------------------------------------- */ | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_OBJECT_X: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_OBJECT_X: | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_POP_INTO_OBJECT_X: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				goto handle_object; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_OBJECT_0: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_OBJECT_1: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_OBJECT_2: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_OBJECT_3: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_OBJECT_0: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_OBJECT_1: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_OBJECT_2: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_OBJECT_3: | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_POP_INTO_OBJECT_0: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_OBJECT_1: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_OBJECT_2: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_OBJECT_3: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				b1 = bcode & 0x3; /* low 2 bits */ | 
					
						
							|  |  |  | 			handle_object: | 
					
						
							|  |  |  | 				if ((bcode >> 3) & 1) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					if ((bcode >> 2) & 1) | 
					
						
							|  |  |  | 					{ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 						LOG_INST_1 (hcl, "pop_into_object @%zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 					else | 
					
						
							|  |  |  | 					{ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 						LOG_INST_1 (hcl, "store_into_object @%zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 					LOG_INST_1 (hcl, "push_object @%zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* -------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_JUMP_FORWARD_X: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "jump_forward %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_JUMP_FORWARD_0: | 
					
						
							|  |  |  | 			case HCL_CODE_JUMP_FORWARD_1: | 
					
						
							|  |  |  | 			case HCL_CODE_JUMP_FORWARD_2: | 
					
						
							|  |  |  | 			case HCL_CODE_JUMP_FORWARD_3: | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "jump_forward %zu", (hcl_oow_t)(bcode & 0x3)); /* low 2 bits */ | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_JUMP_BACKWARD_X: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "jump_backward %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				hcl->ip += b1; | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_JUMP_BACKWARD_0: | 
					
						
							|  |  |  | 			case HCL_CODE_JUMP_BACKWARD_1: | 
					
						
							|  |  |  | 			case HCL_CODE_JUMP_BACKWARD_2: | 
					
						
							|  |  |  | 			case HCL_CODE_JUMP_BACKWARD_3: | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "jump_backward %zu", (hcl_oow_t)(bcode & 0x3)); /* low 2 bits */ | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-12 07:30:54 +00:00
										 |  |  | 			case HCL_CODE_JUMP_FORWARD_IF_TRUE: | 
					
						
							| 
									
										
										
										
											2016-10-10 11:36:24 +00:00
										 |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							| 
									
										
										
										
											2016-10-12 07:30:54 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "jump_forward_if_true %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-10-10 11:36:24 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-12 07:30:54 +00:00
										 |  |  | 			case HCL_CODE_JUMP2_FORWARD_IF_TRUE: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				LOG_INST_1 (hcl, "jump2_forward_if_true %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-10-10 11:36:24 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-12 07:30:54 +00:00
										 |  |  | 			case HCL_CODE_JUMP_FORWARD_IF_FALSE: | 
					
						
							| 
									
										
										
										
											2016-10-10 11:36:24 +00:00
										 |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				LOG_INST_1 (hcl, "jump_forward_if_false %zu", b1); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-12 07:30:54 +00:00
										 |  |  | 			case HCL_CODE_JUMP2_FORWARD_IF_FALSE: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				LOG_INST_1 (hcl, "jump2_forward_if_false %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-10-10 11:36:24 +00:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_JUMP2_FORWARD: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "jump2_forward %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_JUMP2_BACKWARD: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "jump2_backward %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* -------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_CALL_X: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				goto handle_call; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_CALL_0: | 
					
						
							|  |  |  | 			case HCL_CODE_CALL_1: | 
					
						
							|  |  |  | 			case HCL_CODE_CALL_2: | 
					
						
							|  |  |  | 			case HCL_CODE_CALL_3: | 
					
						
							|  |  |  | 				b1 = bcode & 0x3; /* low 2 bits */ | 
					
						
							|  |  |  | 			handle_call: | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "call %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			/* -------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-29 13:20:09 +00:00
										 |  |  | 			case HCL_CODE_PUSH_CTXTEMPVAR_X: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_CTXTEMPVAR_X: | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_POP_INTO_CTXTEMPVAR_X: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b2); | 
					
						
							|  |  |  | 				goto handle_ctxtempvar; | 
					
						
							| 
									
										
										
										
											2016-09-29 13:20:09 +00:00
										 |  |  | 			case HCL_CODE_PUSH_CTXTEMPVAR_0: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_CTXTEMPVAR_1: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_CTXTEMPVAR_2: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_CTXTEMPVAR_3: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_CTXTEMPVAR_0: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_CTXTEMPVAR_1: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_CTXTEMPVAR_2: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_CTXTEMPVAR_3: | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_POP_INTO_CTXTEMPVAR_0: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_CTXTEMPVAR_1: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_CTXTEMPVAR_2: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_CTXTEMPVAR_3: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				b1 = bcode & 0x3; /* low 2 bits */ | 
					
						
							|  |  |  | 				FETCH_BYTE_CODE_TO (hcl, b2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			handle_ctxtempvar: | 
					
						
							|  |  |  | 				if ((bcode >> 3) & 1) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					/* store or pop */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					if ((bcode >> 2) & 1) | 
					
						
							|  |  |  | 					{ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 						LOG_INST_2 (hcl, "pop_into_ctxtempvar %zu %zu", b1, b2); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 					else | 
					
						
							|  |  |  | 					{ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 						LOG_INST_2 (hcl, "store_into_ctxtempvar %zu %zu", b1, b2); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					/* push */ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 					LOG_INST_2 (hcl, "push_ctxtempvar %zu %zu", b1, b2); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			/* -------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_PUSH_OBJVAR_X: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_OBJVAR_X: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_OBJVAR_X: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b2); | 
					
						
							|  |  |  | 				goto handle_objvar; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_PUSH_OBJVAR_0: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_OBJVAR_1: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_OBJVAR_2: | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_OBJVAR_3: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_OBJVAR_0: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_OBJVAR_1: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_OBJVAR_2: | 
					
						
							|  |  |  | 			case HCL_CODE_STORE_INTO_OBJVAR_3: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_OBJVAR_0: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_OBJVAR_1: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_OBJVAR_2: | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_OBJVAR_3: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				/* b1 -> variable index to the object indicated by b2.
 | 
					
						
							|  |  |  | 				 * b2 -> object index stored in the literal frame. */ | 
					
						
							|  |  |  | 				b1 = bcode & 0x3; /* low 2 bits */ | 
					
						
							|  |  |  | 				FETCH_BYTE_CODE_TO (hcl, b2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			handle_objvar: | 
					
						
							|  |  |  | 				if ((bcode >> 3) & 1) | 
					
						
							|  |  |  | 				{ | 
					
						
							|  |  |  | 					/* store or pop */ | 
					
						
							|  |  |  | 					if ((bcode >> 2) & 1) | 
					
						
							|  |  |  | 					{ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 						LOG_INST_2 (hcl, "pop_into_objvar %zu %zu", b1, b2); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 					else | 
					
						
							|  |  |  | 					{ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 						LOG_INST_2 (hcl, "store_into_objvar %zu %zu", b1, b2); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				else | 
					
						
							|  |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 					LOG_INST_2 (hcl, "push_objvar %zu %zu", b1, b2); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* -------------------------------------------------------- */ | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_SEND_MESSAGE_X: | 
					
						
							|  |  |  | 			case HCL_CODE_SEND_MESSAGE_TO_SUPER_X: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				/* b1 -> number of arguments 
 | 
					
						
							|  |  |  | 				 * b2 -> selector index stored in the literal frame */ | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b2); | 
					
						
							|  |  |  | 				goto handle_send_message; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_SEND_MESSAGE_0: | 
					
						
							|  |  |  | 			case HCL_CODE_SEND_MESSAGE_1: | 
					
						
							|  |  |  | 			case HCL_CODE_SEND_MESSAGE_2: | 
					
						
							|  |  |  | 			case HCL_CODE_SEND_MESSAGE_3: | 
					
						
							|  |  |  | 			case HCL_CODE_SEND_MESSAGE_TO_SUPER_0: | 
					
						
							|  |  |  | 			case HCL_CODE_SEND_MESSAGE_TO_SUPER_1: | 
					
						
							|  |  |  | 			case HCL_CODE_SEND_MESSAGE_TO_SUPER_2: | 
					
						
							|  |  |  | 			case HCL_CODE_SEND_MESSAGE_TO_SUPER_3: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				b1 = bcode & 0x3; /* low 2 bits */ | 
					
						
							|  |  |  | 				FETCH_BYTE_CODE_TO (hcl, b2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			handle_send_message: | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_3 (hcl, "send_message%hs %zu @%zu", (((bcode >> 2) & 1)? "_to_super": ""), b1, b2); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break;  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* -------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_PUSH_RECEIVER: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				LOG_INST_0 (hcl, "push_receiver"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_NIL: | 
					
						
							|  |  |  | 				LOG_INST_0 (hcl, "push_nil"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_TRUE: | 
					
						
							|  |  |  | 				LOG_INST_0 (hcl, "push_true"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_FALSE: | 
					
						
							|  |  |  | 				LOG_INST_0 (hcl, "push_false"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_PUSH_CONTEXT: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				LOG_INST_0 (hcl, "push_context"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_PUSH_PROCESS: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				LOG_INST_0 (hcl, "push_process"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_NEGONE: | 
					
						
							|  |  |  | 				LOG_INST_0 (hcl, "push_negone"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_ZERO: | 
					
						
							|  |  |  | 				LOG_INST_0 (hcl, "push_zero"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_ONE: | 
					
						
							|  |  |  | 				LOG_INST_0 (hcl, "push_one"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_TWO: | 
					
						
							|  |  |  | 				LOG_INST_0 (hcl, "push_two"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_INTLIT: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "push_intlit %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_NEGINTLIT: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "push_negintlit %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_PUSH_CHARLIT: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "push_charlit %zu", b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 			/* -------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 07:35:30 +00:00
										 |  |  | 			case HCL_CODE_MAKE_ARRAY: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				LOG_INST_1 (hcl, "make_array %zu", b1); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_POP_INTO_ARRAY: | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				LOG_INST_1 (hcl, "pop_into_array %zu", b1); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 13:55:22 +00:00
										 |  |  | 			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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 10:55:20 +00:00
										 |  |  | 			case HCL_CODE_MAKE_DIC: | 
					
						
							| 
									
										
										
										
											2018-02-07 07:35:30 +00:00
										 |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							| 
									
										
										
										
											2018-02-07 10:55:20 +00:00
										 |  |  | 				LOG_INST_1 (hcl, "make_dic %zu", b1); | 
					
						
							| 
									
										
										
										
											2018-02-07 07:35:30 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 10:55:20 +00:00
										 |  |  | 			case HCL_CODE_POP_INTO_DIC: | 
					
						
							|  |  |  | 				LOG_INST_0 (hcl, "pop_into_dic"); | 
					
						
							| 
									
										
										
										
											2018-02-07 07:35:30 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			/* -------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_DUP_STACKTOP: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				LOG_INST_0 (hcl, "dup_stacktop"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_POP_STACKTOP: | 
					
						
							|  |  |  | 				LOG_INST_0 (hcl, "pop_stacktop"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_RETURN_STACKTOP: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				LOG_INST_0 (hcl, "return_stacktop"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-22 09:19:53 +00:00
										 |  |  | 			case HCL_CODE_RETURN_RECEIVER: | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				LOG_INST_0 (hcl, "return_receiver"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_RETURN_FROM_BLOCK: | 
					
						
							|  |  |  | 				LOG_INST_0 (hcl, "return_from_block"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-04 18:21:05 +00:00
										 |  |  | 			case HCL_CODE_MAKE_FUNCTION: | 
					
						
							|  |  |  | 				/* b1 - number of block arguments
 | 
					
						
							|  |  |  | 				 * b2 - number of block temporaries | 
					
						
							|  |  |  | 				 * b3 - base literal frame start | 
					
						
							|  |  |  | 				 * b4 - base literal frame end */ | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b2); | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b3); | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b4); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				LOG_INST_4 (hcl, "make_function %zu %zu %zu %zu", b1, b2, b3, b4); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				HCL_ASSERT (hcl, b1 >= 0); | 
					
						
							|  |  |  | 				HCL_ASSERT (hcl, b2 >= b1); | 
					
						
							|  |  |  | 				HCL_ASSERT (hcl, b4 >= b3); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 			case HCL_CODE_MAKE_BLOCK: | 
					
						
							|  |  |  | 				/* b1 - number of block arguments
 | 
					
						
							|  |  |  | 				 * b2 - number of block temporaries */ | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b1); | 
					
						
							|  |  |  | 				FETCH_PARAM_CODE_TO (hcl, b2); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-04 17:56:28 +00:00
										 |  |  | 				LOG_INST_2 (hcl, "make_block %zu %zu", b1, b2); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-05 10:43:25 +00:00
										 |  |  | 				HCL_ASSERT (hcl, b1 >= 0); | 
					
						
							|  |  |  | 				HCL_ASSERT (hcl, b2 >= b1); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case HCL_CODE_NOOP: | 
					
						
							|  |  |  | 				/* do nothing */ | 
					
						
							|  |  |  | 				LOG_INST_0 (hcl, "noop"); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				LOG_INST_1 (hcl, "UNKNOWN BYTE CODE ENCOUNTERED %x", (int)bcode); | 
					
						
							| 
									
										
										
										
											2018-02-05 10:43:25 +00:00
										 |  |  | 				hcl_seterrnum (hcl, HCL_EINTERN); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-04 18:21:05 +00:00
										 |  |  | // TODO: this needs changes... */
 | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 	/* print literal frame contents */ | 
					
						
							|  |  |  | 	for (ip = 0; ip < hcl->code.lit.len; ip++) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2016-10-06 17:49:47 +00:00
										 |  |  | 		HCL_LOG2(hcl, DECODE_LOG_MASK, "@%-9zd %O\n", ip, ((hcl_oop_oop_t)hcl->code.lit.arr)->slot[ip]); | 
					
						
							| 
									
										
										
										
											2016-09-28 14:40:37 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |