Index: src/objects-inl.h |
=================================================================== |
--- src/objects-inl.h (revision 6384) |
+++ src/objects-inl.h (working copy) |
@@ -1978,13 +1978,13 @@ |
void JSFunctionResultCache::MakeZeroSize() { |
- set(kFingerIndex, Smi::FromInt(kEntriesIndex)); |
- set(kCacheSizeIndex, Smi::FromInt(kEntriesIndex)); |
+ set_finger_index(kEntriesIndex); |
+ set_size(kEntriesIndex); |
} |
void JSFunctionResultCache::Clear() { |
- int cache_size = Smi::cast(get(kCacheSizeIndex))->value(); |
+ int cache_size = size(); |
Object** entries_start = RawField(this, OffsetOfElementAt(kEntriesIndex)); |
MemsetPointer(entries_start, |
Heap::the_hole_value(), |
@@ -1993,6 +1993,26 @@ |
} |
+int JSFunctionResultCache::size() { |
+ return Smi::cast(get(kCacheSizeIndex))->value(); |
+} |
+ |
+ |
+void JSFunctionResultCache::set_size(int size) { |
+ set(kCacheSizeIndex, Smi::FromInt(size)); |
+} |
+ |
+ |
+int JSFunctionResultCache::finger_index() { |
+ return Smi::cast(get(kFingerIndex))->value(); |
+} |
+ |
+ |
+void JSFunctionResultCache::set_finger_index(int finger_index) { |
+ set(kFingerIndex, Smi::FromInt(finger_index)); |
+} |
+ |
+ |
byte ByteArray::get(int index) { |
ASSERT(index >= 0 && index < this->length()); |
return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize); |
@@ -2396,6 +2416,12 @@ |
} |
+Code::ExtraICState Code::extra_ic_state() { |
+ ASSERT(is_inline_cache_stub()); |
+ return ExtractExtraICStateFromFlags(flags()); |
+} |
+ |
+ |
PropertyType Code::type() { |
ASSERT(ic_state() == MONOMORPHIC); |
return ExtractTypeFromFlags(flags()); |
@@ -2572,14 +2598,20 @@ |
Code::Flags Code::ComputeFlags(Kind kind, |
InLoopFlag in_loop, |
InlineCacheState ic_state, |
+ ExtraICState extra_ic_state, |
PropertyType type, |
int argc, |
InlineCacheHolderFlag holder) { |
+ // Extra IC state is only allowed for monomorphic call IC stubs. |
+ ASSERT(extra_ic_state == kNoExtraICState || |
+ (kind == CALL_IC && (ic_state == MONOMORPHIC || |
+ ic_state == MONOMORPHIC_PROTOTYPE_FAILURE))); |
// Compute the bit mask. |
int bits = kind << kFlagsKindShift; |
if (in_loop) bits |= kFlagsICInLoopMask; |
bits |= ic_state << kFlagsICStateShift; |
bits |= type << kFlagsTypeShift; |
+ bits |= extra_ic_state << kFlagsExtraICStateShift; |
bits |= argc << kFlagsArgumentsCountShift; |
if (holder == PROTOTYPE_MAP) bits |= kFlagsCacheInPrototypeMapMask; |
// Cast to flags and validate result before returning it. |
@@ -2588,6 +2620,7 @@ |
ASSERT(ExtractICStateFromFlags(result) == ic_state); |
ASSERT(ExtractICInLoopFromFlags(result) == in_loop); |
ASSERT(ExtractTypeFromFlags(result) == type); |
+ ASSERT(ExtractExtraICStateFromFlags(result) == extra_ic_state); |
ASSERT(ExtractArgumentsCountFromFlags(result) == argc); |
return result; |
} |
@@ -2595,10 +2628,12 @@ |
Code::Flags Code::ComputeMonomorphicFlags(Kind kind, |
PropertyType type, |
+ ExtraICState extra_ic_state, |
InlineCacheHolderFlag holder, |
InLoopFlag in_loop, |
int argc) { |
- return ComputeFlags(kind, in_loop, MONOMORPHIC, type, argc, holder); |
+ return ComputeFlags( |
+ kind, in_loop, MONOMORPHIC, extra_ic_state, type, argc, holder); |
} |
@@ -2614,6 +2649,12 @@ |
} |
+Code::ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) { |
+ int bits = (flags & kFlagsExtraICStateMask) >> kFlagsExtraICStateShift; |
+ return static_cast<ExtraICState>(bits); |
+} |
+ |
+ |
InLoopFlag Code::ExtractICInLoopFromFlags(Flags flags) { |
int bits = (flags & kFlagsICInLoopMask); |
return bits != 0 ? IN_LOOP : NOT_IN_LOOP; |