From 5e272eaaf99e7fa2a8ac538058d9d851309ea498 Mon Sep 17 00:00:00 2001 From: "beard%netscape.com" Date: Tue, 9 May 2000 03:11:54 +0000 Subject: [PATCH] Fixed leaks by changing JSValue::toString()/toNumber() to return JSValue rather than JSValue*. LOAD_STRING now creates a JSString from a String*. --- js/js2/interpreter.cpp | 30 +++++++++++++++++------------- js2/src/interpreter.cpp | 30 +++++++++++++++++------------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/js/js2/interpreter.cpp b/js/js2/interpreter.cpp index fbdf4b517c8d..30ef85341830 100644 --- a/js/js2/interpreter.cpp +++ b/js/js2/interpreter.cpp @@ -303,7 +303,7 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) case LOAD_STRING: { LoadString* ls = static_cast(instruction); - (*registers)[dst(ls)] = JSValue(src1(ls)); + (*registers)[dst(ls)] = JSValue(new JSString(src1(ls))); } break; case BRANCH: @@ -376,25 +376,27 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) break; case ADD: { - // LEAKING like a sieve here because the toXXX are returning pointers - // to possibly new JSValues. - // could get clever here with Functional forms. Arithmetic* add = static_cast(instruction); - if ((*registers)[src1(add)].isString() - || (*registers)[src2(add)].isString()) { - JSValue *s = (*registers)[src1(add)].toString(); - *(s->string) += *((*registers)[src2(add)].toString()->string); - (*registers)[dst(add)] = *s; + JSValue& dest = (*registers)[dst(add)]; + JSValue& r1 = (*registers)[src1(add)]; + JSValue& r2 = (*registers)[src2(add)]; + if (r1.isString() || r2.isString()) { + dest = r1.toString(); + JSString& str1(*dest.string); + JSString& str2(*r2.toString().string); + str1 += str2; } else { - (*registers)[dst(add)] = (*registers)[src1(add)].toNumber()->f64 - + (*registers)[src2(add)].toNumber()->f64; + JSValue num1(r1.toNumber()); + JSValue num2(r2.toNumber()); + dest = num1.f64 + num2.f64; } } break; case SUBTRACT: { + // XXX should use toNumber(). Arithmetic* sub = static_cast(instruction); (*registers)[dst(sub)] = JSValue((*registers)[src1(sub)].f64 - @@ -403,6 +405,7 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) break; case MULTIPLY: { + // XXX should use toNumber(). Arithmetic* mul = static_cast(instruction); (*registers)[dst(mul)] = JSValue((*registers)[src1(mul)].f64 * @@ -411,6 +414,7 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) break; case DIVIDE: { + // XXX should use toNumber(). Arithmetic* div = static_cast(instruction); (*registers)[dst(div)] = JSValue((*registers)[src1(div)].f64 / @@ -435,13 +439,13 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) case NEGATE: { Negate* neg = static_cast(instruction); - (*registers)[dst(neg)] = JSValue(-(*registers)[src1(neg)].toNumber()->f64); + (*registers)[dst(neg)] = JSValue(-(*registers)[src1(neg)].toNumber().f64); } break; case POSATE: { Posate* pos = static_cast(instruction); - (*registers)[dst(pos)] = *(*registers)[src1(pos)].toNumber(); + (*registers)[dst(pos)] = (*registers)[src1(pos)].toNumber(); } break; case NOT: diff --git a/js2/src/interpreter.cpp b/js2/src/interpreter.cpp index fbdf4b517c8d..30ef85341830 100644 --- a/js2/src/interpreter.cpp +++ b/js2/src/interpreter.cpp @@ -303,7 +303,7 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) case LOAD_STRING: { LoadString* ls = static_cast(instruction); - (*registers)[dst(ls)] = JSValue(src1(ls)); + (*registers)[dst(ls)] = JSValue(new JSString(src1(ls))); } break; case BRANCH: @@ -376,25 +376,27 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) break; case ADD: { - // LEAKING like a sieve here because the toXXX are returning pointers - // to possibly new JSValues. - // could get clever here with Functional forms. Arithmetic* add = static_cast(instruction); - if ((*registers)[src1(add)].isString() - || (*registers)[src2(add)].isString()) { - JSValue *s = (*registers)[src1(add)].toString(); - *(s->string) += *((*registers)[src2(add)].toString()->string); - (*registers)[dst(add)] = *s; + JSValue& dest = (*registers)[dst(add)]; + JSValue& r1 = (*registers)[src1(add)]; + JSValue& r2 = (*registers)[src2(add)]; + if (r1.isString() || r2.isString()) { + dest = r1.toString(); + JSString& str1(*dest.string); + JSString& str2(*r2.toString().string); + str1 += str2; } else { - (*registers)[dst(add)] = (*registers)[src1(add)].toNumber()->f64 - + (*registers)[src2(add)].toNumber()->f64; + JSValue num1(r1.toNumber()); + JSValue num2(r2.toNumber()); + dest = num1.f64 + num2.f64; } } break; case SUBTRACT: { + // XXX should use toNumber(). Arithmetic* sub = static_cast(instruction); (*registers)[dst(sub)] = JSValue((*registers)[src1(sub)].f64 - @@ -403,6 +405,7 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) break; case MULTIPLY: { + // XXX should use toNumber(). Arithmetic* mul = static_cast(instruction); (*registers)[dst(mul)] = JSValue((*registers)[src1(mul)].f64 * @@ -411,6 +414,7 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) break; case DIVIDE: { + // XXX should use toNumber(). Arithmetic* div = static_cast(instruction); (*registers)[dst(div)] = JSValue((*registers)[src1(div)].f64 / @@ -435,13 +439,13 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) case NEGATE: { Negate* neg = static_cast(instruction); - (*registers)[dst(neg)] = JSValue(-(*registers)[src1(neg)].toNumber()->f64); + (*registers)[dst(neg)] = JSValue(-(*registers)[src1(neg)].toNumber().f64); } break; case POSATE: { Posate* pos = static_cast(instruction); - (*registers)[dst(pos)] = *(*registers)[src1(pos)].toNumber(); + (*registers)[dst(pos)] = (*registers)[src1(pos)].toNumber(); } break; case NOT: