Added simple JavaScript call tracing. Very useful for
authorrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 7 Oct 2004 21:30:47 +0000 (21:30 +0000)
committerrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 7 Oct 2004 21:30:47 +0000 (21:30 +0000)
        debugging complex pages.

Tracing is only available in development builds and is
enabled by:

(gdb) set traceJavaScript = 1

or programatically

setTraceJavaScript(true)

Function, args, and return values are printed to console.  Very
verbose.

        Reviewed by Ken.

        * kjs/function_object.cpp:
        (FunctionProtoFuncImp::call):
        * kjs/object.cpp:
        (KJS::Object::call):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@7786 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/function_object.cpp
JavaScriptCore/kjs/object.cpp

index bda1bfa43892cd97058ce6b3156f4ba375d79cca..c4d371481014019d22d7fb39a063c46ba66d2eee 100644 (file)
@@ -1,3 +1,27 @@
+2004-10-07  Richard Williamson   <rjw@apple.com>
+
+       Added simple JavaScript call tracing.  Very useful for
+        debugging complex pages.
+
+       Tracing is only available in development builds and is
+       enabled by:
+
+       (gdb) set traceJavaScript = 1
+
+       or programatically
+
+       setTraceJavaScript(true)
+
+       Function, args, and return values are printed to console.  Very
+       verbose.
+
+        Reviewed by Ken.
+
+        * kjs/function_object.cpp:
+        (FunctionProtoFuncImp::call):
+        * kjs/object.cpp:
+        (KJS::Object::call):
+
 === Safari-166 ===
 
 2004-10-05  Richard Williamson   <rjw@apple.com>
index 4e227b15772a073222909c82fcd2b5fcc4d291f5..cad7de3ffdb72169347124f6932857c6d4516299 100644 (file)
@@ -105,7 +105,7 @@ Value FunctionProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &a
       result = String("function " + static_cast<FunctionImp*>(thisObj.imp())->name().ustring() + "()");
     }
     else {
-      result = String("(Internal function)");
+      result = String("(Internal Function)");
     }
     }
     break;
index b09acfc3cfa288b36b89dcffe0d9c63eaebfd1db..780ff27807611feaf438ad19e3bb17797a696383 100644 (file)
 #include "error_object.h"
 #include "nodes.h"
 
+#ifndef NDEBUG
+#define JAVASCRIPT_CALL_TRACING Yes
+#endif
+
+#ifdef JAVASCRIPT_CALL_TRACING
+static bool traceJavaScript = false;
+
+extern "C" {
+    void setTraceJavaScript(bool f)
+    {
+        traceJavaScript = f;
+    }
+
+    static bool traceJavaScript()
+    {
+        return traceJavaScript;
+    }
+}
+#endif
+
 namespace KJS {
 
 // ------------------------------ Object ---------------------------------------
@@ -56,6 +76,23 @@ Value Object::call(ExecState *exec, Object &thisObj, const List &args)
 { 
 #if KJS_MAX_STACK > 0
   static int depth = 0; // sum of all concurrent interpreters
+
+#ifdef JAVASCRIPT_CALL_TRACING
+    static bool tracing = false;
+    if (javaScriptTrace() && !tracing) {
+        tracing = true;
+        for (int i = 0; i < depth; i++)
+            putchar (' ');
+        printf ("*** calling:  %s\n", toString(exec).ascii());
+        for (int j = 0; j < args.size(); j++) {
+            for (int i = 0; i < depth; i++)
+                putchar (' ');
+            printf ("*** arg[%d] = %s\n", j, args[j].toString(exec).ascii());
+        }
+        tracing = false;
+    }
+#endif
+
   if (++depth > KJS_MAX_STACK) {
     --depth;
     Object err = Error::create(exec, RangeError,
@@ -71,6 +108,16 @@ Value Object::call(ExecState *exec, Object &thisObj, const List &args)
   --depth;
 #endif
 
+#ifdef JAVASCRIPT_CALL_TRACING
+    if (javaScriptTrace() && !tracing) {
+        tracing = true;
+        for (int i = 0; i < depth; i++)
+            putchar (' ');
+        printf ("*** returning:  %s\n", ret.toString(exec).ascii());
+        tracing = false;
+    }
+#endif
+
   return ret;
 }