summaryrefslogtreecommitdiff
path: root/deps
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2015-11-18 18:08:24 +0100
committerRod Vagg <rod@vagg.org>2015-12-04 14:42:13 +1100
commitf88b1576e5a53d773f4fa1bfe18db4f2a2057a07 (patch)
tree7181552881ba28cecd1fb3c46b6dcb08bbc21f0a /deps
parent004778e6df266dd6366fc455ac4e6dc3c697e53b (diff)
downloadandroid-node-v8-f88b1576e5a53d773f4fa1bfe18db4f2a2057a07.tar.gz
android-node-v8-f88b1576e5a53d773f4fa1bfe18db4f2a2057a07.tar.bz2
android-node-v8-f88b1576e5a53d773f4fa1bfe18db4f2a2057a07.zip
deps: backport a7e50a5 from upstream v8
PR-URL: https://github.com/nodejs/node-private/pull/6 Reviewed-By: Fedor Indutny <fedor@indutny.com>
Diffstat (limited to 'deps')
-rw-r--r--deps/v8/src/json-stringifier.h62
-rw-r--r--deps/v8/test/mjsunit/regress/regress-crbug-554946.js49
2 files changed, 106 insertions, 5 deletions
diff --git a/deps/v8/src/json-stringifier.h b/deps/v8/src/json-stringifier.h
index 0a4101b7df..3bbfb63a65 100644
--- a/deps/v8/src/json-stringifier.h
+++ b/deps/v8/src/json-stringifier.h
@@ -82,7 +82,8 @@ class BasicJsonStringifier BASE_EMBEDDED {
INLINE(Result SerializeJSArray(Handle<JSArray> object));
INLINE(Result SerializeJSObject(Handle<JSObject> object));
- Result SerializeJSArraySlow(Handle<JSArray> object, uint32_t length);
+ Result SerializeJSArraySlow(Handle<JSArray> object, uint32_t start,
+ uint32_t length);
void SerializeString(Handle<String> object);
@@ -434,8 +435,59 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArray(
uint32_t length = 0;
CHECK(object->length()->ToArrayLength(&length));
builder_.AppendCharacter('[');
- Result result = SerializeJSArraySlow(object, length);
- if (result != SUCCESS) return result;
+ switch (object->GetElementsKind()) {
+ case FAST_SMI_ELEMENTS: {
+ Handle<FixedArray> elements(FixedArray::cast(object->elements()),
+ isolate_);
+ for (uint32_t i = 0; i < length; i++) {
+ if (i > 0) builder_.AppendCharacter(',');
+ SerializeSmi(Smi::cast(elements->get(i)));
+ }
+ break;
+ }
+ case FAST_DOUBLE_ELEMENTS: {
+ // Empty array is FixedArray but not FixedDoubleArray.
+ if (length == 0) break;
+ Handle<FixedDoubleArray> elements(
+ FixedDoubleArray::cast(object->elements()), isolate_);
+ for (uint32_t i = 0; i < length; i++) {
+ if (i > 0) builder_.AppendCharacter(',');
+ SerializeDouble(elements->get_scalar(i));
+ }
+ break;
+ }
+ case FAST_ELEMENTS: {
+ Handle<Object> old_length(object->length(), isolate_);
+ for (uint32_t i = 0; i < length; i++) {
+ if (object->length() != *old_length ||
+ object->GetElementsKind() != FAST_ELEMENTS) {
+ Result result = SerializeJSArraySlow(object, i, length);
+ if (result != SUCCESS) return result;
+ break;
+ }
+ if (i > 0) builder_.AppendCharacter(',');
+ Result result = SerializeElement(
+ isolate_,
+ Handle<Object>(FixedArray::cast(object->elements())->get(i),
+ isolate_),
+ i);
+ if (result == SUCCESS) continue;
+ if (result == UNCHANGED) {
+ builder_.AppendCString("null");
+ } else {
+ return result;
+ }
+ }
+ break;
+ }
+ // The FAST_HOLEY_* cases could be handled in a faster way. They resemble
+ // the non-holey cases except that a lookup is necessary for holes.
+ default: {
+ Result result = SerializeJSArraySlow(object, 0, length);
+ if (result != SUCCESS) return result;
+ break;
+ }
+ }
builder_.AppendCharacter(']');
StackPop();
return SUCCESS;
@@ -443,8 +495,8 @@ BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArray(
BasicJsonStringifier::Result BasicJsonStringifier::SerializeJSArraySlow(
- Handle<JSArray> object, uint32_t length) {
- for (uint32_t i = 0; i < length; i++) {
+ Handle<JSArray> object, uint32_t start, uint32_t length) {
+ for (uint32_t i = start; i < length; i++) {
if (i > 0) builder_.AppendCharacter(',');
Handle<Object> element;
ASSIGN_RETURN_ON_EXCEPTION_VALUE(
diff --git a/deps/v8/test/mjsunit/regress/regress-crbug-554946.js b/deps/v8/test/mjsunit/regress/regress-crbug-554946.js
index ab2e327295..fbb79f61b0 100644
--- a/deps/v8/test/mjsunit/regress/regress-crbug-554946.js
+++ b/deps/v8/test/mjsunit/regress/regress-crbug-554946.js
@@ -10,3 +10,52 @@ for (var i = 0; i < 10; i++) array[i] = i;
array[0] = funky;
assertEquals('["funky",null,null,null,null,null,null,null,null,null]',
JSON.stringify(array));
+
+array = [];
+funky = {
+ get value() { array.length = 1; return "funky"; }
+};
+for (var i = 0; i < 10; i++) array[i] = i;
+array[3] = funky;
+assertEquals('[0,1,2,{"value":"funky"},null,null,null,null,null,null]',
+ JSON.stringify(array));
+
+array = [];
+funky = {
+ get value() { array.pop(); return "funky"; }
+};
+for (var i = 0; i < 10; i++) array[i] = i;
+array[3] = funky;
+assertEquals('[0,1,2,{"value":"funky"},4,5,6,7,8,null]', JSON.stringify(array));
+
+array = [];
+funky = {
+ get value() { delete array[9]; return "funky"; }
+};
+for (var i = 0; i < 10; i++) array[i] = i;
+array[3] = funky;
+assertEquals('[0,1,2,{"value":"funky"},4,5,6,7,8,null]', JSON.stringify(array));
+
+array = [];
+funky = {
+ get value() { delete array[6]; return "funky"; }
+};
+for (var i = 0; i < 10; i++) array[i] = i;
+array[3] = funky;
+assertEquals('[0,1,2,{"value":"funky"},4,5,null,7,8,9]', JSON.stringify(array));
+
+array = [];
+funky = {
+ get value() { array[12] = 12; return "funky"; }
+};
+for (var i = 0; i < 10; i++) array[i] = i;
+array[3] = funky;
+assertEquals('[0,1,2,{"value":"funky"},4,5,6,7,8,9]', JSON.stringify(array));
+
+array = [];
+funky = {
+ get value() { array[10000000] = 12; return "funky"; }
+};
+for (var i = 0; i < 10; i++) array[i] = i;
+array[3] = funky;
+assertEquals('[0,1,2,{"value":"funky"},4,5,6,7,8,9]', JSON.stringify(array));