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 "vm/parser.h" | 5 #include "vm/parser.h" |
6 | 6 |
7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
10 #include "vm/compiler_stats.h" | 10 #include "vm/compiler_stats.h" |
(...skipping 1295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1306 String& name = String::Handle(class_name.raw()); | 1306 String& name = String::Handle(class_name.raw()); |
1307 if (class_name.CharAt(0) == Scanner::kPrivateIdentifierStart) { | 1307 if (class_name.CharAt(0) == Scanner::kPrivateIdentifierStart) { |
1308 // Private identifiers are mangled on a per script basis. | 1308 // Private identifiers are mangled on a per script basis. |
1309 name = String::Concat(name, String::Handle(core_lib.private_key())); | 1309 name = String::Concat(name, String::Handle(core_lib.private_key())); |
1310 name = Symbols::New(name); | 1310 name = Symbols::New(name); |
1311 } | 1311 } |
1312 return core_lib.LookupClass(name); | 1312 return core_lib.LookupClass(name); |
1313 } | 1313 } |
1314 | 1314 |
1315 | 1315 |
| 1316 StaticCallNode* Parser::BuildInvocationMirrorAllocation( |
| 1317 intptr_t call_pos, |
| 1318 const String& function_name, |
| 1319 const ArgumentListNode& function_args) { |
| 1320 const intptr_t args_pos = function_args.token_pos(); |
| 1321 // Build arguments to the call to the static |
| 1322 // InvocationMirror._allocateInvocationMirror method. |
| 1323 ArgumentListNode* arguments = new ArgumentListNode(args_pos); |
| 1324 // The first argument is the original function name. |
| 1325 arguments->Add(new LiteralNode(args_pos, function_name)); |
| 1326 // The second argument is an array containing the original function arguments. |
| 1327 ArrayNode* args_array = new ArrayNode( |
| 1328 args_pos, Type::ZoneHandle(Type::ListInterface())); |
| 1329 for (intptr_t i = 1; i < function_args.length(); i++) { |
| 1330 args_array->AddElement(function_args.NodeAt(i)); |
| 1331 } |
| 1332 arguments->Add(args_array); |
| 1333 // Lookup the static InvocationMirror._allocateInvocationMirror method. |
| 1334 const Class& mirror_class = Class::Handle( |
| 1335 LookupCoreClass(String::Handle(Symbols::InvocationMirror()))); |
| 1336 ASSERT(!mirror_class.IsNull()); |
| 1337 const String& allocation_function_name = |
| 1338 String::Handle(Symbols::AllocateInvocationMirror()); |
| 1339 const Function& allocation_function = Function::ZoneHandle( |
| 1340 mirror_class.LookupStaticFunction(allocation_function_name)); |
| 1341 ASSERT(!allocation_function.IsNull()); |
| 1342 return new StaticCallNode(call_pos, allocation_function, arguments); |
| 1343 } |
| 1344 |
| 1345 |
1316 ArgumentListNode* Parser::BuildNoSuchMethodArguments( | 1346 ArgumentListNode* Parser::BuildNoSuchMethodArguments( |
| 1347 intptr_t call_pos, |
1317 const String& function_name, | 1348 const String& function_name, |
1318 const ArgumentListNode& function_args) { | 1349 const ArgumentListNode& function_args) { |
1319 ASSERT(function_args.length() >= 1); // The receiver is the first argument. | 1350 ASSERT(function_args.length() >= 1); // The receiver is the first argument. |
1320 const intptr_t args_pos = function_args.token_pos(); | 1351 const intptr_t args_pos = function_args.token_pos(); |
1321 ArgumentListNode* arguments = new ArgumentListNode(args_pos); | 1352 ArgumentListNode* arguments = new ArgumentListNode(args_pos); |
1322 arguments->Add(function_args.NodeAt(0)); | 1353 arguments->Add(function_args.NodeAt(0)); |
1323 // The second argument is the original function name. | 1354 // The second argument is the invocation mirror. |
1324 // TODO(regis): This will change once mirrors are supported. | 1355 arguments->Add(BuildInvocationMirrorAllocation( |
1325 arguments->Add(new LiteralNode(args_pos, function_name)); | 1356 call_pos, function_name, function_args)); |
1326 // The third argument is an array containing the original function arguments. | |
1327 ArrayNode* args_array = new ArrayNode( | |
1328 args_pos, Type::ZoneHandle(Type::ListInterface())); | |
1329 for (intptr_t i = 1; i < function_args.length(); i++) { | |
1330 args_array->AddElement(function_args.NodeAt(i)); | |
1331 } | |
1332 arguments->Add(args_array); | |
1333 return arguments; | 1357 return arguments; |
1334 } | 1358 } |
1335 | 1359 |
1336 | 1360 |
1337 AstNode* Parser::ParseSuperCall(const String& function_name) { | 1361 AstNode* Parser::ParseSuperCall(const String& function_name) { |
1338 TRACE_PARSER("ParseSuperCall"); | 1362 TRACE_PARSER("ParseSuperCall"); |
1339 ASSERT(CurrentToken() == Token::kLPAREN); | 1363 ASSERT(CurrentToken() == Token::kLPAREN); |
1340 const intptr_t supercall_pos = TokenPos(); | 1364 const intptr_t supercall_pos = TokenPos(); |
1341 | 1365 |
1342 const bool kResolveGetter = true; | 1366 const bool kResolveGetter = true; |
(...skipping 15 matching lines...) Expand all Loading... |
1358 super_class, | 1382 super_class, |
1359 function_name); | 1383 function_name); |
1360 EnsureExpressionTemp(); | 1384 EnsureExpressionTemp(); |
1361 return new ClosureCallNode(supercall_pos, closure, arguments); | 1385 return new ClosureCallNode(supercall_pos, closure, arguments); |
1362 } | 1386 } |
1363 // 'this' parameter is the first argument to super call. | 1387 // 'this' parameter is the first argument to super call. |
1364 AstNode* receiver = LoadReceiver(supercall_pos); | 1388 AstNode* receiver = LoadReceiver(supercall_pos); |
1365 arguments->Add(receiver); | 1389 arguments->Add(receiver); |
1366 ParseActualParameters(arguments, kAllowConst); | 1390 ParseActualParameters(arguments, kAllowConst); |
1367 if (is_no_such_method) { | 1391 if (is_no_such_method) { |
1368 arguments = BuildNoSuchMethodArguments(function_name, *arguments); | 1392 arguments = BuildNoSuchMethodArguments( |
| 1393 supercall_pos, function_name, *arguments); |
1369 } | 1394 } |
1370 return new StaticCallNode(supercall_pos, super_function, arguments); | 1395 return new StaticCallNode(supercall_pos, super_function, arguments); |
1371 } | 1396 } |
1372 | 1397 |
1373 | 1398 |
1374 // Simple test if a node is side effect free. | 1399 // Simple test if a node is side effect free. |
1375 static bool IsSimpleLocalOrLiteralNode(AstNode* node) { | 1400 static bool IsSimpleLocalOrLiteralNode(AstNode* node) { |
1376 if (node->IsLiteralNode()) { | 1401 if (node->IsLiteralNode()) { |
1377 return true; | 1402 return true; |
1378 } | 1403 } |
(...skipping 18 matching lines...) Expand all Loading... |
1397 const Function& super_operator = Function::ZoneHandle( | 1422 const Function& super_operator = Function::ZoneHandle( |
1398 GetSuperFunction(super_pos, | 1423 GetSuperFunction(super_pos, |
1399 operator_function_name, | 1424 operator_function_name, |
1400 kResolveGetter, | 1425 kResolveGetter, |
1401 &is_no_such_method)); | 1426 &is_no_such_method)); |
1402 ArgumentListNode* op_arguments = new ArgumentListNode(super_pos); | 1427 ArgumentListNode* op_arguments = new ArgumentListNode(super_pos); |
1403 AstNode* receiver = LoadReceiver(super_pos); | 1428 AstNode* receiver = LoadReceiver(super_pos); |
1404 op_arguments->Add(receiver); | 1429 op_arguments->Add(receiver); |
1405 CheckFunctionIsCallable(super_pos, super_operator); | 1430 CheckFunctionIsCallable(super_pos, super_operator); |
1406 if (is_no_such_method) { | 1431 if (is_no_such_method) { |
1407 op_arguments = BuildNoSuchMethodArguments(operator_function_name, | 1432 op_arguments = BuildNoSuchMethodArguments( |
1408 *op_arguments); | 1433 super_pos, operator_function_name, *op_arguments); |
1409 } | 1434 } |
1410 super_op = new StaticCallNode(super_pos, super_operator, op_arguments); | 1435 super_op = new StaticCallNode(super_pos, super_operator, op_arguments); |
1411 } else { | 1436 } else { |
1412 ErrorMsg(super_pos, "illegal super operator call"); | 1437 ErrorMsg(super_pos, "illegal super operator call"); |
1413 } | 1438 } |
1414 return super_op; | 1439 return super_op; |
1415 } | 1440 } |
1416 | 1441 |
1417 | 1442 |
1418 AstNode* Parser::ParseSuperOperator() { | 1443 AstNode* Parser::ParseSuperOperator() { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1454 ASSERT(Token::Precedence(op) >= Token::Precedence(Token::kBIT_OR)); | 1479 ASSERT(Token::Precedence(op) >= Token::Precedence(Token::kBIT_OR)); |
1455 AstNode* other_operand = ParseBinaryExpr(Token::Precedence(op) + 1); | 1480 AstNode* other_operand = ParseBinaryExpr(Token::Precedence(op) + 1); |
1456 | 1481 |
1457 ArgumentListNode* op_arguments = new ArgumentListNode(operator_pos); | 1482 ArgumentListNode* op_arguments = new ArgumentListNode(operator_pos); |
1458 AstNode* receiver = LoadReceiver(operator_pos); | 1483 AstNode* receiver = LoadReceiver(operator_pos); |
1459 op_arguments->Add(receiver); | 1484 op_arguments->Add(receiver); |
1460 op_arguments->Add(other_operand); | 1485 op_arguments->Add(other_operand); |
1461 | 1486 |
1462 CheckFunctionIsCallable(operator_pos, super_operator); | 1487 CheckFunctionIsCallable(operator_pos, super_operator); |
1463 if (is_no_such_method) { | 1488 if (is_no_such_method) { |
1464 op_arguments = BuildNoSuchMethodArguments(operator_function_name, | 1489 op_arguments = BuildNoSuchMethodArguments( |
1465 *op_arguments); | 1490 operator_pos, operator_function_name, *op_arguments); |
1466 } | 1491 } |
1467 super_op = new StaticCallNode(operator_pos, super_operator, op_arguments); | 1492 super_op = new StaticCallNode(operator_pos, super_operator, op_arguments); |
1468 if (negate_result) { | 1493 if (negate_result) { |
1469 super_op = new UnaryOpNode(operator_pos, Token::kNOT, super_op); | 1494 super_op = new UnaryOpNode(operator_pos, Token::kNOT, super_op); |
1470 } | 1495 } |
1471 } | 1496 } |
1472 return super_op; | 1497 return super_op; |
1473 } | 1498 } |
1474 | 1499 |
1475 | 1500 |
(...skipping 8362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9838 void Parser::SkipQualIdent() { | 9863 void Parser::SkipQualIdent() { |
9839 ASSERT(IsIdentifier()); | 9864 ASSERT(IsIdentifier()); |
9840 ConsumeToken(); | 9865 ConsumeToken(); |
9841 if (CurrentToken() == Token::kPERIOD) { | 9866 if (CurrentToken() == Token::kPERIOD) { |
9842 ConsumeToken(); // Consume the kPERIOD token. | 9867 ConsumeToken(); // Consume the kPERIOD token. |
9843 ExpectIdentifier("identifier expected after '.'"); | 9868 ExpectIdentifier("identifier expected after '.'"); |
9844 } | 9869 } |
9845 } | 9870 } |
9846 | 9871 |
9847 } // namespace dart | 9872 } // namespace dart |
OLD | NEW |