[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdelibs/kjs
From: Maks Orlovich <maksim () kde ! org>
Date: 2010-05-01 19:18:18
Message-ID: 20100501191818.A9518AC8AA () svn ! kde ! org
[Download RAW message or body]
SVN commit 1121575 by orlovich:
- Expand out list cells to LocalStorageEntry, to make passing in stuff
from stack possible.
- Some more variable pass-in tweaking.
M +14 -2 function.cpp
M +12 -14 list.cpp
M +7 -4 list.h
--- trunk/KDE/kdelibs/kjs/function.cpp #1121574:1121575
@@ -509,9 +509,12 @@
function->functionName().isEmpty() ? "(internal)" : \
function->functionName().ascii()); #endif
size_t numParams = body->numParams();
- for (size_t pos = 0; pos < numParams; ++pos) {
+ size_t numPassedIn = min(numParams, static_cast<size_t>(arguments->size()));
+
+ size_t pos = 0;
+ for (; pos < numPassedIn; ++pos) {
size_t symNum = pos + ActivationImp::NumReservedSlots;
- JSValue* v = (*arguments)[pos];
+ JSValue* v = arguments->atUnchecked(pos);
entries[symNum].val.valueVal = v;
@@ -521,7 +524,16 @@
#endif
}
+ for (; pos < numParams; ++pos) {
+ size_t symNum = pos + ActivationImp::NumReservedSlots;
+ entries[symNum].val.valueVal = jsUndefined();
+
#ifdef KJS_VERBOSE
+ fprintf(stderr, "%s setting parameter %s to undefined (not passed in)", \
ind(), body->paramName(pos).ascii()); +#endif
+ }
+
+#ifdef KJS_VERBOSE
fprintf(stderr, "\n%s---------------------------------\n", ind());
fprintf(stderr, "%sBody:\n", ind());
fprintf(stderr, "%s---------------------------------\n", ind());
--- trunk/KDE/kdelibs/kjs/list.cpp #1121574:1121575
@@ -39,13 +39,14 @@
struct ListImp : ListImpBase
{
ListImpState state;
- int capacity; // or 0 if data is inline
union {
- JSValue *values[inlineListValuesSize];
+ int capacity; // or 0 if data is inline
ListImp *nextInFreeList;
};
+ LocalStorageEntry values[inlineListValuesSize];
+
#if DUMP_STATISTICS
int sizeHighWaterMark;
#endif
@@ -101,8 +102,8 @@
inline void ListImp::markValues()
{
for (int i = 0; i != size; ++i) {
- if (!data[i]->marked())
- data[i]->mark();
+ if (!data[i].val.valueVal->marked())
+ data[i].val.valueVal->mark();
}
}
@@ -163,17 +164,14 @@
#endif
}
-
-void List::markValues()
-{
- static_cast<ListImp *>(_impBase)->markValues();
-}
-
void List::release()
{
ListImp *imp = static_cast<ListImp *>(_impBase);
#if DUMP_STATISTICS
+ if (imp->size > imp->sizeHighWaterMark)
+ imp->sizeHighWaterMark = imp->size;
+
--numLists;
++numListsDestroyed;
for (int i = 0; i < 17; i++)
@@ -227,7 +225,7 @@
if (i >= imp->capacity) {
int newCapacity = i * 2;
- JSValue** newBuffer = new JSValue*[newCapacity];
+ LocalStorageEntry* newBuffer = new LocalStorageEntry[newCapacity];
// Copy everything over
for (int c = 0; c < i; ++c)
@@ -240,7 +238,7 @@
imp->capacity = newCapacity;
}
- imp->data[i] = v;
+ imp->data[i].val.valueVal = v;
}
List List::copy() const
@@ -264,7 +262,7 @@
if (size > inlineListValuesSize) {
// need an out-of-line buffer
ourImp->capacity = size;
- ourImp->data = new JSValue*[size];
+ ourImp->data = new LocalStorageEntry[size];
} else {
ourImp->capacity = 0;
}
@@ -287,7 +285,7 @@
if (size > inlineListValuesSize) {
// need an out-of-line buffer
ourImp->capacity = size;
- ourImp->data = new JSValue*[size];
+ ourImp->data = new LocalStorageEntry[size];
} else {
ourImp->capacity = 0;
}
--- trunk/KDE/kdelibs/kjs/list.h #1121574:1121575
@@ -24,6 +24,7 @@
#define KJS_LIST_H
#include "value.h"
+#include "LocalStorage.h"
namespace KJS {
@@ -32,7 +33,7 @@
struct ListImpBase {
int size;
int refCount;
- JSValue** data; // points either to inline or out-of-line buffer
+ LocalStorageEntry* data; // points either to inline or out-of-line buffer
};
class ListIterator;
@@ -111,6 +112,9 @@
*/
JSValue *at(int i) const;
+ // As above but omits the range change
+ JSValue* atUnchecked(int i) const { return _impBase->data[i].val.valueVal; }
+
/**
* Equivalent to at.
*/
@@ -136,12 +140,11 @@
void deref() { if (--_impBase->refCount == 0) release(); }
void release();
- void markValues();
};
inline JSValue* List::at(int i) const {
if (i < _impBase->size)
- return _impBase->data[i];
+ return _impBase->data[i].val.valueVal;
else
return jsUndefined();
}
@@ -151,7 +154,7 @@
int newSize = size + 1;
if (newSize < inlineListValuesSize) {
// Can just write to the inline buffer
- _impBase->data[size] = val;
+ _impBase->data[size].val.valueVal = val;
_impBase->size = newSize;
} else {
appendSlowCase(val);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic