Fixed bad delete of string ptrs in libraries.

git-svn-id: svn://10.0.0.236/trunk@133340 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
rogerl%netscape.com 2002-11-07 23:46:02 +00:00
parent 43076e4c08
commit 8318629a33
8 changed files with 56 additions and 93 deletions

View File

@ -175,6 +175,9 @@ static bool processArgs(int argc, char **argv, int *result)
stdOut << "unrecognized command line switch\n";
i = argc;
break;
case 'i':
doInteractive = true;
break;
case 'f':
{
try {

View File

@ -91,7 +91,6 @@ js2val Array_Constructor(JS2Metadata *meta, const js2val /*thisValue*/, js2val *
setLength(meta, arrInst, 1);
Multiname mn(meta->toString((int32)0), meta->publicNamespace);
meta->writeDynamicProperty(arrInst, &mn, true, argv[0], RunPhase);
delete mn.name;
}
}
else {
@ -100,7 +99,6 @@ js2val Array_Constructor(JS2Metadata *meta, const js2val /*thisValue*/, js2val *
for (uint32 i = 0; i < argc; i++) {
mn.name = meta->toString(i);
meta->writeDynamicProperty(arrInst, &mn, true, argv[i], RunPhase);
delete mn.name;
}
}
}
@ -123,13 +121,12 @@ static js2val Array_toString(JS2Metadata *meta, const js2val thisValue, js2val *
js2val result;
String *s = new String();
for (uint32 i = 0; i < length; i++) {
mn.name = numberToString(i);
mn.name = meta->engine->numberToString(i);
if (meta->readDynamicProperty(arrInst, &mn, &lookup, RunPhase, &result)
&& !JS2VAL_IS_UNDEFINED(result))
s->append(*meta->toString(result));
if (i < (length - 1))
s->append(widenCString(","));
delete mn.name;
}
result = meta->engine->allocString(s);
delete s;
@ -154,13 +151,12 @@ static js2val Array_toSource(JS2Metadata *meta, const js2val thisValue, js2val *
js2val result;
String *s = new String();
for (uint32 i = 0; i < length; i++) {
mn.name = numberToString(i);
mn.name = meta->engine->numberToString(i);
if (meta->readDynamicProperty(arrInst, &mn, &lookup, RunPhase, &result)
&& !JS2VAL_IS_UNDEFINED(result))
s->append(*meta->toString(result));
if (i < (length - 1))
s->append(widenCString(","));
delete mn.name;
}
s->append(widenCString("]"));
result = meta->engine->allocString(s);
@ -178,9 +174,8 @@ static js2val Array_push(JS2Metadata *meta, const js2val thisValue, js2val *argv
Multiname mn(NULL, meta->publicNamespace);
for (uint32 i = 0; i < argc; i++) {
mn.name = numberToString(i + length);
mn.name = meta->engine->numberToString(i + length);
meta->writeDynamicProperty(thisObj, &mn, true, argv[i], RunPhase);
delete mn.name;
}
return setLength(meta, thisObj, length + argc);
}
@ -192,14 +187,13 @@ static js2val Array_pop(JS2Metadata *meta, const js2val thisValue, js2val * /*ar
uint32 length = getLength(meta, thisObj);
if (length > 0) {
Multiname mn(numberToString(length - 1), meta->publicNamespace);
Multiname mn(meta->engine->numberToString(length - 1), meta->publicNamespace);
LookupKind lookup(false, JS2VAL_NULL);
js2val result = JS2VAL_UNDEFINED;
bool deleteResult;
meta->readDynamicProperty(thisObj, &mn, &lookup, RunPhase, &result);
meta->deleteProperty(thisValue, &mn, &lookup, RunPhase, &deleteResult);
setLength(meta, thisObj, length - 1);
delete mn.name;
return result;
}
else
@ -219,22 +213,19 @@ js2val Array_concat(JS2Metadata *meta, const js2val thisValue, js2val *argv, uin
do {
if (meta->objectType(E) != meta->arrayClass) {
mn.name = numberToString(n++);
mn.name = meta->engine->numberToString(n++);
meta->writeDynamicProperty(A, &mn, true, E, RunPhase);
delete mn.name;
}
else {
ASSERT(JS2VAL_IS_OBJECT(thisValue));
JS2Object *arrObj = JS2VAL_TO_OBJECT(E);
uint32 length = getLength(meta, arrObj);
for (uint32 k = 0; k < length; k++) {
mn.name = numberToString(k);
mn.name = meta->engine->numberToString(k);
js2val rval = JS2VAL_UNDEFINED;
meta->readDynamicProperty(arrObj, &mn, &lookup, RunPhase, &rval);
delete mn.name;
mn.name = numberToString(n++);
mn.name = meta->engine->numberToString(n++);
meta->writeDynamicProperty(A, &mn, true, rval, RunPhase);
delete mn.name;
}
}
E = argv[i++];
@ -261,14 +252,13 @@ static js2val Array_join(JS2Metadata *meta, const js2val thisValue, js2val *argv
for (uint32 k = 0; k < length; k++) {
js2val result = JS2VAL_UNDEFINED;
mn.name = numberToString(k);
mn.name = meta->engine->numberToString(k);
meta->readDynamicProperty(thisObj, &mn, &lookup, RunPhase, &result);
if (!JS2VAL_IS_UNDEFINED(result) && !JS2VAL_IS_NULL(result))
*S += *meta->toString(result);
if (k < (length - 1))
*S += *separator;
delete mn.name;
}
return meta->engine->allocString(S);
@ -290,8 +280,8 @@ static js2val Array_reverse(JS2Metadata *meta, const js2val thisValue, js2val *
bool deleteResult;
js2val result1 = JS2VAL_UNDEFINED;
js2val result2 = JS2VAL_UNDEFINED;
mn1.name = numberToString(k);
mn2.name = numberToString(length - k - 1);
mn1.name = meta->engine->numberToString(k);
mn2.name = meta->engine->numberToString(length - k - 1);
if (meta->hasOwnProperty(thisObj, mn1.name)) {
if (meta->hasOwnProperty(thisObj, mn2.name)) {
@ -317,8 +307,6 @@ static js2val Array_reverse(JS2Metadata *meta, const js2val thisValue, js2val *
meta->deleteProperty(thisValue, &mn2, &lookup, RunPhase, &deleteResult);
}
}
delete mn1.name;
delete mn2.name;
}
return thisValue;
@ -340,13 +328,12 @@ static js2val Array_shift(JS2Metadata *meta, const js2val thisValue, js2val * /*
LookupKind lookup(false, JS2VAL_NULL);
js2val result;
bool deleteResult;
mn1.name = numberToString((int32)0);
mn1.name = meta->engine->numberToString((int32)0);
meta->readDynamicProperty(thisObj, &mn1, &lookup, RunPhase, &result);
delete mn1.name;
for (uint32 k = 1; k < length; k++) {
mn1.name = numberToString(k);
mn2.name = numberToString(k - 1);
mn1.name = meta->engine->numberToString(k);
mn2.name = meta->engine->numberToString(k - 1);
if (meta->hasOwnProperty(thisObj, mn1.name)) {
meta->readDynamicProperty(thisObj, &mn1, &lookup, RunPhase, &result);
@ -354,13 +341,10 @@ static js2val Array_shift(JS2Metadata *meta, const js2val thisValue, js2val * /*
}
else
meta->deleteProperty(thisValue, &mn2, &lookup, RunPhase, &deleteResult);
delete mn1.name;
delete mn2.name;
}
mn1.name = numberToString(length - 1);
mn1.name = meta->engine->numberToString(length - 1);
meta->deleteProperty(thisValue, &mn2, &lookup, RunPhase, &deleteResult);
delete mn1.name;
setLength(meta, thisObj, length - 1);
return result;
}
@ -419,17 +403,15 @@ static js2val Array_slice(JS2Metadata *meta, const js2val thisValue, js2val *arg
LookupKind lookup(false, JS2VAL_NULL);
uint32 n = 0;
while (start < end) {
mn1.name = numberToString(start);
mn1.name = meta->engine->numberToString(start);
if (meta->hasOwnProperty(thisObj, mn1.name)) {
js2val rval;
mn2.name = numberToString(n);
mn2.name = meta->engine->numberToString(n);
meta->readDynamicProperty(thisObj, &mn1, &lookup, RunPhase, &rval);
meta->writeDynamicProperty(A, &mn2, true, rval, RunPhase);
delete mn2.name;
}
n++;
start++;
delete mn1.name;
}
setLength(meta, A, n);
return result;
@ -574,17 +556,15 @@ static js2val Array_sort(JS2Metadata *meta, const js2val thisValue, js2val *argv
Multiname mn(NULL, meta->publicNamespace);
LookupKind lookup(false, JS2VAL_NULL);
for (i = 0; i < length; i++) {
mn.name = numberToString(i);
mn.name = meta->engine->numberToString(i);
meta->readDynamicProperty(thisObj, &mn, &lookup, RunPhase, &vec[i]);
delete mn.name;
}
js_qsort(vec, length, &ca);
for (i = 0; i < length; i++) {
mn.name = numberToString(i);
mn.name = meta->engine->numberToString(i);
meta->writeDynamicProperty(thisObj, &mn, true, vec[i], RunPhase);
delete mn.name;
}
delete[] mn.name;
}
@ -633,15 +613,13 @@ static js2val Array_splice(JS2Metadata *meta, const js2val thisValue, js2val *ar
Multiname mn2(NULL, meta->publicNamespace);
LookupKind lookup(false, JS2VAL_NULL);
for (k = 0; k < deleteCount; k++) {
mn1.name = numberToString(start + k);
mn1.name = meta->engine->numberToString(start + k);
if (meta->hasOwnProperty(thisObj, mn1.name)) {
js2val rval;
mn2.name = numberToString(k);
mn2.name = meta->engine->numberToString(k);
meta->readDynamicProperty(thisObj, &mn1, &lookup, RunPhase, &rval);
meta->writeDynamicProperty(A, &mn2, true, rval, RunPhase);
delete mn2.name;
}
delete mn1.name;
}
setLength(meta, A, deleteCount);
@ -649,8 +627,8 @@ static js2val Array_splice(JS2Metadata *meta, const js2val thisValue, js2val *ar
if (newItemCount < deleteCount) {
bool deleteResult;
for (k = start; k < (length - deleteCount); k++) {
mn1.name = numberToString(k + deleteCount);
mn2.name = numberToString(k + newItemCount);
mn1.name = meta->engine->numberToString(k + deleteCount);
mn2.name = meta->engine->numberToString(k + newItemCount);
if (meta->hasOwnProperty(thisObj, mn1.name)) {
js2val rval;
meta->readDynamicProperty(thisObj, &mn1, &lookup, RunPhase, &rval);
@ -658,21 +636,18 @@ static js2val Array_splice(JS2Metadata *meta, const js2val thisValue, js2val *ar
}
else
meta->deleteProperty(thisValue, &mn2, &lookup, RunPhase, &deleteResult);
delete mn1.name;
delete mn2.name;
}
for (k = length; k > (length - deleteCount + newItemCount); k--) {
mn1.name = numberToString(k - 1);
mn1.name = meta->engine->numberToString(k - 1);
meta->deleteProperty(thisValue, &mn1, &lookup, RunPhase, &deleteResult);
delete mn1.name;
}
}
else {
if (newItemCount > deleteCount) {
for (k = length - deleteCount; k > start; k--) {
bool deleteResult;
mn1.name = numberToString(k + deleteCount - 1);
mn1.name = numberToString(k + newItemCount - 1);
mn1.name = meta->engine->numberToString(k + deleteCount - 1);
mn2.name = meta->engine->numberToString(k + newItemCount - 1);
if (meta->hasOwnProperty(thisObj, mn1.name)) {
js2val rval;
meta->readDynamicProperty(thisObj, &mn1, &lookup, RunPhase, &rval);
@ -680,16 +655,13 @@ static js2val Array_splice(JS2Metadata *meta, const js2val thisValue, js2val *ar
}
else
meta->deleteProperty(thisValue, &mn2, &lookup, RunPhase, &deleteResult);
delete mn1.name;
delete mn2.name;
}
}
}
k = start;
for (uint32 i = 2; i < argc; i++) {
mn1.name = numberToString(k++);
mn1.name = meta->engine->numberToString(k++);
meta->writeDynamicProperty(A, &mn2, true, argv[i], RunPhase);
delete mn1.name;
}
setLength(meta, thisObj, (length - deleteCount + newItemCount));
@ -712,8 +684,8 @@ static js2val Array_unshift(JS2Metadata *meta, const js2val thisValue, js2val *a
for (k = length; k > 0; k--) {
bool deleteResult;
mn1.name = numberToString(k - 1);
mn2.name = numberToString(k + argc - 1);
mn1.name = meta->engine->numberToString(k - 1);
mn2.name = meta->engine->numberToString(k + argc - 1);
if (meta->hasOwnProperty(thisObj, mn1.name)) {
js2val rval;
meta->readDynamicProperty(thisObj, &mn1, &lookup, RunPhase, &rval);
@ -721,14 +693,11 @@ static js2val Array_unshift(JS2Metadata *meta, const js2val thisValue, js2val *a
}
else
meta->deleteProperty(thisValue, &mn2, &lookup, RunPhase, &deleteResult);
delete mn1.name;
delete mn2.name;
}
for (k = 0; k < argc; k++) {
mn1.name = numberToString(k);
mn1.name = meta->engine->numberToString(k);
meta->writeDynamicProperty(thisObj, &mn1, true, argv[k], RunPhase);
delete mn1.name;
}
setLength(meta, thisObj, (length + argc));

View File

@ -1075,7 +1075,7 @@ static js2val Date_toSource(JS2Metadata *meta, const js2val thisValue, js2val *
{
StringFormatter buf;
float64 *date = Date_getProlog(meta, thisValue);
buf << "(new Date(" << *numberToString(date) << "))";
buf << "(new Date(" << *meta->engine->numberToString(date) << "))";
return meta->engine->allocString(buf.getString());
}

View File

@ -124,11 +124,9 @@ namespace MetaData {
} while (hndlr->mActivation != curAct);
if (jsx.hasKind(Exception::userException)) // snatch the exception before the stack gets clobbered
x = pop();
/*
switch interpreter to execution of the activation
XXX will need more (argument frame handling etc.)
*/
activationStackTop = prev;
activationStackTop = prev; // need the one before the target function to
// be at the top, because of postincrement
bCon = curAct->bCon;
}
else {
if (jsx.hasKind(Exception::userException))
@ -160,7 +158,6 @@ namespace MetaData {
#endif
sp = hndlr->mStackTop;
pc = hndlr->mPC;
bCon = hndlr->mActivation->bCon;
push(x);
}
else
@ -251,19 +248,19 @@ namespace MetaData {
}
// Convert an integer to a string
String *numberToString(int32 i)
String *JS2Engine::numberToString(int32 i)
{
char buf[dtosStandardBufferSize];
const char *chrp = doubleToStr(buf, dtosStandardBufferSize, i, dtosStandard, 0);
return new JavaScript::String(widenCString(chrp));
return allocStringPtr(&meta->world.identifiers[chrp]);
}
// Convert a double to a string
String *numberToString(float64 *number)
String *JS2Engine::numberToString(float64 *number)
{
char buf[dtosStandardBufferSize];
const char *chrp = doubleToStr(buf, dtosStandardBufferSize, *number, dtosStandard, 0);
return new JavaScript::String(widenCString(chrp));
return allocStringPtr(&meta->world.identifiers[chrp]);
}
// x is a Number, validate that it has no fractional component

View File

@ -187,6 +187,9 @@ public:
String *allocStringPtr(const String *s);
String *allocStringPtr(const char *s);
String *numberToString(float64 *number);
String *numberToString(int32 i);
js2val allocFloat(float32 x);
js2val pushFloat(float32 x) { js2val retval = allocFloat(x); push(retval); return retval; }
@ -293,11 +296,6 @@ public:
};
String *numberToString(float64 *number);
String *numberToString(int32 i);
}
}

View File

@ -2166,7 +2166,7 @@ doUnary:
bCon->addString(checked_cast<StringExprNode *>(e->field)->str, p->pos);
break;
case ExprNode::number:
bCon->addString(numberToString(&(checked_cast<NumberExprNode *>(e->field))->value), p->pos);
bCon->addString(engine->numberToString(&(checked_cast<NumberExprNode *>(e->field))->value), p->pos);
break;
default:
NOT_REACHED("bad field name");
@ -3702,23 +3702,23 @@ deleteClassProperty:
if (JS2VAL_IS_BOOLEAN(x))
return (JS2VAL_TO_BOOLEAN(x)) ? engine->true_StringAtom : engine->false_StringAtom;
if (JS2VAL_IS_INT(x))
return numberToString(JS2VAL_TO_INT(x));
return engine->numberToString(JS2VAL_TO_INT(x));
if (JS2VAL_IS_LONG(x)) {
float64 d;
JSLL_L2D(d, *JS2VAL_TO_LONG(x));
return numberToString(&d);
return engine->numberToString(&d);
}
if (JS2VAL_IS_ULONG(x)) {
float64 d;
JSLL_UL2D(d, *JS2VAL_TO_ULONG(x));
return numberToString(&d);
return engine->numberToString(&d);
}
if (JS2VAL_IS_FLOAT(x)) {
float64 d = *JS2VAL_TO_FLOAT(x);
return numberToString(&d);
return engine->numberToString(&d);
}
if (JS2VAL_IS_DOUBLE(x))
return numberToString(JS2VAL_TO_DOUBLE(x));
return engine->numberToString(JS2VAL_TO_DOUBLE(x));
return toString(toPrimitive(x));
}

