[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

darin darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:03:11 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 401641eea1afe2495aa4b74214f74f94c6ad1688
Author: darin <darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Nov 18 21:55:23 2002 +0000

    	- fix worst speed problems on the sort page of the iBench JavaScript test
    
    	Sped up JavaScript iBench by 70%, the sort page by 88%.
    
            * kjs/array_object.h: Add array-specific sort functions.
            * kjs/array_object.cpp:
            (compareByStringForQSort): Added.
            (ArrayInstanceImp::sort): Added.
            (compareWithCompareFunctionForQSort): Added.
            (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being
    	sorted is actually an array.
    
            * kjs/object.h: Add argumentsPropertyName.
            * kjs/object.cpp: Add argumentsPropertyName.
            * kjs/function.cpp:
            (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString.
            (FunctionImp::call): Ditto.
            (ActivationImp::ActivationImp): Ditto.
            * kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto.
    
            * kjs/ustring.h: Added compare function for -1/0/+1 comparison.
            * kjs/ustring.cpp: (KJS::compare): Added.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@2736 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog
index 02ad4fe..79d6936 100644
--- a/JavaScriptCore/ChangeLog
+++ b/JavaScriptCore/ChangeLog
@@ -1,3 +1,28 @@
+2002-11-18  Darin Adler  <darin at apple.com>
+
+	- fix worst speed problems on the sort page of the iBench JavaScript test
+
+	Sped up JavaScript iBench by 70%, the sort page by 88%.
+
+        * kjs/array_object.h: Add array-specific sort functions.
+        * kjs/array_object.cpp:
+        (compareByStringForQSort): Added.
+        (ArrayInstanceImp::sort): Added.
+        (compareWithCompareFunctionForQSort): Added.
+        (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being
+	sorted is actually an array.
+
+        * kjs/object.h: Add argumentsPropertyName.
+        * kjs/object.cpp: Add argumentsPropertyName.
+        * kjs/function.cpp:
+        (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString.
+        (FunctionImp::call): Ditto.
+        (ActivationImp::ActivationImp): Ditto.
+        * kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto.
+
+        * kjs/ustring.h: Added compare function for -1/0/+1 comparison.
+        * kjs/ustring.cpp: (KJS::compare): Added.
+
 2002-11-18  Maciej Stachowiak  <mjs at apple.com>
 
 	Change ArgumentListNode operations to be iterative instead of
diff --git a/JavaScriptCore/ChangeLog-2002-12-03 b/JavaScriptCore/ChangeLog-2002-12-03
index 02ad4fe..79d6936 100644
--- a/JavaScriptCore/ChangeLog-2002-12-03
+++ b/JavaScriptCore/ChangeLog-2002-12-03
@@ -1,3 +1,28 @@
+2002-11-18  Darin Adler  <darin at apple.com>
+
+	- fix worst speed problems on the sort page of the iBench JavaScript test
+
+	Sped up JavaScript iBench by 70%, the sort page by 88%.
+
+        * kjs/array_object.h: Add array-specific sort functions.
+        * kjs/array_object.cpp:
+        (compareByStringForQSort): Added.
+        (ArrayInstanceImp::sort): Added.
+        (compareWithCompareFunctionForQSort): Added.
+        (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being
+	sorted is actually an array.
+
+        * kjs/object.h: Add argumentsPropertyName.
+        * kjs/object.cpp: Add argumentsPropertyName.
+        * kjs/function.cpp:
+        (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString.
+        (FunctionImp::call): Ditto.
+        (ActivationImp::ActivationImp): Ditto.
+        * kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto.
+
+        * kjs/ustring.h: Added compare function for -1/0/+1 comparison.
+        * kjs/ustring.cpp: (KJS::compare): Added.
+
 2002-11-18  Maciej Stachowiak  <mjs at apple.com>
 
 	Change ArgumentListNode operations to be iterative instead of
diff --git a/JavaScriptCore/ChangeLog-2003-10-25 b/JavaScriptCore/ChangeLog-2003-10-25
index 02ad4fe..79d6936 100644
--- a/JavaScriptCore/ChangeLog-2003-10-25
+++ b/JavaScriptCore/ChangeLog-2003-10-25
@@ -1,3 +1,28 @@
+2002-11-18  Darin Adler  <darin at apple.com>
+
+	- fix worst speed problems on the sort page of the iBench JavaScript test
+
+	Sped up JavaScript iBench by 70%, the sort page by 88%.
+
+        * kjs/array_object.h: Add array-specific sort functions.
+        * kjs/array_object.cpp:
+        (compareByStringForQSort): Added.
+        (ArrayInstanceImp::sort): Added.
+        (compareWithCompareFunctionForQSort): Added.
+        (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being
+	sorted is actually an array.
+
+        * kjs/object.h: Add argumentsPropertyName.
+        * kjs/object.cpp: Add argumentsPropertyName.
+        * kjs/function.cpp:
+        (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString.
+        (FunctionImp::call): Ditto.
+        (ActivationImp::ActivationImp): Ditto.
+        * kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto.
+
+        * kjs/ustring.h: Added compare function for -1/0/+1 comparison.
+        * kjs/ustring.cpp: (KJS::compare): Added.
+
 2002-11-18  Maciej Stachowiak  <mjs at apple.com>
 
 	Change ArgumentListNode operations to be iterative instead of
diff --git a/JavaScriptCore/kjs/array_object.cpp b/JavaScriptCore/kjs/array_object.cpp
index 52123ff..5f316f8 100644
--- a/JavaScriptCore/kjs/array_object.cpp
+++ b/JavaScriptCore/kjs/array_object.cpp
@@ -192,6 +192,55 @@ void ArrayInstanceImp::mark()
   }
 }
 
+static ExecState *execForCompareByStringForQSort;
+
+static int compareByStringForQSort(const void *a, const void *b)
+{
+    ExecState *exec = execForCompareByStringForQSort;
+    return compare(Value(*(ValueImp **)a).toString(exec), Value(*(ValueImp **)b).toString(exec));
+}
+
+void ArrayInstanceImp::sort(ExecState *exec)
+{
+    execForCompareByStringForQSort = exec;
+    qsort(storage, length, sizeof(ValueImp *), compareByStringForQSort);
+    execForCompareByStringForQSort = 0;
+}
+
+struct CompareWithCompareFunctionArguments {
+    CompareWithCompareFunctionArguments(ExecState *e, ObjectImp *cf)
+        : exec(e)
+        , compareFunction(cf)
+        , globalObject(e->interpreter()->globalObject())
+    { }
+
+    ExecState *exec;
+    ObjectImp *compareFunction;
+    List arguments;
+    Object globalObject;
+};
+
+static CompareWithCompareFunctionArguments *compareWithCompareFunctionArguments;
+
+static int compareWithCompareFunctionForQSort(const void *a, const void *b)
+{
+    CompareWithCompareFunctionArguments *args = compareWithCompareFunctionArguments;
+    
+    args->arguments.clear();
+    args->arguments.append(Value(*(ValueImp **)a));
+    args->arguments.append(Value(*(ValueImp **)b));
+    return args->compareFunction->call(args->exec, args->globalObject, args->arguments)
+        .toInt32(args->exec);
+}
+
+void ArrayInstanceImp::sort(ExecState *exec, Object &compareFunction)
+{
+    CompareWithCompareFunctionArguments args(exec, compareFunction.imp());
+    compareWithCompareFunctionArguments = &args;
+    qsort(storage, length, sizeof(ValueImp *), compareWithCompareFunctionForQSort);
+    compareWithCompareFunctionArguments = 0;
+}
+
 // ------------------------------ ArrayPrototypeImp ----------------------------
 
 const ClassInfo ArrayPrototypeImp::info = {"Array", &ArrayInstanceImp::info, &arrayTable, 0};
@@ -424,10 +473,19 @@ Value ArrayProtoFuncImp::call(ExecState *exec, Object &thisObj, const List &args
         if (!sortFunction.implementsCall())
           useSortFunction = false;
       }
+    
+    if (thisObj.imp()->classInfo() == &ArrayInstanceImp::info) {
+      if (useSortFunction)
+        ((ArrayInstanceImp *)thisObj.imp())->sort(exec, sortFunction);
+      else
+        ((ArrayInstanceImp *)thisObj.imp())->sort(exec);
+      result = thisObj;
+      break;
+    }
 
     if (length == 0) {
       thisObj.put(exec, lengthPropertyName, Number(0), DontEnum | DontDelete);
-      result = Undefined();
+      result = thisObj;
       break;
     }
 
diff --git a/JavaScriptCore/kjs/array_object.h b/JavaScriptCore/kjs/array_object.h
index 32dd764..abfdb76 100644
--- a/JavaScriptCore/kjs/array_object.h
+++ b/JavaScriptCore/kjs/array_object.h
@@ -49,6 +49,9 @@ namespace KJS {
     
     unsigned getLength() const { return length; }
     
+    void sort(ExecState *exec);
+    void sort(ExecState *exec, Object &compareFunction);
+    
   private:
     void setLength(unsigned newLength);
     
diff --git a/JavaScriptCore/kjs/function.cpp b/JavaScriptCore/kjs/function.cpp
index a2900b0..e6ba8b7 100644
--- a/JavaScriptCore/kjs/function.cpp
+++ b/JavaScriptCore/kjs/function.cpp
@@ -59,7 +59,7 @@ FunctionImp::FunctionImp(ExecState *exec, const UString &n)
 {
   Value protect(this);
   //fprintf(stderr,"FunctionImp::FunctionImp this=%p\n");
-  put(exec,"arguments",Null(),ReadOnly|DontDelete|DontEnum);
+  put(exec,argumentsPropertyName,Null(),ReadOnly|DontDelete|DontEnum);
 }
 
 FunctionImp::~FunctionImp()
@@ -108,12 +108,12 @@ Value FunctionImp::call(ExecState *exec, Object &thisObj, const List &args)
   // value from a possible earlier call. Upon return, we restore the
   // previous arguments object.
   // Note: this does not appear to be part of the spec
-  Value oldArgs = get(&newExec, "arguments");
+  Value oldArgs = get(&newExec, argumentsPropertyName);
 
   if (codeType() == FunctionCode) {
     assert(ctx.activationObject().inherits(&ActivationImp::info));
     Object argsObj = static_cast<ActivationImp*>(ctx.activationObject().imp())->argumentsObject();
-    put(&newExec, "arguments", argsObj, DontDelete|DontEnum|ReadOnly);
+    put(&newExec, argumentsPropertyName, argsObj, DontDelete|DontEnum|ReadOnly);
   }
 
   // assign user supplied arguments to parameters
@@ -127,7 +127,7 @@ Value FunctionImp::call(ExecState *exec, Object &thisObj, const List &args)
   if (newExec.hadException())
     exec->setException(newExec.exception());
   if (codeType() == FunctionCode)
-    put(&newExec, "arguments", oldArgs, DontDelete|DontEnum|ReadOnly);
+    put(&newExec, argumentsPropertyName, oldArgs, DontDelete|DontEnum|ReadOnly);
 
 #ifdef KJS_VERBOSE
   if (comp.complType() == Throw)
@@ -308,7 +308,7 @@ ActivationImp::ActivationImp(ExecState *exec, FunctionImp *f, const List &args)
 {
   Value protect(this);
   arguments = new ArgumentsImp(exec,f, args);
-  put(exec, "arguments", Object(arguments), Internal|DontDelete);
+  put(exec, argumentsPropertyName, Object(arguments), Internal|DontDelete);
 }
 
 ActivationImp::~ActivationImp()
diff --git a/JavaScriptCore/kjs/function_object.cpp b/JavaScriptCore/kjs/function_object.cpp
index 15ecf27..828dafb 100644
--- a/JavaScriptCore/kjs/function_object.cpp
+++ b/JavaScriptCore/kjs/function_object.cpp
@@ -283,7 +283,7 @@ Object FunctionObjectImp::construct(ExecState *exec, const List &args)
   prototype.put(exec, "constructor",
 		Object(fimp), DontEnum|DontDelete|ReadOnly);
   fimp->put(exec,prototypePropertyName,prototype,DontEnum|DontDelete|ReadOnly);
-  fimp->put(exec,"arguments",Null(),DontEnum|DontDelete|ReadOnly);
+  fimp->put(exec,argumentsPropertyName,Null(),DontEnum|DontDelete|ReadOnly);
   return ret;
 }
 
diff --git a/JavaScriptCore/kjs/object.cpp b/JavaScriptCore/kjs/object.cpp
index c38e878..da6642e 100644
--- a/JavaScriptCore/kjs/object.cpp
+++ b/JavaScriptCore/kjs/object.cpp
@@ -41,6 +41,7 @@
 
 namespace KJS {
 
+extern const UString argumentsPropertyName("arguments");
 extern const UString lengthPropertyName("length");
 extern const UString prototypePropertyName("prototype");
 extern const UString toStringPropertyName("toString");
diff --git a/JavaScriptCore/kjs/object.h b/JavaScriptCore/kjs/object.h
index 47a174d..e402e8c 100644
--- a/JavaScriptCore/kjs/object.h
+++ b/JavaScriptCore/kjs/object.h
@@ -705,6 +705,7 @@ namespace KJS {
   inline void Object::setInternalValue(const Value &v)
     { imp()->setInternalValue(v); }
 
+  extern const UString argumentsPropertyName;
   extern const UString lengthPropertyName;
   extern const UString prototypePropertyName;
   extern const UString toStringPropertyName;
diff --git a/JavaScriptCore/kjs/ustring.cpp b/JavaScriptCore/kjs/ustring.cpp
index abf552e..0290b88 100644
--- a/JavaScriptCore/kjs/ustring.cpp
+++ b/JavaScriptCore/kjs/ustring.cpp
@@ -642,3 +642,25 @@ bool KJS::operator<(const UString& s1, const UString& s2)
 
   return (l1 < l2);
 }
+
+int KJS::compare(const UString& s1, const UString& s2)
+{
+  const int l1 = s1.size();
+  const int l2 = s2.size();
+  const int lmin = l1 < l2 ? l1 : l2;
+  const UChar *c1 = s1.data();
+  const UChar *c2 = s2.data();
+  int l = 0;
+  while (l < lmin && *c1 == *c2) {
+    c1++;
+    c2++;
+    l++;
+  }
+  if (l < lmin)
+    return (c1->unicode() > c2->unicode()) ? 1 : -1;
+
+  if (l1 == l2) {
+    return 0;
+  }
+  return (l1 < l2) ? 1 : -1;
+}
diff --git a/JavaScriptCore/kjs/ustring.h b/JavaScriptCore/kjs/ustring.h
index cb11f3d..18e37d8 100644
--- a/JavaScriptCore/kjs/ustring.h
+++ b/JavaScriptCore/kjs/ustring.h
@@ -430,6 +430,8 @@ namespace KJS {
   inline UString operator+(const UString& s1, const UString& s2) {
     return UString(s1, s2);
   }
+  
+  int compare(const UString &, const UString &);
 
 }; // namespace
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list