diff options
Diffstat (limited to 'deps/v8/src/compiler/js-operator.h')
-rw-r--r-- | deps/v8/src/compiler/js-operator.h | 303 |
1 files changed, 95 insertions, 208 deletions
diff --git a/deps/v8/src/compiler/js-operator.h b/deps/v8/src/compiler/js-operator.h index 88b2dd304e..6bd6516af3 100644 --- a/deps/v8/src/compiler/js-operator.h +++ b/deps/v8/src/compiler/js-operator.h @@ -16,24 +16,24 @@ class Operator; struct JSOperatorGlobalCache; -// Defines a pair of {TypeFeedbackVector} and {TypeFeedbackVectorICSlot}, which +// Defines a pair of {TypeFeedbackVector} and {TypeFeedbackVectorSlot}, which // is used to access the type feedback for a certain {Node}. class VectorSlotPair { public: VectorSlotPair(); - VectorSlotPair(Handle<TypeFeedbackVector> vector, FeedbackVectorICSlot slot) + VectorSlotPair(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot) : vector_(vector), slot_(slot) {} - bool IsValid() const { return !vector_.is_null(); } + bool IsValid() const { return !vector_.is_null() && !slot_.IsInvalid(); } Handle<TypeFeedbackVector> vector() const { return vector_; } - FeedbackVectorICSlot slot() const { return slot_; } + FeedbackVectorSlot slot() const { return slot_; } int index() const; private: const Handle<TypeFeedbackVector> vector_; - const FeedbackVectorICSlot slot_; + const FeedbackVectorSlot slot_; }; bool operator==(VectorSlotPair const&, VectorSlotPair const&); @@ -41,26 +41,43 @@ bool operator!=(VectorSlotPair const&, VectorSlotPair const&); size_t hash_value(VectorSlotPair const&); -enum TailCallMode { NO_TAIL_CALLS, ALLOW_TAIL_CALLS }; + +// The ConvertReceiverMode is used as parameter by JSConvertReceiver operators. +ConvertReceiverMode ConvertReceiverModeOf(const Operator* op); + + +// Defines whether tail call optimization is allowed. +enum class TailCallMode : unsigned { kAllow, kDisallow }; + +size_t hash_value(TailCallMode); + +std::ostream& operator<<(std::ostream&, TailCallMode); + // Defines the arity and the call flags for a JavaScript function call. This is // used as a parameter by JSCallFunction operators. class CallFunctionParameters final { public: - CallFunctionParameters(size_t arity, CallFunctionFlags flags, - LanguageMode language_mode, + CallFunctionParameters(size_t arity, LanguageMode language_mode, VectorSlotPair const& feedback, - TailCallMode tail_call_mode) - : bit_field_(ArityField::encode(arity) | FlagsField::encode(flags) | - LanguageModeField::encode(language_mode)), - feedback_(feedback), - tail_call_mode_(tail_call_mode) {} + TailCallMode tail_call_mode, + ConvertReceiverMode convert_mode) + : bit_field_(ArityField::encode(arity) | + ConvertReceiverModeField::encode(convert_mode) | + LanguageModeField::encode(language_mode) | + TailCallModeField::encode(tail_call_mode)), + feedback_(feedback) {} size_t arity() const { return ArityField::decode(bit_field_); } - CallFunctionFlags flags() const { return FlagsField::decode(bit_field_); } LanguageMode language_mode() const { return LanguageModeField::decode(bit_field_); } + ConvertReceiverMode convert_mode() const { + return ConvertReceiverModeField::decode(bit_field_); + } + TailCallMode tail_call_mode() const { + return TailCallModeField::decode(bit_field_); + } VectorSlotPair const& feedback() const { return feedback_; } bool operator==(CallFunctionParameters const& that) const { @@ -71,20 +88,18 @@ class CallFunctionParameters final { return !(*this == that); } - bool AllowTailCalls() const { return tail_call_mode_ == ALLOW_TAIL_CALLS; } - private: friend size_t hash_value(CallFunctionParameters const& p) { return base::hash_combine(p.bit_field_, p.feedback_); } - typedef BitField<size_t, 0, 28> ArityField; - typedef BitField<CallFunctionFlags, 28, 2> FlagsField; - typedef BitField<LanguageMode, 30, 2> LanguageModeField; + typedef BitField<size_t, 0, 27> ArityField; + typedef BitField<ConvertReceiverMode, 27, 2> ConvertReceiverModeField; + typedef BitField<LanguageMode, 29, 2> LanguageModeField; + typedef BitField<TailCallMode, 31, 1> TailCallModeField; const uint32_t bit_field_; const VectorSlotPair feedback_; - bool tail_call_mode_; }; size_t hash_value(CallFunctionParameters const&); @@ -148,113 +163,56 @@ std::ostream& operator<<(std::ostream&, ContextAccess const&); ContextAccess const& ContextAccessOf(Operator const*); -// Defines the name for a dynamic variable lookup. The {check_bitset} allows to -// inline checks whether the lookup yields in a global variable. This is used as -// a parameter by JSLoadDynamicGlobal and JSStoreDynamicGlobal operators. -class DynamicGlobalAccess final { +// Defines the name for a dynamic variable lookup. This is used as a parameter +// by JSLoadDynamic and JSStoreDynamic operators. +class DynamicAccess final { public: - DynamicGlobalAccess(const Handle<String>& name, uint32_t check_bitset, - const VectorSlotPair& feedback, TypeofMode typeof_mode); + DynamicAccess(const Handle<String>& name, TypeofMode typeof_mode); const Handle<String>& name() const { return name_; } - uint32_t check_bitset() const { return check_bitset_; } - const VectorSlotPair& feedback() const { return feedback_; } TypeofMode typeof_mode() const { return typeof_mode_; } - // Indicates that an inline check is disabled. - bool RequiresFullCheck() const { - return check_bitset() == kFullCheckRequired; - } - - // Limit of context chain length to which inline check is possible. - static const int kMaxCheckDepth = 30; - - // Sentinel for {check_bitset} disabling inline checks. - static const uint32_t kFullCheckRequired = -1; - private: const Handle<String> name_; - const uint32_t check_bitset_; - const VectorSlotPair feedback_; const TypeofMode typeof_mode_; }; -size_t hash_value(DynamicGlobalAccess const&); - -bool operator==(DynamicGlobalAccess const&, DynamicGlobalAccess const&); -bool operator!=(DynamicGlobalAccess const&, DynamicGlobalAccess const&); - -std::ostream& operator<<(std::ostream&, DynamicGlobalAccess const&); - -DynamicGlobalAccess const& DynamicGlobalAccessOf(Operator const*); - - -// Defines the name for a dynamic variable lookup. The {check_bitset} allows to -// inline checks whether the lookup yields in a context variable. This is used -// as a parameter by JSLoadDynamicContext and JSStoreDynamicContext operators. -class DynamicContextAccess final { - public: - DynamicContextAccess(const Handle<String>& name, uint32_t check_bitset, - const ContextAccess& context_access); - - const Handle<String>& name() const { return name_; } - uint32_t check_bitset() const { return check_bitset_; } - const ContextAccess& context_access() const { return context_access_; } - - // Indicates that an inline check is disabled. - bool RequiresFullCheck() const { - return check_bitset() == kFullCheckRequired; - } - - // Limit of context chain length to which inline check is possible. - static const int kMaxCheckDepth = 30; - - // Sentinel for {check_bitset} disabling inline checks. - static const uint32_t kFullCheckRequired = -1; - - private: - const Handle<String> name_; - const uint32_t check_bitset_; - const ContextAccess context_access_; -}; - -size_t hash_value(DynamicContextAccess const&); +size_t hash_value(DynamicAccess const&); -bool operator==(DynamicContextAccess const&, DynamicContextAccess const&); -bool operator!=(DynamicContextAccess const&, DynamicContextAccess const&); +bool operator==(DynamicAccess const&, DynamicAccess const&); +bool operator!=(DynamicAccess const&, DynamicAccess const&); -std::ostream& operator<<(std::ostream&, DynamicContextAccess const&); +std::ostream& operator<<(std::ostream&, DynamicAccess const&); -DynamicContextAccess const& DynamicContextAccessOf(Operator const*); +DynamicAccess const& DynamicAccessOf(Operator const*); -// Defines the property being loaded from an object by a named load. This is -// used as a parameter by JSLoadNamed operators. -class LoadNamedParameters final { +// Defines the property of an object for a named access. This is +// used as a parameter by the JSLoadNamed and JSStoreNamed operators. +class NamedAccess final { public: - LoadNamedParameters(const Handle<Name>& name, const VectorSlotPair& feedback, - LanguageMode language_mode) + NamedAccess(LanguageMode language_mode, Handle<Name> name, + VectorSlotPair const& feedback) : name_(name), feedback_(feedback), language_mode_(language_mode) {} - const Handle<Name>& name() const { return name_; } + Handle<Name> name() const { return name_; } LanguageMode language_mode() const { return language_mode_; } - - const VectorSlotPair& feedback() const { return feedback_; } + VectorSlotPair const& feedback() const { return feedback_; } private: - const Handle<Name> name_; - const VectorSlotPair feedback_; - const LanguageMode language_mode_; + Handle<Name> const name_; + VectorSlotPair const feedback_; + LanguageMode const language_mode_; }; -bool operator==(LoadNamedParameters const&, LoadNamedParameters const&); -bool operator!=(LoadNamedParameters const&, LoadNamedParameters const&); +bool operator==(NamedAccess const&, NamedAccess const&); +bool operator!=(NamedAccess const&, NamedAccess const&); -size_t hash_value(LoadNamedParameters const&); +size_t hash_value(NamedAccess const&); -std::ostream& operator<<(std::ostream&, LoadNamedParameters const&); +std::ostream& operator<<(std::ostream&, NamedAccess const&); -const LoadNamedParameters& LoadNamedParametersOf(const Operator* op); +const NamedAccess& NamedAccessOf(const Operator* op); // Defines the property being loaded from an object by a named load. This is @@ -262,24 +220,18 @@ const LoadNamedParameters& LoadNamedParametersOf(const Operator* op); class LoadGlobalParameters final { public: LoadGlobalParameters(const Handle<Name>& name, const VectorSlotPair& feedback, - TypeofMode typeof_mode, int slot_index) - : name_(name), - feedback_(feedback), - typeof_mode_(typeof_mode), - slot_index_(slot_index) {} + TypeofMode typeof_mode) + : name_(name), feedback_(feedback), typeof_mode_(typeof_mode) {} const Handle<Name>& name() const { return name_; } TypeofMode typeof_mode() const { return typeof_mode_; } const VectorSlotPair& feedback() const { return feedback_; } - int slot_index() const { return slot_index_; } - private: const Handle<Name> name_; const VectorSlotPair feedback_; const TypeofMode typeof_mode_; - const int slot_index_; }; bool operator==(LoadGlobalParameters const&, LoadGlobalParameters const&); @@ -298,22 +250,17 @@ class StoreGlobalParameters final { public: StoreGlobalParameters(LanguageMode language_mode, const VectorSlotPair& feedback, - const Handle<Name>& name, int slot_index) - : language_mode_(language_mode), - name_(name), - feedback_(feedback), - slot_index_(slot_index) {} + const Handle<Name>& name) + : language_mode_(language_mode), name_(name), feedback_(feedback) {} LanguageMode language_mode() const { return language_mode_; } const VectorSlotPair& feedback() const { return feedback_; } const Handle<Name>& name() const { return name_; } - int slot_index() const { return slot_index_; } private: const LanguageMode language_mode_; const Handle<Name> name_; const VectorSlotPair feedback_; - int slot_index_; }; bool operator==(StoreGlobalParameters const&, StoreGlobalParameters const&); @@ -326,85 +273,29 @@ std::ostream& operator<<(std::ostream&, StoreGlobalParameters const&); const StoreGlobalParameters& StoreGlobalParametersOf(const Operator* op); -// Defines the property being loaded from an object. This is -// used as a parameter by JSLoadProperty operators. -class LoadPropertyParameters final { +// Defines the property of an object for a keyed access. This is used +// as a parameter by the JSLoadProperty and JSStoreProperty operators. +class PropertyAccess final { public: - explicit LoadPropertyParameters(const VectorSlotPair& feedback, - LanguageMode language_mode) + PropertyAccess(LanguageMode language_mode, VectorSlotPair const& feedback) : feedback_(feedback), language_mode_(language_mode) {} - const VectorSlotPair& feedback() const { return feedback_; } - - LanguageMode language_mode() const { return language_mode_; } - - private: - const VectorSlotPair feedback_; - const LanguageMode language_mode_; -}; - -bool operator==(LoadPropertyParameters const&, LoadPropertyParameters const&); -bool operator!=(LoadPropertyParameters const&, LoadPropertyParameters const&); - -size_t hash_value(LoadPropertyParameters const&); - -std::ostream& operator<<(std::ostream&, LoadPropertyParameters const&); - -const LoadPropertyParameters& LoadPropertyParametersOf(const Operator* op); - - -// Defines the property being stored to an object by a named store. This is -// used as a parameter by JSStoreNamed operator. -class StoreNamedParameters final { - public: - StoreNamedParameters(LanguageMode language_mode, - const VectorSlotPair& feedback, const Handle<Name>& name) - : language_mode_(language_mode), name_(name), feedback_(feedback) {} - - LanguageMode language_mode() const { return language_mode_; } - const VectorSlotPair& feedback() const { return feedback_; } - const Handle<Name>& name() const { return name_; } - - private: - const LanguageMode language_mode_; - const Handle<Name> name_; - const VectorSlotPair feedback_; -}; - -bool operator==(StoreNamedParameters const&, StoreNamedParameters const&); -bool operator!=(StoreNamedParameters const&, StoreNamedParameters const&); - -size_t hash_value(StoreNamedParameters const&); - -std::ostream& operator<<(std::ostream&, StoreNamedParameters const&); - -const StoreNamedParameters& StoreNamedParametersOf(const Operator* op); - - -// Defines the property being stored to an object. This is used as a parameter -// by JSStoreProperty operators. -class StorePropertyParameters final { - public: - StorePropertyParameters(LanguageMode language_mode, - const VectorSlotPair& feedback) - : language_mode_(language_mode), feedback_(feedback) {} - LanguageMode language_mode() const { return language_mode_; } - const VectorSlotPair& feedback() const { return feedback_; } + VectorSlotPair const& feedback() const { return feedback_; } private: - const LanguageMode language_mode_; - const VectorSlotPair feedback_; + VectorSlotPair const feedback_; + LanguageMode const language_mode_; }; -bool operator==(StorePropertyParameters const&, StorePropertyParameters const&); -bool operator!=(StorePropertyParameters const&, StorePropertyParameters const&); +bool operator==(PropertyAccess const&, PropertyAccess const&); +bool operator!=(PropertyAccess const&, PropertyAccess const&); -size_t hash_value(StorePropertyParameters const&); +size_t hash_value(PropertyAccess const&); -std::ostream& operator<<(std::ostream&, StorePropertyParameters const&); +std::ostream& operator<<(std::ostream&, PropertyAccess const&); -const StorePropertyParameters& StorePropertyParametersOf(const Operator* op); +PropertyAccess const& PropertyAccessOf(const Operator* op); // Defines specifics about arguments object or rest parameter creation. This is @@ -506,24 +397,24 @@ class JSOperatorBuilder final : public ZoneObject { const Operator* CreateLiteralObject(int literal_flags); const Operator* CallFunction( - size_t arity, CallFunctionFlags flags, LanguageMode language_mode, + size_t arity, LanguageMode language_mode, VectorSlotPair const& feedback = VectorSlotPair(), - TailCallMode tail_call_mode = NO_TAIL_CALLS); + ConvertReceiverMode convert_mode = ConvertReceiverMode::kAny, + TailCallMode tail_call_mode = TailCallMode::kDisallow); const Operator* CallRuntime(Runtime::FunctionId id, size_t arity); - const Operator* CallConstruct(int arguments); - const Operator* LoadProperty(const VectorSlotPair& feedback, - LanguageMode language_mode); - const Operator* LoadNamed(const Handle<Name>& name, - const VectorSlotPair& feedback, - LanguageMode language_mode); + const Operator* ConvertReceiver(ConvertReceiverMode convert_mode); + + const Operator* LoadProperty(LanguageMode language_mode, + VectorSlotPair const& feedback); + const Operator* LoadNamed(LanguageMode language_mode, Handle<Name> name, + VectorSlotPair const& feedback); const Operator* StoreProperty(LanguageMode language_mode, - const VectorSlotPair& feedback); - const Operator* StoreNamed(LanguageMode language_mode, - const Handle<Name>& name, - const VectorSlotPair& feedback); + VectorSlotPair const& feedback); + const Operator* StoreNamed(LanguageMode language_mode, Handle<Name> name, + VectorSlotPair const& feedback); const Operator* DeleteProperty(LanguageMode language_mode); @@ -531,23 +422,16 @@ class JSOperatorBuilder final : public ZoneObject { const Operator* LoadGlobal(const Handle<Name>& name, const VectorSlotPair& feedback, - TypeofMode typeof_mode = NOT_INSIDE_TYPEOF, - int slot_index = -1); + TypeofMode typeof_mode = NOT_INSIDE_TYPEOF); const Operator* StoreGlobal(LanguageMode language_mode, const Handle<Name>& name, - const VectorSlotPair& feedback, - int slot_index = -1); + const VectorSlotPair& feedback); const Operator* LoadContext(size_t depth, size_t index, bool immutable); const Operator* StoreContext(size_t depth, size_t index); - const Operator* LoadDynamicGlobal(const Handle<String>& name, - uint32_t check_bitset, - const VectorSlotPair& feedback, - TypeofMode typeof_mode); - const Operator* LoadDynamicContext(const Handle<String>& name, - uint32_t check_bitset, size_t depth, - size_t index); + const Operator* LoadDynamic(const Handle<String>& name, + TypeofMode typeof_mode); const Operator* TypeOf(); const Operator* InstanceOf(); @@ -557,9 +441,12 @@ class JSOperatorBuilder final : public ZoneObject { const Operator* ForInPrepare(); const Operator* ForInStep(); + const Operator* LoadMessage(); + const Operator* StoreMessage(); + const Operator* StackCheck(); - const Operator* CreateFunctionContext(); + const Operator* CreateFunctionContext(int slot_count); const Operator* CreateCatchContext(const Handle<String>& name); const Operator* CreateWithContext(); const Operator* CreateBlockContext(const Handle<ScopeInfo>& scpope_info); |