From 2602b85a03b377910d85f2ecf81e9abb83d5b290 Mon Sep 17 00:00:00 2001
From: Martin Stjernholm <mast@lysator.liu.se>
Date: Tue, 29 Aug 2000 23:54:01 +0200
Subject: [PATCH] Broke apart the describer functions a bit to make it easier
 to overload.

Rev: lib/master.pike.in:1.128
---
 lib/master.pike.in | 150 ++++++++++++++++++++++++++-------------------
 1 file changed, 86 insertions(+), 64 deletions(-)

diff --git a/lib/master.pike.in b/lib/master.pike.in
index 06be952dfc..7bb348b625 100644
--- a/lib/master.pike.in
+++ b/lib/master.pike.in
@@ -1,6 +1,6 @@
 /* -*- Pike -*-
  *	
- * $Id: master.pike.in,v 1.127 2000/08/29 14:46:36 mast Exp $
+ * $Id: master.pike.in,v 1.128 2000/08/29 21:54:01 mast Exp $
  * 
  * Master-file for Pike.
  *
@@ -1420,10 +1420,58 @@ class Describer
 	foreach (indices (stuff), mixed elem)
 	  identify_parts (elem), identify_parts (stuff[elem]);
     }
-    else if (objectp (stuff))
+    else if (objectp (stuff) || functionp (stuff) || programp (stuff))
       ident[stuff]++;
   }
 
+  string describe_string (string m, int maxlen)
+  {
+    canclip++;
+    if(sizeof(m) < maxlen)
+    {
+      string t = sprintf("%O", m);
+      if (sizeof(t) < (maxlen + 2)) {
+	return t;
+      }
+      t = 0;
+    }
+    clipped++;
+    if(maxlen>10)
+    {
+      return sprintf("%O+[%d]",m[..maxlen-5],sizeof(m)-(maxlen-5));
+    }else{
+      return "string["+sizeof(m)+"]";
+    }
+  }
+
+  string describe_array (array m, int maxlen)
+  {
+    if(!sizeof(m)) return "({})";
+    else {
+      if(maxlen<5)
+      {
+	clipped++;
+	return "array["+sizeof(m)+"]";
+      }
+      else {
+	canclip++;
+	return "({" + describe_comma_list(m,maxlen-2) +"})";
+      }
+    }
+  }
+
+  string describe_mapping (mapping m, int maxlen)
+  {
+    if(!sizeof(m)) return "([])";
+    else return "mapping["+sizeof(m)+"]";
+  }
+
+  string describe_multiset (multiset m, int maxlen)
+  {
+    if(!sizeof(m)) return "(<>)";
+    else return "multiset["+sizeof(m)+"]";
+  }
+
   string describe (mixed m, int maxlen)
   {
     if (stringp (ident[m])) return ident[m];
@@ -1438,76 +1486,32 @@ class Describer
       case "int":
       case "float":
 	return (string)m;
-      
       case "string":
-	canclip++;
-	if(sizeof(m) < maxlen)
-	{
-	  string t = sprintf("%O", m);
-	  if (sizeof(t) < (maxlen + 2)) {
-	    return t;
-	  }
-	  t = 0;
-	}
-	clipped++;
-	if(maxlen>10)
-	{
-	  return sprintf("%O+[%d]",m[..maxlen-5],sizeof(m)-(maxlen-5));
-	}else{
-	  return "string["+sizeof(m)+"]";
-	}
-      
+	return describe_string (m, maxlen);
       case "array":
-	if(!sizeof(m)) res = "({})";
-	else {
-	  if(maxlen<5)
-	  {
-	    clipped++;
-	    res = "array["+sizeof(m)+"]";
-	  }
-	  else {
-	    canclip++;
-	    res = "({" + describe_comma_list(m,maxlen-2) +"})";
-	  }
-	}
+	res = describe_array (m, maxlen);
 	break;
-      
       case "mapping":
-	if(!sizeof(m)) res = "([])";
-	else res = "mapping["+sizeof(m)+"]";
+	res = describe_mapping (m, maxlen);
 	break;
-      
       case "multiset":
-	if(!sizeof(m)) res = "(<>)";
-	else res = "multiset["+sizeof(m)+"]";
+	res = describe_multiset (m, maxlen);
 	break;
-      
       case "function":
-	if(string tmp=describe_program(m)) return tmp;
-	if(object o=function_object(m)) {
-	  string s = describe_object(o);
-	  if (s && s != "object") return s+"->"+function_name(m);
-	  else return function_name(m);
-	}
-	else {
-	  string tmp;
-	  if (catch (tmp = function_name(m)))
-	    // The function object has probably been destructed.
-	    return "function";
-	  return tmp || "function";
-	}
-
+	if (string tmp=describe_function(m)) res = tmp;
+	else res = typ;
+	break;
       case "program":
-	if(string tmp=describe_program(m)) return tmp;
-	return typ;
-
+	if(string tmp=describe_program(m)) res = tmp;
+	else res = typ;
+	break;
       default:
 	if (objectp(m))
 	  if(string tmp=describe_object(m)) {
 	    res = tmp;
 	    break;
 	  }
-	return typ;
+	res = typ;
     }
 
     if (stringp (ident[m]))
@@ -1644,6 +1648,30 @@ string describe_program(program p)
   return 0;
 }
 
+string describe_function (function f)
+{
+  if (!f) return 0;
+
+  string name;
+
+  if(string s=search(programs,f))
+  {
+    if(sscanf(reverse(s),"%s.%s",string ext,string rest) && ext=="domp")
+      name = EXPLODE_PATH(reverse(rest))[-1];
+    else
+      name = trim_file_name(s);
+  }
+  else
+    if (catch (name = function_name (f))) name = "function";
+
+  if(object o=function_object(f)) {
+    string s;
+    if (!catch (s = sprintf("%O",o)) && s != "object")
+      return s+"->"+name;
+  }
+  return name;
+}
+
 /* It is possible that this should be a real efun,
  * it is currently used by handle_error to convert a backtrace to a
  * readable message.
@@ -1728,13 +1756,7 @@ string describe_backtrace(mixed trace, void|int linewidth)
 	  if(sizeof(tmp)>=3)
 	  {
 	    if(functionp(tmp[2])) {
-	      data = "";
-	      if (object o = function_object(tmp[2])) {
-		string s;
-		if (!catch (s = sprintf("%O",o)) && s != "object")
-		  data = s + "->";
-	      }
-	      data += function_name(tmp[2]);
+	      data = describe_function (tmp[2]);
 	    }
 	    else if (stringp(tmp[2])) {
 	      data= tmp[2];
-- 
GitLab