Reviewers: Michael Starzinger,

Description:
Merged r11533 into 3.8 branch.

Properly set ElementsKind of empty FAST_DOUBLE_ELEMENTS arrays when
transitioning.

[email protected]
BUG=chromium:117409


Please review this at https://chromiumcodereview.appspot.com/10815034/

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

Affected files:
  M src/builtins.cc
  M src/objects-printer.cc
  M src/version.cc
  A + test/mjsunit/regress/regress-117409.js


Index: src/builtins.cc
diff --git a/src/builtins.cc b/src/builtins.cc
index 90a8d3e1b843caa04ec42c00cc04457c13364c5c..fd6e00076ce029164dbce4bf885b570a19b8d170 100644
--- a/src/builtins.cc
+++ b/src/builtins.cc
@@ -443,12 +443,19 @@ static inline MaybeObject* EnsureJSArrayWithWritableFastElements(
   HeapObject* elms = array->elements();
   Map* map = elms->map();
   if (map == heap->fixed_array_map()) {
-    if (args == NULL || !array->HasFastSmiOnlyElements()) {
+    if (array->HasFastElements()) return elms;
+    if (args == NULL) {
+      if (array->HasFastDoubleElements()) {
+        ASSERT(elms == heap->empty_fixed_array());
+        MaybeObject* maybe_transition =
+            array->TransitionElementsKind(FAST_ELEMENTS);
+        if (maybe_transition->IsFailure()) return maybe_transition;
+      }
       return elms;
     }
   } else if (map == heap->fixed_cow_array_map()) {
MaybeObject* maybe_writable_result = array->EnsureWritableFastElements();
-    if (args == NULL || !array->HasFastSmiOnlyElements() ||
+    if (args == NULL || array->HasFastElements() ||
         maybe_writable_result->IsFailure()) {
       return maybe_writable_result;
     }
Index: src/objects-printer.cc
diff --git a/src/objects-printer.cc b/src/objects-printer.cc
index eca9bab822836873e007e05f514802ff57c5cfe7..a3c6a30c493c30ee2e2b1dbc4559a968c69627c5 100644
--- a/src/objects-printer.cc
+++ b/src/objects-printer.cc
@@ -325,14 +325,16 @@ void JSObject::PrintElements(FILE* out) {
     }
     case FAST_DOUBLE_ELEMENTS: {
       // Print in array notation for non-sparse arrays.
-      FixedDoubleArray* p = FixedDoubleArray::cast(elements());
-      for (int i = 0; i < p->length(); i++) {
-        if (p->is_the_hole(i)) {
-          PrintF(out, "   %d: <the hole>", i);
-        } else {
-          PrintF(out, "   %d: %g", i, p->get_scalar(i));
+      if (elements()->length() > 0) {
+        FixedDoubleArray* p = FixedDoubleArray::cast(elements());
+        for (int i = 0; i < p->length(); i++) {
+          if (p->is_the_hole(i)) {
+            PrintF(out, "   %d: <the hole>", i);
+          } else {
+            PrintF(out, "   %d: %g", i, p->get_scalar(i));
+          }
+          PrintF(out, "\n");
         }
-        PrintF(out, "\n");
       }
       break;
     }
Index: src/version.cc
diff --git a/src/version.cc b/src/version.cc
index f40cfd825b73b7a879e9d8bece44eaa44be89729..e1ec2a612c74b73a84bb1b868a119400bf31b43b 100644
--- a/src/version.cc
+++ b/src/version.cc
@@ -35,7 +35,7 @@
 #define MAJOR_VERSION     3
 #define MINOR_VERSION     8
 #define BUILD_NUMBER      9
-#define PATCH_LEVEL       25
+#define PATCH_LEVEL       26
 // Use 1 for candidates and 0 otherwise.
 // (Boolean macro values are not supported by all preprocessors.)
 #define IS_CANDIDATE_VERSION 0
Index: test/mjsunit/regress/regress-117409.js
diff --git a/test/mjsunit/regress/regress-109195.js b/test/mjsunit/regress/regress-117409.js
similarity index 67%
copy from test/mjsunit/regress/regress-109195.js
copy to test/mjsunit/regress/regress-117409.js
index 97538aa1674357798c1083e98cdca800c456e0a5..9222191ae67f4e69be0abd95cf113b091e4cb573 100644
--- a/test/mjsunit/regress/regress-109195.js
+++ b/test/mjsunit/regress/regress-117409.js
@@ -25,41 +25,28 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-// Flags: --expose-debug-as debug
-var Debug = debug.Debug;
+// Flags: --expose-gc

-function listener(event, exec_state, event_data, data) {
-  for (var i = 0, n = exec_state.frameCount(); i < n; i++) {
-    exec_state.frame().scopeCount(i);
-  }
-  exec_state.prepareStep(Debug.StepAction.Continue, 1);
-}
+function KeyedStoreIC(a) { a[0] = Math.E; }

-Debug.setListener(listener);
+// Create literal with a fast double elements backing store
+var literal = [1.2];

-var F = function () {
-  1, function () {
-    var d = 0;
-    (function () { d; });
-    debugger;
-  }();
-};
+// Specialize the IC for fast double elements
+KeyedStoreIC(literal);
+KeyedStoreIC(literal);

-var src = "(" + F.toString() + ")()";
-eval(src);
+// Trruncate array to 0 elements, at which point backing store will be replaced
+// with empty fixed array.
+literal.length = 0;

-Function.prototype.__defineGetter__("f", function () {
-  debugger;
-  return 0;
-});
+// ArrayPush built-in will replace empty fixed array backing store with 19
+// elements fixed array backing store. This leads to a mismatch between the map +// and the backing store. Debug mode will crash here in set_elements accessor.
+literal.push(Math.E, Math.E);

-var G = function () {
-  1, function () {
-    var d = 0;
-    (function () { d; });
-    debugger;
-  }['f'];
-};
+// Corrupt the backing store!
+KeyedStoreIC(literal);

-var src = "(" + G.toString() + ")()";
-eval(src);
+// Release mode will crash here when trying to visit parts of E as pointers.
+gc();


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

Reply via email to