shithub: sl

Download patch

ref: 05e66c8ffeea8c0b02d49acca753f44b65e4ad32
parent: 8a1512175fa175d1a725a3731eb820338aa3ea26
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Apr 8 13:38:53 EDT 2025

extend stack tracing to C builtins; include the entire stack trace, always

--- a/boot/sl.boot
+++ b/boot/sl.boot
@@ -269,14 +269,12 @@
   NIL NIL NIL NIL :from-end 3) identity #0# #fn("n10S;J;04AF0<51513500<:92<0=61:" #() find-if-)
   list-tail list-head reverse!) find-if)
             fits-i8 #fn("n10Y;3<0470r\xaf0r\xb063:" #(>=) fits-i8) fn-disasm
-            #fn("\x871000.///W1000J60q?14z282JG07001E534715047260:@30q482<2305124051II252687>1?:5142527187>2?;514E288851b<I8<<8=L23\x8a24292:888<>2q7;53E8<<L23907150@30q4E87K~2<|48<8<<KM_48>2=8?2>523[08;8>8<<r45348:897?888<<52G5148<8<<r4M_@\x1912=8?2@523V08;8>8<<K5348:89888<<GG5148<8<<KM_@\xea12=8?2A523e08;8>8<<K5347B2C888<<G8>2DC70r3@30EM515148<8<<KM_@\xac12=8?2E523\\08;8>8<<r45347B2C7?888<<52515148<8<<r4M_@w12=8?2F523\xb808;8>8<<r88>2GC70r4@30EM5347B2C7?888<<52512H5248<8<<r4M_47B2C7?888<<52515148<8<<r4M_48>2GCY07B2H5147B2C7?888<<52512H5248<8<<r4M_@30q@\xe608?2Ic3^08;8>8<<r45347B2C7?888<<52512H5248<8<<r4M_@\xb202=8?2J523b08;8>8<<r25347B2K7L8<<7M888<<52M515248<8<<r2M_@w02=8?2N523b08;8>8<<r45347B2K7L8<<7?888<<52M515248<8<<r4M_@<08;8>8<<E53^1^1@\xd0-:" #(fn-disasm
-  newline void #fn(fn-code) #fn(fn-vals) #1# #fn("n10\\3F00[JA070504710qAKM63:72061:" #(newline
-                                                                                        fn-disasm
-                                                                                        print) print-val)
-  #fn("n370A3U0FEl23N071A72151523A0A182ML237023@4024751K~512602765:" #(princ >= 1- " >" "  " hex5
-                                                                       ":  " " ") print-inst)
-  #fn(length) #fn(table-foldl) #fn("n382;J@041AF<Gl2;34040:") Instructions #fn("n1702161:" #(princ
-  "\t")) #fn(memq) (loadv.l loadg.l setg.l) ref-s32-LE (loadv loadg setg)
+            #fn("\x871000.///W1000J60q?14z20[3:07060:@30q482JG07101E534725047060:@30q482<2305124051II252687>1?:5142527187>2?;514E288851b<I8<<8=L23\x8a24292:888<>2q7;53E8<<L23907250@30q4E87K~2<|48<8<<KM_48>2=8?2>523[08;8>8<<r45348:897?888<<52G5148<8<<r4M_@\x1912=8?2@523V08;8>8<<K5348:89888<<GG5148<8<<KM_@\xea12=8?2A523e08;8>8<<K5347B2C888<<G8>2DC70r3@30EM515148<8<<KM_@\xac12=8?2E523\\08;8>8<<r45347B2C7?888<<52515148<8<<r4M_@w12=8?2F523\xb808;8>8<<r88>2GC70r4@30EM5347B2C7?888<<52512H5248<8<<r4M_47B2C7?888<<52515148<8<<r4M_48>2GCY07B2H5147B2C7?888<<52512H5248<8<<r4M_@30q@\xe608?2Ic3^08;8>8<<r45347B2C7?888<<52512H5248<8<<r4M_@\xb202=8?2J523b08;8>8<<r25347B2K7L8<<7M888<<52M515248<8<<r2M_@w02=8?2N523b08;8>8<<r45347B2K7L8<<7?888<<52M515248<8<<r4M_@<08;8>8<<E53^1^1@\xd0-:" #(void
+  fn-disasm newline #fn(fn-code) #fn(fn-vals) #1# #fn("n10\\3F00[JA070504710qAKM63:72061:" #(newline
+  fn-disasm print) print-val) #fn("n370A3U0FEl23N071A72151523A0A182ML237023@4024751K~512602765:" #(princ
+  >= 1- " >" "  " hex5 ":  " " ") print-inst) #fn(length)
+  #fn(table-foldl) #fn("n382;J@041AF<Gl2;34040:") Instructions #fn("n1702161:" #(princ "\t"))
+  #fn(memq) (loadv.l loadg.l setg.l) ref-s32-LE (loadv loadg setg)
   (loada seta loadc call tcall list + - * / < = vec argc vargc loadi8 apply tapply closure box
    shift aref) princ #fn(num->str) aref (loada.l seta.l loadc.l argc.l vargc.l call.l tcall.l box.l)
   (optargs keyargs) keyargs " " brbound (jmp brne brnn brn) "@" hex5 ref-s16-LE (jmp.l brne.l
@@ -390,7 +388,7 @@
   length= princ "type error: expected " ", got " #fn(typeof) caddr ": " print bounds-error "index "
   " out of bounds for " unbound-error "eval: variable " " has no value" error "error: " load-error
   print-exception "in file " list? #fn(str?) "*** Unhandled exception: " *linefeed*) print-exception)
-            print-stack-trace #fn("n1IIb5b620852185>1_51420862285>1_51473740r3523F075076370r5@40r452@300517778292:2;505252Eb92<2=868889>38762:" #(#0#
+            print-stack-trace #fn("n1IIb5b620852185>1_51420862285>1_5147374252627505252Eb82829868788>37:05162:" #(#0#
   #fn("n32005182P2105121151C?022232487e361:25051E76278851512888A187>4|:" #(#fn(fn-name)
                                                                            #fn(fn-code)
                                                                            #fn(raise) thrown-value
@@ -397,13 +395,14 @@
                                                                            ffound #fn(fn-vals) 1-
                                                                            #fn(length)
                                                                            #fn("n170A0G513>0F<A0G929363:q:" #(closure?))) find-in-f)
-  #fn("n220A01>321{863E0722374758651522662:27:" #(#fn("n02021AF>292524q:" #(#fn(for-each)
-                                                                            #fn("n1A<0Fq63:")))
-                                                  #fn("n10B3F00<20C?00T21C8072061:23061:" #(thrown-value
-  ffound caddr #fn(raise))) str-join #fn(map) str reverse! "/" "λ") fname) reverse! length>
-  list-tail *interactive* filter closure? #fn(map) #fn("n10Z;380420061:" #(#fn(top-level-value)))
+  #fn("n220A01>321{863E0722374758651522662:0[38027061:28:" #(#fn("n02021AF>292524q:" #(#fn(for-each)
+                                                                                       #fn("n1A<0Fq63:")))
+                                                             #fn("n10B3F00<20C?00T21C8072061:23061:" #(thrown-value
+  ffound caddr #fn(raise))) str-join #fn(map) str reverse! "/" #fn(fn-name) "λ") fname) filter
+  closure? #fn(map) #fn("n10Z;380420061:" #(#fn(top-level-value)))
   #fn(environment) #fn(for-each) #fn("n17021A<0KGF52524222374051==52470257652492<El23?0770KG0EG52@30q49292<KM_:" #(princ
-  "(" #fn(for-each) #fn("n1702151472061:" #(princ " " print)) vec->list ")" *linefeed* fn-disasm))) print-stack-trace)
+  "(" #fn(for-each) #fn("n1702151472061:" #(princ " " print)) vec->list ")" *linefeed* fn-disasm))
+  reverse!) print-stack-trace)
             print-to-str #fn("z02050212285>10524238561:" #(#fn(buffer)
                                                            #fn(for-each)
                                                            #fn("n1200A62:" #(#fn(write)))
