[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