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