--- a/src/compiler.sl
+++ b/src/compiler.sl
@@ -762,6 +762,8 @@
   (str-lpad (num->str n 16) 5 #\0))
 
 (def (fn-disasm f (ip NIL) . lev?)
+  (when (builtin? f)
+    (return (void)))
   (when (not lev?)
     (fn-disasm f ip 0)
     (newline)
--- a/src/sl.c
+++ b/src/sl.c
@@ -916,10 +916,14 @@
 		int sz = top[-2]+1;
 		sl_v *bp = top-4-sz;
 		sl_v fn = bp[0];
-		const u8int *ip0 = cvalue_data(fn_bcode(fn));
-		intptr ip = ip1 - ip0 - 1; /* -1: ip1 is *after* the one that was being executed */
 		sl_v v = alloc_vec(sz+1, 0);
-		vec_elt(v, 0) = fixnum(ip);
+		if(iscbuiltin(fn))
+			vec_elt(v, 0) = fn;
+		else{
+			/* -1: ip1 is *after* the one that was being executed */
+			intptr ip = ip1 - (const u8int*)cvalue_data(fn_bcode(fn)) - 1;
+			vec_elt(v, 0) = fixnum(ip);
+		}
 		vec_elt(v, 1) = fn;
 		for(int i = 1; i < sz; i++){
 			sl_v si = bp[i];
@@ -997,6 +1001,8 @@
 {
 	argcount(nargs, 1);
 	sl_v v = args[0];
+	if(sl_unlikely(iscbuiltin(v)))
+		return v;
 	if(sl_unlikely(!isfn(v)))
 		type_error("fn", v);
 	return fn_bcode(v);
@@ -1007,6 +1013,8 @@
 {
 	argcount(nargs, 1);
 	sl_v v = args[0];
+	if(sl_unlikely(iscbuiltin(v)))
+		return sl_emptyvec;
 	if(sl_unlikely(!isfn(v)))
 		type_error("fn", v);
 	return fn_vals(v);
@@ -1017,6 +1025,8 @@
 {
 	argcount(nargs, 1);
 	sl_v v = args[0];
+	if(sl_unlikely(iscbuiltin(v)))
+		return sl_nil;
 	if(sl_unlikely(!isfn(v)))
 		type_error("fn", v);
 	return fn_env(v);
--- a/src/system.sl
+++ b/src/system.sl
@@ -1395,7 +1395,8 @@
 (def (print-stack-trace st)
   (def (find-in-f f tgt path)
     (let ((path (cons (fn-name f) path)))
-      (if (eq? (fn-code f) (fn-code tgt))
+      (if (eq? (fn-code f)
+               (fn-code tgt))
           (throw 'ffound path)
           (let ((v (fn-vals f)))
             (for 0 (1- (length v))
@@ -1410,11 +1411,8 @@
                       NIL))))
       (if p
           (str-join (map str (reverse! p)) "/")
-          "λ")))
-  (let ((st (reverse! (if (length> st 3)
-                          (list-tail st (if *interactive* 5 4))
-                          st)))
-        (e (filter closure? (map (λ (s) (and (bound? s)
+          (if (builtin? f) (fn-name f) "λ"))))
+  (let ((e (filter closure? (map (λ (s) (and (bound? s)
                                              (top-level-value s)))
                                  (environment))))
         (n 0))
@@ -1427,7 +1425,7 @@
        (when (= n 0)
          (fn-disasm (aref f 1) (aref f 0)))
        (set! n (+ n 1)))
-     st)))
+     (reverse! st))))
 
 (def (print-exception e)
   (cond ((and (cons? e)
--- a/src/vm.h
+++ b/src/vm.h
@@ -86,9 +86,20 @@
 #endif
 		}
 	}else if(sl_likely(iscbuiltin(v))){
+		bp = sp-nargs;
+		*sp++ = sl_nil; // fn->env;
+		*sp++ = (sl_v)sl.curr_frame;
+		*sp++ = n;
+		*sp++ = v; // ip
+		sl.curr_frame = sp;
 		sl.sp = sp;
-		sp -= n;
-		sp[-1] = ((sl_cv*)ptr(v))->cbuiltin(sp, n);
+		v = ((sl_cv*)ptr(v))->cbuiltin(sp-n-4, n);
+		sp = sl.curr_frame;
+		sl.curr_frame = (sl_v*)sp[-3];
+		sp -= 4+n;
+		n = sl.curr_frame[-2];
+		bp = sl.curr_frame - 4 - n;
+		sp[-1] = v;
 		NEXT_OP;
 	}
 	sl.sp = sp;
--