Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Side by Side Diff: runtime/vm/code_generator_test.cc

Issue 460763002: Fix returning from async functions. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "platform/globals.h" 5 #include "platform/globals.h"
6 6
7 #include "platform/assert.h" 7 #include "platform/assert.h"
8 #include "vm/globals.h" 8 #include "vm/globals.h"
9 #include "vm/ast.h" 9 #include "vm/ast.h"
10 #include "vm/assembler.h" 10 #include "vm/assembler.h"
11 #include "vm/class_finalizer.h" 11 #include "vm/class_finalizer.h"
12 #include "vm/code_generator.h" 12 #include "vm/code_generator.h"
13 #include "vm/compiler.h" 13 #include "vm/compiler.h"
14 #include "vm/dart_entry.h" 14 #include "vm/dart_entry.h"
15 #include "vm/native_entry.h" 15 #include "vm/native_entry.h"
16 #include "vm/native_entry_test.h" 16 #include "vm/native_entry_test.h"
17 #include "vm/symbols.h" 17 #include "vm/symbols.h"
18 #include "vm/unit_test.h" 18 #include "vm/unit_test.h"
19 #include "vm/virtual_memory.h" 19 #include "vm/virtual_memory.h"
20 20
21 namespace dart { 21 namespace dart {
22 22
23 static const intptr_t kPos = Scanner::kNoSourcePos; 23 static const intptr_t kPos = Scanner::kNoSourcePos;
24 24
25 25
26 CODEGEN_TEST_GENERATE(SimpleReturnCodegen, test) { 26 CODEGEN_TEST_GENERATE(SimpleReturnCodegen, test) {
27 test->node_sequence()->Add(new ReturnNode(kPos)); 27 test->node_sequence()->Add(new ReturnNode(kPos, NULL));
28 } 28 }
29 CODEGEN_TEST_RUN(SimpleReturnCodegen, Instance::null()) 29 CODEGEN_TEST_RUN(SimpleReturnCodegen, Instance::null())
30 30
31 31
32 CODEGEN_TEST_GENERATE(SmiReturnCodegen, test) { 32 CODEGEN_TEST_GENERATE(SmiReturnCodegen, test) {
33 LiteralNode* l = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))); 33 LiteralNode* l = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3)));
34 test->node_sequence()->Add(new ReturnNode(kPos, l)); 34 test->node_sequence()->Add(new ReturnNode(kPos, l, NULL));
35 } 35 }
36 CODEGEN_TEST_RUN(SmiReturnCodegen, Smi::New(3)) 36 CODEGEN_TEST_RUN(SmiReturnCodegen, Smi::New(3))
37 37
38 38
39 CODEGEN_TEST2_GENERATE(SimpleStaticCallCodegen, function, test) { 39 CODEGEN_TEST2_GENERATE(SimpleStaticCallCodegen, function, test) {
40 // Wrap the SmiReturnCodegen test above as a static function and call it. 40 // Wrap the SmiReturnCodegen test above as a static function and call it.
41 ArgumentListNode* no_arguments = new ArgumentListNode(kPos); 41 ArgumentListNode* no_arguments = new ArgumentListNode(kPos);
42 test->node_sequence()->Add( 42 test->node_sequence()->Add(
43 new ReturnNode(kPos, new StaticCallNode(kPos, function, no_arguments))); 43 new ReturnNode(kPos,
44 new StaticCallNode(kPos, function, no_arguments),
45 NULL));
44 } 46 }
45 CODEGEN_TEST2_RUN(SimpleStaticCallCodegen, SmiReturnCodegen, Smi::New(3)) 47 CODEGEN_TEST2_RUN(SimpleStaticCallCodegen, SmiReturnCodegen, Smi::New(3))
46 48
47 49
48 // Helper to allocate and return a LocalVariable. 50 // Helper to allocate and return a LocalVariable.
49 static LocalVariable* NewTestLocalVariable(const char* name) { 51 static LocalVariable* NewTestLocalVariable(const char* name) {
50 const String& variable_name = String::ZoneHandle(Symbols::New(name)); 52 const String& variable_name = String::ZoneHandle(Symbols::New(name));
51 const Type& variable_type = Type::ZoneHandle(Type::DynamicType()); 53 const Type& variable_type = Type::ZoneHandle(Type::DynamicType());
52 return new LocalVariable(kPos, variable_name, variable_type); 54 return new LocalVariable(kPos, variable_name, variable_type);
53 } 55 }
54 56
55 57
56 CODEGEN_TEST_GENERATE(ReturnParameterCodegen, test) { 58 CODEGEN_TEST_GENERATE(ReturnParameterCodegen, test) {
57 SequenceNode* node_seq = test->node_sequence(); 59 SequenceNode* node_seq = test->node_sequence();
58 const int num_params = 1; 60 const int num_params = 1;
59 LocalVariable* parameter = NewTestLocalVariable("parameter"); 61 LocalVariable* parameter = NewTestLocalVariable("parameter");
60 LocalScope* local_scope = node_seq->scope(); 62 LocalScope* local_scope = node_seq->scope();
61 local_scope->InsertParameterAt(0, parameter); 63 local_scope->InsertParameterAt(0, parameter);
62 ASSERT(local_scope->num_variables() == num_params); 64 ASSERT(local_scope->num_variables() == num_params);
63 const Function& function = test->function(); 65 const Function& function = test->function();
64 function.set_num_fixed_parameters(num_params); 66 function.set_num_fixed_parameters(num_params);
65 ASSERT(!function.HasOptionalParameters()); 67 ASSERT(!function.HasOptionalParameters());
66 node_seq->Add(new ReturnNode(kPos, new LoadLocalNode(kPos, parameter))); 68 node_seq->Add(new ReturnNode(kPos, new LoadLocalNode(kPos, parameter), NULL));
67 } 69 }
68 70
69 71
70 CODEGEN_TEST2_GENERATE(StaticCallReturnParameterCodegen, function, test) { 72 CODEGEN_TEST2_GENERATE(StaticCallReturnParameterCodegen, function, test) {
71 // Wrap and call the ReturnParameterCodegen test above as a static function. 73 // Wrap and call the ReturnParameterCodegen test above as a static function.
72 SequenceNode* node_seq = test->node_sequence(); 74 SequenceNode* node_seq = test->node_sequence();
73 ArgumentListNode* arguments = new ArgumentListNode(kPos); 75 ArgumentListNode* arguments = new ArgumentListNode(kPos);
74 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3)))); 76 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))));
75 node_seq->Add(new ReturnNode(kPos, 77 node_seq->Add(new ReturnNode(kPos,
76 new StaticCallNode(kPos, function, arguments))); 78 new StaticCallNode(kPos, function, arguments),
79 NULL));
77 } 80 }
78 CODEGEN_TEST2_RUN(StaticCallReturnParameterCodegen, 81 CODEGEN_TEST2_RUN(StaticCallReturnParameterCodegen,
79 ReturnParameterCodegen, 82 ReturnParameterCodegen,
80 Smi::New(3)) 83 Smi::New(3))
81 84
82 85
83 CODEGEN_TEST_GENERATE(SmiParamSumCodegen, test) { 86 CODEGEN_TEST_GENERATE(SmiParamSumCodegen, test) {
84 SequenceNode* node_seq = test->node_sequence(); 87 SequenceNode* node_seq = test->node_sequence();
85 const int num_params = 2; 88 const int num_params = 2;
86 LocalVariable* param1 = NewTestLocalVariable("param1"); 89 LocalVariable* param1 = NewTestLocalVariable("param1");
87 LocalVariable* param2 = NewTestLocalVariable("param2"); 90 LocalVariable* param2 = NewTestLocalVariable("param2");
88 const int num_locals = 1; 91 const int num_locals = 1;
89 LocalVariable* sum = NewTestLocalVariable("sum"); 92 LocalVariable* sum = NewTestLocalVariable("sum");
90 LocalScope* local_scope = node_seq->scope(); 93 LocalScope* local_scope = node_seq->scope();
91 local_scope->InsertParameterAt(0, param1); 94 local_scope->InsertParameterAt(0, param1);
92 local_scope->InsertParameterAt(1, param2); 95 local_scope->InsertParameterAt(1, param2);
93 local_scope->AddVariable(sum); 96 local_scope->AddVariable(sum);
94 ASSERT(local_scope->num_variables() == num_params + num_locals); 97 ASSERT(local_scope->num_variables() == num_params + num_locals);
95 const Function& function = test->function(); 98 const Function& function = test->function();
96 function.set_num_fixed_parameters(num_params); 99 function.set_num_fixed_parameters(num_params);
97 ASSERT(!function.HasOptionalParameters()); 100 ASSERT(!function.HasOptionalParameters());
98 BinaryOpNode* add = new BinaryOpNode(kPos, 101 BinaryOpNode* add = new BinaryOpNode(kPos,
99 Token::kADD, 102 Token::kADD,
100 new LoadLocalNode(kPos, param1), 103 new LoadLocalNode(kPos, param1),
101 new LoadLocalNode(kPos, param2)); 104 new LoadLocalNode(kPos, param2));
102 node_seq->Add(new StoreLocalNode(kPos, sum, add)); 105 node_seq->Add(new StoreLocalNode(kPos, sum, add));
103 node_seq->Add(new ReturnNode(kPos, new LoadLocalNode(kPos, sum))); 106 node_seq->Add(new ReturnNode(kPos, new LoadLocalNode(kPos, sum), NULL));
104 } 107 }
105 108
106 109
107 CODEGEN_TEST2_GENERATE(StaticCallSmiParamSumCodegen, function, test) { 110 CODEGEN_TEST2_GENERATE(StaticCallSmiParamSumCodegen, function, test) {
108 // Wrap and call the SmiParamSumCodegen test above as a static function. 111 // Wrap and call the SmiParamSumCodegen test above as a static function.
109 SequenceNode* node_seq = test->node_sequence(); 112 SequenceNode* node_seq = test->node_sequence();
110 ArgumentListNode* arguments = new ArgumentListNode(kPos); 113 ArgumentListNode* arguments = new ArgumentListNode(kPos);
111 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3)))); 114 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))));
112 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2)))); 115 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2))));
113 node_seq->Add(new ReturnNode(kPos, 116 node_seq->Add(new ReturnNode(kPos,
114 new StaticCallNode(kPos, function, arguments))); 117 new StaticCallNode(kPos, function, arguments),
118 NULL));
115 } 119 }
116 CODEGEN_TEST2_RUN(StaticCallSmiParamSumCodegen, 120 CODEGEN_TEST2_RUN(StaticCallSmiParamSumCodegen,
117 SmiParamSumCodegen, 121 SmiParamSumCodegen,
118 Smi::New(5)) 122 Smi::New(5))
119 123
120 124
121 CODEGEN_TEST_GENERATE(SmiAddCodegen, test) { 125 CODEGEN_TEST_GENERATE(SmiAddCodegen, test) {
122 SequenceNode* node_seq = test->node_sequence(); 126 SequenceNode* node_seq = test->node_sequence();
123 LiteralNode* a = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))); 127 LiteralNode* a = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3)));
124 LiteralNode* b = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2))); 128 LiteralNode* b = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2)));
125 BinaryOpNode* add_node = new BinaryOpNode(kPos, Token::kADD, a, b); 129 BinaryOpNode* add_node = new BinaryOpNode(kPos, Token::kADD, a, b);
126 node_seq->Add(new ReturnNode(kPos, add_node)); 130 node_seq->Add(new ReturnNode(kPos, add_node, NULL));
127 } 131 }
128 CODEGEN_TEST_RUN(SmiAddCodegen, Smi::New(5)) 132 CODEGEN_TEST_RUN(SmiAddCodegen, Smi::New(5))
129 133
130 134
131 CODEGEN_TEST_GENERATE(GenericAddCodegen, test) { 135 CODEGEN_TEST_GENERATE(GenericAddCodegen, test) {
132 SequenceNode* node_seq = test->node_sequence(); 136 SequenceNode* node_seq = test->node_sequence();
133 LiteralNode* a = 137 LiteralNode* a =
134 new LiteralNode(kPos, Double::ZoneHandle(Double::New(12.2, Heap::kOld))); 138 new LiteralNode(kPos, Double::ZoneHandle(Double::New(12.2, Heap::kOld)));
135 LiteralNode* b = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2))); 139 LiteralNode* b = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2)));
136 BinaryOpNode* add_node_1 = new BinaryOpNode(kPos, Token::kADD, a, b); 140 BinaryOpNode* add_node_1 = new BinaryOpNode(kPos, Token::kADD, a, b);
137 LiteralNode* c = 141 LiteralNode* c =
138 new LiteralNode(kPos, Double::ZoneHandle(Double::New(0.8, Heap::kOld))); 142 new LiteralNode(kPos, Double::ZoneHandle(Double::New(0.8, Heap::kOld)));
139 BinaryOpNode* add_node_2 = new BinaryOpNode(kPos, Token::kADD, add_node_1, c); 143 BinaryOpNode* add_node_2 = new BinaryOpNode(kPos, Token::kADD, add_node_1, c);
140 node_seq->Add(new ReturnNode(kPos, add_node_2)); 144 node_seq->Add(new ReturnNode(kPos, add_node_2, NULL));
141 } 145 }
142 CODEGEN_TEST_RUN(GenericAddCodegen, Double::New(15.0)) 146 CODEGEN_TEST_RUN(GenericAddCodegen, Double::New(15.0))
143 147
144 148
145 CODEGEN_TEST_GENERATE(SmiBinaryOpCodegen, test) { 149 CODEGEN_TEST_GENERATE(SmiBinaryOpCodegen, test) {
146 SequenceNode* node_seq = test->node_sequence(); 150 SequenceNode* node_seq = test->node_sequence();
147 LiteralNode* a = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(4))); 151 LiteralNode* a = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(4)));
148 LiteralNode* b = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2))); 152 LiteralNode* b = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2)));
149 LiteralNode* c = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))); 153 LiteralNode* c = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3)));
150 BinaryOpNode* sub_node = 154 BinaryOpNode* sub_node =
151 new BinaryOpNode(kPos, Token::kSUB, a, b); // 4 - 2 -> 2. 155 new BinaryOpNode(kPos, Token::kSUB, a, b); // 4 - 2 -> 2.
152 BinaryOpNode* mul_node = 156 BinaryOpNode* mul_node =
153 new BinaryOpNode(kPos, Token::kMUL, sub_node, c); // 2 * 3 -> 6. 157 new BinaryOpNode(kPos, Token::kMUL, sub_node, c); // 2 * 3 -> 6.
154 BinaryOpNode* div_node = 158 BinaryOpNode* div_node =
155 new BinaryOpNode(kPos, Token::kTRUNCDIV, mul_node, b); // 6 ~/ 2 -> 3. 159 new BinaryOpNode(kPos, Token::kTRUNCDIV, mul_node, b); // 6 ~/ 2 -> 3.
156 node_seq->Add(new ReturnNode(kPos, div_node)); 160 node_seq->Add(new ReturnNode(kPos, div_node, NULL));
157 } 161 }
158 CODEGEN_TEST_RUN(SmiBinaryOpCodegen, Smi::New(3)) 162 CODEGEN_TEST_RUN(SmiBinaryOpCodegen, Smi::New(3))
159 163
160 164
161 CODEGEN_TEST_GENERATE(BoolNotCodegen, test) { 165 CODEGEN_TEST_GENERATE(BoolNotCodegen, test) {
162 SequenceNode* node_seq = test->node_sequence(); 166 SequenceNode* node_seq = test->node_sequence();
163 LiteralNode* b = new LiteralNode(kPos, Bool::False()); 167 LiteralNode* b = new LiteralNode(kPos, Bool::False());
164 UnaryOpNode* not_node = new UnaryOpNode(kPos, Token::kNOT, b); 168 UnaryOpNode* not_node = new UnaryOpNode(kPos, Token::kNOT, b);
165 node_seq->Add(new ReturnNode(kPos, not_node)); 169 node_seq->Add(new ReturnNode(kPos, not_node, NULL));
166 } 170 }
167 CODEGEN_TEST_RUN(BoolNotCodegen, Bool::True().raw()) 171 CODEGEN_TEST_RUN(BoolNotCodegen, Bool::True().raw())
168 172
169 173
170 CODEGEN_TEST_GENERATE(BoolAndCodegen, test) { 174 CODEGEN_TEST_GENERATE(BoolAndCodegen, test) {
171 SequenceNode* node_seq = test->node_sequence(); 175 SequenceNode* node_seq = test->node_sequence();
172 LiteralNode* a = new LiteralNode(kPos, Bool::True()); 176 LiteralNode* a = new LiteralNode(kPos, Bool::True());
173 LiteralNode* b = new LiteralNode(kPos, Bool::False()); 177 LiteralNode* b = new LiteralNode(kPos, Bool::False());
174 BinaryOpNode* and_node = new BinaryOpNode(kPos, Token::kAND, a, b); 178 BinaryOpNode* and_node = new BinaryOpNode(kPos, Token::kAND, a, b);
175 node_seq->Add(new ReturnNode(kPos, and_node)); 179 node_seq->Add(new ReturnNode(kPos, and_node, NULL));
176 } 180 }
177 CODEGEN_TEST_RUN(BoolAndCodegen, Bool::False().raw()) 181 CODEGEN_TEST_RUN(BoolAndCodegen, Bool::False().raw())
178 182
179 183
180 CODEGEN_TEST_GENERATE(BinaryOpCodegen, test) { 184 CODEGEN_TEST_GENERATE(BinaryOpCodegen, test) {
181 SequenceNode* node_seq = test->node_sequence(); 185 SequenceNode* node_seq = test->node_sequence();
182 LiteralNode* a = 186 LiteralNode* a =
183 new LiteralNode(kPos, Double::ZoneHandle(Double::New(12, Heap::kOld))); 187 new LiteralNode(kPos, Double::ZoneHandle(Double::New(12, Heap::kOld)));
184 LiteralNode* b = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2))); 188 LiteralNode* b = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2)));
185 LiteralNode* c = 189 LiteralNode* c =
186 new LiteralNode(kPos, Double::ZoneHandle(Double::New(0.5, Heap::kOld))); 190 new LiteralNode(kPos, Double::ZoneHandle(Double::New(0.5, Heap::kOld)));
187 BinaryOpNode* sub_node = new BinaryOpNode(kPos, Token::kSUB, a, b); 191 BinaryOpNode* sub_node = new BinaryOpNode(kPos, Token::kSUB, a, b);
188 BinaryOpNode* mul_node = new BinaryOpNode(kPos, Token::kMUL, sub_node, c); 192 BinaryOpNode* mul_node = new BinaryOpNode(kPos, Token::kMUL, sub_node, c);
189 BinaryOpNode* div_node = new BinaryOpNode(kPos, Token::kDIV, mul_node, b); 193 BinaryOpNode* div_node = new BinaryOpNode(kPos, Token::kDIV, mul_node, b);
190 node_seq->Add(new ReturnNode(kPos, div_node)); 194 node_seq->Add(new ReturnNode(kPos, div_node, NULL));
191 } 195 }
192 CODEGEN_TEST_RUN(BinaryOpCodegen, Double::New(2.5)); 196 CODEGEN_TEST_RUN(BinaryOpCodegen, Double::New(2.5));
193 197
194 198
195 // Tested Dart code: 199 // Tested Dart code:
196 // int dec(int a, [int b = 1]) native: "TestSmiSub"; 200 // int dec(int a, [int b = 1]) native: "TestSmiSub";
197 // The native entry TestSmiSub implements dec natively. 201 // The native entry TestSmiSub implements dec natively.
198 CODEGEN_TEST_GENERATE(NativeDecCodegen, test) { 202 CODEGEN_TEST_GENERATE(NativeDecCodegen, test) {
199 // A NativeBodyNode, preceded by an EnterNode and followed by a ReturnNode, 203 // A NativeBodyNode, preceded by an EnterNode and followed by a ReturnNode,
200 // implements the body of a native Dart function. Let's take this native 204 // implements the body of a native Dart function. Let's take this native
(...skipping 19 matching lines...) Expand all
220 String::ZoneHandle(Symbols::New("TestSmiSub")); 224 String::ZoneHandle(Symbols::New("TestSmiSub"));
221 NativeFunction native_function = 225 NativeFunction native_function =
222 reinterpret_cast<NativeFunction>(TestSmiSub); 226 reinterpret_cast<NativeFunction>(TestSmiSub);
223 node_seq->Add( 227 node_seq->Add(
224 new ReturnNode(kPos, 228 new ReturnNode(kPos,
225 new NativeBodyNode(kPos, 229 new NativeBodyNode(kPos,
226 function, 230 function,
227 native_name, 231 native_name,
228 native_function, 232 native_function,
229 local_scope, 233 local_scope,
230 false /* not bootstrap native */))); 234 false /* not bootstrap native */),
235 NULL));
231 } 236 }
232 237
233 238
234 // Tested Dart code: 239 // Tested Dart code:
235 // return dec(5); 240 // return dec(5);
236 CODEGEN_TEST2_GENERATE(StaticDecCallCodegen, function, test) { 241 CODEGEN_TEST2_GENERATE(StaticDecCallCodegen, function, test) {
237 SequenceNode* node_seq = test->node_sequence(); 242 SequenceNode* node_seq = test->node_sequence();
238 ArgumentListNode* arguments = new ArgumentListNode(kPos); 243 ArgumentListNode* arguments = new ArgumentListNode(kPos);
239 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(5)))); 244 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(5))));
240 node_seq->Add(new ReturnNode(kPos, 245 node_seq->Add(new ReturnNode(kPos,
241 new StaticCallNode(kPos, function, arguments))); 246 new StaticCallNode(kPos, function, arguments),
247 NULL));
242 } 248 }
243 CODEGEN_TEST2_RUN(StaticDecCallCodegen, NativeDecCodegen, Smi::New(4)) 249 CODEGEN_TEST2_RUN(StaticDecCallCodegen, NativeDecCodegen, Smi::New(4))
244 250
245 251
246 CODEGEN_TEST_GENERATE(SmiUnaryOpCodegen, test) { 252 CODEGEN_TEST_GENERATE(SmiUnaryOpCodegen, test) {
247 SequenceNode* node_seq = test->node_sequence(); 253 SequenceNode* node_seq = test->node_sequence();
248 LiteralNode* a = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(12))); 254 LiteralNode* a = new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(12)));
249 UnaryOpNode* neg_node = new UnaryOpNode(kPos, Token::kNEGATE, a); 255 UnaryOpNode* neg_node = new UnaryOpNode(kPos, Token::kNEGATE, a);
250 node_seq->Add(new ReturnNode(kPos, neg_node)); 256 node_seq->Add(new ReturnNode(kPos, neg_node, NULL));
251 } 257 }
252 CODEGEN_TEST_RUN(SmiUnaryOpCodegen, Smi::New(-12)) 258 CODEGEN_TEST_RUN(SmiUnaryOpCodegen, Smi::New(-12))
253 259
254 260
255 CODEGEN_TEST_GENERATE(DoubleUnaryOpCodegen, test) { 261 CODEGEN_TEST_GENERATE(DoubleUnaryOpCodegen, test) {
256 SequenceNode* node_seq = test->node_sequence(); 262 SequenceNode* node_seq = test->node_sequence();
257 LiteralNode* a = 263 LiteralNode* a =
258 new LiteralNode(kPos, Double::ZoneHandle(Double::New(12.0, Heap::kOld))); 264 new LiteralNode(kPos, Double::ZoneHandle(Double::New(12.0, Heap::kOld)));
259 UnaryOpNode* neg_node = new UnaryOpNode(kPos, Token::kNEGATE, a); 265 UnaryOpNode* neg_node = new UnaryOpNode(kPos, Token::kNEGATE, a);
260 node_seq->Add(new ReturnNode(kPos, neg_node)); 266 node_seq->Add(new ReturnNode(kPos, neg_node, NULL));
261 } 267 }
262 CODEGEN_TEST_RUN(DoubleUnaryOpCodegen, Double::New(-12.0)) 268 CODEGEN_TEST_RUN(DoubleUnaryOpCodegen, Double::New(-12.0))
263 269
264 270
265 static Library& MakeTestLibrary(const char* url) { 271 static Library& MakeTestLibrary(const char* url) {
266 const String& lib_url = String::ZoneHandle(Symbols::New(url)); 272 const String& lib_url = String::ZoneHandle(Symbols::New(url));
267 Library& lib = Library::ZoneHandle(Library::New(lib_url)); 273 Library& lib = Library::ZoneHandle(Library::New(lib_url));
268 lib.Register(); 274 lib.Register();
269 Library& core_lib = Library::Handle(Library::CoreLibrary()); 275 Library& core_lib = Library::Handle(Library::CoreLibrary());
270 ASSERT(!core_lib.IsNull()); 276 ASSERT(!core_lib.IsNull());
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 322
317 ArgumentListNode* no_arguments = new ArgumentListNode(kPos); 323 ArgumentListNode* no_arguments = new ArgumentListNode(kPos);
318 StaticCallNode* call_bar = 324 StaticCallNode* call_bar =
319 new StaticCallNode(kPos, function_bar, no_arguments); 325 new StaticCallNode(kPos, function_bar, no_arguments);
320 StaticCallNode* call_fly = 326 StaticCallNode* call_fly =
321 new StaticCallNode(kPos, function_fly, no_arguments); 327 new StaticCallNode(kPos, function_fly, no_arguments);
322 328
323 BinaryOpNode* add_node = 329 BinaryOpNode* add_node =
324 new BinaryOpNode(kPos, Token::kADD, call_bar, call_fly); 330 new BinaryOpNode(kPos, Token::kADD, call_bar, call_fly);
325 331
326 test->node_sequence()->Add(new ReturnNode(kPos, add_node)); 332 test->node_sequence()->Add(new ReturnNode(kPos, add_node, NULL));
327 } 333 }
328 CODEGEN_TEST_RUN(StaticCallCodegen, Smi::New(42 + 5)) 334 CODEGEN_TEST_RUN(StaticCallCodegen, Smi::New(42 + 5))
329 335
330 336
331 CODEGEN_TEST_GENERATE(InstanceCallCodegen, test) { 337 CODEGEN_TEST_GENERATE(InstanceCallCodegen, test) {
332 const char* kScriptChars = 338 const char* kScriptChars =
333 "class A {\n" 339 "class A {\n"
334 " A() {}\n" 340 " A() {}\n"
335 " int bar() { return 42; }\n" 341 " int bar() { return 42; }\n"
336 "}\n"; 342 "}\n";
(...skipping 18 matching lines...) Expand all
355 String& function_bar_name = String::ZoneHandle(Symbols::New("bar")); 361 String& function_bar_name = String::ZoneHandle(Symbols::New("bar"));
356 ArgumentListNode* no_arguments = new ArgumentListNode(kPos); 362 ArgumentListNode* no_arguments = new ArgumentListNode(kPos);
357 const TypeArguments& no_type_arguments = TypeArguments::ZoneHandle(); 363 const TypeArguments& no_type_arguments = TypeArguments::ZoneHandle();
358 InstanceCallNode* call_bar = new InstanceCallNode( 364 InstanceCallNode* call_bar = new InstanceCallNode(
359 kPos, 365 kPos,
360 new ConstructorCallNode( 366 new ConstructorCallNode(
361 kPos, no_type_arguments, constructor, no_arguments), 367 kPos, no_type_arguments, constructor, no_arguments),
362 function_bar_name, 368 function_bar_name,
363 no_arguments); 369 no_arguments);
364 370
365 test->node_sequence()->Add(new ReturnNode(kPos, call_bar)); 371 test->node_sequence()->Add(new ReturnNode(kPos, call_bar, NULL));
366 } 372 }
367 CODEGEN_TEST_RUN(InstanceCallCodegen, Smi::New(42)) 373 CODEGEN_TEST_RUN(InstanceCallCodegen, Smi::New(42))
368 374
369 375
370 // Tested Dart code: 376 // Tested Dart code:
371 // int sum(int a, int b, 377 // int sum(int a, int b,
372 // [int c = 10, int d = 21, int e = -32]) native: "TestSmiSum"; 378 // [int c = 10, int d = 21, int e = -32]) native: "TestSmiSum";
373 // The native entry TestSmiSum implements sum natively. 379 // The native entry TestSmiSum implements sum natively.
374 CODEGEN_TEST_GENERATE(NativeSumCodegen, test) { 380 CODEGEN_TEST_GENERATE(NativeSumCodegen, test) {
375 SequenceNode* node_seq = test->node_sequence(); 381 SequenceNode* node_seq = test->node_sequence();
(...skipping 26 matching lines...) Expand all
402 String::ZoneHandle(Symbols::New("TestSmiSum")); 408 String::ZoneHandle(Symbols::New("TestSmiSum"));
403 NativeFunction native_function = 409 NativeFunction native_function =
404 reinterpret_cast<NativeFunction>(TestSmiSum); 410 reinterpret_cast<NativeFunction>(TestSmiSum);
405 node_seq->Add( 411 node_seq->Add(
406 new ReturnNode(kPos, 412 new ReturnNode(kPos,
407 new NativeBodyNode(kPos, 413 new NativeBodyNode(kPos,
408 function, 414 function,
409 native_name, 415 native_name,
410 native_function, 416 native_function,
411 local_scope, 417 local_scope,
412 false /* Not bootstrap native */))); 418 false /* Not bootstrap native */),
419 NULL));
413 } 420 }
414 421
415 422
416 // Tested Dart code, calling function sum declared above: 423 // Tested Dart code, calling function sum declared above:
417 // return sum(1, 3); 424 // return sum(1, 3);
418 // Optional arguments are not passed and hence are set to their default values. 425 // Optional arguments are not passed and hence are set to their default values.
419 CODEGEN_TEST2_GENERATE(StaticSumCallNoOptCodegen, function, test) { 426 CODEGEN_TEST2_GENERATE(StaticSumCallNoOptCodegen, function, test) {
420 SequenceNode* node_seq = test->node_sequence(); 427 SequenceNode* node_seq = test->node_sequence();
421 ArgumentListNode* arguments = new ArgumentListNode(kPos); 428 ArgumentListNode* arguments = new ArgumentListNode(kPos);
422 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1)))); 429 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1))));
423 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3)))); 430 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))));
424 node_seq->Add(new ReturnNode(kPos, 431 node_seq->Add(new ReturnNode(kPos,
425 new StaticCallNode(kPos, function, arguments))); 432 new StaticCallNode(kPos, function, arguments),
433 NULL));
426 } 434 }
427 CODEGEN_TEST2_RUN(StaticSumCallNoOptCodegen, 435 CODEGEN_TEST2_RUN(StaticSumCallNoOptCodegen,
428 NativeSumCodegen, 436 NativeSumCodegen,
429 Smi::New(1 + 3 + 10 + 21 - 32)) 437 Smi::New(1 + 3 + 10 + 21 - 32))
430 438
431 439
432 // Tested Dart code, calling function sum declared above: 440 // Tested Dart code, calling function sum declared above:
433 // return sum(1, 3, 5); 441 // return sum(1, 3, 5);
434 // Only one out of three optional arguments is passed in; the second and third 442 // Only one out of three optional arguments is passed in; the second and third
435 // arguments are hence set to their default values. 443 // arguments are hence set to their default values.
436 CODEGEN_TEST2_GENERATE(StaticSumCallOneOptCodegen, function, test) { 444 CODEGEN_TEST2_GENERATE(StaticSumCallOneOptCodegen, function, test) {
437 SequenceNode* node_seq = test->node_sequence(); 445 SequenceNode* node_seq = test->node_sequence();
438 ArgumentListNode* arguments = new ArgumentListNode(kPos); 446 ArgumentListNode* arguments = new ArgumentListNode(kPos);
439 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1)))); 447 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1))));
440 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3)))); 448 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))));
441 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(5)))); 449 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(5))));
442 node_seq->Add(new ReturnNode(kPos, 450 node_seq->Add(new ReturnNode(kPos,
443 new StaticCallNode(kPos, function, arguments))); 451 new StaticCallNode(kPos, function, arguments),
452 NULL));
444 } 453 }
445 CODEGEN_TEST2_RUN(StaticSumCallOneOptCodegen, 454 CODEGEN_TEST2_RUN(StaticSumCallOneOptCodegen,
446 NativeSumCodegen, 455 NativeSumCodegen,
447 Smi::New(1 + 3 + 5 + 21 - 32)) 456 Smi::New(1 + 3 + 5 + 21 - 32))
448 457
449 458
450 // Tested Dart code, calling function sum declared above: 459 // Tested Dart code, calling function sum declared above:
451 // return sum(0, 1, 1, 2, 3); 460 // return sum(0, 1, 1, 2, 3);
452 // Optional arguments are passed in. 461 // Optional arguments are passed in.
453 CODEGEN_TEST2_GENERATE(StaticSumCallTenFiboCodegen, function, test) { 462 CODEGEN_TEST2_GENERATE(StaticSumCallTenFiboCodegen, function, test) {
454 SequenceNode* node_seq = test->node_sequence(); 463 SequenceNode* node_seq = test->node_sequence();
455 ArgumentListNode* arguments = new ArgumentListNode(kPos); 464 ArgumentListNode* arguments = new ArgumentListNode(kPos);
456 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(0)))); 465 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(0))));
457 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1)))); 466 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1))));
458 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1)))); 467 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1))));
459 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2)))); 468 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(2))));
460 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3)))); 469 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))));
461 node_seq->Add(new ReturnNode(kPos, 470 node_seq->Add(new ReturnNode(kPos,
462 new StaticCallNode(kPos, function, arguments))); 471 new StaticCallNode(kPos, function, arguments),
472 NULL));
463 } 473 }
464 CODEGEN_TEST2_RUN( 474 CODEGEN_TEST2_RUN(
465 StaticSumCallTenFiboCodegen, 475 StaticSumCallTenFiboCodegen,
466 NativeSumCodegen, 476 NativeSumCodegen,
467 Smi::New(0 + 1 + 1 + 2 + 3)) 477 Smi::New(0 + 1 + 1 + 2 + 3))
468 478
469 479
470 // Tested Dart code: 480 // Tested Dart code:
471 // int sum(a, b, c) native: "TestNonNullSmiSum"; 481 // int sum(a, b, c) native: "TestNonNullSmiSum";
472 // The native entry TestNonNullSmiSum implements sum natively. 482 // The native entry TestNonNullSmiSum implements sum natively.
(...skipping 19 matching lines...) Expand all
492 String::ZoneHandle(Symbols::New("TestNonNullSmiSum")); 502 String::ZoneHandle(Symbols::New("TestNonNullSmiSum"));
493 NativeFunction native_function = 503 NativeFunction native_function =
494 reinterpret_cast<NativeFunction>(TestNonNullSmiSum); 504 reinterpret_cast<NativeFunction>(TestNonNullSmiSum);
495 node_seq->Add( 505 node_seq->Add(
496 new ReturnNode(kPos, 506 new ReturnNode(kPos,
497 new NativeBodyNode(kPos, 507 new NativeBodyNode(kPos,
498 function, 508 function,
499 native_name, 509 native_name,
500 native_function, 510 native_function,
501 local_scope, 511 local_scope,
502 false /* Not bootstrap native */))); 512 false /* Not bootstrap native */),
513 NULL));
503 } 514 }
504 515
505 516
506 // Tested Dart code, calling function sum declared above: 517 // Tested Dart code, calling function sum declared above:
507 // return sum(1, null, 3); 518 // return sum(1, null, 3);
508 CODEGEN_TEST2_GENERATE(StaticNonNullSumCallCodegen, function, test) { 519 CODEGEN_TEST2_GENERATE(StaticNonNullSumCallCodegen, function, test) {
509 SequenceNode* node_seq = test->node_sequence(); 520 SequenceNode* node_seq = test->node_sequence();
510 ArgumentListNode* arguments = new ArgumentListNode(kPos); 521 ArgumentListNode* arguments = new ArgumentListNode(kPos);
511 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1)))); 522 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(1))));
512 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle())); 523 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle()));
513 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3)))); 524 arguments->Add(new LiteralNode(kPos, Smi::ZoneHandle(Smi::New(3))));
514 node_seq->Add(new ReturnNode(kPos, 525 node_seq->Add(new ReturnNode(kPos,
515 new StaticCallNode(kPos, function, arguments))); 526 new StaticCallNode(kPos, function, arguments),
527 NULL));
516 } 528 }
517 CODEGEN_TEST2_RUN(StaticNonNullSumCallCodegen, 529 CODEGEN_TEST2_RUN(StaticNonNullSumCallCodegen,
518 NativeNonNullSumCodegen, 530 NativeNonNullSumCodegen,
519 Smi::New(1 + 3)) 531 Smi::New(1 + 3))
520 532
521 533
522 // Test allocation of dart objects. 534 // Test allocation of dart objects.
523 CODEGEN_TEST_GENERATE(AllocateNewObjectCodegen, test) { 535 CODEGEN_TEST_GENERATE(AllocateNewObjectCodegen, test) {
524 const char* kScriptChars = 536 const char* kScriptChars =
525 "class A {\n" 537 "class A {\n"
(...skipping 12 matching lines...) Expand all
538 Class& cls = Class::ZoneHandle(LookupClass(lib, "A")); 550 Class& cls = Class::ZoneHandle(LookupClass(lib, "A"));
539 EXPECT(!cls.IsNull()); 551 EXPECT(!cls.IsNull());
540 552
541 String& constructor_name = String::Handle(String::New("A.")); 553 String& constructor_name = String::Handle(String::New("A."));
542 Function& constructor = 554 Function& constructor =
543 Function::ZoneHandle(cls.LookupConstructor(constructor_name)); 555 Function::ZoneHandle(cls.LookupConstructor(constructor_name));
544 EXPECT(!constructor.IsNull()); 556 EXPECT(!constructor.IsNull());
545 557
546 const TypeArguments& no_type_arguments = TypeArguments::ZoneHandle(); 558 const TypeArguments& no_type_arguments = TypeArguments::ZoneHandle();
547 ArgumentListNode* no_arguments = new ArgumentListNode(kPos); 559 ArgumentListNode* no_arguments = new ArgumentListNode(kPos);
548 test->node_sequence()->Add(new ReturnNode(kPos, new ConstructorCallNode( 560 test->node_sequence()->Add(
549 kPos, no_type_arguments, constructor, no_arguments))); 561 new ReturnNode(
562 kPos,
563 new ConstructorCallNode(
564 kPos, no_type_arguments, constructor, no_arguments),
565 NULL));
550 } 566 }
551 567
552 568
553 CODEGEN_TEST_RAW_RUN(AllocateNewObjectCodegen, function) { 569 CODEGEN_TEST_RAW_RUN(AllocateNewObjectCodegen, function) {
554 const Object& result = Object::Handle( 570 const Object& result = Object::Handle(
555 DartEntry::InvokeFunction(function, Object::empty_array())); 571 DartEntry::InvokeFunction(function, Object::empty_array()));
556 EXPECT(!result.IsError()); 572 EXPECT(!result.IsError());
557 const GrowableObjectArray& libs = GrowableObjectArray::Handle( 573 const GrowableObjectArray& libs = GrowableObjectArray::Handle(
558 Isolate::Current()->object_store()->libraries()); 574 Isolate::Current()->object_store()->libraries());
559 ASSERT(!libs.IsNull()); 575 ASSERT(!libs.IsNull());
560 // App lib is the last one that was loaded. 576 // App lib is the last one that was loaded.
561 intptr_t num_libs = libs.Length(); 577 intptr_t num_libs = libs.Length();
562 Library& app_lib = Library::Handle(); 578 Library& app_lib = Library::Handle();
563 app_lib ^= libs.At(num_libs - 1); 579 app_lib ^= libs.At(num_libs - 1);
564 ASSERT(!app_lib.IsNull()); 580 ASSERT(!app_lib.IsNull());
565 const Class& cls = Class::Handle( 581 const Class& cls = Class::Handle(
566 app_lib.LookupClass(String::Handle(Symbols::New("A")))); 582 app_lib.LookupClass(String::Handle(Symbols::New("A"))));
567 EXPECT_EQ(cls.raw(), result.clazz()); 583 EXPECT_EQ(cls.raw(), result.clazz());
568 } 584 }
569 585
570 } // namespace dart 586 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698