| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index f6a6d8d147d356129bd17f80d6a200695b9899e4..bef57aa8431f34efd2ca1bf220e859340960fb7b 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -3167,29 +3167,21 @@ HValue* HGraphBuilder::BuildArrayBufferViewFieldAccessor(HValue* object,
|
| object, checked_object, HObjectAccess::ForJSArrayBufferViewBuffer());
|
| HInstruction* field = Add<HLoadNamedField>(object, checked_object, access);
|
|
|
| - IfBuilder if_has_buffer(this);
|
| - HValue* has_buffer = if_has_buffer.IfNot<HIsSmiAndBranch>(buffer);
|
| - if_has_buffer.Then();
|
| - {
|
| - HInstruction* flags = Add<HLoadNamedField>(
|
| - buffer, has_buffer, HObjectAccess::ForJSArrayBufferBitField());
|
| - HValue* was_neutered_mask =
|
| - Add<HConstant>(1 << JSArrayBuffer::WasNeutered::kShift);
|
| - HValue* was_neutered_test =
|
| - AddUncasted<HBitwise>(Token::BIT_AND, flags, was_neutered_mask);
|
| -
|
| - IfBuilder if_was_neutered(this);
|
| - if_was_neutered.If<HCompareNumericAndBranch>(
|
| - was_neutered_test, graph()->GetConstant0(), Token::NE);
|
| - if_was_neutered.Then();
|
| - Push(graph()->GetConstant0());
|
| - if_was_neutered.Else();
|
| - Push(field);
|
| - if_was_neutered.End();
|
| - }
|
| - if_has_buffer.Else();
|
| + HInstruction* flags = Add<HLoadNamedField>(
|
| + buffer, nullptr, HObjectAccess::ForJSArrayBufferBitField());
|
| + HValue* was_neutered_mask =
|
| + Add<HConstant>(1 << JSArrayBuffer::WasNeutered::kShift);
|
| + HValue* was_neutered_test =
|
| + AddUncasted<HBitwise>(Token::BIT_AND, flags, was_neutered_mask);
|
| +
|
| + IfBuilder if_was_neutered(this);
|
| + if_was_neutered.If<HCompareNumericAndBranch>(
|
| + was_neutered_test, graph()->GetConstant0(), Token::NE);
|
| + if_was_neutered.Then();
|
| + Push(graph()->GetConstant0());
|
| + if_was_neutered.Else();
|
| Push(field);
|
| - if_has_buffer.End();
|
| + if_was_neutered.End();
|
|
|
| return Pop();
|
| }
|
| @@ -9702,6 +9694,45 @@ void HOptimizedGraphBuilder::VisitCallNew(CallNew* expr) {
|
| }
|
|
|
|
|
| +HValue* HGraphBuilder::BuildAllocateEmptyArrayBuffer(HValue* byte_length) {
|
| + HAllocate* result =
|
| + BuildAllocate(Add<HConstant>(JSArrayBuffer::kSizeWithInternalFields),
|
| + HType::JSObject(), JS_ARRAY_BUFFER_TYPE, HAllocationMode());
|
| +
|
| + HValue* global_object = Add<HLoadNamedField>(
|
| + context(), nullptr,
|
| + HObjectAccess::ForContextSlot(Context::GLOBAL_OBJECT_INDEX));
|
| + HValue* native_context = Add<HLoadNamedField>(
|
| + global_object, nullptr, HObjectAccess::ForGlobalObjectNativeContext());
|
| + Add<HStoreNamedField>(
|
| + result, HObjectAccess::ForMap(),
|
| + Add<HLoadNamedField>(
|
| + native_context, nullptr,
|
| + HObjectAccess::ForContextSlot(Context::ARRAY_BUFFER_MAP_INDEX)));
|
| +
|
| + Add<HStoreNamedField>(result, HObjectAccess::ForJSArrayBufferBackingStore(),
|
| + Add<HConstant>(ExternalReference()));
|
| + Add<HStoreNamedField>(result, HObjectAccess::ForJSArrayBufferByteLength(),
|
| + byte_length);
|
| + Add<HStoreNamedField>(result, HObjectAccess::ForJSArrayBufferBitFieldSlot(),
|
| + graph()->GetConstant0());
|
| + Add<HStoreNamedField>(
|
| + result, HObjectAccess::ForJSArrayBufferBitField(),
|
| + Add<HConstant>((1 << JSArrayBuffer::IsExternal::kShift) |
|
| + (1 << JSArrayBuffer::IsNeuterable::kShift)));
|
| +
|
| + for (int field = 0; field < v8::ArrayBuffer::kInternalFieldCount; ++field) {
|
| + Add<HStoreNamedField>(
|
| + result,
|
| + HObjectAccess::ForObservableJSObjectOffset(
|
| + JSArrayBuffer::kSize + field * kPointerSize, Representation::Smi()),
|
| + graph()->GetConstant0());
|
| + }
|
| +
|
| + return result;
|
| +}
|
| +
|
| +
|
| template <class ViewClass>
|
| void HGraphBuilder::BuildArrayBufferViewInitialization(
|
| HValue* obj,
|
| @@ -9725,17 +9756,8 @@ void HGraphBuilder::BuildArrayBufferViewInitialization(
|
| obj,
|
| HObjectAccess::ForJSArrayBufferViewByteLength(),
|
| byte_length);
|
| -
|
| - if (buffer != NULL) {
|
| - Add<HStoreNamedField>(
|
| - obj,
|
| - HObjectAccess::ForJSArrayBufferViewBuffer(), buffer);
|
| - } else {
|
| - Add<HStoreNamedField>(
|
| - obj,
|
| - HObjectAccess::ForJSArrayBufferViewBuffer(),
|
| - Add<HConstant>(static_cast<int32_t>(0)));
|
| - }
|
| + Add<HStoreNamedField>(obj, HObjectAccess::ForJSArrayBufferViewBuffer(),
|
| + buffer);
|
| }
|
|
|
|
|
| @@ -9957,8 +9979,12 @@ void HOptimizedGraphBuilder::GenerateTypedArrayInitialize(
|
|
|
|
|
| { // byte_offset is Smi.
|
| - BuildArrayBufferViewInitialization<JSTypedArray>(
|
| - obj, buffer, byte_offset, byte_length);
|
| + HValue* allocated_buffer = buffer;
|
| + if (buffer == NULL) {
|
| + allocated_buffer = BuildAllocateEmptyArrayBuffer(byte_length);
|
| + }
|
| + BuildArrayBufferViewInitialization<JSTypedArray>(obj, allocated_buffer,
|
| + byte_offset, byte_length);
|
|
|
|
|
| HInstruction* length = AddUncasted<HDiv>(byte_length,
|
|
|