libv8 3.10.8.0 → 3.11.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +10 -3
- data/ext/libv8/compiler.rb +46 -0
- data/ext/libv8/extconf.rb +5 -1
- data/ext/libv8/make.rb +13 -0
- data/lib/libv8/version.rb +1 -1
- data/patches/add-freebsd9-and-freebsd10-to-gyp-GetFlavor.patch +11 -0
- data/patches/src_platform-freebsd.cc.patch +10 -0
- data/vendor/v8/ChangeLog +124 -0
- data/vendor/v8/DEPS +27 -0
- data/vendor/v8/Makefile +7 -0
- data/vendor/v8/SConstruct +15 -2
- data/vendor/v8/build/common.gypi +129 -157
- data/vendor/v8/build/gyp_v8 +11 -25
- data/vendor/v8/build/standalone.gypi +9 -3
- data/vendor/v8/include/v8.h +5 -3
- data/vendor/v8/src/SConscript +1 -0
- data/vendor/v8/src/api.cc +4 -33
- data/vendor/v8/src/api.h +2 -2
- data/vendor/v8/src/arm/builtins-arm.cc +5 -4
- data/vendor/v8/src/arm/code-stubs-arm.cc +21 -14
- data/vendor/v8/src/arm/codegen-arm.cc +2 -2
- data/vendor/v8/src/arm/debug-arm.cc +3 -1
- data/vendor/v8/src/arm/full-codegen-arm.cc +3 -102
- data/vendor/v8/src/arm/ic-arm.cc +30 -33
- data/vendor/v8/src/arm/lithium-arm.cc +20 -7
- data/vendor/v8/src/arm/lithium-arm.h +10 -4
- data/vendor/v8/src/arm/lithium-codegen-arm.cc +106 -60
- data/vendor/v8/src/arm/macro-assembler-arm.cc +49 -39
- data/vendor/v8/src/arm/macro-assembler-arm.h +5 -4
- data/vendor/v8/src/arm/regexp-macro-assembler-arm.cc +115 -55
- data/vendor/v8/src/arm/regexp-macro-assembler-arm.h +7 -6
- data/vendor/v8/src/arm/simulator-arm.h +6 -6
- data/vendor/v8/src/arm/stub-cache-arm.cc +64 -19
- data/vendor/v8/src/array.js +7 -3
- data/vendor/v8/src/ast.cc +11 -6
- data/vendor/v8/src/bootstrapper.cc +9 -11
- data/vendor/v8/src/builtins.cc +61 -31
- data/vendor/v8/src/code-stubs.cc +23 -9
- data/vendor/v8/src/code-stubs.h +1 -0
- data/vendor/v8/src/codegen.h +3 -3
- data/vendor/v8/src/compiler.cc +1 -1
- data/vendor/v8/src/contexts.h +2 -18
- data/vendor/v8/src/d8.cc +94 -93
- data/vendor/v8/src/d8.h +1 -1
- data/vendor/v8/src/debug-agent.cc +3 -3
- data/vendor/v8/src/debug.cc +41 -1
- data/vendor/v8/src/debug.h +50 -0
- data/vendor/v8/src/elements-kind.cc +134 -0
- data/vendor/v8/src/elements-kind.h +210 -0
- data/vendor/v8/src/elements.cc +356 -190
- data/vendor/v8/src/elements.h +36 -28
- data/vendor/v8/src/factory.cc +44 -4
- data/vendor/v8/src/factory.h +11 -7
- data/vendor/v8/src/flag-definitions.h +3 -0
- data/vendor/v8/src/frames.h +3 -0
- data/vendor/v8/src/full-codegen.cc +2 -1
- data/vendor/v8/src/func-name-inferrer.h +2 -0
- data/vendor/v8/src/globals.h +3 -0
- data/vendor/v8/src/heap-inl.h +16 -4
- data/vendor/v8/src/heap.cc +38 -32
- data/vendor/v8/src/heap.h +3 -17
- data/vendor/v8/src/hydrogen-instructions.cc +28 -5
- data/vendor/v8/src/hydrogen-instructions.h +142 -44
- data/vendor/v8/src/hydrogen.cc +160 -55
- data/vendor/v8/src/hydrogen.h +2 -0
- data/vendor/v8/src/ia32/assembler-ia32.h +3 -0
- data/vendor/v8/src/ia32/builtins-ia32.cc +5 -4
- data/vendor/v8/src/ia32/code-stubs-ia32.cc +22 -16
- data/vendor/v8/src/ia32/codegen-ia32.cc +2 -2
- data/vendor/v8/src/ia32/debug-ia32.cc +29 -2
- data/vendor/v8/src/ia32/full-codegen-ia32.cc +8 -101
- data/vendor/v8/src/ia32/ic-ia32.cc +23 -19
- data/vendor/v8/src/ia32/lithium-codegen-ia32.cc +126 -80
- data/vendor/v8/src/ia32/lithium-codegen-ia32.h +2 -1
- data/vendor/v8/src/ia32/lithium-ia32.cc +15 -9
- data/vendor/v8/src/ia32/lithium-ia32.h +14 -6
- data/vendor/v8/src/ia32/macro-assembler-ia32.cc +50 -40
- data/vendor/v8/src/ia32/macro-assembler-ia32.h +5 -4
- data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.cc +113 -43
- data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.h +9 -4
- data/vendor/v8/src/ia32/simulator-ia32.h +4 -4
- data/vendor/v8/src/ia32/stub-cache-ia32.cc +52 -14
- data/vendor/v8/src/ic.cc +77 -20
- data/vendor/v8/src/ic.h +18 -2
- data/vendor/v8/src/incremental-marking-inl.h +21 -5
- data/vendor/v8/src/incremental-marking.cc +35 -8
- data/vendor/v8/src/incremental-marking.h +12 -3
- data/vendor/v8/src/isolate.cc +12 -2
- data/vendor/v8/src/isolate.h +1 -1
- data/vendor/v8/src/jsregexp.cc +66 -26
- data/vendor/v8/src/jsregexp.h +60 -31
- data/vendor/v8/src/list-inl.h +8 -0
- data/vendor/v8/src/list.h +3 -0
- data/vendor/v8/src/lithium.cc +5 -2
- data/vendor/v8/src/liveedit.cc +57 -5
- data/vendor/v8/src/mark-compact-inl.h +17 -11
- data/vendor/v8/src/mark-compact.cc +100 -143
- data/vendor/v8/src/mark-compact.h +44 -20
- data/vendor/v8/src/messages.js +131 -99
- data/vendor/v8/src/mips/builtins-mips.cc +5 -4
- data/vendor/v8/src/mips/code-stubs-mips.cc +23 -15
- data/vendor/v8/src/mips/codegen-mips.cc +2 -2
- data/vendor/v8/src/mips/debug-mips.cc +3 -1
- data/vendor/v8/src/mips/full-codegen-mips.cc +4 -102
- data/vendor/v8/src/mips/ic-mips.cc +34 -36
- data/vendor/v8/src/mips/lithium-codegen-mips.cc +116 -68
- data/vendor/v8/src/mips/lithium-mips.cc +20 -7
- data/vendor/v8/src/mips/lithium-mips.h +11 -4
- data/vendor/v8/src/mips/macro-assembler-mips.cc +50 -39
- data/vendor/v8/src/mips/macro-assembler-mips.h +5 -4
- data/vendor/v8/src/mips/regexp-macro-assembler-mips.cc +110 -50
- data/vendor/v8/src/mips/regexp-macro-assembler-mips.h +6 -5
- data/vendor/v8/src/mips/simulator-mips.h +5 -5
- data/vendor/v8/src/mips/stub-cache-mips.cc +66 -20
- data/vendor/v8/src/mksnapshot.cc +5 -1
- data/vendor/v8/src/objects-debug.cc +103 -6
- data/vendor/v8/src/objects-inl.h +215 -116
- data/vendor/v8/src/objects-printer.cc +13 -8
- data/vendor/v8/src/objects.cc +608 -331
- data/vendor/v8/src/objects.h +129 -94
- data/vendor/v8/src/parser.cc +16 -4
- data/vendor/v8/src/platform-freebsd.cc +1 -0
- data/vendor/v8/src/platform-linux.cc +9 -30
- data/vendor/v8/src/platform-posix.cc +28 -7
- data/vendor/v8/src/platform-win32.cc +15 -3
- data/vendor/v8/src/platform.h +2 -1
- data/vendor/v8/src/profile-generator-inl.h +25 -2
- data/vendor/v8/src/profile-generator.cc +300 -822
- data/vendor/v8/src/profile-generator.h +97 -214
- data/vendor/v8/src/regexp-macro-assembler-irregexp.cc +2 -1
- data/vendor/v8/src/regexp-macro-assembler-irregexp.h +2 -2
- data/vendor/v8/src/regexp-macro-assembler-tracer.cc +6 -5
- data/vendor/v8/src/regexp-macro-assembler-tracer.h +1 -1
- data/vendor/v8/src/regexp-macro-assembler.cc +7 -3
- data/vendor/v8/src/regexp-macro-assembler.h +10 -2
- data/vendor/v8/src/regexp.js +6 -0
- data/vendor/v8/src/runtime.cc +265 -212
- data/vendor/v8/src/runtime.h +6 -5
- data/vendor/v8/src/scopes.cc +20 -0
- data/vendor/v8/src/scopes.h +6 -3
- data/vendor/v8/src/spaces.cc +0 -2
- data/vendor/v8/src/string-stream.cc +2 -2
- data/vendor/v8/src/v8-counters.h +0 -2
- data/vendor/v8/src/v8natives.js +2 -2
- data/vendor/v8/src/v8utils.h +6 -3
- data/vendor/v8/src/version.cc +1 -1
- data/vendor/v8/src/x64/assembler-x64.h +2 -1
- data/vendor/v8/src/x64/builtins-x64.cc +5 -4
- data/vendor/v8/src/x64/code-stubs-x64.cc +25 -16
- data/vendor/v8/src/x64/codegen-x64.cc +2 -2
- data/vendor/v8/src/x64/debug-x64.cc +14 -1
- data/vendor/v8/src/x64/disasm-x64.cc +1 -1
- data/vendor/v8/src/x64/full-codegen-x64.cc +10 -106
- data/vendor/v8/src/x64/ic-x64.cc +20 -16
- data/vendor/v8/src/x64/lithium-codegen-x64.cc +156 -79
- data/vendor/v8/src/x64/lithium-codegen-x64.h +2 -1
- data/vendor/v8/src/x64/lithium-x64.cc +18 -8
- data/vendor/v8/src/x64/lithium-x64.h +7 -2
- data/vendor/v8/src/x64/macro-assembler-x64.cc +50 -40
- data/vendor/v8/src/x64/macro-assembler-x64.h +5 -4
- data/vendor/v8/src/x64/regexp-macro-assembler-x64.cc +122 -51
- data/vendor/v8/src/x64/regexp-macro-assembler-x64.h +17 -8
- data/vendor/v8/src/x64/simulator-x64.h +4 -4
- data/vendor/v8/src/x64/stub-cache-x64.cc +55 -17
- data/vendor/v8/test/cctest/cctest.status +1 -0
- data/vendor/v8/test/cctest/test-api.cc +24 -0
- data/vendor/v8/test/cctest/test-func-name-inference.cc +38 -0
- data/vendor/v8/test/cctest/test-heap-profiler.cc +21 -77
- data/vendor/v8/test/cctest/test-heap.cc +164 -3
- data/vendor/v8/test/cctest/test-list.cc +12 -0
- data/vendor/v8/test/cctest/test-mark-compact.cc +5 -5
- data/vendor/v8/test/cctest/test-regexp.cc +14 -8
- data/vendor/v8/test/cctest/testcfg.py +2 -0
- data/vendor/v8/test/mjsunit/accessor-map-sharing.js +176 -0
- data/vendor/v8/test/mjsunit/array-construct-transition.js +3 -3
- data/vendor/v8/test/mjsunit/array-literal-transitions.js +10 -10
- data/vendor/v8/test/mjsunit/big-array-literal.js +3 -0
- data/vendor/v8/test/mjsunit/compiler/inline-construct.js +4 -2
- data/vendor/v8/test/mjsunit/debug-liveedit-stack-padding.js +88 -0
- data/vendor/v8/test/mjsunit/elements-kind.js +4 -4
- data/vendor/v8/test/mjsunit/elements-transition-hoisting.js +2 -2
- data/vendor/v8/test/mjsunit/elements-transition.js +5 -5
- data/vendor/v8/test/mjsunit/error-constructors.js +68 -33
- data/vendor/v8/test/mjsunit/harmony/proxies.js +14 -6
- data/vendor/v8/test/mjsunit/mjsunit.status +1 -0
- data/vendor/v8/test/mjsunit/packed-elements.js +112 -0
- data/vendor/v8/test/mjsunit/regexp-capture-3.js +6 -0
- data/vendor/v8/test/mjsunit/regexp-global.js +132 -0
- data/vendor/v8/test/mjsunit/regexp.js +11 -0
- data/vendor/v8/test/mjsunit/regress/regress-117409.js +52 -0
- data/vendor/v8/test/mjsunit/regress/regress-126412.js +33 -0
- data/vendor/v8/test/mjsunit/regress/regress-128018.js +35 -0
- data/vendor/v8/test/mjsunit/regress/regress-128146.js +33 -0
- data/vendor/v8/test/mjsunit/regress/regress-1639-2.js +4 -1
- data/vendor/v8/test/mjsunit/regress/regress-1639.js +14 -8
- data/vendor/v8/test/mjsunit/regress/regress-1849.js +3 -3
- data/vendor/v8/test/mjsunit/regress/regress-1878.js +2 -2
- data/vendor/v8/test/mjsunit/regress/regress-2071.js +79 -0
- data/vendor/v8/test/mjsunit/regress/regress-2153.js +32 -0
- data/vendor/v8/test/mjsunit/regress/regress-crbug-122271.js +4 -4
- data/vendor/v8/test/mjsunit/regress/regress-crbug-126414.js +32 -0
- data/vendor/v8/test/mjsunit/regress/regress-smi-only-concat.js +2 -2
- data/vendor/v8/test/mjsunit/regress/regress-transcendental.js +49 -0
- data/vendor/v8/test/mjsunit/stack-traces.js +14 -0
- data/vendor/v8/test/mjsunit/unbox-double-arrays.js +4 -3
- data/vendor/v8/test/test262/testcfg.py +6 -1
- data/vendor/v8/tools/check-static-initializers.sh +11 -3
- data/vendor/v8/tools/fuzz-harness.sh +92 -0
- data/vendor/v8/tools/grokdump.py +658 -67
- data/vendor/v8/tools/gyp/v8.gyp +21 -39
- data/vendor/v8/tools/js2c.py +3 -3
- data/vendor/v8/tools/jsmin.py +2 -2
- data/vendor/v8/tools/presubmit.py +2 -1
- data/vendor/v8/tools/test-wrapper-gypbuild.py +25 -11
- metadata +624 -612
data/vendor/v8/src/objects-inl.h
CHANGED
@@ -128,18 +128,6 @@ PropertyDetails PropertyDetails::AsDeleted() {
|
|
128
128
|
}
|
129
129
|
|
130
130
|
|
131
|
-
bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind,
|
132
|
-
ElementsKind to_kind) {
|
133
|
-
if (to_kind == FAST_ELEMENTS) {
|
134
|
-
return from_kind == FAST_SMI_ONLY_ELEMENTS ||
|
135
|
-
from_kind == FAST_DOUBLE_ELEMENTS;
|
136
|
-
} else {
|
137
|
-
return to_kind == FAST_DOUBLE_ELEMENTS &&
|
138
|
-
from_kind == FAST_SMI_ONLY_ELEMENTS;
|
139
|
-
}
|
140
|
-
}
|
141
|
-
|
142
|
-
|
143
131
|
bool Object::IsFixedArrayBase() {
|
144
132
|
return IsFixedArray() || IsFixedDoubleArray();
|
145
133
|
}
|
@@ -1244,35 +1232,26 @@ FixedArrayBase* JSObject::elements() {
|
|
1244
1232
|
return static_cast<FixedArrayBase*>(array);
|
1245
1233
|
}
|
1246
1234
|
|
1247
|
-
|
1235
|
+
|
1236
|
+
void JSObject::ValidateElements() {
|
1248
1237
|
#if DEBUG
|
1249
|
-
if (
|
1250
|
-
|
1251
|
-
|
1252
|
-
// are filler pointers in the array.
|
1253
|
-
FixedArray* fixed_array =
|
1254
|
-
reinterpret_cast<FixedArray*>(READ_FIELD(this, kElementsOffset));
|
1255
|
-
Map* map = fixed_array->map();
|
1256
|
-
// Arrays that have been shifted in place can't be verified.
|
1257
|
-
if (map != heap->raw_unchecked_one_pointer_filler_map() &&
|
1258
|
-
map != heap->raw_unchecked_two_pointer_filler_map() &&
|
1259
|
-
map != heap->free_space_map()) {
|
1260
|
-
for (int i = 0; i < fixed_array->length(); i++) {
|
1261
|
-
Object* current = fixed_array->get(i);
|
1262
|
-
ASSERT(current->IsSmi() || current->IsTheHole());
|
1263
|
-
}
|
1264
|
-
}
|
1238
|
+
if (FLAG_enable_slow_asserts) {
|
1239
|
+
ElementsAccessor* accessor = GetElementsAccessor();
|
1240
|
+
accessor->Validate(this);
|
1265
1241
|
}
|
1266
1242
|
#endif
|
1267
1243
|
}
|
1268
1244
|
|
1269
1245
|
|
1270
1246
|
MaybeObject* JSObject::EnsureCanContainHeapObjectElements() {
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
1274
|
-
|
1275
|
-
|
1247
|
+
ValidateElements();
|
1248
|
+
ElementsKind elements_kind = map()->elements_kind();
|
1249
|
+
if (!IsFastObjectElementsKind(elements_kind)) {
|
1250
|
+
if (IsFastHoleyElementsKind(elements_kind)) {
|
1251
|
+
return TransitionElementsKind(FAST_HOLEY_ELEMENTS);
|
1252
|
+
} else {
|
1253
|
+
return TransitionElementsKind(FAST_ELEMENTS);
|
1254
|
+
}
|
1276
1255
|
}
|
1277
1256
|
return this;
|
1278
1257
|
}
|
@@ -1284,20 +1263,34 @@ MaybeObject* JSObject::EnsureCanContainElements(Object** objects,
|
|
1284
1263
|
ElementsKind current_kind = map()->elements_kind();
|
1285
1264
|
ElementsKind target_kind = current_kind;
|
1286
1265
|
ASSERT(mode != ALLOW_COPIED_DOUBLE_ELEMENTS);
|
1287
|
-
|
1288
|
-
|
1266
|
+
bool is_holey = IsFastHoleyElementsKind(current_kind);
|
1267
|
+
if (current_kind == FAST_HOLEY_ELEMENTS) return this;
|
1289
1268
|
Heap* heap = GetHeap();
|
1290
1269
|
Object* the_hole = heap->the_hole_value();
|
1291
1270
|
Object* heap_number_map = heap->heap_number_map();
|
1292
1271
|
for (uint32_t i = 0; i < count; ++i) {
|
1293
1272
|
Object* current = *objects++;
|
1294
|
-
if (
|
1273
|
+
if (current == the_hole) {
|
1274
|
+
is_holey = true;
|
1275
|
+
target_kind = GetHoleyElementsKind(target_kind);
|
1276
|
+
} else if (!current->IsSmi()) {
|
1295
1277
|
if (mode == ALLOW_CONVERTED_DOUBLE_ELEMENTS &&
|
1296
|
-
HeapObject::cast(current)->map() == heap_number_map
|
1297
|
-
|
1278
|
+
HeapObject::cast(current)->map() == heap_number_map &&
|
1279
|
+
IsFastSmiElementsKind(target_kind)) {
|
1280
|
+
if (is_holey) {
|
1281
|
+
target_kind = FAST_HOLEY_DOUBLE_ELEMENTS;
|
1282
|
+
} else {
|
1283
|
+
target_kind = FAST_DOUBLE_ELEMENTS;
|
1284
|
+
}
|
1298
1285
|
} else {
|
1299
|
-
|
1300
|
-
|
1286
|
+
if (!current->IsNumber()) {
|
1287
|
+
if (is_holey) {
|
1288
|
+
target_kind = FAST_HOLEY_ELEMENTS;
|
1289
|
+
break;
|
1290
|
+
} else {
|
1291
|
+
target_kind = FAST_ELEMENTS;
|
1292
|
+
}
|
1293
|
+
}
|
1301
1294
|
}
|
1302
1295
|
}
|
1303
1296
|
}
|
@@ -1310,6 +1303,7 @@ MaybeObject* JSObject::EnsureCanContainElements(Object** objects,
|
|
1310
1303
|
|
1311
1304
|
|
1312
1305
|
MaybeObject* JSObject::EnsureCanContainElements(FixedArrayBase* elements,
|
1306
|
+
uint32_t length,
|
1313
1307
|
EnsureElementsMode mode) {
|
1314
1308
|
if (elements->map() != GetHeap()->fixed_double_array_map()) {
|
1315
1309
|
ASSERT(elements->map() == GetHeap()->fixed_array_map() ||
|
@@ -1318,11 +1312,19 @@ MaybeObject* JSObject::EnsureCanContainElements(FixedArrayBase* elements,
|
|
1318
1312
|
mode = DONT_ALLOW_DOUBLE_ELEMENTS;
|
1319
1313
|
}
|
1320
1314
|
Object** objects = FixedArray::cast(elements)->GetFirstElementAddress();
|
1321
|
-
return EnsureCanContainElements(objects,
|
1315
|
+
return EnsureCanContainElements(objects, length, mode);
|
1322
1316
|
}
|
1323
1317
|
|
1324
1318
|
ASSERT(mode == ALLOW_COPIED_DOUBLE_ELEMENTS);
|
1325
|
-
if (GetElementsKind() ==
|
1319
|
+
if (GetElementsKind() == FAST_HOLEY_SMI_ELEMENTS) {
|
1320
|
+
return TransitionElementsKind(FAST_HOLEY_DOUBLE_ELEMENTS);
|
1321
|
+
} else if (GetElementsKind() == FAST_SMI_ELEMENTS) {
|
1322
|
+
FixedDoubleArray* double_array = FixedDoubleArray::cast(elements);
|
1323
|
+
for (uint32_t i = 0; i < length; ++i) {
|
1324
|
+
if (double_array->is_the_hole(i)) {
|
1325
|
+
return TransitionElementsKind(FAST_HOLEY_DOUBLE_ELEMENTS);
|
1326
|
+
}
|
1327
|
+
}
|
1326
1328
|
return TransitionElementsKind(FAST_DOUBLE_ELEMENTS);
|
1327
1329
|
}
|
1328
1330
|
|
@@ -1334,21 +1336,20 @@ MaybeObject* JSObject::GetElementsTransitionMap(Isolate* isolate,
|
|
1334
1336
|
ElementsKind to_kind) {
|
1335
1337
|
Map* current_map = map();
|
1336
1338
|
ElementsKind from_kind = current_map->elements_kind();
|
1337
|
-
|
1338
1339
|
if (from_kind == to_kind) return current_map;
|
1339
1340
|
|
1340
1341
|
Context* global_context = isolate->context()->global_context();
|
1341
|
-
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1348
|
-
ASSERT(to_kind == DICTIONARY_ELEMENTS);
|
1342
|
+
Object* maybe_array_maps = global_context->js_array_maps();
|
1343
|
+
if (maybe_array_maps->IsFixedArray()) {
|
1344
|
+
FixedArray* array_maps = FixedArray::cast(maybe_array_maps);
|
1345
|
+
if (array_maps->get(from_kind) == current_map) {
|
1346
|
+
Object* maybe_transitioned_map = array_maps->get(to_kind);
|
1347
|
+
if (maybe_transitioned_map->IsMap()) {
|
1348
|
+
return Map::cast(maybe_transitioned_map);
|
1349
1349
|
}
|
1350
1350
|
}
|
1351
1351
|
}
|
1352
|
+
|
1352
1353
|
return GetElementsTransitionMapSlow(to_kind);
|
1353
1354
|
}
|
1354
1355
|
|
@@ -1357,9 +1358,6 @@ void JSObject::set_map_and_elements(Map* new_map,
|
|
1357
1358
|
FixedArrayBase* value,
|
1358
1359
|
WriteBarrierMode mode) {
|
1359
1360
|
ASSERT(value->HasValidElements());
|
1360
|
-
#ifdef DEBUG
|
1361
|
-
ValidateSmiOnlyElements();
|
1362
|
-
#endif
|
1363
1361
|
if (new_map != NULL) {
|
1364
1362
|
if (mode == UPDATE_WRITE_BARRIER) {
|
1365
1363
|
set_map(new_map);
|
@@ -1368,8 +1366,7 @@ void JSObject::set_map_and_elements(Map* new_map,
|
|
1368
1366
|
set_map_no_write_barrier(new_map);
|
1369
1367
|
}
|
1370
1368
|
}
|
1371
|
-
ASSERT((map()->
|
1372
|
-
map()->has_fast_smi_only_elements() ||
|
1369
|
+
ASSERT((map()->has_fast_smi_or_object_elements() ||
|
1373
1370
|
(value == GetHeap()->empty_fixed_array())) ==
|
1374
1371
|
(value->map() == GetHeap()->fixed_array_map() ||
|
1375
1372
|
value->map() == GetHeap()->fixed_cow_array_map()));
|
@@ -1392,8 +1389,7 @@ void JSObject::initialize_properties() {
|
|
1392
1389
|
|
1393
1390
|
|
1394
1391
|
void JSObject::initialize_elements() {
|
1395
|
-
ASSERT(map()->
|
1396
|
-
map()->has_fast_smi_only_elements() ||
|
1392
|
+
ASSERT(map()->has_fast_smi_or_object_elements() ||
|
1397
1393
|
map()->has_fast_double_elements());
|
1398
1394
|
ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
|
1399
1395
|
WRITE_FIELD(this, kElementsOffset, GetHeap()->empty_fixed_array());
|
@@ -1402,9 +1398,10 @@ void JSObject::initialize_elements() {
|
|
1402
1398
|
|
1403
1399
|
MaybeObject* JSObject::ResetElements() {
|
1404
1400
|
Object* obj;
|
1405
|
-
ElementsKind elements_kind =
|
1406
|
-
|
1407
|
-
|
1401
|
+
ElementsKind elements_kind = GetInitialFastElementsKind();
|
1402
|
+
if (!FLAG_smi_only_arrays) {
|
1403
|
+
elements_kind = FastSmiToObjectElementsKind(elements_kind);
|
1404
|
+
}
|
1408
1405
|
MaybeObject* maybe_obj = GetElementsTransitionMap(GetIsolate(),
|
1409
1406
|
elements_kind);
|
1410
1407
|
if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
@@ -1676,6 +1673,11 @@ Object* FixedArray::get(int index) {
|
|
1676
1673
|
}
|
1677
1674
|
|
1678
1675
|
|
1676
|
+
bool FixedArray::is_the_hole(int index) {
|
1677
|
+
return get(index) == GetHeap()->the_hole_value();
|
1678
|
+
}
|
1679
|
+
|
1680
|
+
|
1679
1681
|
void FixedArray::set(int index, Smi* value) {
|
1680
1682
|
ASSERT(map() != HEAP->fixed_cow_array_map());
|
1681
1683
|
ASSERT(index >= 0 && index < this->length());
|
@@ -1929,6 +1931,12 @@ String* DescriptorArray::GetKey(int descriptor_number) {
|
|
1929
1931
|
}
|
1930
1932
|
|
1931
1933
|
|
1934
|
+
Object** DescriptorArray::GetValueSlot(int descriptor_number) {
|
1935
|
+
ASSERT(descriptor_number < number_of_descriptors());
|
1936
|
+
return GetContentArray()->data_start() + ToValueIndex(descriptor_number);
|
1937
|
+
}
|
1938
|
+
|
1939
|
+
|
1932
1940
|
Object* DescriptorArray::GetValue(int descriptor_number) {
|
1933
1941
|
ASSERT(descriptor_number < number_of_descriptors());
|
1934
1942
|
return GetContentArray()->get(ToValueIndex(descriptor_number));
|
@@ -2857,15 +2865,15 @@ bool Map::has_non_instance_prototype() {
|
|
2857
2865
|
|
2858
2866
|
void Map::set_function_with_prototype(bool value) {
|
2859
2867
|
if (value) {
|
2860
|
-
|
2868
|
+
set_bit_field3(bit_field3() | (1 << kFunctionWithPrototype));
|
2861
2869
|
} else {
|
2862
|
-
|
2870
|
+
set_bit_field3(bit_field3() & ~(1 << kFunctionWithPrototype));
|
2863
2871
|
}
|
2864
2872
|
}
|
2865
2873
|
|
2866
2874
|
|
2867
2875
|
bool Map::function_with_prototype() {
|
2868
|
-
return ((1 << kFunctionWithPrototype) &
|
2876
|
+
return ((1 << kFunctionWithPrototype) & bit_field3()) != 0;
|
2869
2877
|
}
|
2870
2878
|
|
2871
2879
|
|
@@ -3193,6 +3201,18 @@ void Code::set_compare_state(byte value) {
|
|
3193
3201
|
}
|
3194
3202
|
|
3195
3203
|
|
3204
|
+
byte Code::compare_operation() {
|
3205
|
+
ASSERT(is_compare_ic_stub());
|
3206
|
+
return READ_BYTE_FIELD(this, kCompareOperationOffset);
|
3207
|
+
}
|
3208
|
+
|
3209
|
+
|
3210
|
+
void Code::set_compare_operation(byte value) {
|
3211
|
+
ASSERT(is_compare_ic_stub());
|
3212
|
+
WRITE_BYTE_FIELD(this, kCompareOperationOffset, value);
|
3213
|
+
}
|
3214
|
+
|
3215
|
+
|
3196
3216
|
byte Code::to_boolean_state() {
|
3197
3217
|
ASSERT(is_to_boolean_ic_stub());
|
3198
3218
|
return READ_BYTE_FIELD(this, kToBooleanTypeOffset);
|
@@ -3339,6 +3359,9 @@ void Map::clear_instance_descriptors() {
|
|
3339
3359
|
Object* object = READ_FIELD(this,
|
3340
3360
|
kInstanceDescriptorsOrBitField3Offset);
|
3341
3361
|
if (!object->IsSmi()) {
|
3362
|
+
#ifdef DEBUG
|
3363
|
+
ZapInstanceDescriptors();
|
3364
|
+
#endif
|
3342
3365
|
WRITE_FIELD(
|
3343
3366
|
this,
|
3344
3367
|
kInstanceDescriptorsOrBitField3Offset,
|
@@ -3364,6 +3387,11 @@ void Map::set_instance_descriptors(DescriptorArray* value,
|
|
3364
3387
|
}
|
3365
3388
|
}
|
3366
3389
|
ASSERT(!is_shared());
|
3390
|
+
#ifdef DEBUG
|
3391
|
+
if (value != instance_descriptors()) {
|
3392
|
+
ZapInstanceDescriptors();
|
3393
|
+
}
|
3394
|
+
#endif
|
3367
3395
|
WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, value);
|
3368
3396
|
CONDITIONAL_WRITE_BARRIER(
|
3369
3397
|
heap, this, kInstanceDescriptorsOrBitField3Offset, value, mode);
|
@@ -3395,14 +3423,71 @@ void Map::set_bit_field3(int value) {
|
|
3395
3423
|
}
|
3396
3424
|
|
3397
3425
|
|
3398
|
-
|
3399
|
-
|
3400
|
-
|
3426
|
+
Object* Map::GetBackPointer() {
|
3427
|
+
Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
|
3428
|
+
if (object->IsFixedArray()) {
|
3429
|
+
return FixedArray::cast(object)->get(kProtoTransitionBackPointerOffset);
|
3430
|
+
} else {
|
3431
|
+
return object;
|
3432
|
+
}
|
3433
|
+
}
|
3434
|
+
|
3435
|
+
|
3436
|
+
void Map::SetBackPointer(Object* value, WriteBarrierMode mode) {
|
3437
|
+
Heap* heap = GetHeap();
|
3438
|
+
ASSERT(instance_type() >= FIRST_JS_RECEIVER_TYPE);
|
3439
|
+
ASSERT((value->IsUndefined() && GetBackPointer()->IsMap()) ||
|
3440
|
+
(value->IsMap() && GetBackPointer()->IsUndefined()));
|
3441
|
+
Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
|
3442
|
+
if (object->IsFixedArray()) {
|
3443
|
+
FixedArray::cast(object)->set(
|
3444
|
+
kProtoTransitionBackPointerOffset, value, mode);
|
3445
|
+
} else {
|
3446
|
+
WRITE_FIELD(this, kPrototypeTransitionsOrBackPointerOffset, value);
|
3447
|
+
CONDITIONAL_WRITE_BARRIER(
|
3448
|
+
heap, this, kPrototypeTransitionsOrBackPointerOffset, value, mode);
|
3449
|
+
}
|
3450
|
+
}
|
3451
|
+
|
3452
|
+
|
3453
|
+
FixedArray* Map::prototype_transitions() {
|
3454
|
+
Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
|
3455
|
+
if (object->IsFixedArray()) {
|
3456
|
+
return FixedArray::cast(object);
|
3457
|
+
} else {
|
3458
|
+
return GetHeap()->empty_fixed_array();
|
3459
|
+
}
|
3460
|
+
}
|
3461
|
+
|
3462
|
+
|
3463
|
+
void Map::set_prototype_transitions(FixedArray* value, WriteBarrierMode mode) {
|
3464
|
+
Heap* heap = GetHeap();
|
3465
|
+
ASSERT(value != heap->empty_fixed_array());
|
3466
|
+
value->set(kProtoTransitionBackPointerOffset, GetBackPointer());
|
3467
|
+
#ifdef DEBUG
|
3468
|
+
if (value != prototype_transitions()) {
|
3469
|
+
ZapPrototypeTransitions();
|
3470
|
+
}
|
3471
|
+
#endif
|
3472
|
+
WRITE_FIELD(this, kPrototypeTransitionsOrBackPointerOffset, value);
|
3473
|
+
CONDITIONAL_WRITE_BARRIER(
|
3474
|
+
heap, this, kPrototypeTransitionsOrBackPointerOffset, value, mode);
|
3475
|
+
}
|
3476
|
+
|
3477
|
+
|
3478
|
+
void Map::init_prototype_transitions(Object* undefined) {
|
3479
|
+
ASSERT(undefined->IsUndefined());
|
3480
|
+
WRITE_FIELD(this, kPrototypeTransitionsOrBackPointerOffset, undefined);
|
3481
|
+
}
|
3482
|
+
|
3483
|
+
|
3484
|
+
HeapObject* Map::unchecked_prototype_transitions() {
|
3485
|
+
Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
|
3486
|
+
return reinterpret_cast<HeapObject*>(object);
|
3401
3487
|
}
|
3402
3488
|
|
3403
3489
|
|
3404
3490
|
ACCESSORS(Map, code_cache, Object, kCodeCacheOffset)
|
3405
|
-
ACCESSORS(Map, prototype_transitions, FixedArray, kPrototypeTransitionsOffset)
|
3406
3491
|
ACCESSORS(Map, constructor, Object, kConstructorOffset)
|
3407
3492
|
|
3408
3493
|
ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset)
|
@@ -3660,6 +3745,12 @@ void SharedFunctionInfo::set_optimization_disabled(bool disable) {
|
|
3660
3745
|
}
|
3661
3746
|
|
3662
3747
|
|
3748
|
+
int SharedFunctionInfo::profiler_ticks() {
|
3749
|
+
if (code()->kind() != Code::FUNCTION) return 0;
|
3750
|
+
return code()->profiler_ticks();
|
3751
|
+
}
|
3752
|
+
|
3753
|
+
|
3663
3754
|
LanguageMode SharedFunctionInfo::language_mode() {
|
3664
3755
|
int hints = compiler_hints();
|
3665
3756
|
if (BooleanBit::get(hints, kExtendedModeFunction)) {
|
@@ -3925,27 +4016,32 @@ MaybeObject* JSFunction::set_initial_map_and_cache_transitions(
|
|
3925
4016
|
global_context->get(Context::ARRAY_FUNCTION_INDEX);
|
3926
4017
|
if (array_function->IsJSFunction() &&
|
3927
4018
|
this == JSFunction::cast(array_function)) {
|
3928
|
-
|
3929
|
-
|
3930
|
-
|
3931
|
-
|
3932
|
-
|
3933
|
-
|
3934
|
-
|
3935
|
-
|
3936
|
-
|
3937
|
-
|
3938
|
-
|
3939
|
-
|
3940
|
-
|
3941
|
-
|
3942
|
-
|
3943
|
-
|
3944
|
-
|
3945
|
-
|
3946
|
-
|
3947
|
-
|
3948
|
-
|
4019
|
+
// Replace all of the cached initial array maps in the global context with
|
4020
|
+
// the appropriate transitioned elements kind maps.
|
4021
|
+
Heap* heap = GetHeap();
|
4022
|
+
MaybeObject* maybe_maps =
|
4023
|
+
heap->AllocateFixedArrayWithHoles(kElementsKindCount);
|
4024
|
+
FixedArray* maps;
|
4025
|
+
if (!maybe_maps->To(&maps)) return maybe_maps;
|
4026
|
+
|
4027
|
+
Map* current_map = initial_map;
|
4028
|
+
ElementsKind kind = current_map->elements_kind();
|
4029
|
+
ASSERT(kind == GetInitialFastElementsKind());
|
4030
|
+
maps->set(kind, current_map);
|
4031
|
+
for (int i = GetSequenceIndexFromFastElementsKind(kind) + 1;
|
4032
|
+
i < kFastElementsKindCount; ++i) {
|
4033
|
+
ElementsKind transitioned_kind = GetFastElementsKindFromSequenceIndex(i);
|
4034
|
+
MaybeObject* maybe_new_map = current_map->CopyDropTransitions();
|
4035
|
+
Map* new_map = NULL;
|
4036
|
+
if (!maybe_new_map->To<Map>(&new_map)) return maybe_new_map;
|
4037
|
+
new_map->set_elements_kind(transitioned_kind);
|
4038
|
+
maybe_new_map = current_map->AddElementsTransition(transitioned_kind,
|
4039
|
+
new_map);
|
4040
|
+
if (maybe_new_map->IsFailure()) return maybe_new_map;
|
4041
|
+
maps->set(transitioned_kind, new_map);
|
4042
|
+
current_map = new_map;
|
4043
|
+
}
|
4044
|
+
global_context->set_js_array_maps(maps);
|
3949
4045
|
}
|
3950
4046
|
set_initial_map(initial_map);
|
3951
4047
|
return this;
|
@@ -4281,18 +4377,18 @@ ElementsKind JSObject::GetElementsKind() {
|
|
4281
4377
|
FixedArrayBase* fixed_array =
|
4282
4378
|
reinterpret_cast<FixedArrayBase*>(READ_FIELD(this, kElementsOffset));
|
4283
4379
|
Map* map = fixed_array->map();
|
4284
|
-
|
4285
|
-
|
4286
|
-
|
4287
|
-
|
4288
|
-
|
4289
|
-
|
4290
|
-
|
4380
|
+
ASSERT((IsFastSmiOrObjectElementsKind(kind) &&
|
4381
|
+
(map == GetHeap()->fixed_array_map() ||
|
4382
|
+
map == GetHeap()->fixed_cow_array_map())) ||
|
4383
|
+
(IsFastDoubleElementsKind(kind) &&
|
4384
|
+
(fixed_array->IsFixedDoubleArray() ||
|
4385
|
+
fixed_array == GetHeap()->empty_fixed_array())) ||
|
4386
|
+
(kind == DICTIONARY_ELEMENTS &&
|
4291
4387
|
fixed_array->IsFixedArray() &&
|
4292
|
-
|
4293
|
-
|
4294
|
-
|
4295
|
-
|
4388
|
+
fixed_array->IsDictionary()) ||
|
4389
|
+
(kind > DICTIONARY_ELEMENTS));
|
4390
|
+
ASSERT((kind != NON_STRICT_ARGUMENTS_ELEMENTS) ||
|
4391
|
+
(elements()->IsFixedArray() && elements()->length() >= 2));
|
4296
4392
|
#endif
|
4297
4393
|
return kind;
|
4298
4394
|
}
|
@@ -4303,25 +4399,28 @@ ElementsAccessor* JSObject::GetElementsAccessor() {
|
|
4303
4399
|
}
|
4304
4400
|
|
4305
4401
|
|
4306
|
-
bool JSObject::
|
4307
|
-
return GetElementsKind()
|
4402
|
+
bool JSObject::HasFastObjectElements() {
|
4403
|
+
return IsFastObjectElementsKind(GetElementsKind());
|
4308
4404
|
}
|
4309
4405
|
|
4310
4406
|
|
4311
|
-
bool JSObject::
|
4312
|
-
return GetElementsKind()
|
4407
|
+
bool JSObject::HasFastSmiElements() {
|
4408
|
+
return IsFastSmiElementsKind(GetElementsKind());
|
4313
4409
|
}
|
4314
4410
|
|
4315
4411
|
|
4316
|
-
bool JSObject::
|
4317
|
-
|
4318
|
-
return elements_kind == FAST_SMI_ONLY_ELEMENTS ||
|
4319
|
-
elements_kind == FAST_ELEMENTS;
|
4412
|
+
bool JSObject::HasFastSmiOrObjectElements() {
|
4413
|
+
return IsFastSmiOrObjectElementsKind(GetElementsKind());
|
4320
4414
|
}
|
4321
4415
|
|
4322
4416
|
|
4323
4417
|
bool JSObject::HasFastDoubleElements() {
|
4324
|
-
return GetElementsKind()
|
4418
|
+
return IsFastDoubleElementsKind(GetElementsKind());
|
4419
|
+
}
|
4420
|
+
|
4421
|
+
|
4422
|
+
bool JSObject::HasFastHoleyElements() {
|
4423
|
+
return IsFastHoleyElementsKind(GetElementsKind());
|
4325
4424
|
}
|
4326
4425
|
|
4327
4426
|
|
@@ -4378,7 +4477,7 @@ bool JSObject::HasIndexedInterceptor() {
|
|
4378
4477
|
|
4379
4478
|
|
4380
4479
|
MaybeObject* JSObject::EnsureWritableFastElements() {
|
4381
|
-
ASSERT(
|
4480
|
+
ASSERT(HasFastSmiOrObjectElements());
|
4382
4481
|
FixedArray* elems = FixedArray::cast(elements());
|
4383
4482
|
Isolate* isolate = GetIsolate();
|
4384
4483
|
if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems;
|
@@ -4736,7 +4835,7 @@ void Map::ClearCodeCache(Heap* heap) {
|
|
4736
4835
|
|
4737
4836
|
|
4738
4837
|
void JSArray::EnsureSize(int required_size) {
|
4739
|
-
ASSERT(
|
4838
|
+
ASSERT(HasFastSmiOrObjectElements());
|
4740
4839
|
FixedArray* elts = FixedArray::cast(elements());
|
4741
4840
|
const int kArraySizeThatFitsComfortablyInNewSpace = 128;
|
4742
4841
|
if (elts->length() < required_size) {
|
@@ -4768,13 +4867,13 @@ bool JSArray::AllowsSetElementsLength() {
|
|
4768
4867
|
|
4769
4868
|
MaybeObject* JSArray::SetContent(FixedArrayBase* storage) {
|
4770
4869
|
MaybeObject* maybe_result = EnsureCanContainElements(
|
4771
|
-
storage, ALLOW_COPIED_DOUBLE_ELEMENTS);
|
4870
|
+
storage, storage->length(), ALLOW_COPIED_DOUBLE_ELEMENTS);
|
4772
4871
|
if (maybe_result->IsFailure()) return maybe_result;
|
4773
4872
|
ASSERT((storage->map() == GetHeap()->fixed_double_array_map() &&
|
4774
|
-
GetElementsKind()
|
4873
|
+
IsFastDoubleElementsKind(GetElementsKind())) ||
|
4775
4874
|
((storage->map() != GetHeap()->fixed_double_array_map()) &&
|
4776
|
-
((GetElementsKind()
|
4777
|
-
(GetElementsKind()
|
4875
|
+
(IsFastObjectElementsKind(GetElementsKind()) ||
|
4876
|
+
(IsFastSmiElementsKind(GetElementsKind()) &&
|
4778
4877
|
FixedArray::cast(storage)->ContainsOnlySmisOrHoles()))));
|
4779
4878
|
set_elements(storage);
|
4780
4879
|
set_length(Smi::FromInt(storage->length()));
|