touched up vm debugging code
This commit is contained in:
		@ -29,10 +29,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define DECODE_LOG_MASK (STIX_LOG_MNEMONIC)
 | 
					#define DECODE_LOG_MASK (STIX_LOG_MNEMONIC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define LOG_INST_0(stix,fmt) STIX_LOG0(stix, DECODE_LOG_MASK, "\t" fmt "\n")
 | 
					#define LOG_INST_0(stix,fmt) STIX_LOG1(stix, DECODE_LOG_MASK, " %06zd " fmt "\n", fetched_instruction_pointer)
 | 
				
			||||||
#define LOG_INST_1(stix,fmt,a1) STIX_LOG1(stix, DECODE_LOG_MASK, "\t" fmt "\n",a1)
 | 
					#define LOG_INST_1(stix,fmt,a1) STIX_LOG2(stix, DECODE_LOG_MASK, " %06zd " fmt "\n", fetched_instruction_pointer, a1)
 | 
				
			||||||
#define LOG_INST_2(stix,fmt,a1,a2) STIX_LOG2(stix, DECODE_LOG_MASK, "\t" fmt "\n", a1, a2)
 | 
					#define LOG_INST_2(stix,fmt,a1,a2) STIX_LOG3(stix, DECODE_LOG_MASK, " %06zd " fmt "\n", fetched_instruction_pointer, a1, a2)
 | 
				
			||||||
#define LOG_INST_3(stix,fmt,a1,a2,a3) STIX_LOG3(stix, DECODE_LOG_MASK, "\t" fmt "\n", a1, a2, a3)
 | 
					#define LOG_INST_3(stix,fmt,a1,a2,a3) STIX_LOG4(stix, DECODE_LOG_MASK, " %06zd " fmt "\n", fetched_instruction_pointer, a1, a2, a3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FETCH_BYTE_CODE(stix) (cdptr[ip++])
 | 
					#define FETCH_BYTE_CODE(stix) (cdptr[ip++])
 | 
				
			||||||
#define FETCH_BYTE_CODE_TO(stix,v_oow) (v_oow = FETCH_BYTE_CODE(stix))
 | 
					#define FETCH_BYTE_CODE_TO(stix,v_oow) (v_oow = FETCH_BYTE_CODE(stix))
 | 
				
			||||||
