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 |