|  |  |  | @ -1549,6 +1549,7 @@ static int get_numlit (moo_t* moo, int negated) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		moo_iolxc_t period; | 
		
	
		
			
				|  |  |  |  | 		moo_oow_t scale; | 
		
	
		
			
				|  |  |  |  | 		moo_iotok_type_t tok_type; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	fixed_point: | 
		
	
		
			
				|  |  |  |  | 		scale = 0; | 
		
	
	
		
			
				
					
					|  |  |  | @ -1563,6 +1564,12 @@ static int get_numlit (moo_t* moo, int negated) | 
		
	
		
			
				|  |  |  |  | 		{ | 
		
	
		
			
				|  |  |  |  | 			unget_char (moo, &moo->c->lxc); | 
		
	
		
			
				|  |  |  |  | 			unget_char (moo, &period); | 
		
	
		
			
				|  |  |  |  | 			if (xscale <= 0)  | 
		
	
		
			
				|  |  |  |  | 			{ | 
		
	
		
			
				|  |  |  |  | 				/* * restore the token type. it's not prefixed with 'p' like 20p. | 
		
	
		
			
				|  |  |  |  | 				 * the number is followed by a terminating period rather than a decimal point. */ | 
		
	
		
			
				|  |  |  |  | 				SET_TOKEN_TYPE(moo, MOO_IOTOK_INTLIT); | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  | 		else | 
		
	
		
			
				|  |  |  |  | 		{ | 
		
	
	
		
			
				
					
					|  |  |  | @ -4978,6 +4985,8 @@ static int compile_block_expression (moo_t* moo) | 
		
	
		
			
				|  |  |  |  | 	code_start = cc->mth.code.len; | 
		
	
		
			
				|  |  |  |  | 	if (TOKEN_TYPE(moo) != MOO_IOTOK_RBRACK) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		moo_oow_t pop_stacktop_pos = 0; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 		while (TOKEN_TYPE(moo) != MOO_IOTOK_EOF) | 
		
	
		
			
				|  |  |  |  | 		{ | 
		
	
		
			
				|  |  |  |  | 			int n; | 
		
	
	
		
			
				
					
					|  |  |  | @ -4987,7 +4996,13 @@ static int compile_block_expression (moo_t* moo) | 
		
	
		
			
				|  |  |  |  | 			if (n == 8888) | 
		
	
		
			
				|  |  |  |  | 			{ | 
		
	
		
			
				|  |  |  |  | 				/* compile_block_statement() processed non-statement item like a jump label. */ | 
		
	
		
			
				|  |  |  |  | 				if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACK) break; | 
		
	
		
			
				|  |  |  |  | 				if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACK)  | 
		
	
		
			
				|  |  |  |  | 				{ | 
		
	
		
			
				|  |  |  |  | 					/* eliminate BCODE_POP_STACKTOP produced in the else block below | 
		
	
		
			
				|  |  |  |  | 					 * becuase the non-steatemnt item is the last item before the closing bracket */ | 
		
	
		
			
				|  |  |  |  | 					if (pop_stacktop_pos > 0) eliminate_instructions (moo, pop_stacktop_pos, cc->mth.code.len - 1); | 
		
	
		
			
				|  |  |  |  | 					break; | 
		
	
		
			
				|  |  |  |  | 				} | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 			else | 
		
	
		
			
				|  |  |  |  | 			{ | 
		
	
	
		
			
				
					
					|  |  |  | @ -4998,6 +5013,8 @@ static int compile_block_expression (moo_t* moo) | 
		
	
		
			
				|  |  |  |  | 					moo_ioloc_t period_loc = *TOKEN_LOC(moo); | 
		
	
		
			
				|  |  |  |  | 					GET_TOKEN (moo); | 
		
	
		
			
				|  |  |  |  | 					if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACK) break; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 					pop_stacktop_pos = cc->mth.code.len; | 
		
	
		
			
				|  |  |  |  | 					if (emit_byte_instruction(moo, BCODE_POP_STACKTOP, &period_loc) <= -1) return -1; | 
		
	
		
			
				|  |  |  |  | 				} | 
		
	
		
			
				|  |  |  |  | 				else | 
		
	
	
		
			
				
					
					|  |  |  | @ -6052,6 +6069,8 @@ static int compile_braced_block (moo_t* moo) | 
		
	
		
			
				|  |  |  |  | 	code_start = cc->mth.code.len; | 
		
	
		
			
				|  |  |  |  | 	if (TOKEN_TYPE(moo) != MOO_IOTOK_RBRACE) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		moo_oow_t pop_stacktop_pos = 0; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 		while (TOKEN_TYPE(moo) != MOO_IOTOK_EOF) | 
		
	
		
			
				|  |  |  |  | 		{ | 
		
	
		
			
				|  |  |  |  | 			int n; | 
		
	
	
		
			
				
					
					|  |  |  | @ -6060,7 +6079,14 @@ static int compile_braced_block (moo_t* moo) | 
		
	
		
			
				|  |  |  |  | 			if (n <= -1) return -1; | 
		
	
		
			
				|  |  |  |  | 			if (n == 8888) | 
		
	
		
			
				|  |  |  |  | 			{ | 
		
	
		
			
				|  |  |  |  | 				if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACE)  break; | 
		
	
		
			
				|  |  |  |  | 				if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACE)  | 
		
	
		
			
				|  |  |  |  | 				{ | 
		
	
		
			
				|  |  |  |  | 					/* non-statement followed by the closing brace. | 
		
	
		
			
				|  |  |  |  | 					 * if there is a statement above the non-statement item, the POP_STACKSTOP is procuced. | 
		
	
		
			
				|  |  |  |  | 					 * it should be eliminated since the block should return the last evalulated value */ | 
		
	
		
			
				|  |  |  |  | 					if (pop_stacktop_pos > 0) eliminate_instructions (moo, pop_stacktop_pos, cc->mth.code.len - 1); | 
		
	
		
			
				|  |  |  |  | 					break; | 
		
	
		
			
				|  |  |  |  | 				} | 
		
	
		
			
				|  |  |  |  | 			} | 
		
	
		
			
				|  |  |  |  | 			else | 
		
	
		
			
				|  |  |  |  | 			{ | 
		
	
	
		
			
				
					
					|  |  |  | @ -6071,6 +6097,8 @@ static int compile_braced_block (moo_t* moo) | 
		
	
		
			
				|  |  |  |  | 					moo_ioloc_t period_loc = *TOKEN_LOC(moo); | 
		
	
		
			
				|  |  |  |  | 					GET_TOKEN (moo); | 
		
	
		
			
				|  |  |  |  | 					if (TOKEN_TYPE(moo) == MOO_IOTOK_RBRACE) break; | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 					pop_stacktop_pos = cc->mth.code.len; /* remember the position of the last POP_STACKTOP for elimination */ | 
		
	
		
			
				|  |  |  |  | 					if (emit_byte_instruction(moo, BCODE_POP_STACKTOP, &period_loc) <= -1) return -1; | 
		
	
		
			
				|  |  |  |  | 				} | 
		
	
		
			
				|  |  |  |  | 				else | 
		
	
	
		
			
				
					
					|  |  |  | @ -6537,16 +6565,16 @@ static int compile_method_expression (moo_t* moo, int pop) | 
		
	
		
			
				|  |  |  |  |  | 
		
	
		
			
				|  |  |  |  | 	if (TOKEN_TYPE(moo) == MOO_IOTOK_IF || TOKEN_TYPE(moo) == MOO_IOTOK_IFNOT) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		if (compile_if_expression (moo) <= -1) return -1; | 
		
	
		
			
				|  |  |  |  | 		if (compile_if_expression(moo) <= -1) return -1; | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 	else if (TOKEN_TYPE(moo) == MOO_IOTOK_WHILE || | 
		
	
		
			
				|  |  |  |  | 	         TOKEN_TYPE(moo) == MOO_IOTOK_UNTIL) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		if (compile_while_expression (moo) <= -1) return -1; | 
		
	
		
			
				|  |  |  |  | 		if (compile_while_expression(moo) <= -1) return -1; | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 	else if (TOKEN_TYPE(moo) == MOO_IOTOK_DO) | 
		
	
		
			
				|  |  |  |  | 	{ | 
		
	
		
			
				|  |  |  |  | 		if (compile_do_while_expression (moo) <= -1) return -1; | 
		
	
		
			
				|  |  |  |  | 		if (compile_do_while_expression(moo) <= -1) return -1; | 
		
	
		
			
				|  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  | 	else if (TOKEN_TYPE(moo) == MOO_IOTOK_IDENT || | 
		
	
		
			
				|  |  |  |  | 	         TOKEN_TYPE(moo) == MOO_IOTOK_IDENT_DOTTED) | 
		
	
	
		
			
				
					
					|  |  |  | @ -6735,8 +6763,9 @@ MOO_DEBUG2 (moo, "LABEL => %.*js\n", TOKEN_NAME_LEN(moo), TOKEN_NAME_PTR(moo)); | 
		
	
		
			
				|  |  |  |  | static int compile_block_statement (moo_t* moo) | 
		
	
		
			
				|  |  |  |  | { | 
		
	
		
			
				|  |  |  |  | 	/* compile_block_statement() is a simpler version of | 
		
	
		
			
				|  |  |  |  | 	 * of compile_method_statement(). it doesn't cater for | 
		
	
		
			
				|  |  |  |  | 	 * popping the stack top */ | 
		
	
		
			
				|  |  |  |  | 	 * of compile_method_statement(). it doesn't care to | 
		
	
		
			
				|  |  |  |  | 	 * produce the instruction to pop the stack top by passing | 
		
	
		
			
				|  |  |  |  | 	 * 0 as the second argument to compile_method_expression(). */ | 
		
	
		
			
				|  |  |  |  | 	int n; | 
		
	
		
			
				|  |  |  |  | 	n = compile_special_statement(moo); | 
		
	
		
			
				|  |  |  |  | 	if (n <= -1) return -1; | 
		
	
	
		
			
				
					
					|  |  |  | 
 |