@ -51,6 +51,7 @@ int stix_decode (stix_t* stix, stix_oop_method_t mth, const stix_oocs_t* classfq
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	stix_oob_t bcode, * cdptr;
 | 
						stix_oob_t bcode, * cdptr;
 | 
				
			||||||
	stix_ooi_t ip = 0, cdlen; /* byte code length is limited by the compiler. so stix_ooi_t is good enough */
 | 
						stix_ooi_t ip = 0, cdlen; /* byte code length is limited by the compiler. so stix_ooi_t is good enough */
 | 
				
			||||||
 | 
						stix_ooi_t fetched_instruction_pointer;
 | 
				
			||||||
	stix_oow_t b1, b2;
 | 
						stix_oow_t b1, b2;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
	cdptr = STIX_METHOD_GET_CODE_BYTE(mth);
 | 
						cdptr = STIX_METHOD_GET_CODE_BYTE(mth);
 | 
				
			||||||
@ -64,6 +65,7 @@ int stix_decode (stix_t* stix, stix_oop_method_t mth, const stix_oocs_t* classfq
 | 
				
			|||||||
/* TODO: check if ip increases beyond bcode when fetching parameters too */
 | 
					/* TODO: check if ip increases beyond bcode when fetching parameters too */
 | 
				
			||||||
	while (ip < cdlen)
 | 
						while (ip < cdlen)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							fetched_instruction_pointer = ip;
 | 
				
			||||||
		FETCH_BYTE_CODE_TO(stix, bcode);
 | 
							FETCH_BYTE_CODE_TO(stix, bcode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch (bcode)
 | 
							switch (bcode)
 | 
				
			||||||
@ -503,7 +505,7 @@ return -1;
 | 
				
			|||||||
	/* print literal frame contents */
 | 
						/* print literal frame contents */
 | 
				
			||||||
	for (ip = 0; ip < STIX_OBJ_GET_SIZE(mth) - STIX_METHOD_NAMED_INSTVARS; ip++)
 | 
						for (ip = 0; ip < STIX_OBJ_GET_SIZE(mth) - STIX_METHOD_NAMED_INSTVARS; ip++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		LOG_INST_2 (stix, " @%-3zd %O", ip, mth->slot[ip]);
 | 
							 STIX_LOG2(stix, DECODE_LOG_MASK, " @%-5zd %O\n", ip, mth->slot[ip]);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -116,11 +116,11 @@
 | 
				
			|||||||
#if defined(STIX_DEBUG_VM_EXEC)
 | 
					#if defined(STIX_DEBUG_VM_EXEC)
 | 
				
			||||||
#	define LOG_MASK_INST (STIX_LOG_IC | STIX_LOG_MNEMONIC)
 | 
					#	define LOG_MASK_INST (STIX_LOG_IC | STIX_LOG_MNEMONIC)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#	define LOG_INST_0(stix,fmt) STIX_LOG0(stix, LOG_MASK_INST, "\t" fmt "\n")
 | 
					/* TODO: for send_message, display the method name. or include the method name before 'ip' */
 | 
				
			||||||
#	define LOG_INST_1(stix,fmt,a1) STIX_LOG1(stix, LOG_MASK_INST, "\t" fmt "\n",a1)
 | 
					#	define LOG_INST_0(stix,fmt) STIX_LOG1(stix, LOG_MASK_INST, " %06zd " fmt "\n", fetched_instruction_pointer)
 | 
				
			||||||
#	define LOG_INST_2(stix,fmt,a1,a2) STIX_LOG2(stix, LOG_MASK_INST, "\t" fmt "\n", a1, a2)
 | 
					#	define LOG_INST_1(stix,fmt,a1) STIX_LOG2(stix, LOG_MASK_INST, " %06zd " fmt "\n",fetched_instruction_pointer, a1)
 | 
				
			||||||
#	define LOG_INST_3(stix,fmt,a1,a2,a3) STIX_LOG3(stix, LOG_MASK_INST, "\t" fmt "\n", a1, a2, a3)
 | 
					#	define LOG_INST_2(stix,fmt,a1,a2) STIX_LOG3(stix, LOG_MASK_INST, " %06zd " fmt "\n", fetched_instruction_pointer, a1, a2)
 | 
				
			||||||
 | 
					#	define LOG_INST_3(stix,fmt,a1,a2,a3) STIX_LOG4(stix, LOG_MASK_INST, " %06zd " fmt "\n", fetched_instruction_pointer, a1, a2, a3)
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#	define LOG_INST_0(stix,fmt)
 | 
					#	define LOG_INST_0(stix,fmt)
 | 
				
			||||||
#	define LOG_INST_1(stix,fmt,a1)
 | 
					#	define LOG_INST_1(stix,fmt,a1)
 | 
				
			||||||
@ -128,7 +128,6 @@
 | 
				
			|||||||
#	define LOG_INST_3(stix,fmt,a1,a2,a3)
 | 
					#	define LOG_INST_3(stix,fmt,a1,a2,a3)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define __PRIMITIVE_NAME__ (&__FUNCTION__[4])
 | 
					#define __PRIMITIVE_NAME__ (&__FUNCTION__[4])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ------------------------------------------------------------------------- */
 | 
					/* ------------------------------------------------------------------------- */
 | 
				
			||||||
@ -2909,6 +2908,10 @@ static int start_method (stix_t* stix, stix_oop_method_t method, stix_oow_t narg
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	stix_ooi_t preamble, preamble_code;
 | 
						stix_ooi_t preamble, preamble_code;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(STIX_DEBUG_VM_EXEC)
 | 
				
			||||||
 | 
						stix_ooi_t fetched_instruction_pointer = 0; /* set it to a fake value */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	STIX_ASSERT (STIX_OOP_TO_SMOOI(method->tmpr_nargs) == nargs);
 | 
						STIX_ASSERT (STIX_OOP_TO_SMOOI(method->tmpr_nargs) == nargs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	preamble = STIX_OOP_TO_SMOOI(method->preamble);
 | 
						preamble = STIX_OOP_TO_SMOOI(method->preamble);
 | 
				
			||||||
@ -3151,6 +3154,10 @@ int stix_execute (stix_t* stix)
 | 
				
			|||||||
	stix_uintmax_t inst_counter = 0;
 | 
						stix_uintmax_t inst_counter = 0;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(STIX_DEBUG_VM_EXEC)
 | 
				
			||||||
 | 
						stix_ooi_t fetched_instruction_pointer;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	STIX_ASSERT (stix->active_context != STIX_NULL);
 | 
						STIX_ASSERT (stix->active_context != STIX_NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	vm_startup (stix);
 | 
						vm_startup (stix);
 | 
				
			||||||
@ -3222,12 +3229,12 @@ int stix_execute (stix_t* stix)
 | 
				
			|||||||
			STIX_ASSERT (stix->processor->tally = STIX_SMOOI_TO_OOP(0));
 | 
								STIX_ASSERT (stix->processor->tally = STIX_SMOOI_TO_OOP(0));
 | 
				
			||||||
			STIX_LOG0 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "No more runnable process\n");
 | 
								STIX_LOG0 (stix, STIX_LOG_IC | STIX_LOG_DEBUG, "No more runnable process\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if 0
 | 
								#if 0
 | 
				
			||||||
if (there is semaphore awaited.... )
 | 
								if (there is semaphore awaited.... )
 | 
				
			||||||
{
 | 
								{
 | 
				
			||||||
/* DO SOMETHING */
 | 
								/* DO SOMETHING */
 | 
				
			||||||
}
 | 
								}
 | 
				
			||||||
#endif
 | 
								#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -3254,6 +3261,9 @@ if (there is semaphore awaited.... )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		stix->proc_switched = 0;
 | 
							stix->proc_switched = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(STIX_DEBUG_VM_EXEC)
 | 
				
			||||||
 | 
							fetched_instruction_pointer = stix->ip;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		FETCH_BYTE_CODE_TO (stix, bcode);
 | 
							FETCH_BYTE_CODE_TO (stix, bcode);
 | 
				
			||||||
		/*while (bcode == BCODE_NOOP) FETCH_BYTE_CODE_TO (stix, bcode);*/
 | 
							/*while (bcode == BCODE_NOOP) FETCH_BYTE_CODE_TO (stix, bcode);*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -372,6 +372,30 @@ static void* mod_getsym (stix_t* stix, void* handle, const stix_ooch_t* name)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* ========================================================================= */
 | 
					/* ========================================================================= */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int write_all (int fd, const char* ptr, stix_oow_t len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						while (len > 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							stix_ooi_t wr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							wr = write (1, ptr, len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (wr <= -1)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								/*if (errno == EAGAIN || errno == EWOULDBLOCK)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									push it to internal buffers? before writing data just converted, need to write buffered data first.
 | 
				
			||||||
 | 
								}*/
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ptr += wr;
 | 
				
			||||||
 | 
							len -= wr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void log_write (stix_t* stix, stix_oow_t mask, const stix_ooch_t* msg, stix_oow_t len)
 | 
					static void log_write (stix_t* stix, stix_oow_t mask, const stix_ooch_t* msg, stix_oow_t len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(_WIN32)
 | 
					#if defined(_WIN32)
 | 
				
			||||||
@ -381,26 +405,24 @@ static void log_write (stix_t* stix, stix_oow_t mask, const stix_ooch_t* msg, st
 | 
				
			|||||||
	stix_bch_t buf[256];
 | 
						stix_bch_t buf[256];
 | 
				
			||||||
	stix_oow_t ucslen, bcslen, msgidx;
 | 
						stix_oow_t ucslen, bcslen, msgidx;
 | 
				
			||||||
	int n;
 | 
						int n;
 | 
				
			||||||
 | 
						char ts[32];
 | 
				
			||||||
 | 
						struct tm tm, *tmp;
 | 
				
			||||||
 | 
						time_t now;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*if (mask & STIX_LOG_GC) return;*/ /* don't show gc logs */
 | 
					/*if (mask & STIX_LOG_GC) return;*/ /* don't show gc logs */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* TODO: beautify the log message.
 | 
					/* TODO: beautify the log message.
 | 
				
			||||||
 *       do classification based on mask. */
 | 
					 *       do classification based on mask. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	char ts[32];
 | 
					 | 
				
			||||||
	struct tm tm;
 | 
					 | 
				
			||||||
	time_t now;
 | 
					 | 
				
			||||||
	now = time(NULL);
 | 
						now = time(NULL);
 | 
				
			||||||
	localtime_r (&now, &tm);
 | 
					#if defined(__MSDOS__)
 | 
				
			||||||
	strftime (ts, sizeof(ts), "%Y-%m-%d %H:%M:%S %z ", &tm);
 | 
						tmp = localtime (&now);
 | 
				
			||||||
	write (1, ts, strlen(ts));
 | 
					#else
 | 
				
			||||||
}
 | 
						tmp = localtime_r (&now, &tm);
 | 
				
			||||||
*/
 | 
					#endif
 | 
				
			||||||
 | 
						strftime (ts, sizeof(ts), "%Y-%m-%d %H:%M:%S %z ", tmp);
 | 
				
			||||||
 | 
						write_all (1, ts, strlen(ts));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	msgidx = 0;
 | 
						msgidx = 0;
 | 
				
			||||||
	while (len > 0)
 | 
						while (len > 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -410,8 +432,6 @@ static void log_write (stix_t* stix, stix_oow_t mask, const stix_ooch_t* msg, st
 | 
				
			|||||||
		n = stix_ucstoutf8 (&msg[msgidx], &ucslen, buf, &bcslen);
 | 
							n = stix_ucstoutf8 (&msg[msgidx], &ucslen, buf, &bcslen);
 | 
				
			||||||
		if (n == 0 || n == -2)
 | 
							if (n == 0 || n == -2)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			stix_oow_t rem;
 | 
					 | 
				
			||||||
			const stix_bch_t* ptr;
 | 
					 | 
				
			||||||
			/* n = 0: 
 | 
								/* n = 0: 
 | 
				
			||||||
			 *   converted all successfully 
 | 
								 *   converted all successfully 
 | 
				
			||||||
			 * n == -2: 
 | 
								 * n == -2: 
 | 
				
			||||||
@ -421,25 +441,7 @@ static void log_write (stix_t* stix, stix_oow_t mask, const stix_ooch_t* msg, st
 | 
				
			|||||||
			STIX_ASSERT (ucslen > 0); /* if this fails, the buffer size must be increased */
 | 
								STIX_ASSERT (ucslen > 0); /* if this fails, the buffer size must be increased */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			/* attempt to write all converted characters */
 | 
								/* attempt to write all converted characters */
 | 
				
			||||||
			rem = bcslen;
 | 
								if (write_all (1, buf, bcslen) <= -1) break;
 | 
				
			||||||
			ptr = buf;
 | 
					 | 
				
			||||||
			while (rem > 0)
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				stix_ooi_t wr;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				wr = write (1, ptr, rem); /* TODO: write all */
 | 
					 | 
				
			||||||
				if (wr <= -1)
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					/*if (errno == EAGAIN || errno == EWOULDBLOCK)
 | 
					 | 
				
			||||||
					{
 | 
					 | 
				
			||||||
						push it to internal buffers? before writing data just converted, need to write buffered data first.
 | 
					 | 
				
			||||||
					}*/
 | 
					 | 
				
			||||||
					break;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				ptr += wr;
 | 
					 | 
				
			||||||
				rem -= wr;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (n == 0) break;
 | 
								if (n == 0) break;
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
@ -517,11 +519,9 @@ static char* syntax_error_msg[] =
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* ========================================================================= */
 | 
					/* ========================================================================= */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
stix_ooch_t str_my_object[] = { 'M', 'y', 'O', 'b','j','e','c','t' };
 | 
					static stix_ooch_t str_my_object[] = { 'M', 'y', 'O', 'b','j','e','c','t' };
 | 
				
			||||||
stix_ooch_t str_main[] = { 'm', 'a', 'i', 'n' };
 | 
					static stix_ooch_t str_main[] = { 'm', 'a', 'i', 'n' };
 | 
				
			||||||
 | 
					static stix_t* g_stix = STIX_NULL;
 | 
				
			||||||
 | 
					 | 
				
			||||||
stix_t* g_stix = STIX_NULL;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ========================================================================= */
 | 
					/* ========================================================================= */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user