| Index: src/ic/handler-configuration.h
|
| diff --git a/src/ic/handler-configuration.h b/src/ic/handler-configuration.h
|
| index b96e958e5c35902e0d50b3453d39e524a3eadce8..2741654befad3112745973349cf0156e6a3b29cd 100644
|
| --- a/src/ic/handler-configuration.h
|
| +++ b/src/ic/handler-configuration.h
|
| @@ -13,57 +13,57 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -enum LoadHandlerType {
|
| - kLoadICHandlerForElements = 0,
|
| - kLoadICHandlerForFields = 1,
|
| - kLoadICHandlerForConstants = 2
|
| -};
|
| +// A set of bit fields representing Smi handlers for loads.
|
| +class LoadHandler {
|
| + public:
|
| + enum Kind { kForElements, kForFields, kForConstants };
|
| + class KindBits : public BitField<Kind, 0, 2> {};
|
|
|
| -class LoadHandlerTypeBits : public BitField<LoadHandlerType, 0, 2> {};
|
| + //
|
| + // Encoding when KindBits contains kForConstants.
|
| + //
|
|
|
| -// Encoding for configuration Smis for constants loads (when LoadHandlerTypeBits
|
| -// contain LoadICHandlerForConstants):
|
| -class ValueIndexInDescriptorArray
|
| - : public BitField<int, LoadHandlerTypeBits::kNext,
|
| - kDescriptorIndexBitCount + 2> {};
|
| -// Make sure we don't overflow into the sign bit.
|
| -STATIC_ASSERT(ValueIndexInDescriptorArray::kNext <= kSmiValueSize - 1);
|
| + // +2 here is because each descriptor entry occupies 3 slots in array.
|
| + class DescriptorValueIndexBits
|
| + : public BitField<unsigned, KindBits::kNext,
|
| + kDescriptorIndexBitCount + 2> {};
|
| + // Make sure we don't overflow the smi.
|
| + STATIC_ASSERT(DescriptorValueIndexBits::kNext <= kSmiValueSize);
|
|
|
| -// Encoding for configuration Smis for field loads (when LoadHandlerTypeBits
|
| -// contain LoadICHandlerForFields):
|
| -class FieldOffsetIsInobject
|
| - : public BitField<bool, LoadHandlerTypeBits::kNext, 1> {};
|
| -class FieldOffsetIsDouble
|
| - : public BitField<bool, FieldOffsetIsInobject::kNext, 1> {};
|
| -class FieldOffsetOffset : public BitField<int, FieldOffsetIsDouble::kNext, 26> {
|
| -};
|
| -// Make sure we don't overflow into the sign bit.
|
| -STATIC_ASSERT(FieldOffsetOffset::kNext <= kSmiValueSize - 1);
|
| + //
|
| + // Encoding when KindBits contains kForFields.
|
| + //
|
| + class IsInobjectBits : public BitField<bool, KindBits::kNext, 1> {};
|
| + class IsDoubleBits : public BitField<bool, IsInobjectBits::kNext, 1> {};
|
| + // +1 here is to cover all possible JSObject header sizes.
|
| + class FieldOffsetBits
|
| + : public BitField<unsigned, IsDoubleBits::kNext,
|
| + kDescriptorIndexBitCount + 1 + kPointerSizeLog2> {};
|
| + // Make sure we don't overflow the smi.
|
| + STATIC_ASSERT(FieldOffsetBits::kNext <= kSmiValueSize);
|
|
|
| -// Encoding for configuration Smis for elements loads (when LoadHandlerTypeBits
|
| -// contain LoadICHandlerForElements)
|
| -class KeyedLoadIsJsArray
|
| - : public BitField<bool, LoadHandlerTypeBits::kNext, 1> {};
|
| -class KeyedLoadConvertHole
|
| - : public BitField<bool, KeyedLoadIsJsArray::kNext, 1> {};
|
| -class KeyedLoadElementsKind
|
| - : public BitField<ElementsKind, KeyedLoadConvertHole::kNext, 8> {};
|
| -// Make sure we don't overflow into the sign bit.
|
| -STATIC_ASSERT(KeyedLoadElementsKind::kNext <= kSmiValueSize - 1);
|
| + //
|
| + // Encoding when KindBits contains kForElements.
|
| + //
|
| + class IsJsArrayBits : public BitField<bool, KindBits::kNext, 1> {};
|
| + class ConvertHoleBits : public BitField<bool, IsJsArrayBits::kNext, 1> {};
|
| + class ElementsKindBits
|
| + : public BitField<ElementsKind, ConvertHoleBits::kNext, 8> {};
|
| + // Make sure we don't overflow the smi.
|
| + STATIC_ASSERT(ElementsKindBits::kNext <= kSmiValueSize);
|
|
|
| -// This class is a collection of factory methods for various Smi-encoded
|
| -// IC handlers consumed by respective IC dispatchers.
|
| -class SmiHandler {
|
| - public:
|
| - static inline Handle<Object> MakeLoadFieldHandler(Isolate* isolate,
|
| - FieldIndex field_index);
|
| + // Creates a Smi-handler for loading a field from fast object.
|
| + static inline Handle<Object> LoadField(Isolate* isolate,
|
| + FieldIndex field_index);
|
|
|
| - static inline Handle<Object> MakeLoadConstantHandler(Isolate* isolate,
|
| - int descriptor);
|
| + // Creates a Smi-handler for loading a constant from fast object.
|
| + static inline Handle<Object> LoadConstant(Isolate* isolate, int descriptor);
|
|
|
| - static inline Handle<Object> MakeKeyedLoadHandler(
|
| - Isolate* isolate, ElementsKind elements_kind,
|
| - bool convert_hole_to_undefined, bool is_js_array);
|
| + // Creates a Smi-handler for loading an element.
|
| + static inline Handle<Object> LoadElement(Isolate* isolate,
|
| + ElementsKind elements_kind,
|
| + bool convert_hole_to_undefined,
|
| + bool is_js_array);
|
| };
|
|
|
| } // namespace internal
|
|
|