[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677
mjs
mjs at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:06:22 UTC 2009
The following commit has been merged in the debian/unstable branch:
commit bb46f898afbbe65546ee52458b1aad0b65dadefb
Author: mjs <mjs at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Fri Nov 22 02:08:26 2002 +0000
- reduced the size of PropertyMap by storing sizes and such in the
dynamically allocated part of the object to reduce the size of
ObjectImp - .5% speed improvement on JS iBench.
* kjs/property_map.cpp:
* kjs/property_map.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@2817 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog
index ae44537..976a712 100644
--- a/JavaScriptCore/ChangeLog
+++ b/JavaScriptCore/ChangeLog
@@ -1,5 +1,14 @@
2002-11-21 Maciej Stachowiak <mjs at apple.com>
+ - reduced the size of PropertyMap by storing sizes and such in the
+ dynamically allocated part of the object to reduce the size of
+ ObjectImp - .5% speed improvement on JS iBench.
+
+ * kjs/property_map.cpp:
+ * kjs/property_map.h:
+
+2002-11-21 Maciej Stachowiak <mjs at apple.com>
+
* Makefile.am: Pass symroots for this tree to pbxbuild.
=== Alexander-33 ===
diff --git a/JavaScriptCore/ChangeLog-2002-12-03 b/JavaScriptCore/ChangeLog-2002-12-03
index ae44537..976a712 100644
--- a/JavaScriptCore/ChangeLog-2002-12-03
+++ b/JavaScriptCore/ChangeLog-2002-12-03
@@ -1,5 +1,14 @@
2002-11-21 Maciej Stachowiak <mjs at apple.com>
+ - reduced the size of PropertyMap by storing sizes and such in the
+ dynamically allocated part of the object to reduce the size of
+ ObjectImp - .5% speed improvement on JS iBench.
+
+ * kjs/property_map.cpp:
+ * kjs/property_map.h:
+
+2002-11-21 Maciej Stachowiak <mjs at apple.com>
+
* Makefile.am: Pass symroots for this tree to pbxbuild.
=== Alexander-33 ===
diff --git a/JavaScriptCore/ChangeLog-2003-10-25 b/JavaScriptCore/ChangeLog-2003-10-25
index ae44537..976a712 100644
--- a/JavaScriptCore/ChangeLog-2003-10-25
+++ b/JavaScriptCore/ChangeLog-2003-10-25
@@ -1,5 +1,14 @@
2002-11-21 Maciej Stachowiak <mjs at apple.com>
+ - reduced the size of PropertyMap by storing sizes and such in the
+ dynamically allocated part of the object to reduce the size of
+ ObjectImp - .5% speed improvement on JS iBench.
+
+ * kjs/property_map.cpp:
+ * kjs/property_map.h:
+
+2002-11-21 Maciej Stachowiak <mjs at apple.com>
+
* Makefile.am: Pass symroots for this tree to pbxbuild.
=== Alexander-33 ===
diff --git a/JavaScriptCore/kjs/property_map.cpp b/JavaScriptCore/kjs/property_map.cpp
index ee759d2..1c9d078 100644
--- a/JavaScriptCore/kjs/property_map.cpp
+++ b/JavaScriptCore/kjs/property_map.cpp
@@ -44,7 +44,7 @@ public:
// Algorithm concepts from Algorithms in C++, Sedgewick.
-PropertyMap::PropertyMap() : _tableSize(0), _table(0), _keyCount(0)
+PropertyMap::PropertyMap() : _table(0)
{
}
@@ -55,12 +55,14 @@ PropertyMap::~PropertyMap()
if (key)
key->deref();
#endif
- for (int i = 0; i < _tableSize; i++) {
- UString::Rep *key = _table[i].key;
+ if (_table) {
+ for (int i = 0; i < _table->size; i++) {
+ UString::Rep *key = _table->entries[i].key;
if (key)
- key->deref();
+ key->deref();
+ }
+ free(_table);
}
- free(_table);
}
void PropertyMap::clear()
@@ -72,19 +74,21 @@ void PropertyMap::clear()
_singleEntry.key = 0;
}
#endif
- for (int i = 0; i < _tableSize; i++) {
- UString::Rep *key = _table[i].key;
+ if (_table) {
+ for (int i = 0; i < _table->size; i++) {
+ UString::Rep *key = _table->entries[i].key;
if (key) {
- key->deref();
- _table[i].key = 0;
+ key->deref();
+ _table->entries[i].key = 0;
}
+ }
+ _table->keyCount = 0;
}
- _keyCount = 0;
}
inline int PropertyMap::hash(const UString::Rep *s) const
{
- return s->hash() & _tableSizeMask;
+ return s->hash() & _table->sizeMask;
}
ValueImp *PropertyMap::get(const Identifier &name, int &attributes) const
@@ -103,12 +107,12 @@ ValueImp *PropertyMap::get(const Identifier &name, int &attributes) const
}
int i = hash(rep);
- while (UString::Rep *key = _table[i].key) {
+ while (UString::Rep *key = _table->entries[i].key) {
if (rep == key) {
- attributes = _table[i].attributes;
- return _table[i].value;
+ attributes = _table->entries[i].attributes;
+ return _table->entries[i].value;
}
- i = (i + 1) & _tableSizeMask;
+ i = (i + 1) & _table->sizeMask;
}
return 0;
}
@@ -127,10 +131,10 @@ ValueImp *PropertyMap::get(const Identifier &name) const
}
int i = hash(rep);
- while (UString::Rep *key = _table[i].key) {
+ while (UString::Rep *key = _table->entries[i].key) {
if (rep == key)
- return _table[i].value;
- i = (i + 1) & _tableSizeMask;
+ return _table->entries[i].value;
+ i = (i + 1) & _table->sizeMask;
}
return 0;
}
@@ -154,58 +158,60 @@ void PropertyMap::put(const Identifier &name, ValueImp *value, int attributes)
_singleEntry.key = rep;
_singleEntry.value = value;
_singleEntry.attributes = attributes;
- _keyCount = 1;
checkConsistency();
return;
}
}
#endif
- if (_keyCount * 2 >= _tableSize)
+ if (!_table || _table->keyCount * 2 >= _table->size)
expand();
int i = hash(rep);
- while (UString::Rep *key = _table[i].key) {
+ while (UString::Rep *key = _table->entries[i].key) {
if (rep == key) {
// Put a new value in an existing hash table entry.
- _table[i].value = value;
+ _table->entries[i].value = value;
// Attributes are intentionally not updated.
return;
}
- i = (i + 1) & _tableSizeMask;
+ i = (i + 1) & _table->sizeMask;
}
// Create a new hash table entry.
rep->ref();
- _table[i].key = rep;
- _table[i].value = value;
- _table[i].attributes = attributes;
- ++_keyCount;
+ _table->entries[i].key = rep;
+ _table->entries[i].value = value;
+ _table->entries[i].attributes = attributes;
+ ++_table->keyCount;
checkConsistency();
}
inline void PropertyMap::insert(UString::Rep *key, ValueImp *value, int attributes)
{
- int i = hash(key);
- while (_table[i].key)
- i = (i + 1) & _tableSizeMask;
+ assert(_table);
+
+ int i = hash(key);
+ while (_table->entries[i].key)
+ i = (i + 1) & _table->sizeMask;
- _table[i].key = key;
- _table[i].value = value;
- _table[i].attributes = attributes;
+ _table->entries[i].key = key;
+ _table->entries[i].value = value;
+ _table->entries[i].attributes = attributes;
}
void PropertyMap::expand()
{
checkConsistency();
- int oldTableSize = _tableSize;
- Entry *oldTable = _table;
+ Table *oldTable = _table;
+ int oldTableSize = oldTable ? _table->size : 0;
- _tableSize = oldTableSize ? oldTableSize * 2 : 16;
- _tableSizeMask = _tableSize - 1;
- _table = (Entry *)calloc(_tableSize, sizeof(Entry));
+ int newTableSize = oldTableSize ? oldTableSize * 2 : 16;
+ _table = (Table *)calloc(1, sizeof(Table) + (newTableSize - 1) * sizeof(Entry) );
+ _table->size = newTableSize;
+ _table->sizeMask = _table->size - 1;
#if USE_SINGLE_ENTRY
UString::Rep *key = _singleEntry.key;
@@ -216,9 +222,9 @@ void PropertyMap::expand()
#endif
for (int i = 0; i != oldTableSize; ++i) {
- UString::Rep *key = oldTable[i].key;
+ UString::Rep *key = oldTable->entries[i].key;
if (key)
- insert(key, oldTable[i].value, oldTable[i].attributes);
+ insert(key, oldTable->entries[i].value, oldTable->entries[i].attributes);
}
free(oldTable);
@@ -240,7 +246,6 @@ void PropertyMap::remove(const Identifier &name)
if (rep == key) {
key->deref();
_singleEntry.key = 0;
- _keyCount = 0;
checkConsistency();
}
#endif
@@ -249,28 +254,28 @@ void PropertyMap::remove(const Identifier &name)
// Find the thing to remove.
int i = hash(rep);
- while ((key = _table[i].key)) {
+ while ((key = _table->entries[i].key)) {
if (rep == key)
break;
- i = (i + 1) & _tableSizeMask;
+ i = (i + 1) & _table->sizeMask;
}
if (!key)
return;
// Remove the one key.
key->deref();
- _table[i].key = 0;
- assert(_keyCount >= 1);
- --_keyCount;
+ _table->entries[i].key = 0;
+ assert(_table->keyCount >= 1);
+ --_table->keyCount;
// Reinsert all the items to the right in the same cluster.
while (1) {
- i = (i + 1) & _tableSizeMask;
- key = _table[i].key;
+ i = (i + 1) & _table->sizeMask;
+ key = _table->entries[i].key;
if (!key)
break;
- _table[i].key = 0;
- insert(key, _table[i].value, _table[i].attributes);
+ _table->entries[i].key = 0;
+ insert(key, _table->entries[i].value, _table->entries[i].attributes);
}
checkConsistency();
@@ -285,9 +290,14 @@ void PropertyMap::mark() const
v->mark();
}
#endif
- for (int i = 0; i != _tableSize; ++i) {
- if (_table[i].key) {
- ValueImp *v = _table[i].value;
+
+ if (!_table) {
+ return;
+ }
+
+ for (int i = 0; i != _table->size; ++i) {
+ if (_table->entries[i].key) {
+ ValueImp *v = _table->entries[i].value;
if (!v->marked())
v->mark();
}
@@ -301,9 +311,13 @@ void PropertyMap::addEnumerablesToReferenceList(ReferenceList &list, const Objec
if (key && !(_singleEntry.attributes & DontEnum))
list.append(Reference(base, Identifier(key)));
#endif
- for (int i = 0; i != _tableSize; ++i) {
- UString::Rep *key = _table[i].key;
- if (key && !(_table[i].attributes & DontEnum))
+ if (!_table) {
+ return;
+ }
+
+ for (int i = 0; i != _table->size; ++i) {
+ UString::Rep *key = _table->entries[i].key;
+ if (key && !(_table->entries[i].attributes & DontEnum))
list.append(Reference(base, Identifier(key)));
}
}
@@ -316,9 +330,11 @@ void PropertyMap::save(SavedProperties &p) const
if (_singleEntry.key)
++count;
#endif
- for (int i = 0; i != _tableSize; ++i)
- if (_table[i].key && _table[i].attributes == 0)
- ++count;
+ if (_table) {
+ for (int i = 0; i != _table->size; ++i)
+ if (_table->entries[i].key && _table->entries[i].attributes == 0)
+ ++count;
+ }
delete [] p._properties;
if (count == 0) {
@@ -336,11 +352,14 @@ void PropertyMap::save(SavedProperties &p) const
++prop;
}
#endif
- for (int i = 0; i != _tableSize; ++i)
- if (_table[i].key && _table[i].attributes == 0) {
- prop->key = Identifier(_table[i].key);
- prop->value = Value(_table[i].value);
+ if (_table) {
+ for (int i = 0; i != _table->size; ++i) {
+ if (_table->entries[i].key && _table->entries[i].attributes == 0) {
+ prop->key = Identifier(_table->entries[i].key);
+ prop->value = Value(_table->entries[i].value);
}
+ }
+ }
}
void PropertyMap::restore(const SavedProperties &p)
@@ -354,28 +373,31 @@ void PropertyMap::restore(const SavedProperties &p)
void PropertyMap::checkConsistency()
{
int count = 0;
- for (int j = 0; j != _tableSize; ++j) {
- UString::Rep *rep = _table[j].key;
+ if (_table) {
+ for (int j = 0; j != _table->size; ++j) {
+ UString::Rep *rep = _table->entries[j].key;
if (!rep)
- continue;
+ continue;
int i = hash(rep);
- while (UString::Rep *key = _table[i].key) {
- if (rep == key)
- break;
- i = (i + 1) & _tableSizeMask;
+ while (UString::Rep *key = _table->entries[i].key) {
+ if (rep == key)
+ break;
+ i = (i + 1) & _tableSizeMask;
}
assert(i == j);
count++;
+ }
}
+
#if USE_SINGLE_ENTRY
if (_singleEntry.key)
- count++;
+ count++;
#endif
- assert(count == _keyCount);
if (_table) {
- assert(_tableSize >= 16);
- assert(_tableSizeMask);
- assert(_tableSize == _tableSizeMask + 1);
+ assert(count == _table->keyCount);
+ assert(_table->size >= 16);
+ assert(_table->sizeMask);
+ assert(_table->size == _table->sizeMask + 1);
}
}
diff --git a/JavaScriptCore/kjs/property_map.h b/JavaScriptCore/kjs/property_map.h
index 5cfe807..67ea8b2 100644
--- a/JavaScriptCore/kjs/property_map.h
+++ b/JavaScriptCore/kjs/property_map.h
@@ -54,6 +54,14 @@ namespace KJS {
ValueImp *value;
int attributes;
};
+
+ struct PropertyMapHashTable
+ {
+ int sizeMask;
+ int size;
+ int keyCount;
+ PropertyMapHashTableEntry entries[1];
+ };
class PropertyMap {
public:
@@ -83,11 +91,9 @@ namespace KJS {
void checkConsistency();
typedef PropertyMapHashTableEntry Entry;
-
- int _tableSizeMask;
- int _tableSize;
- Entry *_table;
- int _keyCount;
+ typedef PropertyMapHashTable Table;
+
+ Table *_table;
Entry _singleEntry;
};
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list