summaryrefslogtreecommitdiff
path: root/deps/v8/test/cctest/test-code-stub-assembler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/cctest/test-code-stub-assembler.cc')
-rw-r--r--deps/v8/test/cctest/test-code-stub-assembler.cc346
1 files changed, 280 insertions, 66 deletions
diff --git a/deps/v8/test/cctest/test-code-stub-assembler.cc b/deps/v8/test/cctest/test-code-stub-assembler.cc
index 1c48225a14..7a94d3a511 100644
--- a/deps/v8/test/cctest/test-code-stub-assembler.cc
+++ b/deps/v8/test/cctest/test-code-stub-assembler.cc
@@ -212,8 +212,8 @@ TEST(LoadHeapNumberValue) {
CodeAssemblerTester asm_tester(isolate);
CodeStubAssembler m(asm_tester.state());
Handle<HeapNumber> number = isolate->factory()->NewHeapNumber(1234);
- m.Return(m.SmiFromWord32(
- m.ChangeFloat64ToUint32(m.LoadHeapNumberValue(m.HeapConstant(number)))));
+ m.Return(m.SmiFromWord32(m.Signed(
+ m.ChangeFloat64ToUint32(m.LoadHeapNumberValue(m.HeapConstant(number))))));
FunctionTester ft(asm_tester.GenerateCode());
MaybeHandle<Object> result = ft.Call();
CHECK_EQ(1234, Handle<Smi>::cast(result.ToHandleChecked())->value());
@@ -657,10 +657,7 @@ TEST(NameDictionaryLookup) { TestNameDictionaryLookup<NameDictionary>(); }
TEST(GlobalDictionaryLookup) { TestNameDictionaryLookup<GlobalDictionary>(); }
-namespace {
-
-template <typename Dictionary>
-void TestNumberDictionaryLookup() {
+TEST(NumberDictionaryLookup) {
Isolate* isolate(CcTest::InitIsolateOnce());
const int kNumParams = 4;
@@ -678,8 +675,8 @@ void TestNumberDictionaryLookup() {
Label if_found(&m), if_not_found(&m);
Variable var_entry(&m, MachineType::PointerRepresentation());
- m.NumberDictionaryLookup<Dictionary>(dictionary, key, &if_found, &var_entry,
- &if_not_found);
+ m.NumberDictionaryLookup(dictionary, key, &if_found, &var_entry,
+ &if_not_found);
m.BIND(&if_found);
m.GotoIfNot(
m.WordEqual(expected_result, m.SmiConstant(Smi::FromInt(kFound))),
@@ -705,7 +702,8 @@ void TestNumberDictionaryLookup() {
Handle<Object> expect_not_found(Smi::FromInt(kNotFound), isolate);
const int kKeysCount = 1000;
- Handle<Dictionary> dictionary = Dictionary::New(isolate, kKeysCount);
+ Handle<NumberDictionary> dictionary =
+ NumberDictionary::New(isolate, kKeysCount);
uint32_t keys[kKeysCount];
Handle<Object> fake_value(Smi::FromInt(42), isolate);
@@ -716,15 +714,16 @@ void TestNumberDictionaryLookup() {
for (int i = 0; i < kKeysCount; i++) {
int random_key = rand_gen.NextInt(Smi::kMaxValue);
keys[i] = static_cast<uint32_t>(random_key);
- if (dictionary->FindEntry(keys[i]) != Dictionary::kNotFound) continue;
+ if (dictionary->FindEntry(keys[i]) != NumberDictionary::kNotFound) continue;
- dictionary = Dictionary::Add(dictionary, keys[i], fake_value, fake_details);
+ dictionary =
+ NumberDictionary::Add(dictionary, keys[i], fake_value, fake_details);
}
// Now try querying existing keys.
for (int i = 0; i < kKeysCount; i++) {
int entry = dictionary->FindEntry(keys[i]);
- CHECK_NE(Dictionary::kNotFound, entry);
+ CHECK_NE(NumberDictionary::kNotFound, entry);
Handle<Object> key(Smi::FromInt(keys[i]), isolate);
Handle<Object> expected_entry(Smi::FromInt(entry), isolate);
@@ -735,7 +734,7 @@ void TestNumberDictionaryLookup() {
for (int i = 0; i < kKeysCount;) {
int random_key = rand_gen.NextInt(Smi::kMaxValue);
int entry = dictionary->FindEntry(random_key);
- if (entry != Dictionary::kNotFound) continue;
+ if (entry != NumberDictionary::kNotFound) continue;
i++;
Handle<Object> key(Smi::FromInt(random_key), isolate);
@@ -743,16 +742,6 @@ void TestNumberDictionaryLookup() {
}
}
-} // namespace
-
-TEST(SeededNumberDictionaryLookup) {
- TestNumberDictionaryLookup<SeededNumberDictionary>();
-}
-
-TEST(UnseededNumberDictionaryLookup) {
- TestNumberDictionaryLookup<UnseededNumberDictionary>();
-}
-
namespace {
void AddProperties(Handle<JSObject> object, Handle<Name> names[],
@@ -902,13 +891,15 @@ TEST(TryHasOwnProperty) {
{
// Dictionary mode object.
- Handle<JSFunction> function = factory->NewFunction(factory->empty_string());
+ Handle<JSFunction> function =
+ factory->NewFunctionForTest(factory->empty_string());
Handle<JSObject> object = factory->NewJSObject(function);
AddProperties(object, names, arraysize(names));
JSObject::NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0, "test");
JSObject::AddProperty(object, deleted_property_name, object, NONE);
- CHECK(JSObject::DeleteProperty(object, deleted_property_name, SLOPPY)
+ CHECK(JSObject::DeleteProperty(object, deleted_property_name,
+ LanguageMode::kSloppy)
.FromJust());
CHECK_EQ(JS_OBJECT_TYPE, object->map()->instance_type());
@@ -918,7 +909,8 @@ TEST(TryHasOwnProperty) {
{
// Global object.
- Handle<JSFunction> function = factory->NewFunction(factory->empty_string());
+ Handle<JSFunction> function =
+ factory->NewFunctionForTest(factory->empty_string());
JSFunction::EnsureHasInitialMap(function);
function->initial_map()->set_instance_type(JS_GLOBAL_OBJECT_TYPE);
function->initial_map()->set_is_prototype_map(true);
@@ -928,7 +920,8 @@ TEST(TryHasOwnProperty) {
AddProperties(object, names, arraysize(names));
JSObject::AddProperty(object, deleted_property_name, object, NONE);
- CHECK(JSObject::DeleteProperty(object, deleted_property_name, SLOPPY)
+ CHECK(JSObject::DeleteProperty(object, deleted_property_name,
+ LanguageMode::kSloppy)
.FromJust());
CHECK_EQ(JS_GLOBAL_OBJECT_TYPE, object->map()->instance_type());
@@ -967,7 +960,8 @@ TEST(TryHasOwnProperty) {
}
{
- Handle<JSFunction> function = factory->NewFunction(factory->empty_string());
+ Handle<JSFunction> function =
+ factory->NewFunctionForTest(factory->empty_string());
Handle<JSProxy> object = factory->NewJSProxy(function, objects[0]);
CHECK_EQ(JS_PROXY_TYPE, object->map()->instance_type());
ft.CheckTrue(object, names[0], expect_bailout);
@@ -1040,11 +1034,11 @@ TEST(TryGetOwnProperty) {
factory->NewPrivateSymbol(),
};
Handle<Object> values[] = {
- factory->NewFunction(factory->empty_string()),
+ factory->NewFunctionForTest(factory->empty_string()),
factory->NewSymbol(),
factory->InternalizeUtf8String("a"),
CreateAccessorPair(&ft, "() => 188;", "() => 199;"),
- factory->NewFunction(factory->InternalizeUtf8String("bb")),
+ factory->NewFunctionForTest(factory->InternalizeUtf8String("bb")),
factory->InternalizeUtf8String("ccc"),
CreateAccessorPair(&ft, "() => 88;", nullptr),
handle(Smi::FromInt(1), isolate),
@@ -1052,7 +1046,8 @@ TEST(TryGetOwnProperty) {
CreateAccessorPair(&ft, nullptr, "() => 99;"),
factory->NewHeapNumber(4.2),
handle(Smi::FromInt(153), isolate),
- factory->NewJSObject(factory->NewFunction(factory->empty_string())),
+ factory->NewJSObject(
+ factory->NewFunctionForTest(factory->empty_string())),
factory->NewPrivateSymbol(),
};
STATIC_ASSERT(arraysize(values) < arraysize(names));
@@ -1102,14 +1097,16 @@ TEST(TryGetOwnProperty) {
{
// Dictionary mode object.
- Handle<JSFunction> function = factory->NewFunction(factory->empty_string());
+ Handle<JSFunction> function =
+ factory->NewFunctionForTest(factory->empty_string());
Handle<JSObject> object = factory->NewJSObject(function);
AddProperties(object, names, arraysize(names), values, arraysize(values),
rand_gen.NextInt());
JSObject::NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0, "test");
JSObject::AddProperty(object, deleted_property_name, object, NONE);
- CHECK(JSObject::DeleteProperty(object, deleted_property_name, SLOPPY)
+ CHECK(JSObject::DeleteProperty(object, deleted_property_name,
+ LanguageMode::kSloppy)
.FromJust());
CHECK_EQ(JS_OBJECT_TYPE, object->map()->instance_type());
@@ -1124,7 +1121,8 @@ TEST(TryGetOwnProperty) {
rand_gen.NextInt());
JSObject::AddProperty(object, deleted_property_name, object, NONE);
- CHECK(JSObject::DeleteProperty(object, deleted_property_name, SLOPPY)
+ CHECK(JSObject::DeleteProperty(object, deleted_property_name,
+ LanguageMode::kSloppy)
.FromJust());
CHECK_EQ(JS_GLOBAL_OBJECT_TYPE, object->map()->instance_type());
@@ -1170,7 +1168,8 @@ TEST(TryGetOwnProperty) {
}
{
- Handle<JSFunction> function = factory->NewFunction(factory->empty_string());
+ Handle<JSFunction> function =
+ factory->NewFunctionForTest(factory->empty_string());
Handle<JSProxy> object = factory->NewJSProxy(function, objects[0]);
CHECK_EQ(JS_PROXY_TYPE, object->map()->instance_type());
Handle<Object> value = ft.Call(object, names[0]).ToHandleChecked();
@@ -1402,7 +1401,8 @@ TEST(TryLookupElement) {
{
Handle<JSArray> handler = factory->NewJSArray(0);
- Handle<JSFunction> function = factory->NewFunction(factory->empty_string());
+ Handle<JSFunction> function =
+ factory->NewFunctionForTest(factory->empty_string());
Handle<JSProxy> object = factory->NewJSProxy(function, handler);
CHECK_EQ(JS_PROXY_TYPE, object->map()->instance_type());
ft.CheckTrue(object, smi0, expect_bailout);
@@ -1573,11 +1573,9 @@ TEST(OneToTwoByteStringCopy) {
CodeAssemblerTester asm_tester(isolate, kNumParams);
CodeStubAssembler m(asm_tester.state());
- m.CopyStringCharacters(
- m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)),
- m.SmiConstant(Smi::FromInt(0)), m.SmiConstant(Smi::FromInt(5)),
- String::ONE_BYTE_ENCODING, String::TWO_BYTE_ENCODING,
- CodeStubAssembler::SMI_PARAMETERS);
+ m.CopyStringCharacters(m.Parameter(0), m.Parameter(1), m.IntPtrConstant(0),
+ m.IntPtrConstant(0), m.IntPtrConstant(5),
+ String::ONE_BYTE_ENCODING, String::TWO_BYTE_ENCODING);
m.Return(m.SmiConstant(Smi::FromInt(0)));
Handle<String> string1 = isolate->factory()->InternalizeUtf8String("abcde");
@@ -1606,11 +1604,9 @@ TEST(OneToOneByteStringCopy) {
CodeAssemblerTester asm_tester(isolate, kNumParams);
CodeStubAssembler m(asm_tester.state());
- m.CopyStringCharacters(
- m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)),
- m.SmiConstant(Smi::FromInt(0)), m.SmiConstant(Smi::FromInt(5)),
- String::ONE_BYTE_ENCODING, String::ONE_BYTE_ENCODING,
- CodeStubAssembler::SMI_PARAMETERS);
+ m.CopyStringCharacters(m.Parameter(0), m.Parameter(1), m.IntPtrConstant(0),
+ m.IntPtrConstant(0), m.IntPtrConstant(5),
+ String::ONE_BYTE_ENCODING, String::ONE_BYTE_ENCODING);
m.Return(m.SmiConstant(Smi::FromInt(0)));
Handle<String> string1 = isolate->factory()->InternalizeUtf8String("abcde");
@@ -1639,11 +1635,9 @@ TEST(OneToOneByteStringCopyNonZeroStart) {
CodeAssemblerTester asm_tester(isolate, kNumParams);
CodeStubAssembler m(asm_tester.state());
- m.CopyStringCharacters(
- m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)),
- m.SmiConstant(Smi::FromInt(3)), m.SmiConstant(Smi::FromInt(2)),
- String::ONE_BYTE_ENCODING, String::ONE_BYTE_ENCODING,
- CodeStubAssembler::SMI_PARAMETERS);
+ m.CopyStringCharacters(m.Parameter(0), m.Parameter(1), m.IntPtrConstant(0),
+ m.IntPtrConstant(3), m.IntPtrConstant(2),
+ String::ONE_BYTE_ENCODING, String::ONE_BYTE_ENCODING);
m.Return(m.SmiConstant(Smi::FromInt(0)));
Handle<String> string1 = isolate->factory()->InternalizeUtf8String("abcde");
@@ -1669,11 +1663,9 @@ TEST(TwoToTwoByteStringCopy) {
CodeAssemblerTester asm_tester(isolate, kNumParams);
CodeStubAssembler m(asm_tester.state());
- m.CopyStringCharacters(
- m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)),
- m.SmiConstant(Smi::FromInt(0)), m.SmiConstant(Smi::FromInt(5)),
- String::TWO_BYTE_ENCODING, String::TWO_BYTE_ENCODING,
- CodeStubAssembler::SMI_PARAMETERS);
+ m.CopyStringCharacters(m.Parameter(0), m.Parameter(1), m.IntPtrConstant(0),
+ m.IntPtrConstant(0), m.IntPtrConstant(5),
+ String::TWO_BYTE_ENCODING, String::TWO_BYTE_ENCODING);
m.Return(m.SmiConstant(Smi::FromInt(0)));
uc16 array1[] = {2000, 2001, 2002, 2003, 2004};
@@ -1799,10 +1791,12 @@ class AppendJSArrayCodeStubAssembler : public CodeStubAssembler {
Handle<JSArray> array = isolate->factory()->NewJSArray(
kind_, 2, initial_size, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE);
JSObject::SetElement(isolate, array, 0,
- Handle<Smi>(Smi::FromInt(1), isolate), SLOPPY)
+ Handle<Smi>(Smi::FromInt(1), isolate),
+ LanguageMode::kSloppy)
.Check();
JSObject::SetElement(isolate, array, 1,
- Handle<Smi>(Smi::FromInt(2), isolate), SLOPPY)
+ Handle<Smi>(Smi::FromInt(2), isolate),
+ LanguageMode::kSloppy)
.Check();
CodeStubArguments args(this, IntPtrConstant(kNumParams));
TVariable<IntPtrT> arg_index(this);
@@ -2138,8 +2132,6 @@ TEST(CreatePromiseResolvingFunctionsContext) {
CHECK_EQ(isolate->native_context()->closure(), context_js->closure());
CHECK_EQ(isolate->heap()->the_hole_value(), context_js->extension());
CHECK_EQ(*isolate->native_context(), context_js->native_context());
- CHECK_EQ(Smi::FromInt(0),
- context_js->get(PromiseBuiltinsAssembler::kAlreadyVisitedSlot));
CHECK(context_js->get(PromiseBuiltinsAssembler::kPromiseSlot)->IsJSPromise());
CHECK_EQ(isolate->heap()->false_value(),
context_js->get(PromiseBuiltinsAssembler::kDebugEventSlot));
@@ -2263,7 +2255,7 @@ TEST(AllocateFunctionWithMapAndContext) {
CHECK_EQ(isolate->heap()->empty_property_array(), fun->property_array());
CHECK_EQ(isolate->heap()->empty_fixed_array(), fun->elements());
CHECK_EQ(isolate->heap()->undefined_cell(), fun->feedback_vector_cell());
- CHECK_EQ(isolate->heap()->the_hole_value(), fun->prototype_or_initial_map());
+ CHECK(!fun->has_prototype_slot());
CHECK_EQ(*isolate->promise_resolve_shared_fun(), fun->shared());
CHECK_EQ(isolate->promise_resolve_shared_fun()->code(), fun->code());
}
@@ -2278,7 +2270,7 @@ TEST(CreatePromiseGetCapabilitiesExecutorContext) {
Node* const context = m.Parameter(kNumParams + 2);
Node* const native_context = m.LoadNativeContext(context);
- Node* const map = m.LoadRoot(Heap::kPromiseCapabilityMapRootIndex);
+ Node* const map = m.LoadRoot(Heap::kTuple3MapRootIndex);
Node* const capability = m.AllocateStruct(map);
m.StoreObjectFieldNoWriteBarrier(
capability, PromiseCapability::kPromiseOffset, m.UndefinedConstant());
@@ -2625,7 +2617,7 @@ TEST(AllocateStruct) {
FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
Handle<Map> maps[] = {
- handle(isolate->heap()->promise_capability_map(), isolate),
+ handle(isolate->heap()->tuple3_map(), isolate),
handle(isolate->heap()->tuple2_map(), isolate),
};
@@ -2679,9 +2671,9 @@ TEST(BranchIfNumericRelationalComparison) {
{
CodeStubAssembler m(asm_tester.state());
Label return_true(&m), return_false(&m);
- m.BranchIfNumericRelationalComparison(
- CodeStubAssembler::kGreaterThanOrEqual, m.Parameter(0), m.Parameter(1),
- &return_true, &return_false);
+ m.BranchIfNumericRelationalComparison(Operation::kGreaterThanOrEqual,
+ m.Parameter(0), m.Parameter(1),
+ &return_true, &return_false);
m.BIND(&return_true);
m.Return(m.BooleanConstant(true));
m.BIND(&return_false);
@@ -2848,6 +2840,228 @@ TEST(NumberAddSub) {
CHECK_EQ(ft_sub.CallChecked<HeapNumber>(double_a, smi_1)->value(), 1.5);
}
+TEST(CloneEmptyFixedArray) {
+ Isolate* isolate(CcTest::InitIsolateOnce());
+ const int kNumParams = 1;
+ CodeAssemblerTester asm_tester(isolate, kNumParams);
+ {
+ CodeStubAssembler m(asm_tester.state());
+ m.Return(m.CloneFixedArray(m.Parameter(0)));
+ }
+ FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
+
+ Handle<FixedArray> source(isolate->factory()->empty_fixed_array());
+ Handle<Object> result_raw = ft.Call(source).ToHandleChecked();
+ FixedArray* result(FixedArray::cast(*result_raw));
+ CHECK_EQ(0, result->length());
+ CHECK_EQ(*(isolate->factory()->empty_fixed_array()), result);
+}
+
+TEST(CloneFixedArray) {
+ Isolate* isolate(CcTest::InitIsolateOnce());
+ const int kNumParams = 1;
+ CodeAssemblerTester asm_tester(isolate, kNumParams);
+ {
+ CodeStubAssembler m(asm_tester.state());
+ m.Return(m.CloneFixedArray(m.Parameter(0)));
+ }
+ FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
+
+ Handle<FixedArray> source(isolate->factory()->NewFixedArrayWithHoles(5));
+ source->set(1, Smi::FromInt(1234));
+ Handle<Object> result_raw = ft.Call(source).ToHandleChecked();
+ FixedArray* result(FixedArray::cast(*result_raw));
+ CHECK_EQ(5, result->length());
+ CHECK(result->get(0)->IsTheHole(isolate));
+ CHECK_EQ(Smi::cast(result->get(1))->value(), 1234);
+ CHECK(result->get(2)->IsTheHole(isolate));
+ CHECK(result->get(3)->IsTheHole(isolate));
+ CHECK(result->get(4)->IsTheHole(isolate));
+}
+
+TEST(CloneFixedArrayCOW) {
+ Isolate* isolate(CcTest::InitIsolateOnce());
+ const int kNumParams = 1;
+ CodeAssemblerTester asm_tester(isolate, kNumParams);
+ {
+ CodeStubAssembler m(asm_tester.state());
+ m.Return(m.CloneFixedArray(m.Parameter(0)));
+ }
+ FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
+
+ Handle<FixedArray> source(isolate->factory()->NewFixedArrayWithHoles(5));
+ source->set(1, Smi::FromInt(1234));
+ source->set_map(isolate->heap()->fixed_cow_array_map());
+ Handle<Object> result_raw = ft.Call(source).ToHandleChecked();
+ FixedArray* result(FixedArray::cast(*result_raw));
+ CHECK_EQ(*source, result);
+}
+
+TEST(ExtractFixedArrayCOWForceCopy) {
+ Isolate* isolate(CcTest::InitIsolateOnce());
+ const int kNumParams = 1;
+ CodeAssemblerTester asm_tester(isolate, kNumParams);
+ {
+ CodeStubAssembler m(asm_tester.state());
+ CodeStubAssembler::ExtractFixedArrayFlags flags;
+ flags |= CodeStubAssembler::ExtractFixedArrayFlag::kAllFixedArrays;
+ m.Return(m.ExtractFixedArray(m.Parameter(0), m.SmiConstant(0), nullptr,
+ nullptr, flags,
+ CodeStubAssembler::SMI_PARAMETERS));
+ }
+ FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
+
+ Handle<FixedArray> source(isolate->factory()->NewFixedArrayWithHoles(5));
+ source->set(1, Smi::FromInt(1234));
+ source->set_map(isolate->heap()->fixed_cow_array_map());
+ Handle<Object> result_raw = ft.Call(source).ToHandleChecked();
+ FixedArray* result(FixedArray::cast(*result_raw));
+ CHECK_NE(*source, result);
+ CHECK_EQ(5, result->length());
+ CHECK(result->get(0)->IsTheHole(isolate));
+ CHECK_EQ(Smi::cast(result->get(1))->value(), 1234);
+ CHECK(result->get(2)->IsTheHole(isolate));
+ CHECK(result->get(3)->IsTheHole(isolate));
+ CHECK(result->get(4)->IsTheHole(isolate));
+}
+
+TEST(ExtractFixedArraySimple) {
+ Isolate* isolate(CcTest::InitIsolateOnce());
+ const int kNumParams = 3;
+ CodeAssemblerTester asm_tester(isolate, kNumParams);
+ {
+ CodeStubAssembler m(asm_tester.state());
+ CodeStubAssembler::ExtractFixedArrayFlags flags;
+ flags |= CodeStubAssembler::ExtractFixedArrayFlag::kAllFixedArrays;
+ flags |= CodeStubAssembler::ExtractFixedArrayFlag::kDontCopyCOW;
+ m.Return(m.ExtractFixedArray(m.Parameter(0), m.Parameter(1), m.Parameter(2),
+ nullptr, flags,
+ CodeStubAssembler::SMI_PARAMETERS));
+ }
+ FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
+
+ Handle<FixedArray> source(isolate->factory()->NewFixedArrayWithHoles(5));
+ source->set(1, Smi::FromInt(1234));
+ Handle<Object> result_raw =
+ ft.Call(source, Handle<Smi>(Smi::FromInt(1), isolate),
+ Handle<Smi>(Smi::FromInt(2), isolate))
+ .ToHandleChecked();
+ FixedArray* result(FixedArray::cast(*result_raw));
+ CHECK_EQ(2, result->length());
+ CHECK_EQ(Smi::cast(result->get(0))->value(), 1234);
+ CHECK(result->get(1)->IsTheHole(isolate));
+}
+
+TEST(ExtractFixedArraySimpleSmiConstant) {
+ Isolate* isolate(CcTest::InitIsolateOnce());
+ const int kNumParams = 1;
+ CodeAssemblerTester asm_tester(isolate, kNumParams);
+ {
+ CodeStubAssembler m(asm_tester.state());
+ CodeStubAssembler::ExtractFixedArrayFlags flags;
+ flags |= CodeStubAssembler::ExtractFixedArrayFlag::kAllFixedArrays;
+ flags |= CodeStubAssembler::ExtractFixedArrayFlag::kDontCopyCOW;
+ m.Return(m.ExtractFixedArray(m.Parameter(0), m.SmiConstant(1),
+ m.SmiConstant(2), nullptr, flags,
+ CodeStubAssembler::SMI_PARAMETERS));
+ }
+ FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
+
+ Handle<FixedArray> source(isolate->factory()->NewFixedArrayWithHoles(5));
+ source->set(1, Smi::FromInt(1234));
+ Handle<Object> result_raw = ft.Call(source).ToHandleChecked();
+ FixedArray* result(FixedArray::cast(*result_raw));
+ CHECK_EQ(2, result->length());
+ CHECK_EQ(Smi::cast(result->get(0))->value(), 1234);
+ CHECK(result->get(1)->IsTheHole(isolate));
+}
+
+TEST(ExtractFixedArraySimpleIntPtrConstant) {
+ Isolate* isolate(CcTest::InitIsolateOnce());
+ const int kNumParams = 1;
+ CodeAssemblerTester asm_tester(isolate, kNumParams);
+ {
+ CodeStubAssembler m(asm_tester.state());
+ CodeStubAssembler::ExtractFixedArrayFlags flags;
+ flags |= CodeStubAssembler::ExtractFixedArrayFlag::kAllFixedArrays;
+ flags |= CodeStubAssembler::ExtractFixedArrayFlag::kDontCopyCOW;
+ m.Return(m.ExtractFixedArray(m.Parameter(0), m.IntPtrConstant(1),
+ m.IntPtrConstant(2), nullptr, flags,
+ CodeStubAssembler::INTPTR_PARAMETERS));
+ }
+ FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
+
+ Handle<FixedArray> source(isolate->factory()->NewFixedArrayWithHoles(5));
+ source->set(1, Smi::FromInt(1234));
+ Handle<Object> result_raw = ft.Call(source).ToHandleChecked();
+ FixedArray* result(FixedArray::cast(*result_raw));
+ CHECK_EQ(2, result->length());
+ CHECK_EQ(Smi::cast(result->get(0))->value(), 1234);
+ CHECK(result->get(1)->IsTheHole(isolate));
+}
+
+TEST(ExtractFixedArraySimpleIntPtrConstantNoDoubles) {
+ Isolate* isolate(CcTest::InitIsolateOnce());
+ const int kNumParams = 1;
+ CodeAssemblerTester asm_tester(isolate, kNumParams);
+ {
+ CodeStubAssembler m(asm_tester.state());
+ m.Return(m.ExtractFixedArray(
+ m.Parameter(0), m.IntPtrConstant(1), m.IntPtrConstant(2), nullptr,
+ CodeStubAssembler::ExtractFixedArrayFlag::kFixedArrays,
+ CodeStubAssembler::INTPTR_PARAMETERS));
+ }
+ FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
+
+ Handle<FixedArray> source(isolate->factory()->NewFixedArrayWithHoles(5));
+ source->set(1, Smi::FromInt(1234));
+ Handle<Object> result_raw = ft.Call(source).ToHandleChecked();
+ FixedArray* result(FixedArray::cast(*result_raw));
+ CHECK_EQ(2, result->length());
+ CHECK_EQ(Smi::cast(result->get(0))->value(), 1234);
+ CHECK(result->get(1)->IsTheHole(isolate));
+}
+
+TEST(ExtractFixedArraySimpleIntPtrParameters) {
+ Isolate* isolate(CcTest::InitIsolateOnce());
+ const int kNumParams = 3;
+ CodeAssemblerTester asm_tester(isolate, kNumParams);
+ {
+ CodeStubAssembler m(asm_tester.state());
+ Node* p1_untagged = m.SmiUntag(m.Parameter(1));
+ Node* p2_untagged = m.SmiUntag(m.Parameter(2));
+ m.Return(m.ExtractFixedArray(m.Parameter(0), p1_untagged, p2_untagged));
+ }
+ FunctionTester ft(asm_tester.GenerateCode(), kNumParams);
+
+ Handle<FixedArray> source(isolate->factory()->NewFixedArrayWithHoles(5));
+ source->set(1, Smi::FromInt(1234));
+ Handle<Object> result_raw =
+ ft.Call(source, Handle<Smi>(Smi::FromInt(1), isolate),
+ Handle<Smi>(Smi::FromInt(2), isolate))
+ .ToHandleChecked();
+ FixedArray* result(FixedArray::cast(*result_raw));
+ CHECK_EQ(2, result->length());
+ CHECK_EQ(Smi::cast(result->get(0))->value(), 1234);
+ CHECK(result->get(1)->IsTheHole(isolate));
+
+ Handle<FixedDoubleArray> source_double(Handle<FixedDoubleArray>::cast(
+ isolate->factory()->NewFixedDoubleArray(5)));
+ source_double->set(0, 10);
+ source_double->set(1, 11);
+ source_double->set(2, 12);
+ source_double->set(3, 13);
+ source_double->set(4, 14);
+ Handle<Object> double_result_raw =
+ ft.Call(source_double, Handle<Smi>(Smi::FromInt(1), isolate),
+ Handle<Smi>(Smi::FromInt(2), isolate))
+ .ToHandleChecked();
+ FixedDoubleArray* double_result(FixedDoubleArray::cast(*double_result_raw));
+ CHECK_EQ(2, double_result->length());
+ CHECK_EQ(double_result->get_scalar(0), 11);
+ CHECK_EQ(double_result->get_scalar(1), 12);
+}
+
} // namespace compiler
} // namespace internal
} // namespace v8