Reviewed by Eric.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Oct 2007 07:00:37 +0000 (07:00 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 23 Oct 2007 07:00:37 +0000 (07:00 +0000)
        - streamline exception handling code for a >1% speed-up of SunSpider

        * kjs/nodes.cpp: Changed macros to use functions for everything that's not
        part of normal execution. We'll take function call overhead when propagating
        an exception or out of memory.
        (KJS::createOutOfMemoryCompletion): Added.
        (KJS::substitute): Use append instead of the relatively inefficient + operator.
        (KJS::Node::rethrowException): Added.
        * kjs/nodes.h: Added rethrowException.

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/nodes.cpp
JavaScriptCore/kjs/nodes.h

index e1575c73e2be974a023f03147f28dc30e096d392..fd296984ee89d296d97485997f4a18b07f3e26f9 100644 (file)
@@ -1,3 +1,17 @@
+2007-10-23  Darin Adler  <darin@apple.com>
+
+        Reviewed by Eric.
+
+        - streamline exception handling code for a >1% speed-up of SunSpider
+
+        * kjs/nodes.cpp: Changed macros to use functions for everything that's not
+        part of normal execution. We'll take function call overhead when propagating
+        an exception or out of memory.
+        (KJS::createOutOfMemoryCompletion): Added.
+        (KJS::substitute): Use append instead of the relatively inefficient + operator.
+        (KJS::Node::rethrowException): Added.
+        * kjs/nodes.h: Added rethrowException.
+
 2007-10-22  Darin Adler  <darin@apple.com>
 
         Reviewed by Maciej.
index 227dc7c63196d28aac2f12964f7b0bad8e9f6617..a840d9a29d943d0a368f8ef1777b7080ef7a0137 100644 (file)
@@ -1,5 +1,4 @@
 /*
- *  This file is part of the KDE libraries
  *  Copyright (C) 1999-2002 Harri Porten (porten@kde.org)
  *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
  *  Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
 #include "config.h"
 #include "nodes.h"
 
-#include <math.h>
-#ifdef KJS_DEBUG_MEM
-#include <stdio.h>
-#include <typeinfo>
-#endif
-
+#include "PropertyNameArray.h"
 #include "context.h"
 #include "debugger.h"
 #include "function_object.h"
 #include "lexer.h"
 #include "operations.h"
-#include "PropertyNameArray.h"
+#include <math.h>
 #include <wtf/Assertions.h>
-#include <wtf/HashSet.h>
 #include <wtf/HashCountedSet.h>
+#include <wtf/HashSet.h>
 #include <wtf/MathExtras.h>
 
-using namespace KJS;
+namespace KJS {
 
 #define KJS_BREAKPOINT \
   if (Debugger::debuggersPresent > 0 && !hitStatement(exec)) \
     return Completion(Normal);
 
-#define KJS_ABORTPOINT \
-  if (Debugger::debuggersPresent > 0 && \
-      exec->dynamicInterpreter()->imp()->debugger() && \
-      exec->dynamicInterpreter()->imp()->debugger()->imp()->aborted()) \
-    return Completion(Normal);
-
 #define KJS_CHECKEXCEPTION \
-  if (exec->hadException()) { \
-    JSValue *ex = exec->exception(); \
-    exec->clearException(); \
-    handleException(exec, ex); \
-    return Completion(Throw, ex); \
-  } \
+  if (exec->hadException()) \
+    return rethrowException(exec); \
   if (Collector::isOutOfMemory()) \
-    return Completion(Throw, Error::create(exec, GeneralError, "Out of memory"));
+    return createOutOfMemoryCompletion(exec);
 
 #define KJS_CHECKEXCEPTIONVALUE \
   if (exec->hadException()) { \
@@ -80,6 +64,11 @@ using namespace KJS;
   if (Collector::isOutOfMemory()) \
     return List(); // will be picked up by KJS_CHECKEXCEPTION
 
+static Completion createOutOfMemoryCompletion(ExecState* exec)
+{
+    return Completion(Throw, Error::create(exec, GeneralError, "Out of memory"));
+}
+
 // ------------------------------ Node -----------------------------------------
 
 #ifndef NDEBUG
@@ -192,7 +181,10 @@ static void substitute(UString &string, const UString &substring)
 {
     int position = string.find("%s");
     ASSERT(position != -1);
-    string = string.substr(0, position) + substring + string.substr(position + 2);
+    UString newString = string.substr(0, position);
+    newString.append(substring);
+    newString.append(string.substr(position + 2));
+    string = newString;
 }
 
 static inline int currentSourceId(ExecState* exec) KJS_FAST_CALL;
@@ -300,6 +292,14 @@ void Node::handleException(ExecState* exec, JSValue* exceptionValue)
     }
 }
 
+Completion Node::rethrowException(ExecState* exec)
+{
+    JSValue* exception = exec->exception();
+    exec->clearException();
+    handleException(exec, exception);
+    return Completion(Throw, exception);
+}
+
 Node *Node::nodeInsideAllParens()
 {
     return this;
@@ -2615,3 +2615,5 @@ void SourceElementsNode::breakCycle()
 ProgramNode::ProgramNode(SourceElementsNode *s) : FunctionBodyNode(s)
 {
 }
+
+}
index f36fd9e20adfd8f711d4a338c7592c1c4bf3cfe1..d0f0dc1e6f4fe25e0d14198d6160502f8038beca 100644 (file)
@@ -1,6 +1,5 @@
 // -*- c-basic-offset: 2 -*-
 /*
- *  This file is part of the KDE libraries
  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
  *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
  *  Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
@@ -147,6 +146,8 @@ namespace KJS {
     void handleException(ExecState*) KJS_FAST_CALL;
     void handleException(ExecState*, JSValue*) KJS_FAST_CALL;
 
+    Completion rethrowException(ExecState*) KJS_FAST_CALL;
+
     int m_line : 31;
     bool m_mayHaveDeclarations : 1;
   private: