Changes by Michael Kahl, reviewed by me.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Jul 2005 23:10:48 +0000 (23:10 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Jul 2005 23:10:48 +0000 (23:10 +0000)
- fixed <rdar://problem/4194278> Need better debugging support in JavaScriptCore

        * JavaScriptCore.xcodeproj/project.pbxproj:
        * kjs/debugger.cpp:
        (KJS::AttachedInterpreter::AttachedInterpreter):
        (KJS::AttachedInterpreter::~AttachedInterpreter):
        (Debugger::~Debugger):
        (Debugger::attach):
        (Debugger::detach):
        (Debugger::sourceParsed):
        * kjs/debugger.h:
        * kjs/function.cpp:
        (KJS::FunctionImp::call):
        (KJS::GlobalFuncImp::call):
        * kjs/function_object.cpp:
        (FunctionObjectImp::construct):
        * kjs/grammar.y:
        * kjs/internal.cpp:
        (Parser::parse):
        (InterpreterImp::evaluate):
        * kjs/internal.h:
        (KJS::InterpreterImp::setDebugger):
        * kjs/interpreter.cpp:
        * kjs/interpreter.h:
        (KJS::Interpreter::imp):
        * kjs/nodes.cpp:

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

12 files changed:
JavaScriptCore/ChangeLog
JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
JavaScriptCore/kjs/debugger.cpp
JavaScriptCore/kjs/debugger.h
JavaScriptCore/kjs/function.cpp
JavaScriptCore/kjs/function_object.cpp
JavaScriptCore/kjs/grammar.y
JavaScriptCore/kjs/internal.cpp
JavaScriptCore/kjs/internal.h
JavaScriptCore/kjs/interpreter.cpp
JavaScriptCore/kjs/interpreter.h
JavaScriptCore/kjs/nodes.cpp

index e877dbc51a4dbf491a7175b3243b39acb6b1fd0e..fb888cd37d10993a4baed14ea7180848e50406d8 100644 (file)
@@ -1,3 +1,34 @@
+2005-07-27  Maciej Stachowiak  <mjs@apple.com>
+
+        Changes by Michael Kahl, reviewed by me.
+
+       - fixed <rdar://problem/4194278> Need better debugging support in JavaScriptCore
+       
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * kjs/debugger.cpp:
+        (KJS::AttachedInterpreter::AttachedInterpreter):
+        (KJS::AttachedInterpreter::~AttachedInterpreter):
+        (Debugger::~Debugger):
+        (Debugger::attach):
+        (Debugger::detach):
+        (Debugger::sourceParsed):
+        * kjs/debugger.h:
+        * kjs/function.cpp:
+        (KJS::FunctionImp::call):
+        (KJS::GlobalFuncImp::call):
+        * kjs/function_object.cpp:
+        (FunctionObjectImp::construct):
+        * kjs/grammar.y:
+        * kjs/internal.cpp:
+        (Parser::parse):
+        (InterpreterImp::evaluate):
+        * kjs/internal.h:
+        (KJS::InterpreterImp::setDebugger):
+        * kjs/interpreter.cpp:
+        * kjs/interpreter.h:
+        (KJS::Interpreter::imp):
+        * kjs/nodes.cpp:
+
 2005-07-27  Geoffrey Garen  <ggaren@apple.com>
 
         - fixed http://bugzilla.opendarwin.org/show_bug.cgi?id=3381
index 1c7de0b03201ebdb5262d5dc3bc4663066ed92f8..da4198e030013d967f4a32ef8e7036e280cd6f73 100644 (file)
@@ -28,7 +28,7 @@
                932F5B400822A1C700736975 /* array_object.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A84E0255597D01FF60F7 /* array_object.h */; settings = {ATTRIBUTES = (Private, ); }; };
                932F5B420822A1C700736975 /* collector.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A8530255597D01FF60F7 /* collector.h */; settings = {ATTRIBUTES = (Private, ); }; };
                932F5B430822A1C700736975 /* date_object.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A8560255597D01FF60F7 /* date_object.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               932F5B450822A1C700736975 /* debugger.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A8590255597D01FF60F7 /* debugger.h */; };
