Index: test/cctest/test-code-stub-assembler.cc |
diff --git a/test/cctest/test-code-stub-assembler.cc b/test/cctest/test-code-stub-assembler.cc |
index 28cdc55318a61b6c359933841fcc149a43bbb125..f112ccebe08c60bef28e56cb411d2b42bcc19334 100644 |
--- a/test/cctest/test-code-stub-assembler.cc |
+++ b/test/cctest/test-code-stub-assembler.cc |
@@ -2003,5 +2003,272 @@ TEST(ArgumentsForEach) { |
CHECK_EQ(Smi::FromInt(12 + 13 + 14), *result); |
} |
+TEST(BuildAppendJSArrayFastElement) { |
Jakob Kummerow
2016/11/23 17:17:06
High-level comment: We certainly shouldn't over-en
danno
2016/11/29 14:40:00
Done.
|
+ Isolate* isolate(CcTest::InitIsolateOnce()); |
+ typedef CodeStubAssembler::Variable Variable; |
+ typedef CodeStubAssembler::Label Label; |
+ |
+ const int kNumParams = 4; |
+ CodeAssemblerTester data(isolate, kNumParams); |
+ CodeStubAssembler m(data.state()); |
+ |
+ Handle<JSArray> array = isolate->factory()->NewJSArray( |
+ FAST_ELEMENTS, 2, 6, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); |
+ (void)JSObject::SetElement(isolate, array, 0, |
Jakob Kummerow
2016/11/23 17:17:06
Instead of "(void)JSObject::SetElement(...)", do "
danno
2016/11/29 14:40:00
Done.
|
+ Handle<Smi>(Smi::FromInt(1), isolate), SLOPPY); |
+ (void)JSObject::SetElement(isolate, array, 1, |
+ Handle<Smi>(Smi::FromInt(2), isolate), SLOPPY); |
+ CodeStubArguments args(&m, m.IntPtrConstant(4)); |
+ Variable arg_index(&m, MachineType::PointerRepresentation()); |
+ Label bailout(&m); |
+ arg_index.Bind(m.IntPtrConstant(0)); |
+ Node* length = m.BuildAppendJSArray( |
+ FAST_ELEMENTS, |
+ m.HeapConstant(Handle<HeapObject>(isolate->context(), isolate)), |
+ m.HeapConstant(array), args, arg_index, &bailout); |
+ |
+ m.PopAndReturn(m.IntPtrConstant(4), length); |
+ |
+ Handle<Code> code = data.GenerateCode(); |
+ CHECK(!code.is_null()); |
+ |
+ FunctionTester ft(code, kNumParams); |
+ Handle<Object> result; |
+ result = ft.Call(Handle<Smi>(Smi::FromInt(3), isolate), |
+ Handle<Smi>(Smi::FromInt(4), isolate), |
+ Handle<Smi>(Smi::FromInt(5), isolate), |
+ Handle<Smi>(Smi::FromInt(6), isolate)) |
+ .ToHandleChecked(); |
+ |
+ CHECK_EQ(6, Handle<Smi>::cast(result)->value()); |
+ CHECK_EQ(3, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 2).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(4, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 3).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(5, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 4).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(6, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 5).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(6, Smi::cast(array->length())->value()); |
+} |
+ |
+TEST(BuildAppendJSArrayFastElementGrow) { |
+ Isolate* isolate(CcTest::InitIsolateOnce()); |
+ typedef CodeStubAssembler::Variable Variable; |
+ typedef CodeStubAssembler::Label Label; |
+ |
+ const int kNumParams = 4; |
+ CodeAssemblerTester data(isolate, 0); |
Jakob Kummerow
2016/11/23 17:17:06
don't you mean s/0/kNumParams/? How does this even
danno
2016/11/29 14:39:59
Done.
|
+ CodeStubAssembler m(data.state()); |
+ |
+ Handle<JSArray> array = isolate->factory()->NewJSArray( |
+ FAST_ELEMENTS, 2, 3, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); |
+ (void)JSObject::SetElement(isolate, array, 0, |
+ Handle<Smi>(Smi::FromInt(1), isolate), SLOPPY); |
+ (void)JSObject::SetElement(isolate, array, 1, |
+ Handle<Smi>(Smi::FromInt(2), isolate), SLOPPY); |
+ CodeStubArguments args(&m, m.IntPtrConstant(4)); |
+ Variable arg_index(&m, MachineType::PointerRepresentation()); |
+ Label bailout(&m); |
+ arg_index.Bind(m.IntPtrConstant(0)); |
+ Node* length = m.BuildAppendJSArray( |
+ FAST_ELEMENTS, |
+ m.HeapConstant(Handle<HeapObject>(isolate->context(), isolate)), |
+ m.HeapConstant(array), args, arg_index, &bailout); |
+ |
+ m.PopAndReturn(m.IntPtrConstant(4), length); |
+ |
+ Handle<Code> code = data.GenerateCode(); |
+ CHECK(!code.is_null()); |
+ |
+ FunctionTester ft(code, kNumParams); |
+ Handle<Object> result; |
+ result = ft.Call(Handle<Smi>(Smi::FromInt(3), isolate), |
+ Handle<Smi>(Smi::FromInt(4), isolate), |
+ Handle<Smi>(Smi::FromInt(5), isolate), |
+ Handle<Smi>(Smi::FromInt(6), isolate)) |
+ .ToHandleChecked(); |
+ |
+ CHECK_EQ(6, Handle<Smi>::cast(result)->value()); |
+ CHECK_EQ(3, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 2).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(4, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 3).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(5, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 4).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(6, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 5).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(6, Smi::cast(array->length())->value()); |
+} |
+ |
+TEST(BuildAppendJSArrayFastSmiElement) { |
+ Isolate* isolate(CcTest::InitIsolateOnce()); |
+ typedef CodeStubAssembler::Variable Variable; |
+ typedef CodeStubAssembler::Label Label; |
+ |
+ const int kNumParams = 4; |
+ CodeAssemblerTester data(isolate, 0); |
Jakob Kummerow
2016/11/23 17:17:06
same here
danno
2016/11/29 14:39:59
Done.
|
+ CodeStubAssembler m(data.state()); |
+ |
+ Handle<JSArray> array = isolate->factory()->NewJSArray( |
+ FAST_SMI_ELEMENTS, 2, 6, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); |
+ (void)JSObject::SetElement(isolate, array, 0, |
+ Handle<Smi>(Smi::FromInt(1), isolate), SLOPPY); |
+ (void)JSObject::SetElement(isolate, array, 1, |
+ Handle<Smi>(Smi::FromInt(2), isolate), SLOPPY); |
+ CodeStubArguments args(&m, m.IntPtrConstant(4)); |
+ Variable arg_index(&m, MachineType::PointerRepresentation()); |
+ Label bailout(&m); |
+ arg_index.Bind(m.IntPtrConstant(0)); |
+ Node* length = m.BuildAppendJSArray( |
+ FAST_SMI_ELEMENTS, |
+ m.HeapConstant(Handle<HeapObject>(isolate->context(), isolate)), |
+ m.HeapConstant(array), args, arg_index, &bailout); |
+ |
+ m.PopAndReturn(m.IntPtrConstant(4), length); |
+ |
+ Handle<Code> code = data.GenerateCode(); |
+ CHECK(!code.is_null()); |
+ |
+ FunctionTester ft(code, kNumParams); |
+ Handle<Object> result; |
+ result = ft.Call(Handle<Smi>(Smi::FromInt(3), isolate), |
+ Handle<Smi>(Smi::FromInt(4), isolate), |
+ Handle<Smi>(Smi::FromInt(5), isolate), |
+ Handle<Smi>(Smi::FromInt(6), isolate)) |
+ .ToHandleChecked(); |
+ |
+ CHECK_EQ(6, Handle<Smi>::cast(result)->value()); |
+ CHECK_EQ(3, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 2).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(4, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 3).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(5, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 4).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(6, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 5).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(6, Smi::cast(array->length())->value()); |
+ CHECK_EQ(FAST_SMI_ELEMENTS, array->GetElementsKind()); |
+} |
+ |
+TEST(BuildAppendJSArrayFastSmiElementObject) { |
+ Isolate* isolate(CcTest::InitIsolateOnce()); |
+ typedef CodeStubAssembler::Variable Variable; |
+ typedef CodeStubAssembler::Label Label; |
+ |
+ const int kNumParams = 4; |
+ CodeAssemblerTester data(isolate, 0); |
Jakob Kummerow
2016/11/23 17:17:06
same here
danno
2016/11/29 14:40:00
Done.
|
+ CodeStubAssembler m(data.state()); |
+ |
+ Handle<JSArray> array = isolate->factory()->NewJSArray( |
+ FAST_SMI_ELEMENTS, 2, 6, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); |
+ (void)JSObject::SetElement(isolate, array, 0, |
+ Handle<Smi>(Smi::FromInt(1), isolate), SLOPPY); |
+ (void)JSObject::SetElement(isolate, array, 1, |
+ Handle<Smi>(Smi::FromInt(2), isolate), SLOPPY); |
+ CodeStubArguments args(&m, m.IntPtrConstant(4)); |
+ Variable arg_index(&m, MachineType::PointerRepresentation()); |
+ Label bailout(&m); |
+ arg_index.Bind(m.IntPtrConstant(0)); |
+ Node* length = m.BuildAppendJSArray( |
+ FAST_SMI_ELEMENTS, |
+ m.HeapConstant(Handle<HeapObject>(isolate->context(), isolate)), |
+ m.HeapConstant(array), args, arg_index, &bailout); |
+ |
+ m.PopAndReturn(m.IntPtrConstant(4), length); |
+ |
+ m.Bind(&bailout); |
+ m.PopAndReturn(m.IntPtrConstant(4), m.SmiTag(arg_index.value())); |
+ |
+ Handle<Code> code = data.GenerateCode(); |
+ CHECK(!code.is_null()); |
+ |
+ FunctionTester ft(code, kNumParams); |
+ Handle<Object> result; |
+ Handle<HeapObject> undefined = isolate->factory()->undefined_value(); |
+ result = ft.Call(Handle<Smi>(Smi::FromInt(3), isolate), |
+ Handle<Smi>(Smi::FromInt(4), isolate), undefined, |
+ Handle<Smi>(Smi::FromInt(6), isolate)) |
+ .ToHandleChecked(); |
+ |
+ CHECK_EQ(2, Smi::cast(*result)->value()); |
+ CHECK_EQ(3, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 2).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(4, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 3).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(4, Smi::cast(array->length())->value()); |
+} |
+ |
+TEST(BuildAppendJSArrayFastDoubleElements) { |
+ Isolate* isolate(CcTest::InitIsolateOnce()); |
+ typedef CodeStubAssembler::Variable Variable; |
+ typedef CodeStubAssembler::Label Label; |
+ |
+ const int kNumParams = 4; |
+ CodeAssemblerTester data(isolate, 0); |
Jakob Kummerow
2016/11/23 17:17:06
same here
danno
2016/11/29 14:40:00
Done.
|
+ CodeStubAssembler m(data.state()); |
+ |
+ Handle<JSArray> array = isolate->factory()->NewJSArray( |
+ FAST_SMI_ELEMENTS, 2, 6, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); |
+ (void)JSObject::SetElement(isolate, array, 0, |
+ Handle<Smi>(Smi::FromInt(1), isolate), SLOPPY); |
+ (void)JSObject::SetElement(isolate, array, 1, |
+ Handle<Smi>(Smi::FromInt(2), isolate), SLOPPY); |
+ JSObject::TransitionElementsKind(array, FAST_DOUBLE_ELEMENTS); |
+ CodeStubArguments args(&m, m.IntPtrConstant(4)); |
+ Variable arg_index(&m, MachineType::PointerRepresentation()); |
+ Label bailout(&m); |
+ arg_index.Bind(m.IntPtrConstant(0)); |
+ Node* length = m.BuildAppendJSArray( |
+ FAST_DOUBLE_ELEMENTS, |
+ m.HeapConstant(Handle<HeapObject>(isolate->context(), isolate)), |
+ m.HeapConstant(array), args, arg_index, &bailout); |
+ m.PopAndReturn(m.IntPtrConstant(4), length); |
+ |
+ m.Bind(&bailout); |
+ m.PopAndReturn(m.IntPtrConstant(4), m.SmiTag(arg_index.value())); |
+ |
+ Handle<Code> code = data.GenerateCode(); |
+ CHECK(!code.is_null()); |
+ |
+ FunctionTester ft(code, kNumParams); |
+ Handle<Object> result; |
+ result = ft.Call(Handle<Smi>(Smi::FromInt(3), isolate), |
+ Handle<Smi>(Smi::FromInt(4), isolate), |
+ Handle<Smi>(Smi::FromInt(5), isolate), |
+ Handle<Smi>(Smi::FromInt(6), isolate)) |
+ .ToHandleChecked(); |
+ |
+ CHECK_EQ(6, Handle<Smi>::cast(result)->value()); |
+ CHECK_EQ(3, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 2).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(4, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 3).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(5, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 4).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(6, Handle<Smi>::cast( |
+ JSObject::GetElement(isolate, array, 5).ToHandleChecked()) |
+ ->value()); |
+ CHECK_EQ(6, Smi::cast(array->length())->value()); |
+ CHECK_EQ(FAST_DOUBLE_ELEMENTS, array->GetElementsKind()); |
+} |
+ |
} // namespace internal |
} // namespace v8 |