8000
We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent 201cf97 commit f2abe7bCopy full SHA for f2abe7b
common.gypi
@@ -30,7 +30,7 @@
30
31
# Reset this number to 0 on major V8 upgrades.
32
# Increment by one for each non-official patch applied to deps/v8.
33
- 'v8_embedder_string': '-node.14',
+ 'v8_embedder_string': '-node.15',
34
35
# Enable disassembler for `--print-code` v8 options
36
'v8_enable_disassembler': 1,
deps/v8/src/builtins/builtins-constructor-gen.cc
@@ -525,8 +525,7 @@ Node* ConstructorBuiltinsAssembler::EmitCreateShallowObjectLiteral(
525
VARIABLE(offset, MachineType::PointerRepresentation(),
526
IntPtrConstant(JSObject::kHeaderSize));
527
// Mutable heap numbers only occur on 32-bit platforms.
528
- bool may_use_mutable_heap_numbers =
529
- FLAG_track_double_fields && !FLAG_unbox_double_fields;
+ bool may_use_mutable_heap_numbers = !FLAG_unbox_double_fields;
530
{
531
Comment("Copy in-object properties fast");
532
Label continue_fast(this, &offset);
deps/v8/src/code-stub-assembler.cc
@@ -4432,6 +4432,13 @@ void CodeStubAssembler::CopyPropertyArrayValues(Node* from_array,
4432
Comment("[ CopyPropertyArrayValues");
4433
4434
bool needs_write_barrier = barrier_mode == UPDATE_WRITE_BARRIER;
4435
+
4436
+ if (destroy_source == DestroySource::kNo) {
4437
+ // PropertyArray may contain MutableHeapNumbers, which will be cloned on the
4438
+ // heap, requiring a write barrier.
4439
+ needs_write_barrier = true;
4440
+ }
4441
4442
Node* start = IntPtrOrSmiConstant(0, mode);
4443
ElementsKind kind = PACKED_ELEMENTS;
4444
BuildFastFixedArrayForEach(
deps/v8/src/ic/accessor-assembler.cc
@@ -3417,7 +3417,7 @@ void AccessorAssembler::GenerateStoreInArrayLiteralIC() {
3417
3418
void AccessorAssembler::GenerateCloneObjectIC() {
3419
typedef CloneObjectWithVectorDescriptor Descriptor;
3420
- Node* source = Parameter(Descriptor::kSource);
+ TNode<HeapObject> source = CAST(Parameter(Descriptor::kSource));
3421
Node* flags = Parameter(Descriptor::kFlags);
3422
Node* slot = Parameter(Descriptor::kSlot);
3423
Node* vector = Parameter(Descriptor::kVector);
@@ -3427,8 +3427,7 @@ void AccessorAssembler::GenerateCloneObjectIC() {
3427
Label miss(this, Label::kDeferred), try_polymorphic(this, Label::kDeferred),
3428
try_megamorphic(this, Label::kDeferred);
3429
3430
- CSA_SLOW_ASSERT(this, TaggedIsNotSmi(source));
3431
- Node* source_map = LoadMap(UncheckedCast<HeapObject>(source));
+ TNode<Map> source_map = LoadMap(UncheckedCast<HeapObject>(source));
3432
GotoIf(IsDeprecatedMap(source_map), &miss);
3433
TNode<MaybeObject> feedback = TryMonomorphicCase(
3434
slot, vector, source_map, &if_handler, &var_handler, &try_polymorphic);
@@ -3449,7 +3448,7 @@ void AccessorAssembler::GenerateCloneObjectIC() {
3449
3448
3450
// The IC fast case should only be taken if the result map a compatible
3451
// elements kind with the source object.
3452
- TNode<FixedArrayBase> source_elements = LoadElements(source);
+ TNode<FixedArrayBase> source_elements = LoadElements(CAST(source));
3453
3454
auto flags = ExtractFixedArrayFlag::kAllFixedArraysDontCopyCOW;
3455
var_elements = CAST(CloneFixedArray(source_elements, flags));
@@ -3484,22 +3483,45 @@ void AccessorAssembler::GenerateCloneObjectIC() {
3484
3483
// Lastly, clone any in-object properties.
3485
// Determine the inobject property capacity of both objects, and copy the
3486
// smaller number into the resulting object.
3487
- Node* source_start = LoadMapInobjectPropertiesStartInWords(source_map);
3488
- Node* source_size = LoadMapInstanceSizeInWords(source_map);
3489
- Node* result_start = LoadMapInobjectPropertiesStartInWords(result_map);
3490
- Node* field_offset_difference =
+ TNode<IntPtrT> source_start =
+ LoadMapInobjectPropertiesStartInWords(source_map);
+ TNode<IntPtrT> source_size = LoadMapInstanceSizeInWords(source_map);
+ TNode<IntPtrT> result_start =
+ LoadMapInobjectPropertiesStartInWords(result_map);
3491
+ TNode<IntPtrT> field_offset_difference =
3492
TimesPointerSize(IntPtrSub(result_start, source_start));
- BuildFastLoop(source_start, source_size,
3493
- [=](Node* field_index) {
3494
- Node* field_offset = TimesPointerSize(field_index);
3495
- TNode<Object> field = LoadObjectField(source, field_offset);
3496
- field = CloneIfMutablePrimitive(field);
3497
- Node* result_offset =
3498
- IntPtrAdd(field_offset, field_offset_difference);
3499
- StoreObjectFieldNoWriteBarrier(object, result_offset,
3500
- field);
3501
- },
3502
- 1, INTPTR_PARAMETERS, IndexAdvanceMode::kPost);
+ // If MutableHeapNumbers may be present in-object, allocations may occur
+ // within this loop, thus the write barrier is required.
+ //
+ // TODO(caitp): skip the write barrier until the first MutableHeapNumber
+ // field is found
+ const bool may_use_mutable_heap_numbers = !FLAG_unbox_double_fields;
+ BuildFastLoop(
+ source_start, source_size,
3503
+ [=](Node* field_index) {
3504
+ TNode<IntPtrT> field_offset =
3505
+ TimesPointerSize(UncheckedCast<IntPtrT>(field_index));
3506
3507
+ if (may_use_mutable_heap_numbers) {
3508
+ TNode<Object> field = LoadObjectField(source, field_offset);
3509
+ field = CloneIfMutablePrimitive(field);
3510
+ TNode<IntPtrT> result_offset =
3511
+ IntPtrAdd(field_offset, field_offset_difference);
3512
+ StoreObjectField(object, result_offset, field);
3513
+ } else {
3514
+ // Copy fields as raw data.
3515
+ TNode<IntPtrT> field = UncheckedCast<IntPtrT>(
3516
+ LoadObjectField(source, field_offset, MachineType::IntPtr()));
3517
3518
3519
+ StoreObjectFieldNoWriteBarrier(
3520
+ object, result_offset, field,
3521
+ MachineType::IntPtr().representation());
3522
3523
+ },
3524
+ 1, INTPTR_PARAMETERS, IndexAdvanceMode::kPost);
3525
Return(object);
3526
}
3527
deps/v8/test/mjsunit/es9/regress/regress-902965.js
@@ -0,0 +1,12 @@
1
+// Copyright 2018 the V8 project authors. All rights reserved.
2
+// Use of this source code is governed by a BSD-style license that can be
3
+// found in the LICENSE file.
4
5
+// Previously, spreading in-object properties would always treat double fields
6
+// as tagged, potentially dereferencing a Float64.
7
+function inobjectDouble() {
8
+ "use strict";
9
+ this.x = -3.9;
10
+}
11
+const instance = new inobjectDouble();
12
+const clone = { ...instance, };
deps/v8/test/mjsunit/es9/regress/regress-903070.js
@@ -0,0 +1,15 @@
+function clone(src) {
+ return { ...src };
+function inobjectDoubles() {
+ this.p0 = -6400510997704731;
13
14
+// Check that unboxed double is not treated as tagged
15
+assertEquals({ p0: -6400510997704731 }, clone(new inobjectDoubles()));