+               932F5B450822A1C700736975 /* debugger.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A8590255597D01FF60F7 /* debugger.h */; settings = {ATTRIBUTES = (Private, ); }; };
                932F5B460822A1C700736975 /* error_object.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A85B0255597D01FF60F7 /* error_object.h */; settings = {ATTRIBUTES = (Private, ); }; };
                932F5B470822A1C700736975 /* function_object.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A85D0255597D01FF60F7 /* function_object.h */; settings = {ATTRIBUTES = (Private, ); }; };
                932F5B480822A1C700736975 /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A85F0255597D01FF60F7 /* function.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -56,7 +56,7 @@
                932F5B640822A1C700736975 /* reference.h in Headers */ = {isa = PBXBuildFile; fileRef = F5341391030CEEB1018BE7F3 /* reference.h */; settings = {ATTRIBUTES = (Private, ); }; };
                932F5B650822A1C700736975 /* completion.h in Headers */ = {isa = PBXBuildFile; fileRef = F5BB2BC5030F772101FCFE1D /* completion.h */; settings = {ATTRIBUTES = (Private, ); }; };
                932F5B660822A1C700736975 /* identifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 933A349A038AE7C6008635CE /* identifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               932F5B670822A1C700736975 /* array_instance.h in Headers */ = {isa = PBXBuildFile; fileRef = 938772E5038BFE19008635CE /* array_instance.h */; };
+               932F5B670822A1C700736975 /* array_instance.h in Headers */ = {isa = PBXBuildFile; fileRef = 938772E5038BFE19008635CE /* array_instance.h */; settings = {ATTRIBUTES = (Private, ); }; };
                932F5B680822A1C700736975 /* scope_chain.h in Headers */ = {isa = PBXBuildFile; fileRef = 9374D3A7038D9D74008635CE /* scope_chain.h */; settings = {ATTRIBUTES = (Private, ); }; };
                932F5B690822A1C700736975 /* context.h in Headers */ = {isa = PBXBuildFile; fileRef = 9373524E038DA8C2008635CE /* context.h */; settings = {ATTRIBUTES = (Private, ); }; };
                932F5B6A0822A1C700736975 /* list.h in Headers */ = {isa = PBXBuildFile; fileRef = 931C6CEF038EE8DE008635CE /* list.h */; settings = {ATTRIBUTES = (Private, ); }; };
                A85D81F8087B2822006A9172 /* array_object.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A84E0255597D01FF60F7 /* array_object.h */; settings = {ATTRIBUTES = (Private, ); }; };
                A85D81F9087B2822006A9172 /* collector.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A8530255597D01FF60F7 /* collector.h */; settings = {ATTRIBUTES = (Private, ); }; };
                A85D81FA087B2822006A9172 /* date_object.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A8560255597D01FF60F7 /* date_object.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               A85D81FB087B2822006A9172 /* debugger.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A8590255597D01FF60F7 /* debugger.h */; };
+               A85D81FB087B2822006A9172 /* debugger.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A8590255597D01FF60F7 /* debugger.h */; settings = {ATTRIBUTES = (Private, ); }; };
                A85D81FC087B2822006A9172 /* error_object.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A85B0255597D01FF60F7 /* error_object.h */; settings = {ATTRIBUTES = (Private, ); }; };
                A85D81FD087B2822006A9172 /* function_object.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A85D0255597D01FF60F7 /* function_object.h */; settings = {ATTRIBUTES = (Private, ); }; };
                A85D81FE087B2822006A9172 /* function.h in Headers */ = {isa = PBXBuildFile; fileRef = F692A85F0255597D01FF60F7 /* function.h */; settings = {ATTRIBUTES = (Private, ); }; };
                A85D8214087B2822006A9172 /* reference.h in Headers */ = {isa = PBXBuildFile; fileRef = F5341391030CEEB1018BE7F3 /* reference.h */; settings = {ATTRIBUTES = (Private, ); }; };
                A85D8215087B2822006A9172 /* completion.h in Headers */ = {isa = PBXBuildFile; fileRef = F5BB2BC5030F772101FCFE1D /* completion.h */; settings = {ATTRIBUTES = (Private, ); }; };
                A85D8216087B2822006A9172 /* identifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 933A349A038AE7C6008635CE /* identifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               A85D8217087B2822006A9172 /* array_instance.h in Headers */ = {isa = PBXBuildFile; fileRef = 938772E5038BFE19008635CE /* array_instance.h */; };
