| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |