diff --git a/mozilla/js2/src/epimetheus.cpp b/mozilla/js2/src/epimetheus.cpp index 4df51eeb821..4fcd5b55397 100644 --- a/mozilla/js2/src/epimetheus.cpp +++ b/mozilla/js2/src/epimetheus.cpp @@ -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 { diff --git a/mozilla/js2/src/js2array.cpp b/mozilla/js2/src/js2array.cpp index f7c45597e4f..ada5138ee5b 100644 --- a/mozilla/js2/src/js2array.cpp +++ b/mozilla/js2/src/js2array.cpp @@ -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)); diff --git a/mozilla/js2/src/js2date.cpp b/mozilla/js2/src/js2date.cpp index 2b271807d51..6f974065fa5 100644 --- a/mozilla/js2/src/js2date.cpp +++ b/mozilla/js2/src/js2date.cpp @@ -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()); } diff --git a/mozilla/js2/src/js2engine.cpp b/mozilla/js2/src/js2engine.cpp index 5554cae88e4..c75bbf5f819 100644 --- a/mozilla/js2/src/js2engine.cpp +++ b/mozilla/js2/src/js2engine.cpp @@ -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 diff --git a/mozilla/js2/src/js2engine.h b/mozilla/js2/src/js2engine.h index ec5d96e7573..8f3b68683b1 100644 --- a/mozilla/js2/src/js2engine.h +++ b/mozilla/js2/src/js2engine.h @@ -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); - - - } } diff --git a/mozilla/js2/src/js2metadata.cpp b/mozilla/js2/src/js2metadata.cpp index e75f21963bc..4f30c9073eb 100644 --- a/mozilla/js2/src/js2metadata.cpp +++ b/mozilla/js2/src/js2metadata.cpp @@ -2166,7 +2166,7 @@ doUnary: bCon->addString(checked_cast(e->field)->str, p->pos); break; case ExprNode::number: - bCon->addString(numberToString(&(checked_cast(e->field))->value), p->pos); + bCon->addString(engine->numberToString(&(checked_cast(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)); } diff --git a/mozilla/js2/src/js2number.cpp b/mozilla/js2/src/js2number.cpp index 8194e0cc181..466847e4305 100644 --- a/mozilla/js2/src/js2number.cpp +++ b/mozilla/js2/src/js2number.cpp @@ -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(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) \ diff --git a/mozilla/js2/src/js2string.cpp b/mozilla/js2/src/js2string.cpp index f2fe5db1795..1eafce73ae4 100644 --- a/mozilla/js2/src/js2string.cpp +++ b/mozilla/js2/src/js2string.cpp @@ -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; }