@@ -118,6 +118,7 @@ void janet_stacktrace(JanetFiber *fiber, Janet err) {
118118 fiber = fibers [fi ];
119119 int32_t i = fiber -> frame ;
120120 while (i > 0 ) {
121+ JanetCFunRegistry * reg = NULL ;
121122 JanetStackFrame * frame = (JanetStackFrame * )(fiber -> data + i - JANET_FRAME_SIZE );
122123 JanetFuncDef * def = NULL ;
123124 i = frame -> prevframe ;
@@ -144,11 +145,19 @@ void janet_stacktrace(JanetFiber *fiber, Janet err) {
144145 } else {
145146 JanetCFunction cfun = (JanetCFunction )(frame -> pc );
146147 if (cfun ) {
147- Janet name = janet_table_get (janet_vm .registry , janet_wrap_cfunction (cfun ));
148- if (!janet_checktype (name , JANET_NIL ))
149- janet_eprintf (" %s" , (const char * )janet_to_string (name ));
150- else
148+ reg = janet_registry_get (cfun );
149+ if (NULL != reg && NULL != reg -> name ) {
150+ if (reg -> name_prefix ) {
151+ janet_eprintf (" %s/%s" , reg -> name_prefix , reg -> name );
152+ } else {
153+ janet_eprintf (" %s" , reg -> name );
154+ }
155+ if (NULL != reg -> source_file ) {
156+ janet_eprintf (" [%s]" , reg -> source_file );
157+ }
158+ } else {
151159 janet_eprintf (" <cfunction>" );
160+ }
152161 }
153162 }
154163 if (frame -> flags & JANET_STACKFRAME_TAILCALL )
@@ -161,6 +170,11 @@ void janet_stacktrace(JanetFiber *fiber, Janet err) {
161170 } else {
162171 janet_eprintf (" pc=%d" , off );
163172 }
173+ } else if (NULL != reg ) {
174+ /* C Function */
175+ if (reg -> source_line > 0 ) {
176+ janet_eprintf (" on line %d" , (long ) reg -> source_line );
177+ }
164178 }
165179 janet_eprintf ("\n" );
166180 }
@@ -273,9 +287,20 @@ static Janet doframe(JanetStackFrame *frame) {
273287 } else {
274288 JanetCFunction cfun = (JanetCFunction )(frame -> pc );
275289 if (cfun ) {
276- Janet name = janet_table_get (janet_vm .registry , janet_wrap_cfunction (cfun ));
277- if (!janet_checktype (name , JANET_NIL )) {
278- janet_table_put (t , janet_ckeywordv ("name" ), name );
290+ JanetCFunRegistry * reg = janet_registry_get (cfun );
291+ if (NULL != reg -> name ) {
292+ if (NULL != reg -> name_prefix ) {
293+ janet_table_put (t , janet_ckeywordv ("name" ), janet_wrap_string (janet_formatc ("%s/%s" , reg -> name_prefix , reg -> name )));
294+ } else {
295+ janet_table_put (t , janet_ckeywordv ("name" ), janet_cstringv (reg -> name ));
296+ }
297+ if (NULL != reg -> source_file ) {
298+ janet_table_put (t , janet_ckeywordv ("source" ), janet_cstringv (reg -> source_file ));
299+ }
300+ if (reg -> source_line > 0 ) {
301+ janet_table_put (t , janet_ckeywordv ("source-line" ), janet_wrap_integer (reg -> source_line ));
302+ janet_table_put (t , janet_ckeywordv ("source-column" ), janet_wrap_integer (1 ));
303+ }
279304 }
280305 }
281306 janet_table_put (t , janet_ckeywordv ("c" ), janet_wrap_true ());
0 commit comments