From e0e05f5f5ad2d1f4a3c1ff9e9191b5432e8f30b3 Mon Sep 17 00:00:00 2001
From: Martin Stjernholm <mast@lysator.liu.se>
Date: Thu, 23 Mar 2000 21:05:09 +0100
Subject: [PATCH] More robustness against objects with broken _sprintf() when
 formatting a backtrace.

Rev: lib/master.pike.in:1.104
---
 lib/master.pike.in | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)

diff --git a/lib/master.pike.in b/lib/master.pike.in
index 23c375c811..8d1184b689 100644
--- a/lib/master.pike.in
+++ b/lib/master.pike.in
@@ -1,6 +1,6 @@
 /* -*- Pike -*-
  *	
- * $Id: master.pike.in,v 1.103 2000/03/20 05:18:21 mast Exp $
+ * $Id: master.pike.in,v 1.104 2000/03/23 20:05:09 mast Exp $
  * 
  * Master-file for Pike.
  *
@@ -1273,7 +1273,10 @@ int canclip=0;
 // FIXME
 string stupid_describe(mixed m, int maxlen)
 {
-  switch(string typ=sprintf("%t",m))
+  string typ;
+  if (catch (typ=sprintf("%t",m)))
+    typ = "object";		// Object with a broken _sprintf(), probably.
+  switch(typ)
   {
     case "int":
     case "float":
@@ -1433,17 +1436,7 @@ string describe_object(object o)
 {
   string s;
   if(!o) return 0;
-  /*
-  // This seems broken. Maybe objects should be programs here, but
-  // that's essentially what the call to describe_program() below
-  // does. /mast
-  if(s=search(objects,object_program(o)))
-  {
-    if(sscanf(reverse(s),"%s.%s",string ext,string rest) && ext=="domp")
-      return EXPLODE_PATH(reverse(rest))[-1];
-    return s;
-  }
-  */
+  if (!catch(s=sprintf("%O",o)) && stringp(s)) return s;
   if(( s=describe_program(object_program(o)) ))
     return s+"()";
   return 0;
@@ -1576,7 +1569,8 @@ string describe_backtrace(mixed trace, void|int linewidth)
 	else
 	{
 	  if (tmp) {
-	    row = sprintf("%O", tmp);
+	    if (catch (row = sprintf("%O", tmp)))
+	      row = describe_program(object_program(tmp)) + " with broken _sprintf()";
 	  } else {
 	    row = "Destructed object";
 	  }
-- 
GitLab