Reviewed by Richard.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 15 Apr 2005 16:45:20 +0000 (16:45 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 15 Apr 2005 16:45:20 +0000 (16:45 +0000)
- use custom single-threaded malloc for all non-GC JavaScriptCore
allocations, for a 9.1% speedup on JavaScript iBench

* khtml/ecma/kjs_binding.cpp:
        (UString::UString):
        * khtml/ecma/kjs_proxy.cpp:
        (KJSProxyImpl::evaluate):

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/ecma/kjs_binding.cpp
WebCore/khtml/ecma/kjs_events.cpp
WebCore/khtml/ecma/kjs_proxy.cpp

index 176fd013172fbfe11e3e3508bd0a519dac44343f..9c63fe9d777b1de1a35ecb6616c9c932e5ca9555 100644 (file)
@@ -1,3 +1,15 @@
+2005-04-12  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Richard.
+
+       - use custom single-threaded malloc for all non-GC JavaScriptCore
+       allocations, for a 9.1% speedup on JavaScript iBench
+        
+       * khtml/ecma/kjs_binding.cpp:
+        (UString::UString):
+        * khtml/ecma/kjs_proxy.cpp:
+        (KJSProxyImpl::evaluate):
+
 2005-04-15  David Hyatt  <hyatt@apple.com>
 
        Fix the six pixel gap between rows nine and ten of the Acid2 test.  Make sure that percentage heights that
index da512f192a3d5018e7462104bf021608f6854aa0..f5aca1ae6f9a4da51b52b9fb98ed471d066eb23c 100644 (file)
@@ -317,10 +317,9 @@ void *ScriptInterpreter::createLanguageInstanceForValue (ExecState *exec, Bindin
 
 UString::UString(const QString &d)
 {
-  unsigned int len = d.length();
-  UChar *dat = new UChar[len];
-  memcpy(dat, d.unicode(), len * sizeof(UChar));
-  rep = UString::Rep::create(dat, len);
+  // reinterpret_cast is ugly but in this case safe, since QChar and UChar have the same
+  // memory layout
+  rep = UString::Rep::createCopying(reinterpret_cast<const UChar *>(d.unicode()), d.length());
 }
 
 UString::UString(const DOMString &d)
@@ -329,11 +328,9 @@ UString::UString(const DOMString &d)
     attach(&Rep::null);
     return;
   }
-
-  unsigned int len = d.length();
-  UChar *dat = new UChar[len];
-  memcpy(dat, d.unicode(), len * sizeof(UChar));
-  rep = UString::Rep::create(dat, len);
+  // reinterpret_cast is ugly but in this case safe, since QChar and UChar have the same
+  // memory layout
+  rep = UString::Rep::createCopying(reinterpret_cast<const UChar *>(d.unicode()), d.length());
 }
 
 DOMString UString::string() const
index 8e7cdd92dfef35b19dc6ced0931edf6dbca1b66e..0b71f780c7f8b9c54120a9178ef7d8bf8142cf1e 100644 (file)
@@ -98,12 +98,17 @@ void JSAbstractEventListener::handleEvent(DOM::Event &evt, bool isWindowEvent)
         KJS::Interpreter::lock();
         char *message = exec->exception().toObject(exec).get(exec, messagePropertyName).toString(exec).ascii();
         int lineNumber =  exec->exception().toObject(exec).get(exec, "line").toInt32(exec);
-        UString sourceURL = exec->exception().toObject(exec).get(exec, "sourceURL").toString(exec);
+        QString sourceURL;
+        {
+          // put this in a block to make sure UString is deallocated inside the lock
+          UString uSourceURL = exec->exception().toObject(exec).get(exec, "sourceURL").toString(exec);
+          sourceURL = uSourceURL.qstring();
+        }
         KJS::Interpreter::unlock();
         if (Interpreter::shouldPrintExceptions()) {
            printf("(event handler):%s\n", message);
        }
-        KWQ(part)->addMessageToConsole(message, lineNumber, sourceURL.qstring());
+        KWQ(part)->addMessageToConsole(message, lineNumber, sourceURL);
         exec->clearException();
     }
 #else
index b315e021461dd2ea6e03d767d5dda4688a9fb5c9..80da404e4f64b6597020a2519878eca55739530c 100644 (file)
@@ -114,7 +114,10 @@ QVariant KJSProxyImpl::evaluate(QString filename, int baseLine,
   m_script->setInlineCode(inlineCode);
   KJS::Value thisNode = n.isNull() ? Window::retrieve( m_part ) : getDOMNode(m_script->globalExec(),n);
 
+  KJS::Interpreter::lock();
   UString code( str );
+  KJS::Interpreter::unlock();
+
   Completion comp = m_script->evaluate(filename, baseLine, code, thisNode);
   bool success = ( comp.complType() == Normal ) || ( comp.complType() == ReturnValue );  
 #ifdef KJS_DEBUGGER