View File

@ -72,7 +72,7 @@ namespace MetaData {
if (meta->objectType(thisValue) != meta->numberClass)
meta->reportError(Exception::typeError, "Number.toString called on something other than a number thing", meta->engine->errorPos());
NumberInstance *numInst = checked_cast<NumberInstance *>(JS2VAL_TO_OBJECT(thisValue));
return meta->engine->allocString(numberToString(&numInst->mValue));
return STRING_TO_JS2VAL(meta->engine->numberToString(&numInst->mValue));
}
#define MAKE_INSTANCE_VARIABLE(name, type) \

View File

@ -168,7 +168,7 @@ static js2val String_match(JS2Metadata *meta, const js2val thisValue, js2val *ar
else
lastIndex = match->endIndex;
js2val matchStr = meta->engine->allocString(JS2VAL_TO_STRING(S)->substr(toUInt32(match->startIndex), toUInt32(match->endIndex) - match->startIndex));
Multiname mname(&meta->world.identifiers[*meta->toString(index)], meta->publicNamespace);
Multiname mname(&meta->world.identifiers[*meta->engine->numberToString(index)], meta->publicNamespace);
index++;
meta->writeDynamicProperty(A, &mname, true, matchStr, RunPhase);
}
@ -232,7 +232,7 @@ static const String interpretDollar(JS2Metadata *meta, const String *replaceStr,
* in the same manner as in String.prototype.match, including the update of searchValue.lastIndex. Let m
* be the number of left capturing parentheses in searchValue (NCapturingParens as specified in section 15.10.2.1).
*
* If searchValue is not a regular expression, let searchString be meta->toString(searchValue) and search string for the first
* If searchValue is not a regular expression, let searchString be toString(searchValue) and search string for the first
* occurrence of searchString. Let m be 0.
*
* If replaceValue is a function, then for each matched substring, call the function with the following m + 3 arguments.
@ -432,9 +432,8 @@ static js2val String_split(JS2Metadata *meta, const js2val thisValue, js2val *ar
strSplitMatch(S, 0, R, z);
if (!z.failure)
return result;
mn.name = meta->toString((int32)0);
mn.name = meta->engine->numberToString((int32)0); // XXX
meta->writeDynamicProperty(A, &mn, true, STRING_TO_JS2VAL(S), RunPhase);
delete mn.name;
return result;
}
@ -443,9 +442,8 @@ static js2val String_split(JS2Metadata *meta, const js2val thisValue, js2val *ar
step11:
if (q == s) {
js2val v = meta->engine->allocString(new String(*S, p, (s - p)));
mn.name = meta->toString(getLength(meta, A));
mn.name = meta->engine->numberToString(getLength(meta, A));
meta->writeDynamicProperty(A, &mn, true, v, RunPhase);
delete mn.name;
return result;
}
MatchResult z;
@ -464,17 +462,15 @@ step11:
}
String *T = meta->engine->allocStringPtr(new String(*S, p, (q - p))); // XXX
js2val v = STRING_TO_JS2VAL(T);
mn.name = meta->toString(getLength(meta, A));
mn.name = meta->engine->numberToString(getLength(meta, A));
meta->writeDynamicProperty(A, &mn, true, v, RunPhase);
delete mn.name;
if (getLength(meta, A) == lim)
return result;
p = e;
for (uint32 i = 0; i < z.capturesCount; i++) {
mn.name = meta->toString(getLength(meta, A));
mn.name = meta->engine->numberToString(getLength(meta, A));
meta->writeDynamicProperty(A, &mn, true, z.captures[i], RunPhase);
delete mn.name;
if (getLength(meta, A) == lim)
return result;
}