Reviewers: Søren Gjesse,

Description:
Fix another message object leak.

Please review this at http://codereview.chromium.org/6269021/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/messages.js
  M test/cctest/test-api.cc


Index: src/messages.js
diff --git a/src/messages.js b/src/messages.js
index 634771524f31b3453ef0678a259e1a4672a11a3a..ec97d9cc2e47fe5748cd3e9430167d4d7378b9e0 100644
--- a/src/messages.js
+++ b/src/messages.js
@@ -82,8 +82,11 @@ function FormatString(format, args) {
   var result = format;
   for (var i = 0; i < args.length; i++) {
     var str;
-    try { str = ToDetailString(args[i]); }
-    catch (e) { str = "#<error>"; }
+    try {
+      str = ToDetailString(args[i]);
+    } catch (e) {
+      str = "#<error>";
+    }
     result = ArrayJoin.call(StringSplit.call(result, "%" + i), str);
   }
   return result;
@@ -124,7 +127,9 @@ function ToDetailString(obj) {
     var constructor = obj.constructor;
     if (!constructor) return ToStringCheckErrorObject(obj);
     var constructorName = constructor.name;
-    if (!constructorName) return ToStringCheckErrorObject(obj);
+    if (!constructorName || !IS_STRING(constructorName)) {
+      return ToStringCheckErrorObject(obj);
+    }
     return "#<" + GetInstanceName(constructorName) + ">";
   } else {
     return ToStringCheckErrorObject(obj);
Index: test/cctest/test-api.cc
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index 90f499674299768599b7986e8674a487fe54c10f..48dc72e7b3d8fc1159ccbb294cffed54996081ef 100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -2389,6 +2389,11 @@ TEST(APIThrowMessageOverwrittenToString) {
   CompileRun("asdf;");
v8::Handle<Value> string = CompileRun("try { asdf; } catch(e) { e + ''; }");
   CHECK(string->Equals(v8_str("Whoops")));
+  CompileRun("ReferenceError.prototype.constructor = new Object();"
+             "ReferenceError.prototype.constructor.name = 1;"
+             "Number.prototype.toString = function() { return 'Whoops'; };"
+ "ReferenceError.prototype.toString = Object.prototype.toString;");
+  CompileRun("asdf;");
   v8::V8::RemoveMessageListeners(check_message);
 }



--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to