mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 15:43:01 +00:00 
			
		
		
		
	Add debug/arg-stack, and add slots debug/stack.
These features should help implementing a debugger.
This commit is contained in:
		| @@ -203,6 +203,8 @@ static Janet doframe(JanetStackFrame *frame) { | ||||
|         janet_table_put(t, janet_csymbolv(":tail"), janet_wrap_true()); | ||||
|     } | ||||
|     if (frame->func && frame->pc) { | ||||
|         Janet *stack = (Janet *)frame + JANET_FRAME_SIZE; | ||||
|         JanetArray *slots; | ||||
|         off = (int32_t) (frame->pc - def->bytecode); | ||||
|         janet_table_put(t, janet_csymbolv(":pc"), janet_wrap_integer(off)); | ||||
|         if (def->sourcemap) { | ||||
| @@ -213,6 +215,11 @@ static Janet doframe(JanetStackFrame *frame) { | ||||
|         if (def->source) { | ||||
|             janet_table_put(t, janet_csymbolv(":source"), janet_wrap_string(def->source)); | ||||
|         } | ||||
|         /* Add stack arguments */ | ||||
|         slots = janet_array(def->slotcount); | ||||
|         memcpy(slots->data, stack, sizeof(Janet) * def->slotcount); | ||||
|         slots->count = def->slotcount; | ||||
|         janet_table_put(t, janet_csymbolv(":slots"), janet_wrap_array(slots)); | ||||
|     } | ||||
|     return janet_wrap_table(t); | ||||
| } | ||||
| @@ -235,6 +242,17 @@ static int cfun_stack(JanetArgs args) { | ||||
|     JANET_RETURN_ARRAY(args, array); | ||||
| } | ||||
|  | ||||
| static int cfun_argstack(JanetArgs args) { | ||||
|     JanetFiber *fiber; | ||||
|     JanetArray *array; | ||||
|     JANET_FIXARITY(args, 1); | ||||
|     JANET_ARG_FIBER(fiber, args, 0); | ||||
|     array = janet_array(fiber->stacktop - fiber->stackstart); | ||||
|     memcpy(array->data, fiber->data + fiber->stackstart, array->capacity * sizeof(Janet)); | ||||
|     array->count = array->capacity; | ||||
|     JANET_RETURN_ARRAY(args, array); | ||||
| } | ||||
|  | ||||
| static const JanetReg cfuns[] = { | ||||
|     {"debug/break", cfun_break, | ||||
|         "(debug/break source byte-offset)\n\n" | ||||
| @@ -256,6 +274,11 @@ static const JanetReg cfuns[] = { | ||||
|     {"debug/funbreak", cfun_unfbreak, | ||||
|         "(debug/fbreak fun [,pc=0])\n\n" | ||||
|         "Unset a breakpoint set with debug/fbreak."}, | ||||
|     {"debug/arg-stack", cfun_argstack, | ||||
|         "(debug/arg-stack fiber)\n\n" | ||||
|         "Gets all values currently on the fiber's argument stack. Normally, " | ||||
|         "this should be empty unless the fiber signals while pushing arguments " | ||||
|         "to make a function call. Returns a new array."}, | ||||
|     {"debug/stack", cfun_stack, | ||||
|         "(debug/stack fib)\n\n" | ||||
|         "Gets information about the stack as an array of tables. Each table " | ||||
| @@ -269,6 +292,7 @@ static const JanetReg cfuns[] = { | ||||
|         "\t:name - the human friendly name of the function\n" | ||||
|         "\t:pc - integer indicating the location of the program counter\n" | ||||
|         "\t:source - string with filename or other identifier for the source code\n" | ||||
|         "\t:slots - array of all values in each slot\n" | ||||
|         "\t:tail - boolean indicating a tail call" | ||||
|     }, | ||||
|     {"debug/lineage", cfun_lineage, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose