summaryrefslogtreecommitdiff
path: root/deps/v8/src/code-stub-assembler.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/code-stub-assembler.h')
-rw-r--r--deps/v8/src/code-stub-assembler.h239
1 files changed, 175 insertions, 64 deletions
diff --git a/deps/v8/src/code-stub-assembler.h b/deps/v8/src/code-stub-assembler.h
index 3d7859f064..51ed647412 100644
--- a/deps/v8/src/code-stub-assembler.h
+++ b/deps/v8/src/code-stub-assembler.h
@@ -11,6 +11,7 @@
#include "src/compiler/code-assembler.h"
#include "src/globals.h"
#include "src/objects.h"
+#include "src/objects/bigint.h"
#include "src/roots.h"
namespace v8 {
@@ -46,7 +47,6 @@ enum class PrimitiveType { kBoolean, kNumber, kString, kSymbol };
V(EmptySlowElementDictionary, empty_slow_element_dictionary, \
EmptySlowElementDictionary) \
V(empty_string, empty_string, EmptyString) \
- V(EmptyWeakCell, empty_weak_cell, EmptyWeakCell) \
V(FalseValue, false_value, False) \
V(FeedbackVectorMap, feedback_vector_map, FeedbackVectorMap) \
V(FixedArrayMap, fixed_array_map, FixedArrayMap) \
@@ -85,7 +85,6 @@ enum class PrimitiveType { kBoolean, kNumber, kString, kSymbol };
uncompiled_data_with_pre_parsed_scope_map, \
UncompiledDataWithPreParsedScopeMap) \
V(UndefinedValue, undefined_value, Undefined) \
- V(WeakCellMap, weak_cell_map, WeakCellMap) \
V(WeakFixedArrayMap, weak_fixed_array_map, WeakFixedArrayMap)
#define HEAP_IMMOVABLE_OBJECT_LIST(V) \
@@ -103,12 +102,16 @@ struct IteratorRecord {
compiler::TNode<Object> next;
};
+#ifdef DEBUG
#define CSA_CHECK(csa, x) \
(csa)->Check( \
[&]() -> compiler::Node* { \
return implicit_cast<compiler::SloppyTNode<Word32T>>(x); \
}, \
#x, __FILE__, __LINE__)
+#else
+#define CSA_CHECK(csa, x) (csa)->FastCheck(x)
+#endif
#ifdef DEBUG
// Add stringified versions to the given values, except the first. That is,
@@ -305,9 +308,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
return UncheckedCast<HeapObject>(value);
}
- TNode<JSArray> TaggedToJSArray(TNode<Object> value, Label* fail) {
- GotoIf(TaggedIsSmi(value), fail);
- TNode<HeapObject> heap_object = CAST(value);
+ TNode<JSArray> HeapObjectToJSArray(TNode<HeapObject> heap_object,
+ Label* fail) {
GotoIfNot(IsJSArray(heap_object), fail);
return UncheckedCast<JSArray>(heap_object);
}
@@ -320,18 +322,16 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
return UncheckedCast<JSArray>(heap_object);
}
- TNode<JSDataView> TaggedToJSDataView(TNode<Object> value, Label* fail) {
- GotoIf(TaggedIsSmi(value), fail);
- TNode<HeapObject> heap_object = CAST(value);
+ TNode<JSDataView> HeapObjectToJSDataView(TNode<HeapObject> heap_object,
+ Label* fail) {
GotoIfNot(IsJSDataView(heap_object), fail);
- return UncheckedCast<JSDataView>(heap_object);
+ return CAST(heap_object);
}
- TNode<JSReceiver> TaggedToCallable(TNode<Object> value, Label* fail) {
- GotoIf(TaggedIsSmi(value), fail);
- TNode<HeapObject> result = UncheckedCast<HeapObject>(value);
- GotoIfNot(IsCallable(result), fail);
- return CAST(result);
+ TNode<JSReceiver> HeapObjectToCallable(TNode<HeapObject> heap_object,
+ Label* fail) {
+ GotoIfNot(IsCallable(heap_object), fail);
+ return CAST(heap_object);
}
TNode<HeapNumber> UnsafeCastNumberToHeapNumber(TNode<Number> p_n) {
@@ -382,6 +382,12 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
return p_o;
}
+ TNode<Object> UnsafeCastObjectToLoadFn(TNode<Object> p_o) { return p_o; }
+ TNode<Object> UnsafeCastObjectToStoreFn(TNode<Object> p_o) { return p_o; }
+ TNode<Object> UnsafeCastObjectToCanUseSameAccessorFn(TNode<Object> p_o) {
+ return p_o;
+ }
+
TNode<NumberDictionary> UnsafeCastObjectToNumberDictionary(
TNode<Object> p_o) {
return CAST(p_o);
@@ -520,6 +526,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
SMI_ARITHMETIC_BINOP(SmiAnd, WordAnd, Word32And)
SMI_ARITHMETIC_BINOP(SmiOr, WordOr, Word32Or)
#undef SMI_ARITHMETIC_BINOP
+ TNode<Smi> SmiInc(TNode<Smi> value) { return SmiAdd(value, SmiConstant(1)); }
TNode<Smi> TrySmiAdd(TNode<Smi> a, TNode<Smi> b, Label* if_overflow);
TNode<Smi> TrySmiSub(TNode<Smi> a, TNode<Smi> b, Label* if_overflow);
@@ -641,6 +648,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* extra_node3 = nullptr, const char* extra_node3_name = "",
Node* extra_node4 = nullptr, const char* extra_node4_name = "",
Node* extra_node5 = nullptr, const char* extra_node5_name = "");
+ void FastCheck(TNode<BoolT> condition);
// The following Call wrappers call an object according to the semantics that
// one finds in the EcmaScript spec, operating on an Callable (e.g. a
@@ -746,7 +754,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
void BranchIfJSReceiver(Node* object, Label* if_true, Label* if_false);
void BranchIfFastJSArray(Node* object, Node* context, Label* if_true,
- Label* if_false);
+ Label* if_false, bool iteration_only = false);
void BranchIfNotFastJSArray(Node* object, Node* context, Label* if_true,
Label* if_false) {
BranchIfFastJSArray(object, context, if_false, if_true);
@@ -916,10 +924,6 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* PointerToSeqStringData(Node* seq_string);
// Load value field of a JSValue object.
Node* LoadJSValueValue(Node* object);
- // Load value field of a WeakCell object.
- TNode<Object> LoadWeakCellValueUnchecked(SloppyTNode<HeapObject> weak_cell);
- TNode<Object> LoadWeakCellValue(SloppyTNode<WeakCell> weak_cell,
- Label* if_cleared = nullptr);
// Figures out whether the value of maybe_object is:
// - a SMI (jump to "if_smi", "extracted" will be the SMI value)
@@ -960,6 +964,10 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
TNode<MaybeObject> MakeWeak(TNode<HeapObject> value);
+ void FixedArrayBoundsCheck(TNode<FixedArrayBase> array, Node* index,
+ int additional_offset = 0,
+ ParameterMode parameter_mode = INTPTR_PARAMETERS);
+
// Load an array element from a FixedArray / WeakFixedArray / PropertyArray.
TNode<MaybeObject> LoadArrayElement(
SloppyTNode<HeapObject> object, int array_header_size, Node* index,
@@ -969,11 +977,11 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
// Load an array element from a FixedArray.
TNode<Object> LoadFixedArrayElement(
- SloppyTNode<HeapObject> object, Node* index, int additional_offset = 0,
+ TNode<FixedArray> object, Node* index, int additional_offset = 0,
ParameterMode parameter_mode = INTPTR_PARAMETERS,
LoadSensitivity needs_poisoning = LoadSensitivity::kSafe);
- TNode<Object> LoadFixedArrayElement(SloppyTNode<HeapObject> object,
+ TNode<Object> LoadFixedArrayElement(TNode<FixedArray> object,
TNode<IntPtrT> index,
LoadSensitivity needs_poisoning) {
return LoadFixedArrayElement(object, index, 0, INTPTR_PARAMETERS,
@@ -981,27 +989,27 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
}
TNode<Object> LoadFixedArrayElement(
- SloppyTNode<HeapObject> object, TNode<IntPtrT> index,
- int additional_offset = 0,
+ TNode<FixedArray> object, TNode<IntPtrT> index, int additional_offset = 0,
LoadSensitivity needs_poisoning = LoadSensitivity::kSafe) {
return LoadFixedArrayElement(object, index, additional_offset,
INTPTR_PARAMETERS, needs_poisoning);
}
TNode<Object> LoadFixedArrayElement(
- SloppyTNode<HeapObject> object, int index, int additional_offset = 0,
+ TNode<FixedArray> object, int index, int additional_offset = 0,
LoadSensitivity needs_poisoning = LoadSensitivity::kSafe) {
return LoadFixedArrayElement(object, IntPtrConstant(index),
additional_offset, INTPTR_PARAMETERS,
needs_poisoning);
}
- TNode<Object> LoadFixedArrayElement(TNode<HeapObject> object,
+ TNode<Object> LoadFixedArrayElement(TNode<FixedArray> object,
TNode<Smi> index) {
return LoadFixedArrayElement(object, index, 0, SMI_PARAMETERS);
}
TNode<Object> LoadPropertyArrayElement(SloppyTNode<PropertyArray> object,
SloppyTNode<IntPtrT> index);
+ TNode<IntPtrT> LoadPropertyArrayLength(TNode<PropertyArray> object);
// Load an array element from a FixedArray / WeakFixedArray, untag it and
// return it as Word32.
@@ -1048,6 +1056,16 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
SMI_PARAMETERS);
}
+ // Load an array element from a FixedArray, FixedDoubleArray or a
+ // NumberDictionary (depending on the |elements_kind|) and return
+ // it as a tagged value. Assumes that the |index| passed a length
+ // check before. Bails out to |if_accessor| if the element that
+ // was found is an accessor, or to |if_hole| if the element at
+ // the given |index| is not found in |elements|.
+ TNode<Object> LoadFixedArrayBaseElementAsTagged(
+ TNode<FixedArrayBase> elements, TNode<IntPtrT> index,
+ TNode<Int32T> elements_kind, Label* if_accessor, Label* if_hole);
+
// Load a feedback slot from a FeedbackVector.
TNode<MaybeObject> LoadFeedbackVectorSlot(
Node* object, Node* index, int additional_offset = 0,
@@ -1069,6 +1087,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* LoadFixedTypedArrayElementAsTagged(
Node* data_pointer, Node* index_node, ElementsKind elements_kind,
ParameterMode parameter_mode = INTPTR_PARAMETERS);
+ TNode<Numeric> LoadFixedTypedArrayElementAsTagged(
+ TNode<WordT> data_pointer, TNode<Smi> index, TNode<Int32T> elements_kind);
// Parts of the above, factored out for readability:
Node* LoadFixedBigInt64ArrayElementAsTagged(Node* data_pointer, Node* offset);
Node* LoadFixedBigUint64ArrayElementAsTagged(Node* data_pointer,
@@ -1107,6 +1127,10 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
TNode<Map> LoadJSArrayElementsMap(SloppyTNode<Int32T> kind,
SloppyTNode<Context> native_context);
+ TNode<BoolT> IsGeneratorFunction(TNode<JSFunction> function);
+ TNode<BoolT> HasPrototypeProperty(TNode<JSFunction> function, TNode<Map> map);
+ void GotoIfPrototypeRequiresRuntimeLookup(TNode<JSFunction> function,
+ TNode<Map> map, Label* runtime);
// Load the "prototype" property of a JSFunction.
Node* LoadJSFunctionPrototype(Node* function, Label* if_bailout);
@@ -1137,8 +1161,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* StoreObjectFieldRoot(Node* object, int offset,
Heap::RootListIndex root);
// Store an array element to a FixedArray.
- Node* StoreFixedArrayElement(
- Node* object, int index, Node* value,
+ void StoreFixedArrayElement(
+ TNode<FixedArray> object, int index, SloppyTNode<Object> value,
WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER) {
return StoreFixedArrayElement(object, IntPtrConstant(index), value,
barrier_mode);
@@ -1147,21 +1171,40 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* StoreJSArrayLength(TNode<JSArray> array, TNode<Smi> length);
Node* StoreElements(TNode<Object> object, TNode<FixedArrayBase> elements);
- Node* StoreFixedArrayElement(
- Node* object, Node* index, Node* value,
+ void StoreFixedArrayOrPropertyArrayElement(
+ Node* array, Node* index, Node* value,
WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER,
int additional_offset = 0,
ParameterMode parameter_mode = INTPTR_PARAMETERS);
- Node* StoreFixedArrayElementSmi(
- TNode<FixedArray> object, TNode<Smi> index, TNode<Object> value,
+ void StoreFixedArrayElement(
+ TNode<FixedArray> array, Node* index, SloppyTNode<Object> value,
+ WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER,
+ int additional_offset = 0,
+ ParameterMode parameter_mode = INTPTR_PARAMETERS) {
+ FixedArrayBoundsCheck(array, index, additional_offset, parameter_mode);
+ StoreFixedArrayOrPropertyArrayElement(array, index, value, barrier_mode,
+ additional_offset, parameter_mode);
+ }
+
+ void StorePropertyArrayElement(
+ TNode<PropertyArray> array, Node* index, SloppyTNode<Object> value,
+ WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER,
+ int additional_offset = 0,
+ ParameterMode parameter_mode = INTPTR_PARAMETERS) {
+ StoreFixedArrayOrPropertyArrayElement(array, index, value, barrier_mode,
+ additional_offset, parameter_mode);
+ }
+
+ void StoreFixedArrayElementSmi(
+ TNode<FixedArray> array, TNode<Smi> index, TNode<Object> value,
WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER) {
- return StoreFixedArrayElement(object, index, value, barrier_mode, 0,
- SMI_PARAMETERS);
+ StoreFixedArrayElement(array, index, value, barrier_mode, 0,
+ SMI_PARAMETERS);
}
- Node* StoreFixedDoubleArrayElement(
- Node* object, Node* index, Node* value,
+ void StoreFixedDoubleArrayElement(
+ TNode<FixedDoubleArray> object, Node* index, TNode<Float64T> value,
ParameterMode parameter_mode = INTPTR_PARAMETERS);
Node* StoreFeedbackVectorSlot(
@@ -1356,18 +1399,35 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* capacity = nullptr,
Node* allocation_site = nullptr);
- TNode<FixedArray> AllocateFixedArray(
+ TNode<FixedArrayBase> AllocateFixedArray(
ElementsKind kind, Node* capacity, ParameterMode mode = INTPTR_PARAMETERS,
AllocationFlags flags = kNone,
SloppyTNode<Map> fixed_array_map = nullptr);
- TNode<FixedArray> AllocateFixedArray(
+ TNode<FixedArrayBase> AllocateFixedArray(
ElementsKind kind, TNode<IntPtrT> capacity, AllocationFlags flags,
SloppyTNode<Map> fixed_array_map = nullptr) {
return AllocateFixedArray(kind, capacity, INTPTR_PARAMETERS, flags,
fixed_array_map);
}
+ TNode<FixedArray> AllocateZeroedFixedArray(TNode<IntPtrT> capacity) {
+ TNode<FixedArray> result = UncheckedCast<FixedArray>(
+ AllocateFixedArray(PACKED_ELEMENTS, capacity,
+ AllocationFlag::kAllowLargeObjectAllocation));
+ FillFixedArrayWithSmiZero(result, capacity);
+ return result;
+ }
+
+ TNode<FixedDoubleArray> AllocateZeroedFixedDoubleArray(
+ TNode<IntPtrT> capacity) {
+ TNode<FixedDoubleArray> result = UncheckedCast<FixedDoubleArray>(
+ AllocateFixedArray(FLOAT64_ELEMENTS, capacity,
+ AllocationFlag::kAllowLargeObjectAllocation));
+ FillFixedDoubleArrayWithZero(result, capacity);
+ return result;
+ }
+
Node* AllocatePropertyArray(Node* capacity,
ParameterMode mode = INTPTR_PARAMETERS,
AllocationFlags flags = kNone);
@@ -1388,6 +1448,12 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Heap::RootListIndex value_root_index,
ParameterMode mode = INTPTR_PARAMETERS);
+ // Uses memset to effectively initialize the given FixedArray with zeroes.
+ void FillFixedArrayWithSmiZero(TNode<FixedArray> array,
+ TNode<IntPtrT> length);
+ void FillFixedDoubleArrayWithZero(TNode<FixedDoubleArray> array,
+ TNode<IntPtrT> length);
+
void FillPropertyArrayWithUndefined(Node* array, Node* from_index,
Node* to_index,
ParameterMode mode = INTPTR_PARAMETERS);
@@ -1440,11 +1506,11 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
SMI_PARAMETERS);
}
- TNode<FixedArray> ConvertFixedArrayBaseToFixedArray(
- TNode<FixedArrayBase> base, Label* cast_fail);
+ TNode<FixedArray> HeapObjectToFixedArray(TNode<HeapObject> base,
+ Label* cast_fail);
- TNode<FixedDoubleArray> ConvertFixedArrayBaseToFixedDoubleArray(
- TNode<FixedArrayBase> base, Label* cast_fail) {
+ TNode<FixedDoubleArray> HeapObjectToFixedDoubleArray(TNode<HeapObject> base,
+ Label* cast_fail) {
GotoIf(WordNotEqual(LoadMap(base),
LoadRoot(Heap::kFixedDoubleArrayMapRootIndex)),
cast_fail);
@@ -1484,15 +1550,15 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
// passed as the |source| parameter.
// * |parameter_mode| determines the parameter mode of |first|, |count| and
// |capacity|.
- TNode<FixedArray> ExtractFixedArray(
+ TNode<FixedArrayBase> ExtractFixedArray(
Node* source, Node* first, Node* count = nullptr,
Node* capacity = nullptr,
ExtractFixedArrayFlags extract_flags =
ExtractFixedArrayFlag::kAllFixedArrays,
ParameterMode parameter_mode = INTPTR_PARAMETERS);
- TNode<FixedArray> ExtractFixedArray(
- TNode<FixedArray> source, TNode<Smi> first, TNode<Smi> count,
+ TNode<FixedArrayBase> ExtractFixedArray(
+ TNode<FixedArrayBase> source, TNode<Smi> first, TNode<Smi> count,
TNode<Smi> capacity,
ExtractFixedArrayFlags extract_flags =
ExtractFixedArrayFlag::kAllFixedArrays) {
@@ -1588,9 +1654,14 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* TruncateHeapNumberValueToWord32(Node* object);
// Conversions.
+ void TryHeapNumberToSmi(TNode<HeapNumber> number, TVariable<Smi>& output,
+ Label* if_smi);
+ void TryFloat64ToSmi(TNode<Float64T> number, TVariable<Smi>& output,
+ Label* if_smi);
TNode<Number> ChangeFloat64ToTagged(SloppyTNode<Float64T> value);
TNode<Number> ChangeInt32ToTagged(SloppyTNode<Int32T> value);
TNode<Number> ChangeUint32ToTagged(SloppyTNode<Uint32T> value);
+ TNode<Uint32T> ChangeNumberToUint32(TNode<Number> value);
TNode<Float64T> ChangeNumberToFloat64(SloppyTNode<Number> value);
TNode<UintPtrT> ChangeNonnegativeNumberToUintPtr(TNode<Number> value);
@@ -1600,7 +1671,20 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Variable* var_numeric,
Variable* var_feedback);
- SloppyTNode<WordT> TimesPointerSize(Node* value);
+ TNode<WordT> TimesPointerSize(SloppyTNode<WordT> value);
+ TNode<IntPtrT> TimesPointerSize(TNode<IntPtrT> value) {
+ return Signed(TimesPointerSize(implicit_cast<TNode<WordT>>(value)));
+ }
+ TNode<UintPtrT> TimesPointerSize(TNode<UintPtrT> value) {
+ return Unsigned(TimesPointerSize(implicit_cast<TNode<WordT>>(value)));
+ }
+ TNode<WordT> TimesDoubleSize(SloppyTNode<WordT> value);
+ TNode<UintPtrT> TimesDoubleSize(TNode<UintPtrT> value) {
+ return Unsigned(TimesDoubleSize(implicit_cast<TNode<WordT>>(value)));
+ }
+ TNode<IntPtrT> TimesDoubleSize(TNode<IntPtrT> value) {
+ return Signed(TimesDoubleSize(implicit_cast<TNode<WordT>>(value)));
+ }
// Type conversions.
// Throws a TypeError for {method_name} if {value} is not coercible to Object,
@@ -1659,9 +1743,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
TNode<BoolT> IsExternalStringInstanceType(SloppyTNode<Int32T> instance_type);
TNode<BoolT> IsFastJSArray(SloppyTNode<Object> object,
SloppyTNode<Context> context);
- TNode<BoolT> IsFastJSArrayWithNoCustomIteration(
- TNode<Object> object, TNode<Context> context,
- TNode<Context> native_context);
+ TNode<BoolT> IsFastJSArrayWithNoCustomIteration(TNode<Object> object,
+ TNode<Context> context);
TNode<BoolT> IsFeedbackCell(SloppyTNode<HeapObject> object);
TNode<BoolT> IsFeedbackVector(SloppyTNode<HeapObject> object);
TNode<BoolT> IsContext(SloppyTNode<HeapObject> object);
@@ -1739,7 +1822,6 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
TNode<BoolT> IsSymbolInstanceType(SloppyTNode<Int32T> instance_type);
TNode<BoolT> IsSymbol(SloppyTNode<HeapObject> object);
TNode<BoolT> IsUndetectableMap(SloppyTNode<Map> map);
- TNode<BoolT> IsWeakCell(SloppyTNode<HeapObject> object);
TNode<BoolT> IsNotWeakFixedArraySubclass(SloppyTNode<HeapObject> object);
TNode<BoolT> IsZeroOrContext(SloppyTNode<Object> object);
@@ -1795,6 +1877,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
bool IsFastElementsKind(ElementsKind kind) {
return v8::internal::IsFastElementsKind(kind);
}
+ TNode<BoolT> IsDictionaryElementsKind(TNode<Int32T> elements_kind) {
+ return ElementsKindEqual(elements_kind, Int32Constant(DICTIONARY_ELEMENTS));
+ }
TNode<BoolT> IsDoubleElementsKind(TNode<Int32T> elements_kind);
bool IsDoubleElementsKind(ElementsKind kind) {
return v8::internal::IsDoubleElementsKind(kind);
@@ -1890,6 +1975,11 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
TNode<JSReceiver> ToObject(SloppyTNode<Context> context,
SloppyTNode<Object> input);
+ // Same as ToObject but avoids the Builtin call if |input| is already a
+ // JSReceiver.
+ TNode<JSReceiver> ToObject_Inline(TNode<Context> context,
+ TNode<Object> input);
+
enum ToIntegerTruncationMode {
kNoTruncation,
kTruncateMinusZero,
@@ -1981,6 +2071,12 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Int32Constant(0));
}
+ // Returns true if all of the mask's bits in a given |word32| are set.
+ TNode<BoolT> IsAllSetWord32(SloppyTNode<Word32T> word32, uint32_t mask) {
+ TNode<Int32T> const_mask = Int32Constant(mask);
+ return Word32Equal(Word32And(word32, const_mask), const_mask);
+ }
+
// Returns true if any of the |T|'s bits in given |word| are set.
template <typename T>
TNode<BoolT> IsSetWord(SloppyTNode<WordT> word) {
@@ -2078,8 +2174,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
const int kKeyToDetailsOffset =
(ContainerType::kEntryDetailsIndex - ContainerType::kEntryKeyIndex) *
kPointerSize;
- return Unsigned(LoadAndUntagToWord32FixedArrayElement(container, key_index,
- kKeyToDetailsOffset));
+ return Unsigned(LoadAndUntagToWord32FixedArrayElement(
+ CAST(container), key_index, kKeyToDetailsOffset));
}
// Loads the value for the entry with the given key_index.
@@ -2091,8 +2187,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
const int kKeyToValueOffset =
(ContainerType::kEntryValueIndex - ContainerType::kEntryKeyIndex) *
kPointerSize;
- return UncheckedCast<Object>(
- LoadFixedArrayElement(container, key_index, kKeyToValueOffset));
+ return LoadFixedArrayElement(CAST(container), key_index, kKeyToValueOffset);
}
TNode<Uint32T> LoadDetailsByKeyIndex(TNode<DescriptorArray> container,
@@ -2105,7 +2200,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
// Stores the details for the entry with the given key_index.
// |details| must be a Smi.
template <class ContainerType>
- void StoreDetailsByKeyIndex(Node* container, Node* key_index, Node* details) {
+ void StoreDetailsByKeyIndex(TNode<ContainerType> container,
+ TNode<IntPtrT> key_index, TNode<Smi> details) {
const int kKeyToDetailsOffset =
(ContainerType::kEntryDetailsIndex - ContainerType::kEntryKeyIndex) *
kPointerSize;
@@ -2116,7 +2212,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
// Stores the value for the entry with the given key_index.
template <class ContainerType>
void StoreValueByKeyIndex(
- Node* container, Node* key_index, Node* value,
+ TNode<ContainerType> container, TNode<IntPtrT> key_index,
+ TNode<Object> value,
WriteBarrierMode write_barrier = UPDATE_WRITE_BARRIER) {
const int kKeyToValueOffset =
(ContainerType::kEntryValueIndex - ContainerType::kEntryKeyIndex) *
@@ -2250,8 +2347,13 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
TNode<Object> GetProperty(SloppyTNode<Context> context,
SloppyTNode<Object> receiver,
SloppyTNode<Object> name) {
- return CallStub(Builtins::CallableFor(isolate(), Builtins::kGetProperty),
- context, receiver, name);
+ return CallBuiltin(Builtins::kGetProperty, context, receiver, name);
+ }
+
+ TNode<Object> SetPropertyStrict(TNode<Context> context,
+ TNode<Object> receiver, TNode<Object> key,
+ TNode<Object> value) {
+ return CallBuiltin(Builtins::kSetProperty, context, receiver, key, value);
}
Node* GetMethod(Node* context, Node* object, Handle<Name> name,
@@ -2461,8 +2563,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
// Store a weak in-place reference into the FeedbackVector.
TNode<MaybeObject> StoreWeakReferenceInFeedbackVector(
- SloppyTNode<FeedbackVector> feedback_vector, SloppyTNode<IntPtrT> slot,
- TNode<HeapObject> value);
+ SloppyTNode<FeedbackVector> feedback_vector, Node* slot,
+ SloppyTNode<HeapObject> value, int additional_offset = 0,
+ ParameterMode parameter_mode = INTPTR_PARAMETERS);
// Create a new AllocationSite and install it into a feedback vector.
TNode<AllocationSite> CreateAllocationSiteInFeedbackVector(
@@ -2590,9 +2693,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
enum HasPropertyLookupMode { kHasProperty, kForInHasProperty };
- TNode<Oddball> HasProperty(SloppyTNode<HeapObject> object,
+ TNode<Oddball> HasProperty(SloppyTNode<Context> context,
+ SloppyTNode<Object> object,
SloppyTNode<Object> key,
- SloppyTNode<Context> context,
HasPropertyLookupMode mode);
Node* Typeof(Node* value);
@@ -2609,8 +2712,16 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
// Debug helpers
Node* IsDebugActive();
+ TNode<BoolT> IsRuntimeCallStatsEnabled();
+
// TypedArray/ArrayBuffer helpers
Node* IsDetachedBuffer(Node* buffer);
+ void ThrowIfArrayBufferIsDetached(SloppyTNode<Context> context,
+ TNode<JSArrayBuffer> array_buffer,
+ const char* method_name);
+ void ThrowIfArrayBufferViewBufferIsDetached(
+ SloppyTNode<Context> context, TNode<JSArrayBufferView> array_buffer_view,
+ const char* method_name);
TNode<JSArrayBuffer> LoadArrayBufferViewBuffer(
TNode<JSArrayBufferView> array_buffer_view);
TNode<RawPtrT> LoadArrayBufferBackingStore(TNode<JSArrayBuffer> array_buffer);
@@ -2945,13 +3056,13 @@ class ToDirectStringAssembler : public CodeStubAssembler {
// Returns a pointer to the beginning of the string data.
// Jumps to if_bailout if the external string cannot be unpacked.
- Node* PointerToData(Label* if_bailout) {
+ TNode<RawPtrT> PointerToData(Label* if_bailout) {
return TryToSequential(PTR_TO_DATA, if_bailout);
}
// Returns a pointer that, offset-wise, looks like a String.
// Jumps to if_bailout if the external string cannot be unpacked.
- Node* PointerToString(Label* if_bailout) {
+ TNode<RawPtrT> PointerToString(Label* if_bailout) {
return TryToSequential(PTR_TO_STRING, if_bailout);
}
@@ -2963,7 +3074,7 @@ class ToDirectStringAssembler : public CodeStubAssembler {
Node* is_external() { return var_is_external_.value(); }
private:
- Node* TryToSequential(StringPointerKind ptr_kind, Label* if_bailout);
+ TNode<RawPtrT> TryToSequential(StringPointerKind ptr_kind, Label* if_bailout);
Variable var_string_;
Variable var_instance_type_;