| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/interface-descriptors.h" | 5 #include "src/interface-descriptors.h" |
| 6 #include "src/isolate.h" | 6 #include "src/isolate.h" |
| 7 #include "test/cctest/compiler/function-tester.h" | 7 #include "test/cctest/compiler/function-tester.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| 11 namespace compiler { | |
| 12 | 11 |
| 12 using compiler::FunctionTester; |
| 13 using compiler::Node; |
| 13 | 14 |
| 14 class CodeStubAssemblerTester : public CodeStubAssembler { | 15 class CodeStubAssemblerTester : public CodeStubAssembler { |
| 15 public: | 16 public: |
| 16 // Test generating code for a stub. | 17 // Test generating code for a stub. |
| 17 CodeStubAssemblerTester(Isolate* isolate, | 18 CodeStubAssemblerTester(Isolate* isolate, |
| 18 const CallInterfaceDescriptor& descriptor) | 19 const CallInterfaceDescriptor& descriptor) |
| 19 : CodeStubAssembler(isolate, isolate->runtime_zone(), descriptor, | 20 : CodeStubAssembler(isolate, isolate->runtime_zone(), descriptor, |
| 20 Code::ComputeFlags(Code::STUB), "test"), | 21 Code::ComputeFlags(Code::STUB), "test"), |
| 21 scope_(isolate) {} | 22 scope_(isolate) {} |
| 22 | 23 |
| 23 // Test generating code for a JS function (e.g. builtins). | 24 // Test generating code for a JS function (e.g. builtins). |
| 24 CodeStubAssemblerTester(Isolate* isolate, int parameter_count) | 25 CodeStubAssemblerTester(Isolate* isolate, int parameter_count) |
| 25 : CodeStubAssembler(isolate, isolate->runtime_zone(), parameter_count, | 26 : CodeStubAssembler(isolate, isolate->runtime_zone(), parameter_count, |
| 26 Code::ComputeFlags(Code::FUNCTION), "test"), | 27 Code::ComputeFlags(Code::FUNCTION), "test"), |
| 27 scope_(isolate) {} | 28 scope_(isolate) {} |
| 28 | 29 |
| 29 private: | 30 private: |
| 30 HandleScope scope_; | 31 HandleScope scope_; |
| 31 LocalContext context_; | 32 LocalContext context_; |
| 32 }; | 33 }; |
| 33 | 34 |
| 34 | |
| 35 TEST(SimpleSmiReturn) { | 35 TEST(SimpleSmiReturn) { |
| 36 Isolate* isolate(CcTest::InitIsolateOnce()); | 36 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 37 VoidDescriptor descriptor(isolate); | 37 VoidDescriptor descriptor(isolate); |
| 38 CodeStubAssemblerTester m(isolate, descriptor); | 38 CodeStubAssemblerTester m(isolate, descriptor); |
| 39 m.Return(m.SmiTag(m.Int32Constant(37))); | 39 m.Return(m.SmiTag(m.Int32Constant(37))); |
| 40 Handle<Code> code = m.GenerateCode(); | 40 Handle<Code> code = m.GenerateCode(); |
| 41 FunctionTester ft(descriptor, code); | 41 FunctionTester ft(descriptor, code); |
| 42 MaybeHandle<Object> result = ft.Call(); | 42 MaybeHandle<Object> result = ft.Call(); |
| 43 CHECK_EQ(37, Handle<Smi>::cast(result.ToHandleChecked())->value()); | 43 CHECK_EQ(37, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 44 } | 44 } |
| 45 | 45 |
| 46 | |
| 47 TEST(SimpleIntPtrReturn) { | 46 TEST(SimpleIntPtrReturn) { |
| 48 Isolate* isolate(CcTest::InitIsolateOnce()); | 47 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 49 VoidDescriptor descriptor(isolate); | 48 VoidDescriptor descriptor(isolate); |
| 50 CodeStubAssemblerTester m(isolate, descriptor); | 49 CodeStubAssemblerTester m(isolate, descriptor); |
| 51 int test; | 50 int test; |
| 52 m.Return(m.IntPtrConstant(reinterpret_cast<intptr_t>(&test))); | 51 m.Return(m.IntPtrConstant(reinterpret_cast<intptr_t>(&test))); |
| 53 Handle<Code> code = m.GenerateCode(); | 52 Handle<Code> code = m.GenerateCode(); |
| 54 FunctionTester ft(descriptor, code); | 53 FunctionTester ft(descriptor, code); |
| 55 MaybeHandle<Object> result = ft.Call(); | 54 MaybeHandle<Object> result = ft.Call(); |
| 56 CHECK_EQ(reinterpret_cast<intptr_t>(&test), | 55 CHECK_EQ(reinterpret_cast<intptr_t>(&test), |
| 57 reinterpret_cast<intptr_t>(*result.ToHandleChecked())); | 56 reinterpret_cast<intptr_t>(*result.ToHandleChecked())); |
| 58 } | 57 } |
| 59 | 58 |
| 60 | |
| 61 TEST(SimpleDoubleReturn) { | 59 TEST(SimpleDoubleReturn) { |
| 62 Isolate* isolate(CcTest::InitIsolateOnce()); | 60 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 63 VoidDescriptor descriptor(isolate); | 61 VoidDescriptor descriptor(isolate); |
| 64 CodeStubAssemblerTester m(isolate, descriptor); | 62 CodeStubAssemblerTester m(isolate, descriptor); |
| 65 m.Return(m.NumberConstant(0.5)); | 63 m.Return(m.NumberConstant(0.5)); |
| 66 Handle<Code> code = m.GenerateCode(); | 64 Handle<Code> code = m.GenerateCode(); |
| 67 FunctionTester ft(descriptor, code); | 65 FunctionTester ft(descriptor, code); |
| 68 MaybeHandle<Object> result = ft.Call(); | 66 MaybeHandle<Object> result = ft.Call(); |
| 69 CHECK_EQ(0.5, Handle<HeapNumber>::cast(result.ToHandleChecked())->value()); | 67 CHECK_EQ(0.5, Handle<HeapNumber>::cast(result.ToHandleChecked())->value()); |
| 70 } | 68 } |
| 71 | 69 |
| 72 | |
| 73 TEST(SimpleCallRuntime1Arg) { | 70 TEST(SimpleCallRuntime1Arg) { |
| 74 Isolate* isolate(CcTest::InitIsolateOnce()); | 71 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 75 VoidDescriptor descriptor(isolate); | 72 VoidDescriptor descriptor(isolate); |
| 76 CodeStubAssemblerTester m(isolate, descriptor); | 73 CodeStubAssemblerTester m(isolate, descriptor); |
| 77 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); | 74 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); |
| 78 Node* b = m.SmiTag(m.Int32Constant(0)); | 75 Node* b = m.SmiTag(m.Int32Constant(0)); |
| 79 m.Return(m.CallRuntime(Runtime::kNumberToSmi, context, b)); | 76 m.Return(m.CallRuntime(Runtime::kNumberToSmi, context, b)); |
| 80 Handle<Code> code = m.GenerateCode(); | 77 Handle<Code> code = m.GenerateCode(); |
| 81 FunctionTester ft(descriptor, code); | 78 FunctionTester ft(descriptor, code); |
| 82 MaybeHandle<Object> result = ft.Call(); | 79 MaybeHandle<Object> result = ft.Call(); |
| 83 CHECK_EQ(0, Handle<Smi>::cast(result.ToHandleChecked())->value()); | 80 CHECK_EQ(0, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 84 } | 81 } |
| 85 | 82 |
| 86 | |
| 87 TEST(SimpleTailCallRuntime1Arg) { | 83 TEST(SimpleTailCallRuntime1Arg) { |
| 88 Isolate* isolate(CcTest::InitIsolateOnce()); | 84 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 89 VoidDescriptor descriptor(isolate); | 85 VoidDescriptor descriptor(isolate); |
| 90 CodeStubAssemblerTester m(isolate, descriptor); | 86 CodeStubAssemblerTester m(isolate, descriptor); |
| 91 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); | 87 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); |
| 92 Node* b = m.SmiTag(m.Int32Constant(0)); | 88 Node* b = m.SmiTag(m.Int32Constant(0)); |
| 93 m.TailCallRuntime(Runtime::kNumberToSmi, context, b); | 89 m.TailCallRuntime(Runtime::kNumberToSmi, context, b); |
| 94 Handle<Code> code = m.GenerateCode(); | 90 Handle<Code> code = m.GenerateCode(); |
| 95 FunctionTester ft(descriptor, code); | 91 FunctionTester ft(descriptor, code); |
| 96 MaybeHandle<Object> result = ft.Call(); | 92 MaybeHandle<Object> result = ft.Call(); |
| 97 CHECK_EQ(0, Handle<Smi>::cast(result.ToHandleChecked())->value()); | 93 CHECK_EQ(0, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 98 } | 94 } |
| 99 | 95 |
| 100 | |
| 101 TEST(SimpleCallRuntime2Arg) { | 96 TEST(SimpleCallRuntime2Arg) { |
| 102 Isolate* isolate(CcTest::InitIsolateOnce()); | 97 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 103 VoidDescriptor descriptor(isolate); | 98 VoidDescriptor descriptor(isolate); |
| 104 CodeStubAssemblerTester m(isolate, descriptor); | 99 CodeStubAssemblerTester m(isolate, descriptor); |
| 105 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); | 100 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); |
| 106 Node* a = m.SmiTag(m.Int32Constant(2)); | 101 Node* a = m.SmiTag(m.Int32Constant(2)); |
| 107 Node* b = m.SmiTag(m.Int32Constant(4)); | 102 Node* b = m.SmiTag(m.Int32Constant(4)); |
| 108 m.Return(m.CallRuntime(Runtime::kMathPow, context, a, b)); | 103 m.Return(m.CallRuntime(Runtime::kMathPow, context, a, b)); |
| 109 Handle<Code> code = m.GenerateCode(); | 104 Handle<Code> code = m.GenerateCode(); |
| 110 FunctionTester ft(descriptor, code); | 105 FunctionTester ft(descriptor, code); |
| 111 MaybeHandle<Object> result = ft.Call(); | 106 MaybeHandle<Object> result = ft.Call(); |
| 112 CHECK_EQ(16, Handle<Smi>::cast(result.ToHandleChecked())->value()); | 107 CHECK_EQ(16, Handle<Smi>::cast(result.ToHandleChecked())->value()); |
| 113 } | 108 } |
| 114 | 109 |
| 115 | |
| 116 TEST(SimpleTailCallRuntime2Arg) { | 110 TEST(SimpleTailCallRuntime2Arg) { |
| 117 Isolate* isolate(CcTest::InitIsolateOnce()); | 111 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 118 VoidDescriptor descriptor(isolate); | 112 VoidDescriptor descriptor(isolate); |
| 119 CodeStubAssemblerTester m(isolate, descriptor); | 113 CodeStubAssemblerTester m(isolate, descriptor); |
| 120 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); | 114 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); |
| 121 Node* a = m.SmiTag(m.Int32Constant(2)); | 115 Node* a = m.SmiTag(m.Int32Constant(2)); |
| 122 Node* b = m.SmiTag(m.Int32Constant(4)); | 116 Node* b = m.SmiTag(m.Int32Constant(4)); |
| 123 m.TailCallRuntime(Runtime::kMathPow, context, a, b); | 117 m.TailCallRuntime(Runtime::kMathPow, context, a, b); |
| 124 Handle<Code> code = m.GenerateCode(); | 118 Handle<Code> code = m.GenerateCode(); |
| 125 FunctionTester ft(descriptor, code); | 119 FunctionTester ft(descriptor, code); |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 | 376 |
| 383 a = m.UndefinedConstant(); | 377 a = m.UndefinedConstant(); |
| 384 CHECK(!m.ToInt32Constant(a, value32)); | 378 CHECK(!m.ToInt32Constant(a, value32)); |
| 385 CHECK(!m.ToInt64Constant(a, value64)); | 379 CHECK(!m.ToInt64Constant(a, value64)); |
| 386 | 380 |
| 387 a = m.UndefinedConstant(); | 381 a = m.UndefinedConstant(); |
| 388 CHECK(!m.ToInt32Constant(a, value32)); | 382 CHECK(!m.ToInt32Constant(a, value32)); |
| 389 CHECK(!m.ToInt64Constant(a, value64)); | 383 CHECK(!m.ToInt64Constant(a, value64)); |
| 390 } | 384 } |
| 391 | 385 |
| 392 } // namespace compiler | |
| 393 } // namespace internal | 386 } // namespace internal |
| 394 } // namespace v8 | 387 } // namespace v8 |
| OLD | NEW |