diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2013-06-11 23:45:46 +0200 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2013-06-11 23:46:00 +0200 |
commit | 6dd78074a3c0a7579ca5e919021587c22ff763ae (patch) | |
tree | e225460f8e76126f4e4b2e1809dbd4c9c2ba511b /deps/v8/src/objects-inl.h | |
parent | 9ae1d182ba98629ac7c7b9100022ac93133494b7 (diff) | |
download | node-new-6dd78074a3c0a7579ca5e919021587c22ff763ae.tar.gz |
v8: upgrade to v3.19.13
Diffstat (limited to 'deps/v8/src/objects-inl.h')
-rw-r--r-- | deps/v8/src/objects-inl.h | 109 |
1 files changed, 69 insertions, 40 deletions
diff --git a/deps/v8/src/objects-inl.h b/deps/v8/src/objects-inl.h index 95a0eca6a8..e60f0f36f1 100644 --- a/deps/v8/src/objects-inl.h +++ b/deps/v8/src/objects-inl.h @@ -58,7 +58,10 @@ PropertyDetails::PropertyDetails(Smi* smi) { Smi* PropertyDetails::AsSmi() { - return Smi::FromInt(value_); + // Ensure the upper 2 bits have the same value by sign extending it. This is + // necessary to be able to use the 31st bit of the property details. + int value = value_ << 1; + return Smi::FromInt(value >> 1); } @@ -289,6 +292,9 @@ MaybeObject* Object::AllocateNewStorageFor(Heap* heap, PretenureFlag tenure) { if (!FLAG_track_double_fields) return this; if (!representation.IsDouble()) return this; + if (IsUninitialized()) { + return heap->AllocateHeapNumber(0, tenure); + } return heap->AllocateHeapNumber(Number(), tenure); } @@ -527,6 +533,11 @@ bool MaybeObject::IsTheHole() { } +bool MaybeObject::IsUninitialized() { + return !IsFailure() && ToObjectUnchecked()->IsUninitialized(); +} + + Failure* Failure::cast(MaybeObject* obj) { ASSERT(HAS_FAILURE_TAG(obj)); return reinterpret_cast<Failure*>(obj); @@ -842,6 +853,11 @@ bool Object::IsTheHole() { } +bool Object::IsUninitialized() { + return IsOddball() && Oddball::cast(this)->kind() == Oddball::kUninitialized; +} + + bool Object::IsTrue() { return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTrue; } @@ -892,7 +908,7 @@ MaybeObject* Object::GetElement(uint32_t index) { // GetElement can trigger a getter which can cause allocation. // This was not always the case. This ASSERT is here to catch // leftover incorrect uses. - ASSERT(HEAP->IsAllocationAllowed()); + ASSERT(AllowHeapAllocation::IsAllowed()); return GetElementWithReceiver(this, index); } @@ -1538,12 +1554,19 @@ MaybeObject* JSObject::MigrateInstance() { // Converting any field to the most specific type will cause the // GeneralizeFieldRepresentation algorithm to create the most general existing // transition that matches the object. This achieves what is needed. - return GeneralizeFieldRepresentation(0, Representation::Smi()); + return GeneralizeFieldRepresentation(0, Representation::None()); +} + + +MaybeObject* JSObject::TryMigrateInstance() { + Map* new_map = map()->CurrentMapForDeprecated(); + if (new_map == NULL) return Smi::FromInt(0); + return MigrateToMap(new_map); } Handle<String> JSObject::ExpectedTransitionKey(Handle<Map> map) { - AssertNoAllocation no_gc; + DisallowHeapAllocation no_gc; if (!map->HasTransitionArray()) return Handle<String>::null(); TransitionArray* transitions = map->transitions(); if (!transitions->IsSimpleTransition()) return Handle<String>::null(); @@ -1565,7 +1588,7 @@ Handle<Map> JSObject::ExpectedTransitionTarget(Handle<Map> map) { Handle<Map> JSObject::FindTransitionToField(Handle<Map> map, Handle<Name> key) { - AssertNoAllocation no_allocation; + DisallowHeapAllocation no_allocation; if (!map->HasTransitionArray()) return Handle<Map>::null(); TransitionArray* transitions = map->transitions(); int transition = transitions->Search(*key); @@ -1977,7 +2000,8 @@ bool FixedDoubleArray::is_the_hole(int index) { } -WriteBarrierMode HeapObject::GetWriteBarrierMode(const AssertNoAllocation&) { +WriteBarrierMode HeapObject::GetWriteBarrierMode( + const DisallowHeapAllocation& promise) { Heap* heap = GetHeap(); if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER; if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER; @@ -2320,7 +2344,7 @@ PropertyType DescriptorArray::GetType(int descriptor_number) { int DescriptorArray::GetFieldIndex(int descriptor_number) { - return Descriptor::IndexFromValue(GetValue(descriptor_number)); + return GetDetails(descriptor_number).field_index(); } @@ -2355,7 +2379,6 @@ void DescriptorArray::Set(int descriptor_number, // Range check. ASSERT(descriptor_number < number_of_descriptors()); - ASSERT(!desc->GetDetails().representation().IsNone()); NoIncrementalWriteBarrierSet(this, ToKeyIndex(descriptor_number), desc->GetKey()); @@ -2371,7 +2394,6 @@ void DescriptorArray::Set(int descriptor_number, void DescriptorArray::Set(int descriptor_number, Descriptor* desc) { // Range check. ASSERT(descriptor_number < number_of_descriptors()); - ASSERT(!desc->GetDetails().representation().IsNone()); set(ToKeyIndex(descriptor_number), desc->GetKey()); set(ToValueIndex(descriptor_number), desc->GetValue()); @@ -3592,10 +3614,23 @@ bool Map::is_deprecated() { } +void Map::freeze() { + set_bit_field3(IsFrozen::update(bit_field3(), true)); +} + + +bool Map::is_frozen() { + return IsFrozen::decode(bit_field3()); +} + + bool Map::CanBeDeprecated() { int descriptor = LastAdded(); for (int i = 0; i <= descriptor; i++) { PropertyDetails details = instance_descriptors()->GetDetails(i); + if (FLAG_track_fields && details.representation().IsNone()) { + return true; + } if (FLAG_track_fields && details.representation().IsSmi()) { return true; } @@ -3712,6 +3747,7 @@ Code::ExtraICState Code::extra_ic_state() { Code::ExtraICState Code::extended_extra_ic_state() { ASSERT(is_inline_cache_stub() || ic_state() == DEBUG_STUB); + ASSERT(needs_extended_extra_ic_state(kind())); return ExtractExtendedExtraICStateFromFlags(flags()); } @@ -3962,17 +3998,7 @@ void Code::set_unary_op_type(byte value) { byte Code::to_boolean_state() { - ASSERT(is_to_boolean_ic_stub()); - return ToBooleanStateField::decode( - READ_UINT32_FIELD(this, kKindSpecificFlags1Offset)); -} - - -void Code::set_to_boolean_state(byte value) { - ASSERT(is_to_boolean_ic_stub()); - int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset); - int updated = ToBooleanStateField::update(previous, value); - WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated); + return extended_extra_ic_state(); } @@ -4035,10 +4061,7 @@ Code::Flags Code::ComputeFlags(Kind kind, | TypeField::encode(type) | ExtendedExtraICStateField::encode(extra_ic_state) | CacheHolderField::encode(holder); - // TODO(danno): This is a bit of a hack right now since there are still - // clients of this API that pass "extra" values in for argc. These clients - // should be retrofitted to used ExtendedExtraICState. - if (kind != Code::COMPARE_NIL_IC) { + if (!Code::needs_extended_extra_ic_state(kind)) { bits |= (argc << kArgumentsCountShift); } return static_cast<Flags>(bits); @@ -4360,6 +4383,8 @@ ACCESSORS(ExecutableAccessorInfo, getter, Object, kGetterOffset) ACCESSORS(ExecutableAccessorInfo, setter, Object, kSetterOffset) ACCESSORS(ExecutableAccessorInfo, data, Object, kDataOffset) +ACCESSORS(Box, value, Object, kValueOffset) + ACCESSORS(AccessorPair, getter, Object, kGetterOffset) ACCESSORS(AccessorPair, setter, Object, kSetterOffset) @@ -4451,8 +4476,6 @@ ACCESSORS(SharedFunctionInfo, function_data, Object, kFunctionDataOffset) ACCESSORS(SharedFunctionInfo, script, Object, kScriptOffset) ACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset) ACCESSORS(SharedFunctionInfo, inferred_name, String, kInferredNameOffset) -ACCESSORS(SharedFunctionInfo, this_property_assignments, Object, - kThisPropertyAssignmentsOffset) SMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset) @@ -4469,10 +4492,6 @@ BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_expression, BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel, kIsTopLevelBit) -BOOL_GETTER(SharedFunctionInfo, - compiler_hints, - has_only_simple_this_property_assignments, - kHasOnlySimpleThisPropertyAssignments) BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, allows_lazy_compilation, @@ -4505,8 +4524,6 @@ SMI_ACCESSORS(SharedFunctionInfo, function_token_position, kFunctionTokenPositionOffset) SMI_ACCESSORS(SharedFunctionInfo, compiler_hints, kCompilerHintsOffset) -SMI_ACCESSORS(SharedFunctionInfo, this_property_assignments_count, - kThisPropertyAssignmentsCountOffset) SMI_ACCESSORS(SharedFunctionInfo, opt_count, kOptCountOffset) SMI_ACCESSORS(SharedFunctionInfo, counters, kCountersOffset) SMI_ACCESSORS(SharedFunctionInfo, @@ -4558,13 +4575,10 @@ PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, compiler_hints, kCompilerHintsOffset) -PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, - this_property_assignments_count, - kThisPropertyAssignmentsCountOffset) -PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, opt_count, kOptCountOffset) +PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, opt_count, kOptCountOffset) -PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, counters, kCountersOffset) -PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, +PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, counters, kCountersOffset) +PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, stress_deopt_counter, kStressDeoptCounterOffset) #endif @@ -5303,13 +5317,28 @@ void JSArrayBuffer::set_backing_store(void* value, WriteBarrierMode mode) { ACCESSORS(JSArrayBuffer, byte_length, Object, kByteLengthOffset) +ACCESSORS_TO_SMI(JSArrayBuffer, flag, kFlagOffset) + + +bool JSArrayBuffer::is_external() { + return BooleanBit::get(flag(), kIsExternalBit); +} + + +void JSArrayBuffer::set_is_external(bool value) { + set_flag(BooleanBit::set(flag(), kIsExternalBit, value)); +} + + +ACCESSORS(JSArrayBuffer, weak_next, Object, kWeakNextOffset) +ACCESSORS(JSArrayBuffer, weak_first_array, Object, kWeakFirstArrayOffset) ACCESSORS(JSTypedArray, buffer, Object, kBufferOffset) ACCESSORS(JSTypedArray, byte_offset, Object, kByteOffsetOffset) ACCESSORS(JSTypedArray, byte_length, Object, kByteLengthOffset) ACCESSORS(JSTypedArray, length, Object, kLengthOffset) - +ACCESSORS(JSTypedArray, weak_next, Object, kWeakNextOffset) ACCESSORS(JSRegExp, data, Object, kDataOffset) @@ -5811,7 +5840,7 @@ void Dictionary<Shape, Key>::SetEntry(int entry, details.IsDeleted() || details.dictionary_index() > 0); int index = HashTable<Shape, Key>::EntryToIndex(entry); - AssertNoAllocation no_gc; + DisallowHeapAllocation no_gc; WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc); FixedArray::set(index, key, mode); FixedArray::set(index+1, value, mode); |