+               A85D8217087B2822006A9172 /* array_instance.h in Headers */ = {isa = PBXBuildFile; fileRef = 938772E5038BFE19008635CE /* array_instance.h */; settings = {ATTRIBUTES = (Private, ); }; };
                A85D8218087B2822006A9172 /* scope_chain.h in Headers */ = {isa = PBXBuildFile; fileRef = 9374D3A7038D9D74008635CE /* scope_chain.h */; settings = {ATTRIBUTES = (Private, ); }; };
                A85D8219087B2822006A9172 /* context.h in Headers */ = {isa = PBXBuildFile; fileRef = 9373524E038DA8C2008635CE /* context.h */; settings = {ATTRIBUTES = (Private, ); }; };
                A85D821A087B2822006A9172 /* list.h in Headers */ = {isa = PBXBuildFile; fileRef = 931C6CEF038EE8DE008635CE /* list.h */; settings = {ATTRIBUTES = (Private, ); }; };
index 739ef5a8e9c6696269a574a59c00b09fd41830d3..b18da3758d2d14972cb81d1b75d562e4d46f9bbf 100644 (file)
@@ -36,13 +36,16 @@ namespace KJS {
   struct AttachedInterpreter
   {
   public:
-    AttachedInterpreter(Interpreter *i) : interp(i) {}
+    AttachedInterpreter(Interpreter *i, AttachedInterpreter *ai) : interp(i), next(ai) { ++Debugger::debuggersPresent; }
+    ~AttachedInterpreter() { --Debugger::debuggersPresent; }
     Interpreter *interp;
     AttachedInterpreter *next;
   };
 
 }
 
