libv8 3.10.8.0 → 3.11.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/elements.cc
CHANGED
@@ -39,8 +39,14 @@
|
|
39
39
|
// Inheritance hierarchy:
|
40
40
|
// - ElementsAccessorBase (abstract)
|
41
41
|
// - FastElementsAccessor (abstract)
|
42
|
-
// -
|
42
|
+
// - FastSmiOrObjectElementsAccessor
|
43
|
+
// - FastPackedSmiElementsAccessor
|
44
|
+
// - FastHoleySmiElementsAccessor
|
45
|
+
// - FastPackedObjectElementsAccessor
|
46
|
+
// - FastHoleyObjectElementsAccessor
|
43
47
|
// - FastDoubleElementsAccessor
|
48
|
+
// - FastPackedDoubleElementsAccessor
|
49
|
+
// - FastHoleyDoubleElementsAccessor
|
44
50
|
// - ExternalElementsAccessor (abstract)
|
45
51
|
// - ExternalByteElementsAccessor
|
46
52
|
// - ExternalUnsignedByteElementsAccessor
|
@@ -65,9 +71,15 @@ namespace internal {
|
|
65
71
|
// identical. Note that the order must match that of the ElementsKind enum for
|
66
72
|
// the |accessor_array[]| below to work.
|
67
73
|
#define ELEMENTS_LIST(V) \
|
68
|
-
V(
|
69
|
-
V(
|
70
|
-
|
74
|
+
V(FastPackedSmiElementsAccessor, FAST_SMI_ELEMENTS, FixedArray) \
|
75
|
+
V(FastHoleySmiElementsAccessor, FAST_HOLEY_SMI_ELEMENTS, \
|
76
|
+
FixedArray) \
|
77
|
+
V(FastPackedObjectElementsAccessor, FAST_ELEMENTS, FixedArray) \
|
78
|
+
V(FastHoleyObjectElementsAccessor, FAST_HOLEY_ELEMENTS, FixedArray) \
|
79
|
+
V(FastPackedDoubleElementsAccessor, FAST_DOUBLE_ELEMENTS, \
|
80
|
+
FixedDoubleArray) \
|
81
|
+
V(FastHoleyDoubleElementsAccessor, FAST_HOLEY_DOUBLE_ELEMENTS, \
|
82
|
+
FixedDoubleArray) \
|
71
83
|
V(DictionaryElementsAccessor, DICTIONARY_ELEMENTS, \
|
72
84
|
SeededNumberDictionary) \
|
73
85
|
V(NonStrictArgumentsElementsAccessor, NON_STRICT_ARGUMENTS_ELEMENTS, \
|
@@ -139,8 +151,6 @@ void CopyObjectToObjectElements(FixedArray* from,
|
|
139
151
|
uint32_t to_start,
|
140
152
|
int raw_copy_size) {
|
141
153
|
ASSERT(to->map() != HEAP->fixed_cow_array_map());
|
142
|
-
ASSERT(from_kind == FAST_ELEMENTS || from_kind == FAST_SMI_ONLY_ELEMENTS);
|
143
|
-
ASSERT(to_kind == FAST_ELEMENTS || to_kind == FAST_SMI_ONLY_ELEMENTS);
|
144
154
|
int copy_size = raw_copy_size;
|
145
155
|
if (raw_copy_size < 0) {
|
146
156
|
ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
|
@@ -148,7 +158,7 @@ void CopyObjectToObjectElements(FixedArray* from,
|
|
148
158
|
copy_size = Min(from->length() - from_start,
|
149
159
|
to->length() - to_start);
|
150
160
|
#ifdef DEBUG
|
151
|
-
//
|
161
|
+
// FAST_*_ELEMENTS arrays cannot be uninitialized. Ensure they are already
|
152
162
|
// marked with the hole.
|
153
163
|
if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) {
|
154
164
|
for (int i = to_start + copy_size; i < to->length(); ++i) {
|
@@ -160,12 +170,15 @@ void CopyObjectToObjectElements(FixedArray* from,
|
|
160
170
|
ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() &&
|
161
171
|
(copy_size + static_cast<int>(from_start)) <= from->length());
|
162
172
|
if (copy_size == 0) return;
|
173
|
+
ASSERT(IsFastSmiOrObjectElementsKind(from_kind));
|
174
|
+
ASSERT(IsFastSmiOrObjectElementsKind(to_kind));
|
163
175
|
Address to_address = to->address() + FixedArray::kHeaderSize;
|
164
176
|
Address from_address = from->address() + FixedArray::kHeaderSize;
|
165
177
|
CopyWords(reinterpret_cast<Object**>(to_address) + to_start,
|
166
178
|
reinterpret_cast<Object**>(from_address) + from_start,
|
167
179
|
copy_size);
|
168
|
-
if (from_kind
|
180
|
+
if (IsFastObjectElementsKind(from_kind) &&
|
181
|
+
IsFastObjectElementsKind(to_kind)) {
|
169
182
|
Heap* heap = from->GetHeap();
|
170
183
|
if (!heap->InNewSpace(to)) {
|
171
184
|
heap->RecordWrites(to->address(),
|
@@ -190,7 +203,7 @@ static void CopyDictionaryToObjectElements(SeededNumberDictionary* from,
|
|
190
203
|
raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole);
|
191
204
|
copy_size = from->max_number_key() + 1 - from_start;
|
192
205
|
#ifdef DEBUG
|
193
|
-
//
|
206
|
+
// Fast object arrays cannot be uninitialized. Ensure they are already
|
194
207
|
// marked with the hole.
|
195
208
|
if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) {
|
196
209
|
for (int i = to_start + copy_size; i < to->length(); ++i) {
|
@@ -200,7 +213,7 @@ static void CopyDictionaryToObjectElements(SeededNumberDictionary* from,
|
|
200
213
|
#endif
|
201
214
|
}
|
202
215
|
ASSERT(to != from);
|
203
|
-
ASSERT(to_kind
|
216
|
+
ASSERT(IsFastSmiOrObjectElementsKind(to_kind));
|
204
217
|
if (copy_size == 0) return;
|
205
218
|
uint32_t to_length = to->length();
|
206
219
|
if (to_start + copy_size > to_length) {
|
@@ -216,7 +229,7 @@ static void CopyDictionaryToObjectElements(SeededNumberDictionary* from,
|
|
216
229
|
to->set_the_hole(i + to_start);
|
217
230
|
}
|
218
231
|
}
|
219
|
-
if (to_kind
|
232
|
+
if (IsFastObjectElementsKind(to_kind)) {
|
220
233
|
if (!heap->InNewSpace(to)) {
|
221
234
|
heap->RecordWrites(to->address(),
|
222
235
|
to->OffsetOfElementAt(to_start),
|
@@ -234,7 +247,7 @@ MUST_USE_RESULT static MaybeObject* CopyDoubleToObjectElements(
|
|
234
247
|
ElementsKind to_kind,
|
235
248
|
uint32_t to_start,
|
236
249
|
int raw_copy_size) {
|
237
|
-
ASSERT(to_kind
|
250
|
+
ASSERT(IsFastSmiOrObjectElementsKind(to_kind));
|
238
251
|
int copy_size = raw_copy_size;
|
239
252
|
if (raw_copy_size < 0) {
|
240
253
|
ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd ||
|
@@ -242,7 +255,7 @@ MUST_USE_RESULT static MaybeObject* CopyDoubleToObjectElements(
|
|
242
255
|
copy_size = Min(from->length() - from_start,
|
243
256
|
to->length() - to_start);
|
244
257
|
#ifdef DEBUG
|
245
|
-
//
|
258
|
+
// FAST_*_ELEMENTS arrays cannot be uninitialized. Ensure they are already
|
246
259
|
// marked with the hole.
|
247
260
|
if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) {
|
248
261
|
for (int i = to_start + copy_size; i < to->length(); ++i) {
|
@@ -255,14 +268,14 @@ MUST_USE_RESULT static MaybeObject* CopyDoubleToObjectElements(
|
|
255
268
|
(copy_size + static_cast<int>(from_start)) <= from->length());
|
256
269
|
if (copy_size == 0) return from;
|
257
270
|
for (int i = 0; i < copy_size; ++i) {
|
258
|
-
if (to_kind
|
271
|
+
if (IsFastSmiElementsKind(to_kind)) {
|
259
272
|
UNIMPLEMENTED();
|
260
273
|
return Failure::Exception();
|
261
274
|
} else {
|
262
275
|
MaybeObject* maybe_value = from->get(i + from_start);
|
263
276
|
Object* value;
|
264
|
-
ASSERT(to_kind
|
265
|
-
// Because
|
277
|
+
ASSERT(IsFastObjectElementsKind(to_kind));
|
278
|
+
// Because Double -> Object elements transitions allocate HeapObjects
|
266
279
|
// iteratively, the allocate must succeed within a single GC cycle,
|
267
280
|
// otherwise the retry after the GC will also fail. In order to ensure
|
268
281
|
// that no GC is triggered, allocate HeapNumbers from old space if they
|
@@ -404,6 +417,38 @@ class ElementsAccessorBase : public ElementsAccessor {
|
|
404
417
|
|
405
418
|
virtual ElementsKind kind() const { return ElementsTraits::Kind; }
|
406
419
|
|
420
|
+
static void ValidateContents(JSObject* holder, int length) {
|
421
|
+
}
|
422
|
+
|
423
|
+
static void ValidateImpl(JSObject* holder) {
|
424
|
+
FixedArrayBase* fixed_array_base = holder->elements();
|
425
|
+
// When objects are first allocated, its elements are Failures.
|
426
|
+
if (fixed_array_base->IsFailure()) return;
|
427
|
+
if (!fixed_array_base->IsHeapObject()) return;
|
428
|
+
Map* map = fixed_array_base->map();
|
429
|
+
// Arrays that have been shifted in place can't be verified.
|
430
|
+
Heap* heap = holder->GetHeap();
|
431
|
+
if (map == heap->raw_unchecked_one_pointer_filler_map() ||
|
432
|
+
map == heap->raw_unchecked_two_pointer_filler_map() ||
|
433
|
+
map == heap->free_space_map()) {
|
434
|
+
return;
|
435
|
+
}
|
436
|
+
int length = 0;
|
437
|
+
if (holder->IsJSArray()) {
|
438
|
+
Object* length_obj = JSArray::cast(holder)->length();
|
439
|
+
if (length_obj->IsSmi()) {
|
440
|
+
length = Smi::cast(length_obj)->value();
|
441
|
+
}
|
442
|
+
} else {
|
443
|
+
length = fixed_array_base->length();
|
444
|
+
}
|
445
|
+
ElementsAccessorSubclass::ValidateContents(holder, length);
|
446
|
+
}
|
447
|
+
|
448
|
+
virtual void Validate(JSObject* holder) {
|
449
|
+
ElementsAccessorSubclass::ValidateImpl(holder);
|
450
|
+
}
|
451
|
+
|
407
452
|
static bool HasElementImpl(Object* receiver,
|
408
453
|
JSObject* holder,
|
409
454
|
uint32_t key,
|
@@ -424,10 +469,10 @@ class ElementsAccessorBase : public ElementsAccessor {
|
|
424
469
|
receiver, holder, key, BackingStore::cast(backing_store));
|
425
470
|
}
|
426
471
|
|
427
|
-
virtual MaybeObject* Get(Object* receiver,
|
428
|
-
|
429
|
-
|
430
|
-
|
472
|
+
MUST_USE_RESULT virtual MaybeObject* Get(Object* receiver,
|
473
|
+
JSObject* holder,
|
474
|
+
uint32_t key,
|
475
|
+
FixedArrayBase* backing_store) {
|
431
476
|
if (backing_store == NULL) {
|
432
477
|
backing_store = holder->elements();
|
433
478
|
}
|
@@ -435,62 +480,65 @@ class ElementsAccessorBase : public ElementsAccessor {
|
|
435
480
|
receiver, holder, key, BackingStore::cast(backing_store));
|
436
481
|
}
|
437
482
|
|
438
|
-
static MaybeObject* GetImpl(Object* receiver,
|
439
|
-
|
440
|
-
|
441
|
-
|
483
|
+
MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
|
484
|
+
JSObject* obj,
|
485
|
+
uint32_t key,
|
486
|
+
BackingStore* backing_store) {
|
442
487
|
return (key < ElementsAccessorSubclass::GetCapacityImpl(backing_store))
|
443
488
|
? backing_store->get(key)
|
444
489
|
: backing_store->GetHeap()->the_hole_value();
|
445
490
|
}
|
446
491
|
|
447
|
-
virtual MaybeObject* SetLength(JSArray* array,
|
448
|
-
|
492
|
+
MUST_USE_RESULT virtual MaybeObject* SetLength(JSArray* array,
|
493
|
+
Object* length) {
|
449
494
|
return ElementsAccessorSubclass::SetLengthImpl(
|
450
495
|
array, length, BackingStore::cast(array->elements()));
|
451
496
|
}
|
452
497
|
|
453
|
-
static MaybeObject* SetLengthImpl(
|
454
|
-
|
455
|
-
|
498
|
+
MUST_USE_RESULT static MaybeObject* SetLengthImpl(
|
499
|
+
JSObject* obj,
|
500
|
+
Object* length,
|
501
|
+
BackingStore* backing_store);
|
456
502
|
|
457
|
-
virtual MaybeObject* SetCapacityAndLength(
|
458
|
-
|
459
|
-
|
503
|
+
MUST_USE_RESULT virtual MaybeObject* SetCapacityAndLength(
|
504
|
+
JSArray* array,
|
505
|
+
int capacity,
|
506
|
+
int length) {
|
460
507
|
return ElementsAccessorSubclass::SetFastElementsCapacityAndLength(
|
461
508
|
array,
|
462
509
|
capacity,
|
463
510
|
length);
|
464
511
|
}
|
465
512
|
|
466
|
-
static MaybeObject* SetFastElementsCapacityAndLength(
|
467
|
-
|
468
|
-
|
513
|
+
MUST_USE_RESULT static MaybeObject* SetFastElementsCapacityAndLength(
|
514
|
+
JSObject* obj,
|
515
|
+
int capacity,
|
516
|
+
int length) {
|
469
517
|
UNIMPLEMENTED();
|
470
518
|
return obj;
|
471
519
|
}
|
472
520
|
|
473
|
-
virtual MaybeObject* Delete(JSObject* obj,
|
474
|
-
|
475
|
-
|
521
|
+
MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
|
522
|
+
uint32_t key,
|
523
|
+
JSReceiver::DeleteMode mode) = 0;
|
476
524
|
|
477
|
-
static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
525
|
+
MUST_USE_RESULT static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
|
526
|
+
uint32_t from_start,
|
527
|
+
FixedArrayBase* to,
|
528
|
+
ElementsKind to_kind,
|
529
|
+
uint32_t to_start,
|
530
|
+
int copy_size) {
|
483
531
|
UNREACHABLE();
|
484
532
|
return NULL;
|
485
533
|
}
|
486
534
|
|
487
|
-
virtual MaybeObject* CopyElements(JSObject* from_holder,
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
535
|
+
MUST_USE_RESULT virtual MaybeObject* CopyElements(JSObject* from_holder,
|
536
|
+
uint32_t from_start,
|
537
|
+
FixedArrayBase* to,
|
538
|
+
ElementsKind to_kind,
|
539
|
+
uint32_t to_start,
|
540
|
+
int copy_size,
|
541
|
+
FixedArrayBase* from) {
|
494
542
|
if (from == NULL) {
|
495
543
|
from = from_holder->elements();
|
496
544
|
}
|
@@ -501,10 +549,11 @@ class ElementsAccessorBase : public ElementsAccessor {
|
|
501
549
|
from, from_start, to, to_kind, to_start, copy_size);
|
502
550
|
}
|
503
551
|
|
504
|
-
virtual MaybeObject* AddElementsToFixedArray(
|
505
|
-
|
506
|
-
|
507
|
-
|
552
|
+
MUST_USE_RESULT virtual MaybeObject* AddElementsToFixedArray(
|
553
|
+
Object* receiver,
|
554
|
+
JSObject* holder,
|
555
|
+
FixedArray* to,
|
556
|
+
FixedArrayBase* from) {
|
508
557
|
int len0 = to->length();
|
509
558
|
#ifdef DEBUG
|
510
559
|
if (FLAG_enable_slow_asserts) {
|
@@ -620,6 +669,7 @@ class FastElementsAccessor
|
|
620
669
|
KindTraits>(name) {}
|
621
670
|
protected:
|
622
671
|
friend class ElementsAccessorBase<FastElementsAccessorSubclass, KindTraits>;
|
672
|
+
friend class NonStrictArgumentsElementsAccessor;
|
623
673
|
|
624
674
|
typedef typename KindTraits::BackingStore BackingStore;
|
625
675
|
|
@@ -630,10 +680,21 @@ class FastElementsAccessor
|
|
630
680
|
Object* length_object,
|
631
681
|
uint32_t length) {
|
632
682
|
uint32_t old_capacity = backing_store->length();
|
683
|
+
Object* old_length = array->length();
|
684
|
+
bool same_size = old_length->IsSmi() &&
|
685
|
+
static_cast<uint32_t>(Smi::cast(old_length)->value()) == length;
|
686
|
+
ElementsKind kind = array->GetElementsKind();
|
687
|
+
|
688
|
+
if (!same_size && IsFastElementsKind(kind) &&
|
689
|
+
!IsFastHoleyElementsKind(kind)) {
|
690
|
+
kind = GetHoleyElementsKind(kind);
|
691
|
+
MaybeObject* maybe_obj = array->TransitionElementsKind(kind);
|
692
|
+
if (maybe_obj->IsFailure()) return maybe_obj;
|
693
|
+
}
|
633
694
|
|
634
695
|
// Check whether the backing store should be shrunk.
|
635
696
|
if (length <= old_capacity) {
|
636
|
-
if (array->
|
697
|
+
if (array->HasFastSmiOrObjectElements()) {
|
637
698
|
MaybeObject* maybe_obj = array->EnsureWritableFastElements();
|
638
699
|
if (!maybe_obj->To(&backing_store)) return maybe_obj;
|
639
700
|
}
|
@@ -665,39 +726,40 @@ class FastElementsAccessor
|
|
665
726
|
MaybeObject* result = FastElementsAccessorSubclass::
|
666
727
|
SetFastElementsCapacityAndLength(array, new_capacity, length);
|
667
728
|
if (result->IsFailure()) return result;
|
729
|
+
array->ValidateElements();
|
668
730
|
return length_object;
|
669
731
|
}
|
670
732
|
|
671
733
|
// Request conversion to slow elements.
|
672
734
|
return array->GetHeap()->undefined_value();
|
673
735
|
}
|
674
|
-
};
|
675
|
-
|
676
|
-
|
677
|
-
class FastObjectElementsAccessor
|
678
|
-
: public FastElementsAccessor<FastObjectElementsAccessor,
|
679
|
-
ElementsKindTraits<FAST_ELEMENTS>,
|
680
|
-
kPointerSize> {
|
681
|
-
public:
|
682
|
-
explicit FastObjectElementsAccessor(const char* name)
|
683
|
-
: FastElementsAccessor<FastObjectElementsAccessor,
|
684
|
-
ElementsKindTraits<FAST_ELEMENTS>,
|
685
|
-
kPointerSize>(name) {}
|
686
736
|
|
687
737
|
static MaybeObject* DeleteCommon(JSObject* obj,
|
688
|
-
uint32_t key
|
689
|
-
|
690
|
-
|
738
|
+
uint32_t key,
|
739
|
+
JSReceiver::DeleteMode mode) {
|
740
|
+
ASSERT(obj->HasFastSmiOrObjectElements() ||
|
741
|
+
obj->HasFastDoubleElements() ||
|
691
742
|
obj->HasFastArgumentsElements());
|
743
|
+
typename KindTraits::BackingStore* backing_store =
|
744
|
+
KindTraits::BackingStore::cast(obj->elements());
|
692
745
|
Heap* heap = obj->GetHeap();
|
693
|
-
FixedArray* backing_store = FixedArray::cast(obj->elements());
|
694
746
|
if (backing_store->map() == heap->non_strict_arguments_elements_map()) {
|
695
|
-
backing_store =
|
747
|
+
backing_store =
|
748
|
+
KindTraits::BackingStore::cast(
|
749
|
+
FixedArray::cast(backing_store)->get(1));
|
696
750
|
} else {
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
751
|
+
ElementsKind kind = KindTraits::Kind;
|
752
|
+
if (IsFastPackedElementsKind(kind)) {
|
753
|
+
MaybeObject* transitioned =
|
754
|
+
obj->TransitionElementsKind(GetHoleyElementsKind(kind));
|
755
|
+
if (transitioned->IsFailure()) return transitioned;
|
756
|
+
}
|
757
|
+
if (IsFastSmiOrObjectElementsKind(KindTraits::Kind)) {
|
758
|
+
Object* writable;
|
759
|
+
MaybeObject* maybe = obj->EnsureWritableFastElements();
|
760
|
+
if (!maybe->ToObject(&writable)) return maybe;
|
761
|
+
backing_store = KindTraits::BackingStore::cast(writable);
|
762
|
+
}
|
701
763
|
}
|
702
764
|
uint32_t length = static_cast<uint32_t>(
|
703
765
|
obj->IsJSArray()
|
@@ -709,15 +771,14 @@ class FastObjectElementsAccessor
|
|
709
771
|
// has too few used values, normalize it.
|
710
772
|
// To avoid doing the check on every delete we require at least
|
711
773
|
// one adjacent hole to the value being deleted.
|
712
|
-
Object* hole = heap->the_hole_value();
|
713
774
|
const int kMinLengthForSparsenessCheck = 64;
|
714
775
|
if (backing_store->length() >= kMinLengthForSparsenessCheck &&
|
715
776
|
!heap->InNewSpace(backing_store) &&
|
716
|
-
((key > 0 && backing_store->
|
717
|
-
(key + 1 < length && backing_store->
|
777
|
+
((key > 0 && backing_store->is_the_hole(key - 1)) ||
|
778
|
+
(key + 1 < length && backing_store->is_the_hole(key + 1)))) {
|
718
779
|
int num_used = 0;
|
719
780
|
for (int i = 0; i < backing_store->length(); ++i) {
|
720
|
-
if (backing_store->
|
781
|
+
if (!backing_store->is_the_hole(i)) ++num_used;
|
721
782
|
// Bail out early if more than 1/4 is used.
|
722
783
|
if (4 * num_used > backing_store->length()) break;
|
723
784
|
}
|
@@ -730,27 +791,75 @@ class FastObjectElementsAccessor
|
|
730
791
|
return heap->true_value();
|
731
792
|
}
|
732
793
|
|
794
|
+
virtual MaybeObject* Delete(JSObject* obj,
|
795
|
+
uint32_t key,
|
796
|
+
JSReceiver::DeleteMode mode) {
|
797
|
+
return DeleteCommon(obj, key, mode);
|
798
|
+
}
|
799
|
+
|
800
|
+
static bool HasElementImpl(
|
801
|
+
Object* receiver,
|
802
|
+
JSObject* holder,
|
803
|
+
uint32_t key,
|
804
|
+
typename KindTraits::BackingStore* backing_store) {
|
805
|
+
if (key >= static_cast<uint32_t>(backing_store->length())) {
|
806
|
+
return false;
|
807
|
+
}
|
808
|
+
return !backing_store->is_the_hole(key);
|
809
|
+
}
|
810
|
+
|
811
|
+
static void ValidateContents(JSObject* holder, int length) {
|
812
|
+
#if DEBUG
|
813
|
+
FixedArrayBase* elements = holder->elements();
|
814
|
+
Heap* heap = elements->GetHeap();
|
815
|
+
Map* map = elements->map();
|
816
|
+
ASSERT((IsFastSmiOrObjectElementsKind(KindTraits::Kind) &&
|
817
|
+
(map == heap->fixed_array_map() ||
|
818
|
+
map == heap->fixed_cow_array_map())) ||
|
819
|
+
(IsFastDoubleElementsKind(KindTraits::Kind) ==
|
820
|
+
((map == heap->fixed_array_map() && length == 0) ||
|
821
|
+
map == heap->fixed_double_array_map())));
|
822
|
+
for (int i = 0; i < length; i++) {
|
823
|
+
typename KindTraits::BackingStore* backing_store =
|
824
|
+
KindTraits::BackingStore::cast(elements);
|
825
|
+
ASSERT((!IsFastSmiElementsKind(KindTraits::Kind) ||
|
826
|
+
static_cast<Object*>(backing_store->get(i))->IsSmi()) ||
|
827
|
+
(IsFastHoleyElementsKind(KindTraits::Kind) ==
|
828
|
+
backing_store->is_the_hole(i)));
|
829
|
+
}
|
830
|
+
#endif
|
831
|
+
}
|
832
|
+
};
|
833
|
+
|
834
|
+
|
835
|
+
template<typename FastElementsAccessorSubclass,
|
836
|
+
typename KindTraits>
|
837
|
+
class FastSmiOrObjectElementsAccessor
|
838
|
+
: public FastElementsAccessor<FastElementsAccessorSubclass,
|
839
|
+
KindTraits,
|
840
|
+
kPointerSize> {
|
841
|
+
public:
|
842
|
+
explicit FastSmiOrObjectElementsAccessor(const char* name)
|
843
|
+
: FastElementsAccessor<FastElementsAccessorSubclass,
|
844
|
+
KindTraits,
|
845
|
+
kPointerSize>(name) {}
|
846
|
+
|
733
847
|
static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
|
734
848
|
uint32_t from_start,
|
735
849
|
FixedArrayBase* to,
|
736
850
|
ElementsKind to_kind,
|
737
851
|
uint32_t to_start,
|
738
852
|
int copy_size) {
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
FixedArray::cast(from), from_start,
|
750
|
-
FixedDoubleArray::cast(to), to_start, copy_size);
|
751
|
-
return from;
|
752
|
-
default:
|
753
|
-
UNREACHABLE();
|
853
|
+
if (IsFastSmiOrObjectElementsKind(to_kind)) {
|
854
|
+
CopyObjectToObjectElements(
|
855
|
+
FixedArray::cast(from), KindTraits::Kind, from_start,
|
856
|
+
FixedArray::cast(to), to_kind, to_start, copy_size);
|
857
|
+
} else if (IsFastDoubleElementsKind(to_kind)) {
|
858
|
+
CopyObjectToDoubleElements(
|
859
|
+
FixedArray::cast(from), from_start,
|
860
|
+
FixedDoubleArray::cast(to), to_start, copy_size);
|
861
|
+
} else {
|
862
|
+
UNREACHABLE();
|
754
863
|
}
|
755
864
|
return to->GetHeap()->undefined_value();
|
756
865
|
}
|
@@ -759,51 +868,85 @@ class FastObjectElementsAccessor
|
|
759
868
|
static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj,
|
760
869
|
uint32_t capacity,
|
761
870
|
uint32_t length) {
|
762
|
-
JSObject::
|
763
|
-
obj->
|
764
|
-
? JSObject::
|
765
|
-
: JSObject::
|
871
|
+
JSObject::SetFastElementsCapacitySmiMode set_capacity_mode =
|
872
|
+
obj->HasFastSmiElements()
|
873
|
+
? JSObject::kAllowSmiElements
|
874
|
+
: JSObject::kDontAllowSmiElements;
|
766
875
|
return obj->SetFastElementsCapacityAndLength(capacity,
|
767
876
|
length,
|
768
877
|
set_capacity_mode);
|
769
878
|
}
|
879
|
+
};
|
770
880
|
|
771
|
-
protected:
|
772
|
-
friend class FastElementsAccessor<FastObjectElementsAccessor,
|
773
|
-
ElementsKindTraits<FAST_ELEMENTS>,
|
774
|
-
kPointerSize>;
|
775
881
|
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
882
|
+
class FastPackedSmiElementsAccessor
|
883
|
+
: public FastSmiOrObjectElementsAccessor<
|
884
|
+
FastPackedSmiElementsAccessor,
|
885
|
+
ElementsKindTraits<FAST_SMI_ELEMENTS> > {
|
886
|
+
public:
|
887
|
+
explicit FastPackedSmiElementsAccessor(const char* name)
|
888
|
+
: FastSmiOrObjectElementsAccessor<
|
889
|
+
FastPackedSmiElementsAccessor,
|
890
|
+
ElementsKindTraits<FAST_SMI_ELEMENTS> >(name) {}
|
781
891
|
};
|
782
892
|
|
783
893
|
|
894
|
+
class FastHoleySmiElementsAccessor
|
895
|
+
: public FastSmiOrObjectElementsAccessor<
|
896
|
+
FastHoleySmiElementsAccessor,
|
897
|
+
ElementsKindTraits<FAST_HOLEY_SMI_ELEMENTS> > {
|
898
|
+
public:
|
899
|
+
explicit FastHoleySmiElementsAccessor(const char* name)
|
900
|
+
: FastSmiOrObjectElementsAccessor<
|
901
|
+
FastHoleySmiElementsAccessor,
|
902
|
+
ElementsKindTraits<FAST_HOLEY_SMI_ELEMENTS> >(name) {}
|
903
|
+
};
|
904
|
+
|
905
|
+
|
906
|
+
class FastPackedObjectElementsAccessor
|
907
|
+
: public FastSmiOrObjectElementsAccessor<
|
908
|
+
FastPackedObjectElementsAccessor,
|
909
|
+
ElementsKindTraits<FAST_ELEMENTS> > {
|
910
|
+
public:
|
911
|
+
explicit FastPackedObjectElementsAccessor(const char* name)
|
912
|
+
: FastSmiOrObjectElementsAccessor<
|
913
|
+
FastPackedObjectElementsAccessor,
|
914
|
+
ElementsKindTraits<FAST_ELEMENTS> >(name) {}
|
915
|
+
};
|
916
|
+
|
917
|
+
|
918
|
+
class FastHoleyObjectElementsAccessor
|
919
|
+
: public FastSmiOrObjectElementsAccessor<
|
920
|
+
FastHoleyObjectElementsAccessor,
|
921
|
+
ElementsKindTraits<FAST_HOLEY_ELEMENTS> > {
|
922
|
+
public:
|
923
|
+
explicit FastHoleyObjectElementsAccessor(const char* name)
|
924
|
+
: FastSmiOrObjectElementsAccessor<
|
925
|
+
FastHoleyObjectElementsAccessor,
|
926
|
+
ElementsKindTraits<FAST_HOLEY_ELEMENTS> >(name) {}
|
927
|
+
};
|
928
|
+
|
929
|
+
|
930
|
+
template<typename FastElementsAccessorSubclass,
|
931
|
+
typename KindTraits>
|
784
932
|
class FastDoubleElementsAccessor
|
785
|
-
: public FastElementsAccessor<
|
786
|
-
|
933
|
+
: public FastElementsAccessor<FastElementsAccessorSubclass,
|
934
|
+
KindTraits,
|
787
935
|
kDoubleSize> {
|
788
936
|
public:
|
789
937
|
explicit FastDoubleElementsAccessor(const char* name)
|
790
|
-
: FastElementsAccessor<
|
791
|
-
|
938
|
+
: FastElementsAccessor<FastElementsAccessorSubclass,
|
939
|
+
KindTraits,
|
792
940
|
kDoubleSize>(name) {}
|
793
941
|
|
794
942
|
static MaybeObject* SetFastElementsCapacityAndLength(JSObject* obj,
|
795
943
|
uint32_t capacity,
|
796
944
|
uint32_t length) {
|
797
|
-
return obj->SetFastDoubleElementsCapacityAndLength(capacity,
|
945
|
+
return obj->SetFastDoubleElementsCapacityAndLength(capacity,
|
946
|
+
length);
|
798
947
|
}
|
799
948
|
|
800
949
|
protected:
|
801
|
-
friend class ElementsAccessorBase<FastDoubleElementsAccessor,
|
802
|
-
ElementsKindTraits<FAST_DOUBLE_ELEMENTS> >;
|
803
|
-
friend class FastElementsAccessor<FastDoubleElementsAccessor,
|
804
|
-
ElementsKindTraits<FAST_DOUBLE_ELEMENTS>,
|
805
|
-
kDoubleSize>;
|
806
|
-
|
807
950
|
static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
|
808
951
|
uint32_t from_start,
|
809
952
|
FixedArrayBase* to,
|
@@ -811,12 +954,15 @@ class FastDoubleElementsAccessor
|
|
811
954
|
uint32_t to_start,
|
812
955
|
int copy_size) {
|
813
956
|
switch (to_kind) {
|
814
|
-
case
|
957
|
+
case FAST_SMI_ELEMENTS:
|
815
958
|
case FAST_ELEMENTS:
|
959
|
+
case FAST_HOLEY_SMI_ELEMENTS:
|
960
|
+
case FAST_HOLEY_ELEMENTS:
|
816
961
|
return CopyDoubleToObjectElements(
|
817
962
|
FixedDoubleArray::cast(from), from_start, FixedArray::cast(to),
|
818
963
|
to_kind, to_start, copy_size);
|
819
964
|
case FAST_DOUBLE_ELEMENTS:
|
965
|
+
case FAST_HOLEY_DOUBLE_ELEMENTS:
|
820
966
|
CopyDoubleToDoubleElements(FixedDoubleArray::cast(from), from_start,
|
821
967
|
FixedDoubleArray::cast(to),
|
822
968
|
to_start, copy_size);
|
@@ -826,26 +972,35 @@ class FastDoubleElementsAccessor
|
|
826
972
|
}
|
827
973
|
return to->GetHeap()->undefined_value();
|
828
974
|
}
|
975
|
+
};
|
829
976
|
|
830
|
-
virtual MaybeObject* Delete(JSObject* obj,
|
831
|
-
uint32_t key,
|
832
|
-
JSReceiver::DeleteMode mode) {
|
833
|
-
int length = obj->IsJSArray()
|
834
|
-
? Smi::cast(JSArray::cast(obj)->length())->value()
|
835
|
-
: FixedDoubleArray::cast(obj->elements())->length();
|
836
|
-
if (key < static_cast<uint32_t>(length)) {
|
837
|
-
FixedDoubleArray::cast(obj->elements())->set_the_hole(key);
|
838
|
-
}
|
839
|
-
return obj->GetHeap()->true_value();
|
840
|
-
}
|
841
977
|
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
978
|
+
class FastPackedDoubleElementsAccessor
|
979
|
+
: public FastDoubleElementsAccessor<
|
980
|
+
FastPackedDoubleElementsAccessor,
|
981
|
+
ElementsKindTraits<FAST_DOUBLE_ELEMENTS> > {
|
982
|
+
public:
|
983
|
+
friend class ElementsAccessorBase<FastPackedDoubleElementsAccessor,
|
984
|
+
ElementsKindTraits<FAST_DOUBLE_ELEMENTS> >;
|
985
|
+
explicit FastPackedDoubleElementsAccessor(const char* name)
|
986
|
+
: FastDoubleElementsAccessor<
|
987
|
+
FastPackedDoubleElementsAccessor,
|
988
|
+
ElementsKindTraits<FAST_DOUBLE_ELEMENTS> >(name) {}
|
989
|
+
};
|
990
|
+
|
991
|
+
|
992
|
+
class FastHoleyDoubleElementsAccessor
|
993
|
+
: public FastDoubleElementsAccessor<
|
994
|
+
FastHoleyDoubleElementsAccessor,
|
995
|
+
ElementsKindTraits<FAST_HOLEY_DOUBLE_ELEMENTS> > {
|
996
|
+
public:
|
997
|
+
friend class ElementsAccessorBase<
|
998
|
+
FastHoleyDoubleElementsAccessor,
|
999
|
+
ElementsKindTraits<FAST_HOLEY_DOUBLE_ELEMENTS> >;
|
1000
|
+
explicit FastHoleyDoubleElementsAccessor(const char* name)
|
1001
|
+
: FastDoubleElementsAccessor<
|
1002
|
+
FastHoleyDoubleElementsAccessor,
|
1003
|
+
ElementsKindTraits<FAST_HOLEY_DOUBLE_ELEMENTS> >(name) {}
|
849
1004
|
};
|
850
1005
|
|
851
1006
|
|
@@ -866,27 +1021,28 @@ class ExternalElementsAccessor
|
|
866
1021
|
friend class ElementsAccessorBase<ExternalElementsAccessorSubclass,
|
867
1022
|
ElementsKindTraits<Kind> >;
|
868
1023
|
|
869
|
-
static MaybeObject* GetImpl(Object* receiver,
|
870
|
-
|
871
|
-
|
872
|
-
|
1024
|
+
MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
|
1025
|
+
JSObject* obj,
|
1026
|
+
uint32_t key,
|
1027
|
+
BackingStore* backing_store) {
|
873
1028
|
return
|
874
1029
|
key < ExternalElementsAccessorSubclass::GetCapacityImpl(backing_store)
|
875
1030
|
? backing_store->get(key)
|
876
1031
|
: backing_store->GetHeap()->undefined_value();
|
877
1032
|
}
|
878
1033
|
|
879
|
-
static MaybeObject* SetLengthImpl(
|
880
|
-
|
881
|
-
|
1034
|
+
MUST_USE_RESULT static MaybeObject* SetLengthImpl(
|
1035
|
+
JSObject* obj,
|
1036
|
+
Object* length,
|
1037
|
+
BackingStore* backing_store) {
|
882
1038
|
// External arrays do not support changing their length.
|
883
1039
|
UNREACHABLE();
|
884
1040
|
return obj;
|
885
1041
|
}
|
886
1042
|
|
887
|
-
virtual MaybeObject* Delete(JSObject* obj,
|
888
|
-
|
889
|
-
|
1043
|
+
MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
|
1044
|
+
uint32_t key,
|
1045
|
+
JSReceiver::DeleteMode mode) {
|
890
1046
|
// External arrays always ignore deletes.
|
891
1047
|
return obj->GetHeap()->true_value();
|
892
1048
|
}
|
@@ -1002,10 +1158,11 @@ class DictionaryElementsAccessor
|
|
1002
1158
|
|
1003
1159
|
// Adjusts the length of the dictionary backing store and returns the new
|
1004
1160
|
// length according to ES5 section 15.4.5.2 behavior.
|
1005
|
-
static MaybeObject* SetLengthWithoutNormalize(
|
1006
|
-
|
1007
|
-
|
1008
|
-
|
1161
|
+
MUST_USE_RESULT static MaybeObject* SetLengthWithoutNormalize(
|
1162
|
+
SeededNumberDictionary* dict,
|
1163
|
+
JSArray* array,
|
1164
|
+
Object* length_object,
|
1165
|
+
uint32_t length) {
|
1009
1166
|
if (length == 0) {
|
1010
1167
|
// If the length of a slow array is reset to zero, we clear
|
1011
1168
|
// the array and flush backing storage. This has the added
|
@@ -1057,9 +1214,10 @@ class DictionaryElementsAccessor
|
|
1057
1214
|
return length_object;
|
1058
1215
|
}
|
1059
1216
|
|
1060
|
-
static MaybeObject* DeleteCommon(
|
1061
|
-
|
1062
|
-
|
1217
|
+
MUST_USE_RESULT static MaybeObject* DeleteCommon(
|
1218
|
+
JSObject* obj,
|
1219
|
+
uint32_t key,
|
1220
|
+
JSReceiver::DeleteMode mode) {
|
1063
1221
|
Isolate* isolate = obj->GetIsolate();
|
1064
1222
|
Heap* heap = isolate->heap();
|
1065
1223
|
FixedArray* backing_store = FixedArray::cast(obj->elements());
|
@@ -1102,20 +1260,23 @@ class DictionaryElementsAccessor
|
|
1102
1260
|
return heap->true_value();
|
1103
1261
|
}
|
1104
1262
|
|
1105
|
-
static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1263
|
+
MUST_USE_RESULT static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
|
1264
|
+
uint32_t from_start,
|
1265
|
+
FixedArrayBase* to,
|
1266
|
+
ElementsKind to_kind,
|
1267
|
+
uint32_t to_start,
|
1268
|
+
int copy_size) {
|
1111
1269
|
switch (to_kind) {
|
1112
|
-
case
|
1270
|
+
case FAST_SMI_ELEMENTS:
|
1113
1271
|
case FAST_ELEMENTS:
|
1272
|
+
case FAST_HOLEY_SMI_ELEMENTS:
|
1273
|
+
case FAST_HOLEY_ELEMENTS:
|
1114
1274
|
CopyDictionaryToObjectElements(
|
1115
1275
|
SeededNumberDictionary::cast(from), from_start,
|
1116
1276
|
FixedArray::cast(to), to_kind, to_start, copy_size);
|
1117
1277
|
return from;
|
1118
1278
|
case FAST_DOUBLE_ELEMENTS:
|
1279
|
+
case FAST_HOLEY_DOUBLE_ELEMENTS:
|
1119
1280
|
CopyDictionaryToDoubleElements(
|
1120
1281
|
SeededNumberDictionary::cast(from), from_start,
|
1121
1282
|
FixedDoubleArray::cast(to), to_start, copy_size);
|
@@ -1131,16 +1292,17 @@ class DictionaryElementsAccessor
|
|
1131
1292
|
friend class ElementsAccessorBase<DictionaryElementsAccessor,
|
1132
1293
|
ElementsKindTraits<DICTIONARY_ELEMENTS> >;
|
1133
1294
|
|
1134
|
-
virtual MaybeObject* Delete(JSObject* obj,
|
1135
|
-
|
1136
|
-
|
1295
|
+
MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
|
1296
|
+
uint32_t key,
|
1297
|
+
JSReceiver::DeleteMode mode) {
|
1137
1298
|
return DeleteCommon(obj, key, mode);
|
1138
1299
|
}
|
1139
1300
|
|
1140
|
-
static MaybeObject* GetImpl(
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1301
|
+
MUST_USE_RESULT static MaybeObject* GetImpl(
|
1302
|
+
Object* receiver,
|
1303
|
+
JSObject* obj,
|
1304
|
+
uint32_t key,
|
1305
|
+
SeededNumberDictionary* backing_store) {
|
1144
1306
|
int entry = backing_store->FindEntry(key);
|
1145
1307
|
if (entry != SeededNumberDictionary::kNotFound) {
|
1146
1308
|
Object* element = backing_store->ValueAt(entry);
|
@@ -1186,10 +1348,10 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase<
|
|
1186
1348
|
NonStrictArgumentsElementsAccessor,
|
1187
1349
|
ElementsKindTraits<NON_STRICT_ARGUMENTS_ELEMENTS> >;
|
1188
1350
|
|
1189
|
-
static MaybeObject* GetImpl(Object* receiver,
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1351
|
+
MUST_USE_RESULT static MaybeObject* GetImpl(Object* receiver,
|
1352
|
+
JSObject* obj,
|
1353
|
+
uint32_t key,
|
1354
|
+
FixedArray* parameter_map) {
|
1193
1355
|
Object* probe = GetParameterMapArg(obj, parameter_map, key);
|
1194
1356
|
if (!probe->IsTheHole()) {
|
1195
1357
|
Context* context = Context::cast(parameter_map->get(0));
|
@@ -1216,18 +1378,19 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase<
|
|
1216
1378
|
}
|
1217
1379
|
}
|
1218
1380
|
|
1219
|
-
static MaybeObject* SetLengthImpl(
|
1220
|
-
|
1221
|
-
|
1381
|
+
MUST_USE_RESULT static MaybeObject* SetLengthImpl(
|
1382
|
+
JSObject* obj,
|
1383
|
+
Object* length,
|
1384
|
+
FixedArray* parameter_map) {
|
1222
1385
|
// TODO(mstarzinger): This was never implemented but will be used once we
|
1223
1386
|
// correctly implement [[DefineOwnProperty]] on arrays.
|
1224
1387
|
UNIMPLEMENTED();
|
1225
1388
|
return obj;
|
1226
1389
|
}
|
1227
1390
|
|
1228
|
-
virtual MaybeObject* Delete(JSObject* obj,
|
1229
|
-
|
1230
|
-
|
1391
|
+
MUST_USE_RESULT virtual MaybeObject* Delete(JSObject* obj,
|
1392
|
+
uint32_t key,
|
1393
|
+
JSReceiver::DeleteMode mode) {
|
1231
1394
|
FixedArray* parameter_map = FixedArray::cast(obj->elements());
|
1232
1395
|
Object* probe = GetParameterMapArg(obj, parameter_map, key);
|
1233
1396
|
if (!probe->IsTheHole()) {
|
@@ -1240,18 +1403,21 @@ class NonStrictArgumentsElementsAccessor : public ElementsAccessorBase<
|
|
1240
1403
|
if (arguments->IsDictionary()) {
|
1241
1404
|
return DictionaryElementsAccessor::DeleteCommon(obj, key, mode);
|
1242
1405
|
} else {
|
1243
|
-
|
1406
|
+
// It's difficult to access the version of DeleteCommon that is declared
|
1407
|
+
// in the templatized super class, call the concrete implementation in
|
1408
|
+
// the class for the most generalized ElementsKind subclass.
|
1409
|
+
return FastHoleyObjectElementsAccessor::DeleteCommon(obj, key, mode);
|
1244
1410
|
}
|
1245
1411
|
}
|
1246
1412
|
return obj->GetHeap()->true_value();
|
1247
1413
|
}
|
1248
1414
|
|
1249
|
-
static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
|
1250
|
-
|
1251
|
-
|
1252
|
-
|
1253
|
-
|
1254
|
-
|
1415
|
+
MUST_USE_RESULT static MaybeObject* CopyElementsImpl(FixedArrayBase* from,
|
1416
|
+
uint32_t from_start,
|
1417
|
+
FixedArrayBase* to,
|
1418
|
+
ElementsKind to_kind,
|
1419
|
+
uint32_t to_start,
|
1420
|
+
int copy_size) {
|
1255
1421
|
FixedArray* parameter_map = FixedArray::cast(from);
|
1256
1422
|
FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
|
1257
1423
|
ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments);
|
@@ -1304,7 +1470,7 @@ ElementsAccessor* ElementsAccessor::ForArray(FixedArrayBase* array) {
|
|
1304
1470
|
if (array->IsDictionary()) {
|
1305
1471
|
return elements_accessors_[DICTIONARY_ELEMENTS];
|
1306
1472
|
} else {
|
1307
|
-
return elements_accessors_[
|
1473
|
+
return elements_accessors_[FAST_HOLEY_ELEMENTS];
|
1308
1474
|
}
|
1309
1475
|
case EXTERNAL_BYTE_ARRAY_TYPE:
|
1310
1476
|
return elements_accessors_[EXTERNAL_BYTE_ELEMENTS];
|
@@ -1354,8 +1520,8 @@ void ElementsAccessor::TearDown() {
|
|
1354
1520
|
|
1355
1521
|
|
1356
1522
|
template <typename ElementsAccessorSubclass, typename ElementsKindTraits>
|
1357
|
-
MaybeObject* ElementsAccessorBase<ElementsAccessorSubclass,
|
1358
|
-
|
1523
|
+
MUST_USE_RESULT MaybeObject* ElementsAccessorBase<ElementsAccessorSubclass,
|
1524
|
+
ElementsKindTraits>::
|
1359
1525
|
SetLengthImpl(JSObject* obj,
|
1360
1526
|
Object* length,
|
1361
1527
|
typename ElementsKindTraits::BackingStore* backing_store) {
|