| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index 3251d9e9b3b3c8817472f9167224e0bcb0d0a5e8..de4a2fc88c96f8f7e033b1cfee537312d72b4ea5 100644
|
| --- a/src/objects-inl.h
|
| +++ b/src/objects-inl.h
|
| @@ -584,6 +584,14 @@ bool Object::IsDeoptimizationOutputData() {
|
| }
|
|
|
|
|
| +bool Object::IsDependentCodes() {
|
| + if (!IsFixedArray()) return false;
|
| + // There's actually no way to see the difference between a fixed array and
|
| + // a dependent codes array.
|
| + return true;
|
| +}
|
| +
|
| +
|
| bool Object::IsTypeFeedbackCells() {
|
| if (!IsFixedArray()) return false;
|
| // There's actually no way to see the difference between a fixed array and
|
| @@ -2374,6 +2382,7 @@ CAST_ACCESSOR(FixedDoubleArray)
|
| CAST_ACCESSOR(DescriptorArray)
|
| CAST_ACCESSOR(DeoptimizationInputData)
|
| CAST_ACCESSOR(DeoptimizationOutputData)
|
| +CAST_ACCESSOR(DependentCodes)
|
| CAST_ACCESSOR(TypeFeedbackCells)
|
| CAST_ACCESSOR(SymbolTable)
|
| CAST_ACCESSOR(JSFunctionResultCache)
|
| @@ -3406,6 +3415,47 @@ bool Map::is_observed() {
|
| }
|
|
|
|
|
| +void Map::AddDependentCode(Handle<Code> code) {
|
| + Handle<DependentCodes> codes =
|
| + DependentCodes::Append(Handle<DependentCodes>(dependent_codes()), code);
|
| + if (*codes != dependent_codes()) {
|
| + set_dependent_codes(*codes);
|
| + }
|
| +}
|
| +
|
| +
|
| +int DependentCodes::number_of_codes() {
|
| + if (length() == 0) return 0;
|
| + return Smi::cast(get(kNumberOfCodesIndex))->value();
|
| +}
|
| +
|
| +
|
| +void DependentCodes::set_number_of_codes(int value) {
|
| + set(kNumberOfCodesIndex, Smi::FromInt(value));
|
| +}
|
| +
|
| +
|
| +Code* DependentCodes::code_at(int i) {
|
| + return Code::cast(get(kCodesIndex + i));
|
| +}
|
| +
|
| +
|
| +void DependentCodes::set_code_at(int i, Code* value) {
|
| + set(kCodesIndex + i, value);
|
| +}
|
| +
|
| +
|
| +Object** DependentCodes::code_slot_at(int i) {
|
| + return HeapObject::RawField(
|
| + this, FixedArray::OffsetOfElementAt(kCodesIndex + i));
|
| +}
|
| +
|
| +
|
| +void DependentCodes::clear_code_at(int i) {
|
| + set_undefined(kCodesIndex + i);
|
| +}
|
| +
|
| +
|
| void Code::set_flags(Code::Flags flags) {
|
| STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1);
|
| // Make sure that all call stubs have an arguments count.
|
| @@ -3683,6 +3733,21 @@ void Code::set_has_function_cache(bool flag) {
|
| }
|
|
|
|
|
| +bool Code::marked_for_deoptimization() {
|
| + ASSERT(kind() == OPTIMIZED_FUNCTION);
|
| + return MarkedForDeoptimizationField::decode(
|
| + READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
|
| +}
|
| +
|
| +
|
| +void Code::set_marked_for_deoptimization(bool flag) {
|
| + ASSERT(kind() == OPTIMIZED_FUNCTION);
|
| + int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
|
| + int updated = MarkedForDeoptimizationField::update(previous, flag);
|
| + WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
|
| +}
|
| +
|
| +
|
| bool Code::is_inline_cache_stub() {
|
| Kind kind = this->kind();
|
| return kind >= FIRST_IC_KIND && kind <= LAST_IC_KIND;
|
| @@ -4011,6 +4076,7 @@ HeapObject* Map::UncheckedPrototypeTransitions() {
|
|
|
|
|
| ACCESSORS(Map, code_cache, Object, kCodeCacheOffset)
|
| +ACCESSORS(Map, dependent_codes, DependentCodes, kDependentCodesOffset)
|
| ACCESSORS(Map, constructor, Object, kConstructorOffset)
|
|
|
| ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset)
|
|
|