summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/js-operator.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/js-operator.h')
-rw-r--r--deps/v8/src/compiler/js-operator.h303
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);