+int Debugger::debuggersPresent = 0;
+
 Debugger::Debugger()
 {
   rep = new DebuggerImp();
@@ -50,53 +53,42 @@ Debugger::Debugger()
 
 Debugger::~Debugger()
 {
-  // detach from all interpreters
-  while (rep->interps)
-    detach(rep->interps->interp);
-
+  detach(0);
   delete rep;
 }
 
 void Debugger::attach(Interpreter *interp)
 {
-  if (interp->imp()->debugger() != this)
-    interp->imp()->setDebugger(this);
-
-  // add to the list of attached interpreters
-  if (!rep->interps)
-    rep->interps = new AttachedInterpreter(interp);
-  else {
-    AttachedInterpreter *ai = rep->interps;
-    while (ai->next)
-      ai = ai->next;
-    ai->next = new AttachedInterpreter(interp);;
-  }
+  Debugger *other = interp->imp()->debugger();
+  if (other == this)
+    return;
+  if (other)
+    other->detach(interp);
+  interp->imp()->setDebugger(this);
+  rep->interps = new AttachedInterpreter(interp, rep->interps);
 }
 
 void Debugger::detach(Interpreter *interp)
 {
-  if (interp->imp()->debugger() == this)
-    interp->imp()->setDebugger(this);
-
-  // remove from the list of attached interpreters
-  if (rep->interps->interp == interp) {
-    AttachedInterpreter *old = rep->interps;
-    rep->interps = rep->interps->next;
-    delete old;
-  }
-
-  AttachedInterpreter *ai = rep->interps;
-  while (ai->next && ai->next->interp != interp)
-    ai = ai->next;
-  if (ai->next) {
-    AttachedInterpreter *old = ai->next;
-    ai->next = ai->next->next;
-    delete old;
+  if (interp && interp->imp()->debugger() == this)
+    interp->imp()->setDebugger(0);
+
+  // iterate the addresses where AttachedInterpreter pointers are stored
+  // so we can unlink items from the list
+  AttachedInterpreter **p = &rep->interps;
+  AttachedInterpreter *q;
+  while ((q = *p)) {
+    if (!interp || q->interp == interp) {
+      *p = q->next;
+      delete q;
+    } else {
+      p = &q->next;
+    }
   }
 }
 
-bool Debugger::sourceParsed(ExecState */*exec*/, int /*sourceId*/,
-                            const UString &/*source*/, int /*errorLine*/)
+bool Debugger::sourceParsed(ExecState */*exec*/, int /*sourceId*/, const UString &/*sourceURL*/, 
+                           const UString &/*source*/, int /*errorLine*/)
 {
   return true;
 }
index a5998ff738b3467e38fd1e0f342c346ad6c73a0f..2992bd3c45d72ad74c47c7cdddf359846ec59043 100644 (file)
@@ -101,13 +101,14 @@ namespace KJS {
      * @param exec The current execution state
      * @param sourceId The ID of the source code (corresponds to the
      * sourceId supplied in other functions such as atStatement()
+     * @param sourceURL Where the source code that was parsed came from
      * @param source The source code that was parsed
      * @param errorLine The line number at which parsing encountered an
      * error, or -1 if the source code was valid and parsed successfully
      * @return true if execution should be continue, false if it should
      * be aborted
      */
-    virtual bool sourceParsed(ExecState *exec, int sourceId,
+    virtual bool sourceParsed(ExecState *exec, int sourceId, const UString &sourceURL,
                              const UString &source, int errorLine);
 
     /**
@@ -205,6 +206,9 @@ namespace KJS {
 
   private:
     DebuggerImp *rep;
+
+  public:
+    static int debuggersPresent;
   };
 
 };
index 6b0c8fa994fd13bd1243a1dd3754e37897ce64e0..c20caddf4f3e81d174a39c9d6f7b134c4638e556 100644 (file)
@@ -77,6 +77,17 @@ Value FunctionImp::call(ExecState *exec, Object &thisObj, const List &args)
 {
   Object &globalObj = exec->dynamicInterpreter()->globalObject();
 
+  // enter a new execution context
+  ContextImp ctx(globalObj, exec->dynamicInterpreter()->imp(), thisObj, codeType(),
+                 exec->context().imp(), this, &args);
+  ExecState newExec(exec->dynamicInterpreter(), &ctx);
+  newExec.setException(exec->exception()); // could be null
+
+  // assign user supplied arguments to parameters
+  processParameters(&newExec, args);
+  // add variable declarations (initialized to undefined)
+  processVarDecls(&newExec);
+
   Debugger *dbg = exec->dynamicInterpreter()->imp()->debugger();
   int sid = -1;
   int lineno = -1;
@@ -87,29 +98,18 @@ Value FunctionImp::call(ExecState *exec, Object &thisObj, const List &args)
     }
 
     Object func(this);
-    bool cont = dbg->callEvent(exec,sid,lineno,func,args);
+    bool cont = dbg->callEvent(&newExec,sid,lineno,func,args);
     if (!cont) {
       dbg->imp()->abort();
       return Undefined();
     }
   }
 
-  // enter a new execution context
-  ContextImp ctx(globalObj, exec->dynamicInterpreter()->imp(), thisObj, codeType(),
-                 exec->context().imp(), this, &args);
-  ExecState newExec(exec->dynamicInterpreter(), &ctx);
-  newExec.setException(exec->exception()); // could be null
-
-  // assign user supplied arguments to parameters
-  processParameters(&newExec, args);
-  // add variable declarations (initialized to undefined)
-  processVarDecls(&newExec);
-
   Completion comp = execute(&newExec);
 
   // if an exception occured, propogate it back to the previous execution object
   if (newExec.hadException())
-    exec->setException(newExec.exception());
+    comp = Completion(Throw, newExec.exception());
 
 #ifdef KJS_VERBOSE
   if (comp.complType() == Throw)
@@ -121,8 +121,14 @@ Value FunctionImp::call(ExecState *exec, Object &thisObj, const List &args)
 #endif
 
   if (dbg) {
+    if (inherits(&DeclaredFunctionImp::info))
+      lineno = static_cast<DeclaredFunctionImp*>(this)->body->lastLine();
+
+    if (comp.complType() == Throw)
+        newExec.setException(comp.value());
+
     Object func(this);
-    int cont = dbg->returnEvent(exec,sid,lineno,func);
+    int cont = dbg->returnEvent(&newExec,sid,lineno,func);
     if (!cont) {
       dbg->imp()->abort();
       return Undefined();
@@ -789,7 +795,14 @@ Value GlobalFuncImp::call(ExecState *exec, Object &/*thisObj*/, const List &args
         int errLine;
         UString errMsg;
         ProgramNode *progNode = Parser::parse(UString(), 0, s.data(),s.size(),&sid,&errLine,&errMsg);
-        
+
+        Debugger *dbg = exec->dynamicInterpreter()->imp()->debugger();
+        if (dbg) {
+          bool cont = dbg->sourceParsed(exec, sid, UString(), s, errLine);
+          if (!cont)
+            return Undefined();
+        }
+
         // no program node means a syntax occurred
         if (!progNode) {
           Object err = Error::create(exec,SyntaxError,errMsg.ascii(),errLine);
index 09ba2f2fe1635593309841831fe7b22840283aaa..d25ac9f718815fd84b7e501e2d87d40c6dced8d3 100644 (file)
@@ -217,7 +217,8 @@ Object FunctionObjectImp::construct(ExecState *exec, const List &args, const USt
   // notify debugger that source has been parsed
   Debugger *dbg = exec->dynamicInterpreter()->imp()->debugger();
   if (dbg) {
-    bool cont = dbg->sourceParsed(exec,sid,body,errLine);
+    // send empty sourceURL to indicate constructed code
+    bool cont = dbg->sourceParsed(exec,sid,UString(),body,errLine);
     if (!cont) {
       dbg->imp()->abort();
       return Object(new ObjectImp());
index d0aaea6c5d9efaa46b1e3f8cdb1c4d402a47c206..97f0cbb0c307a86716aeb02144656179b716f4c4 100644 (file)
@@ -508,7 +508,7 @@ ExprOpt:
 ContinueStatement:
     CONTINUE ';'                   { $$ = new ContinueNode(); DBG($$,@1,@2); }
   | CONTINUE error                 { if (automatic()) {
-                                       $$ = new ContinueNode(); DBG($$,@1,@2);
+                                       $$ = new ContinueNode(); DBG($$,@1,@1);
                                      } else
                                       YYABORT; }
   | CONTINUE IDENT ';'             { $$ = new ContinueNode(*$2); DBG($$,@1,@3); }
@@ -538,10 +538,10 @@ ReturnStatement:
                                        $$ = new ReturnNode(0); DBG($$,@1,@1);
                                      } else
                                       YYABORT; }
-  | RETURN Expr ';'                { $$ = new ReturnNode($2); }
-  | RETURN Expr error              { if (automatic())
-                                       $$ = new ReturnNode($2);
-                                     else
+  | RETURN Expr ';'                { $$ = new ReturnNode($2); DBG($$,@1,@3); }
+  | RETURN Expr error              { if (automatic()) {
+                                       $$ = new ReturnNode($2); DBG($$,@1,@2);
+                                     else
                                       YYABORT; }
 ;
 
@@ -587,14 +587,14 @@ LabelledStatement:
 ;
 
 ThrowStatement:
-    THROW Expr ';'                 { $$ = new ThrowNode($2); }
-  | THROW Expr error               { if (automatic()) $$ = new ThrowNode($2); else YYABORT; }
+    THROW Expr ';'                 { $$ = new ThrowNode($2); DBG($$,@1,@3); }
+  | THROW Expr error               { if (automatic()) { $$ = new ThrowNode($2); DBG($$,@1,@2); } else YYABORT; }
 ;
 
 TryStatement:
-    TRY Block Catch                { $$ = new TryNode($2, $3); }
-  | TRY Block Finally              { $$ = new TryNode($2, $3); }
-  | TRY Block Catch Finally        { $$ = new TryNode($2, $3, $4); }
+    TRY Block Catch                { $$ = new TryNode($2, $3); DBG($$,@1,@2); }
+  | TRY Block Finally              { $$ = new TryNode($2, $3); DBG($$,@1,@2); }
+  | TRY Block Catch Finally        { $$ = new TryNode($2, $3, $4); DBG($$,@1,@2); }
 ;
 
 Catch:
index e826a039d99188dd52666f641ad23eddfcfe7ce7..dd1497f7f4355314fc78bb0307c9adea12a8bdbf 100644 (file)
@@ -452,7 +452,7 @@ ProgramNode *Parser::parse(const UString &sourceURL, int startingLineNumber,
   Lexer::curr()->doneParsing();
   ProgramNode *prog = progNode;
   progNode = 0;
-  sid = -1;
+//  sid = -1;
 
   if (parseError || lexError) {
     int eline = Lexer::curr()->lineNo();
@@ -761,7 +761,7 @@ Completion InterpreterImp::evaluate(const UString &code, const Value &thisV, con
 
   // notify debugger that source has been parsed
   if (dbg) {
-    bool cont = dbg->sourceParsed(globExec,sid,code,errLine);
+    bool cont = dbg->sourceParsed(globExec,sid,sourceURL,code,errLine);
     if (!cont)
 #if APPLE_CHANGES
       {
@@ -824,13 +824,6 @@ Completion InterpreterImp::evaluate(const UString &code, const Value &thisV, con
   return res;
 }
 
-void InterpreterImp::setDebugger(Debugger *d)
-{
-  if (d)
-    d->detach(m_interpreter);
-  dbg = d;
-}
-
 void InterpreterImp::saveBuiltins (SavedBuiltins &builtins) const
 {
   if (!builtins._internal) {
index 4b23076078e0e38f831a43fd54644aaa1559ca17..582662e85f0c75381ffcb7543a36235d0dc9840c 100644 (file)
@@ -291,7 +291,7 @@ namespace KJS {
     bool checkSyntax(const UString &code);
     Completion evaluate(const UString &code, const Value &thisV, const UString &sourceURL, int startingLineNumber);
     Debugger *debugger() const { return dbg; }
-    void setDebugger(Debugger *d);
+    void setDebugger(Debugger *d) { dbg = d; }
 
     Object builtinObject() const { return b_Object; }
     Object builtinFunction() const { return b_Function; }
index e28fdccff0a276b5d1599a9385e83158e0078cb8..770c424c46e44e82873a8b6ffef1d9c27ef8aea0 100644 (file)
@@ -140,11 +140,6 @@ Completion Interpreter::evaluate(const UString &sourceURL, int startingLineNumbe
   return comp;
 }
 
-InterpreterImp *Interpreter::imp()
-{
-  return rep;
-}
-
 Object Interpreter::builtinObject() const
 {
   return rep->builtinObject();
index 3ce28aad23104e556d1946991b8ae2211aae0aaf..61994092ce30eef796a5ec5a8d799a626c6671f3 100644 (file)
@@ -221,7 +221,7 @@ namespace KJS {
      * Returns the implementation object associated with this interpreter.
      * Only useful for internal KJS operations.
      */
-    InterpreterImp *imp();
+    InterpreterImp *imp() const { return rep; }
 
     /**
      * Returns the builtin "Object" object. This is the object that was set
index 3771fd9951bfd44041a8f320b5a3babeaea6e5e1..b42484711edf66c9766b8ad4e6125ce5aec3862c 100644 (file)
 
 using namespace KJS;
 
-// Disabled for now because it shows up on benchmark (0.5%).
-#if DEBUGGER_SUPPORT
-
 #define KJS_BREAKPOINT \
-  if (!hitStatement(exec)) \
+  if (Debugger::debuggersPresent > 0 && !hitStatement(exec)) \
     return Completion(Normal);
 
 #define KJS_ABORTPOINT \
-  if (exec->dynamicInterpreter()->imp()->debugger() && \
+  if (Debugger::debuggersPresent > 0 && \
+      exec->dynamicInterpreter()->imp()->debugger() && \
       exec->dynamicInterpreter()->imp()->debugger()->imp()->aborted()) \
     return Completion(Normal);
 
-#else
-
-#define KJS_BREAKPOINT
-#define KJS_ABORTPOINT
-
-#endif
-
 #define KJS_CHECKEXCEPTION \
   if (exec->hadException()) { \
     setExceptionDetailsIfNeeded(exec); \