From 59aab2ebbd3d463447a6a541003a1b8dd4d17e93 Mon Sep 17 00:00:00 2001 From: sogaiu <983021772@users.noreply.github.com> Date: Tue, 27 Jul 2021 08:01:56 +0900 Subject: [PATCH] Update debug.c with new style core function declarations. --- src/core/debug.c | 157 +++++++++++++++++++++-------------------------- 1 file changed, 69 insertions(+), 88 deletions(-) diff --git a/src/core/debug.c b/src/core/debug.c index ff4b55f8..e1047035 100644 --- a/src/core/debug.c +++ b/src/core/debug.c @@ -195,7 +195,13 @@ static void helper_find_fun(int32_t argc, Janet *argv, JanetFuncDef **def, int32 *bytecode_offset = offset; } -static Janet cfun_debug_break(int32_t argc, Janet *argv) { +JANET_CORE_FN(cfun_debug_break, + "(debug/break source line col)", + "Sets a breakpoint in `source` at a given line and column. " + "Will throw an error if the breakpoint location " + "cannot be found. For example\n\n" + "\t(debug/break \"core.janet\" 10 4)\n\n" + "will set a breakpoint at line 10, 4th column of the file core.janet.") { JanetFuncDef *def; int32_t offset; helper_find(argc, argv, &def, &offset); @@ -203,7 +209,11 @@ static Janet cfun_debug_break(int32_t argc, Janet *argv) { return janet_wrap_nil(); } -static Janet cfun_debug_unbreak(int32_t argc, Janet *argv) { +JANET_CORE_FN(cfun_debug_unbreak, + "(debug/unbreak source line column)", + "Remove a breakpoint with a source key at a given line and column. " + "Will throw an error if the breakpoint " + "cannot be found.") { JanetFuncDef *def; int32_t offset = 0; helper_find(argc, argv, &def, &offset); @@ -211,7 +221,11 @@ static Janet cfun_debug_unbreak(int32_t argc, Janet *argv) { return janet_wrap_nil(); } -static Janet cfun_debug_fbreak(int32_t argc, Janet *argv) { +JANET_CORE_FN(cfun_debug_fbreak, + "(debug/fbreak fun &opt pc)", + "Set a breakpoint in a given function. pc is an optional offset, which " + "is in bytecode instructions. fun is a function value. Will throw an error " + "if the offset is too large or negative.") { JanetFuncDef *def; int32_t offset = 0; helper_find_fun(argc, argv, &def, &offset); @@ -219,7 +233,9 @@ static Janet cfun_debug_fbreak(int32_t argc, Janet *argv) { return janet_wrap_nil(); } -static Janet cfun_debug_unfbreak(int32_t argc, Janet *argv) { +JANET_CORE_FN(cfun_debug_unfbreak, + "(debug/unfbreak fun &opt pc)", + "Unset a breakpoint set with debug/fbreak.") { JanetFuncDef *def; int32_t offset; helper_find_fun(argc, argv, &def, &offset); @@ -227,7 +243,12 @@ static Janet cfun_debug_unfbreak(int32_t argc, Janet *argv) { return janet_wrap_nil(); } -static Janet cfun_debug_lineage(int32_t argc, Janet *argv) { +JANET_CORE_FN(cfun_debug_lineage, + "(debug/lineage fib)", + "Returns an array of all child fibers from a root fiber. This function " + "is useful when a fiber signals or errors to an ancestor fiber. Using this function, " + "the fiber handling the error can see which fiber raised the signal. This function should " + "be used mostly for debugging purposes.") { janet_fixarity(argc, 1); JanetFiber *fiber = janet_getfiber(argv, 0); JanetArray *array = janet_array(0); @@ -284,7 +305,21 @@ static Janet doframe(JanetStackFrame *frame) { return janet_wrap_table(t); } -static Janet cfun_debug_stack(int32_t argc, Janet *argv) { +JANET_CORE_FN(cfun_debug_stack, + "(debug/stack fib)", + "Gets information about the stack as an array of tables. Each table " + "in the array contains information about a stack frame. The top-most, current " + "stack frame is the first table in the array, and the bottom-most stack frame " + "is the last value. Each stack frame contains some of the following attributes:\n\n" + "* :c - true if the stack frame is a c function invocation\n\n" + "* :column - the current source column of the stack frame\n\n" + "* :function - the function that the stack frame represents\n\n" + "* :line - the current source line of the stack frame\n\n" + "* :name - the human-friendly name of the function\n\n" + "* :pc - integer indicating the location of the program counter\n\n" + "* :source - string with the file path or other identifier for the source code\n\n" + "* :slots - array of all values in each slot\n\n" + "* :tail - boolean indicating a tail call") { janet_fixarity(argc, 1); JanetFiber *fiber = janet_getfiber(argv, 0); JanetArray *array = janet_array(0); @@ -300,7 +335,11 @@ static Janet cfun_debug_stack(int32_t argc, Janet *argv) { return janet_wrap_array(array); } -static Janet cfun_debug_stacktrace(int32_t argc, Janet *argv) { +JANET_CORE_FN(cfun_debug_stacktrace, + "(debug/stacktrace fiber &opt err)", + "Prints a nice looking stacktrace for a fiber. Can optionally provide " + "an error value to print the stack trace with. If `err` is nil or not " + "provided, will skip the error line. Returns the fiber.") { janet_arity(argc, 1, 2); JanetFiber *fiber = janet_getfiber(argv, 0); Janet x = argc == 1 ? janet_wrap_nil() : argv[1]; @@ -308,7 +347,11 @@ static Janet cfun_debug_stacktrace(int32_t argc, Janet *argv) { return argv[0]; } -static Janet cfun_debug_argstack(int32_t argc, Janet *argv) { +JANET_CORE_FN(cfun_debug_argstack, + "(debug/arg-stack fiber)", + "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.") { janet_fixarity(argc, 1); JanetFiber *fiber = janet_getfiber(argv, 0); JanetArray *array = janet_array(fiber->stacktop - fiber->stackstart); @@ -317,7 +360,11 @@ static Janet cfun_debug_argstack(int32_t argc, Janet *argv) { return janet_wrap_array(array); } -static Janet cfun_debug_step(int32_t argc, Janet *argv) { +JANET_CORE_FN(cfun_debug_step, + "(debug/step fiber &opt x)", + "Run a fiber for one virtual instruction of the Janet machine. Can optionally " + "pass in a value that will be passed as the resuming value. Returns the signal value, " + "which will usually be nil, as breakpoints raise nil signals.") { janet_arity(argc, 1, 2); JanetFiber *fiber = janet_getfiber(argv, 0); Janet out = janet_wrap_nil(); @@ -325,85 +372,19 @@ static Janet cfun_debug_step(int32_t argc, Janet *argv) { return out; } -static const JanetReg debug_cfuns[] = { - { - "debug/break", cfun_debug_break, - JDOC("(debug/break source line col)\n\n" - "Sets a breakpoint in `source` at a given line and column. " - "Will throw an error if the breakpoint location " - "cannot be found. For example\n\n" - "\t(debug/break \"core.janet\" 10 4)\n\n" - "will set a breakpoint at line 10, 4th column of the file core.janet.") - }, - { - "debug/unbreak", cfun_debug_unbreak, - JDOC("(debug/unbreak source line column)\n\n" - "Remove a breakpoint with a source key at a given line and column. " - "Will throw an error if the breakpoint " - "cannot be found.") - }, - { - "debug/fbreak", cfun_debug_fbreak, - JDOC("(debug/fbreak fun &opt pc)\n\n" - "Set a breakpoint in a given function. pc is an optional offset, which " - "is in bytecode instructions. fun is a function value. Will throw an error " - "if the offset is too large or negative.") - }, - { - "debug/unfbreak", cfun_debug_unfbreak, - JDOC("(debug/unfbreak fun &opt pc)\n\n" - "Unset a breakpoint set with debug/fbreak.") - }, - { - "debug/arg-stack", cfun_debug_argstack, - JDOC("(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_debug_stack, - JDOC("(debug/stack fib)\n\n" - "Gets information about the stack as an array of tables. Each table " - "in the array contains information about a stack frame. The top-most, current " - "stack frame is the first table in the array, and the bottom-most stack frame " - "is the last value. Each stack frame contains some of the following attributes:\n\n" - "* :c - true if the stack frame is a c function invocation\n\n" - "* :column - the current source column of the stack frame\n\n" - "* :function - the function that the stack frame represents\n\n" - "* :line - the current source line of the stack frame\n\n" - "* :name - the human-friendly name of the function\n\n" - "* :pc - integer indicating the location of the program counter\n\n" - "* :source - string with the file path or other identifier for the source code\n\n" - "* :slots - array of all values in each slot\n\n" - "* :tail - boolean indicating a tail call") - }, - { - "debug/stacktrace", cfun_debug_stacktrace, - JDOC("(debug/stacktrace fiber &opt err)\n\n" - "Prints a nice looking stacktrace for a fiber. Can optionally provide " - "an error value to print the stack trace with. If `err` is nil or not " - "provided, will skip the error line. Returns the fiber.") - }, - { - "debug/lineage", cfun_debug_lineage, - JDOC("(debug/lineage fib)\n\n" - "Returns an array of all child fibers from a root fiber. This function " - "is useful when a fiber signals or errors to an ancestor fiber. Using this function, " - "the fiber handling the error can see which fiber raised the signal. This function should " - "be used mostly for debugging purposes.") - }, - { - "debug/step", cfun_debug_step, - JDOC("(debug/step fiber &opt x)\n\n" - "Run a fiber for one virtual instruction of the Janet machine. Can optionally " - "pass in a value that will be passed as the resuming value. Returns the signal value, " - "which will usually be nil, as breakpoints raise nil signals.") - }, - {NULL, NULL, NULL} -}; - /* Module entry point */ void janet_lib_debug(JanetTable *env) { - janet_core_cfuns(env, NULL, debug_cfuns); + JanetRegExt debug_cfuns[] = { + JANET_CORE_REG("debug/break", cfun_debug_break), + JANET_CORE_REG("debug/unbreak", cfun_debug_unbreak), + JANET_CORE_REG("debug/fbreak", cfun_debug_fbreak), + JANET_CORE_REG("debug/unfbreak", cfun_debug_unfbreak), + JANET_CORE_REG("debug/arg-stack", cfun_debug_argstack), + JANET_CORE_REG("debug/stack", cfun_debug_stack), + JANET_CORE_REG("debug/stacktrace", cfun_debug_stacktrace), + JANET_CORE_REG("debug/lineage", cfun_debug_lineage), + JANET_CORE_REG("debug/step", cfun_debug_step), + JANET_REG_END + }; + janet_core_cfuns_ext(env, NULL, debug_cfuns); }