| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 library analyzer2dart.cps_generator; | 5 library analyzer2dart.cps_generator; |
| 6 | 6 |
| 7 import 'package:analyzer/analyzer.dart'; | 7 import 'package:analyzer/analyzer.dart'; |
| 8 | 8 |
| 9 import 'package:compiler/src/dart_types.dart' as dart2js; | 9 import 'package:compiler/src/dart_types.dart' as dart2js; |
| 10 import 'package:compiler/src/elements/elements.dart' as dart2js; | 10 import 'package:compiler/src/elements/elements.dart' as dart2js; |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 node.argumentList, node.methodName.name), | 195 node.argumentList, node.methodName.name), |
| 196 arguments); | 196 arguments); |
| 197 } | 197 } |
| 198 | 198 |
| 199 @override | 199 @override |
| 200 ir.Primitive visitStaticMethodInvocation(MethodInvocation node, | 200 ir.Primitive visitStaticMethodInvocation(MethodInvocation node, |
| 201 AccessSemantics semantics) { | 201 AccessSemantics semantics) { |
| 202 analyzer.Element staticElement = semantics.element; | 202 analyzer.Element staticElement = semantics.element; |
| 203 dart2js.Element element = converter.convertElement(staticElement); | 203 dart2js.Element element = converter.convertElement(staticElement); |
| 204 List<ir.Primitive> arguments = visitArguments(node.argumentList); | 204 List<ir.Primitive> arguments = visitArguments(node.argumentList); |
| 205 return irBuilder.buildStaticInvocation( | 205 return irBuilder.buildStaticFunctionInvocation( |
| 206 element, | 206 element, |
| 207 createSelectorFromMethodInvocation( | 207 createSelectorFromMethodInvocation( |
| 208 node.argumentList, node.methodName.name), | 208 node.argumentList, node.methodName.name), |
| 209 arguments); | 209 arguments); |
| 210 } | 210 } |
| 211 | 211 |
| 212 @override | 212 @override |
| 213 ir.Node visitLocalFunctionAccess(AstNode node, AccessSemantics semantics) { | 213 ir.Node visitLocalFunctionAccess(AstNode node, AccessSemantics semantics) { |
| 214 return handleLocalAccess(node, semantics); | 214 return handleLocalAccess(node, semantics); |
| 215 } | 215 } |
| 216 | 216 |
| 217 ir.Primitive handleLocalInvocation(MethodInvocation node, | 217 ir.Primitive handleLocalInvocation(MethodInvocation node, |
| 218 AccessSemantics semantics) { | 218 AccessSemantics semantics) { |
| 219 analyzer.Element staticElement = semantics.element; | 219 analyzer.Element staticElement = semantics.element; |
| 220 dart2js.Element element = converter.convertElement(staticElement); | 220 dart2js.Element element = converter.convertElement(staticElement); |
| 221 ir.Primitive receiver = irBuilder.buildLocalGet(element); | |
| 222 List<ir.Definition> arguments = visitArguments(node.argumentList); | 221 List<ir.Definition> arguments = visitArguments(node.argumentList); |
| 223 return irBuilder.buildCallInvocation( | 222 Selector selector = createSelectorFromMethodInvocation( |
| 224 receiver, | 223 node.argumentList, node.methodName.name); |
| 225 createSelectorFromMethodInvocation( | 224 if (semantics.kind == AccessKind.LOCAL_FUNCTION) { |
| 226 node.argumentList, node.methodName.name), | 225 return irBuilder.buildLocalFunctionInvocation( |
| 227 arguments); | 226 element, selector, arguments); |
| 227 } else { |
| 228 return irBuilder.buildLocalVariableInvocation( |
| 229 element, selector, arguments); |
| 230 } |
| 228 } | 231 } |
| 229 | 232 |
| 230 @override | 233 @override |
| 231 ir.Node visitLocalVariableInvocation(MethodInvocation node, | 234 ir.Node visitLocalVariableInvocation(MethodInvocation node, |
| 232 AccessSemantics semantics) { | 235 AccessSemantics semantics) { |
| 233 return handleLocalInvocation(node, semantics); | 236 return handleLocalInvocation(node, semantics); |
| 234 } | 237 } |
| 235 | 238 |
| 236 @override | 239 @override |
| 237 ir.Primitive visitLocalFunctionInvocation(MethodInvocation node, | 240 ir.Primitive visitLocalFunctionInvocation(MethodInvocation node, |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 } | 344 } |
| 342 | 345 |
| 343 dart2js.Element getLocal(AstNode node, AccessSemantics semantics) { | 346 dart2js.Element getLocal(AstNode node, AccessSemantics semantics) { |
| 344 analyzer.Element element = semantics.element; | 347 analyzer.Element element = semantics.element; |
| 345 dart2js.Element target = converter.convertElement(element); | 348 dart2js.Element target = converter.convertElement(element); |
| 346 assert(invariant(node, target.isLocal, '$target expected to be local.')); | 349 assert(invariant(node, target.isLocal, '$target expected to be local.')); |
| 347 return target; | 350 return target; |
| 348 } | 351 } |
| 349 | 352 |
| 350 ir.Primitive handleLocalAccess(AstNode node, AccessSemantics semantics) { | 353 ir.Primitive handleLocalAccess(AstNode node, AccessSemantics semantics) { |
| 351 return irBuilder.buildLocalGet(getLocal(node, semantics)); | 354 dart2js.Element local = getLocal(node, semantics); |
| 355 if (semantics.kind == AccessKind.LOCAL_FUNCTION) { |
| 356 return irBuilder.buildLocalFunctionGet(local); |
| 357 } else { |
| 358 return irBuilder.buildLocalVariableGet(local); |
| 359 } |
| 352 } | 360 } |
| 353 | 361 |
| 354 ir.Primitive handleLocalAssignment(AssignmentExpression node, | 362 ir.Primitive handleLocalAssignment(AssignmentExpression node, |
| 355 AccessSemantics semantics) { | 363 AccessSemantics semantics) { |
| 356 if (node.operator.lexeme != '=') { | 364 if (node.operator.lexeme != '=') { |
| 357 return giveUp(node, 'Assignment operator: ${node.operator.lexeme}'); | 365 return giveUp(node, 'Assignment operator: ${node.operator.lexeme}'); |
| 358 } | 366 } |
| 359 return irBuilder.buildLocalSet( | 367 return irBuilder.buildLocalVariableSet( |
| 360 getLocal(node, semantics), | 368 getLocal(node, semantics), |
| 361 build(node.rightHandSide)); | 369 build(node.rightHandSide)); |
| 362 } | 370 } |
| 363 | 371 |
| 364 @override | 372 @override |
| 365 ir.Node visitAssignmentExpression(AssignmentExpression node) { | 373 ir.Node visitAssignmentExpression(AssignmentExpression node) { |
| 366 // Avoid eager visiting of left and right hand side. | 374 // Avoid eager visiting of left and right hand side. |
| 367 return handleAssignmentExpression(node); | 375 return handleAssignmentExpression(node); |
| 368 } | 376 } |
| 369 | 377 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 384 AccessSemantics semantics) { | 392 AccessSemantics semantics) { |
| 385 if (node.operator.lexeme != '=') { | 393 if (node.operator.lexeme != '=') { |
| 386 return giveUp(node, 'Assignment operator: ${node.operator.lexeme}'); | 394 return giveUp(node, 'Assignment operator: ${node.operator.lexeme}'); |
| 387 } | 395 } |
| 388 analyzer.Element element = semantics.element; | 396 analyzer.Element element = semantics.element; |
| 389 dart2js.Element target = converter.convertElement(element); | 397 dart2js.Element target = converter.convertElement(element); |
| 390 // TODO(johnniwinther): Selector information should be computed in the | 398 // TODO(johnniwinther): Selector information should be computed in the |
| 391 // [TreeShaker] and shared with the [CpsGeneratingVisitor]. | 399 // [TreeShaker] and shared with the [CpsGeneratingVisitor]. |
| 392 assert(invariant(node, target.isTopLevel || target.isStatic, | 400 assert(invariant(node, target.isTopLevel || target.isStatic, |
| 393 '$target expected to be top-level or static.')); | 401 '$target expected to be top-level or static.')); |
| 394 return irBuilder.buildStaticSet(target, build(node.rightHandSide)); | 402 return irBuilder.buildStaticFieldSet(target, build(node.rightHandSide)); |
| 395 } | 403 } |
| 396 | 404 |
| 397 @override | 405 @override |
| 398 ir.Node visitDynamicAccess(AstNode node, AccessSemantics semantics) { | 406 ir.Node visitDynamicAccess(AstNode node, AccessSemantics semantics) { |
| 399 // TODO(johnniwinther): Handle implicit `this`. | 407 // TODO(johnniwinther): Handle implicit `this`. |
| 400 ir.Primitive receiver = build(semantics.target); | 408 ir.Primitive receiver = build(semantics.target); |
| 401 return irBuilder.buildDynamicGet(receiver, | 409 return irBuilder.buildDynamicGet(receiver, |
| 402 new Selector.getter(semantics.identifier.name, | 410 new Selector.getter(semantics.identifier.name, |
| 403 converter.convertElement(element.library))); | 411 converter.convertElement(element.library))); |
| 404 } | 412 } |
| 405 | 413 |
| 406 @override | 414 @override |
| 407 ir.Node visitStaticFieldAccess(AstNode node, AccessSemantics semantics) { | 415 ir.Node visitStaticFieldAccess(AstNode node, AccessSemantics semantics) { |
| 408 analyzer.Element element = semantics.element; | 416 analyzer.Element element = semantics.element; |
| 409 dart2js.Element target = converter.convertElement(element); | 417 dart2js.Element target = converter.convertElement(element); |
| 410 // TODO(johnniwinther): Selector information should be computed in the | 418 // TODO(johnniwinther): Selector information should be computed in the |
| 411 // [TreeShaker] and shared with the [CpsGeneratingVisitor]. | 419 // [TreeShaker] and shared with the [CpsGeneratingVisitor]. |
| 412 assert(invariant(node, target.isTopLevel || target.isStatic, | 420 assert(invariant(node, target.isTopLevel || target.isStatic, |
| 413 '$target expected to be top-level or static.')); | 421 '$target expected to be top-level or static.')); |
| 414 return irBuilder.buildStaticGet(target); | 422 return irBuilder.buildStaticFieldGet(target); |
| 415 } | 423 } |
| 416 | 424 |
| 417 ir.Primitive handleBinaryExpression(BinaryExpression node, | 425 ir.Primitive handleBinaryExpression(BinaryExpression node, |
| 418 String op) { | 426 String op) { |
| 419 ir.Primitive left = build(node.leftOperand); | 427 ir.Primitive left = build(node.leftOperand); |
| 420 ir.Primitive right = build(node.rightOperand); | 428 ir.Primitive right = build(node.rightOperand); |
| 421 Selector selector = new Selector.binaryOperator(op); | 429 Selector selector = new Selector.binaryOperator(op); |
| 422 return irBuilder.buildDynamicInvocation( | 430 return irBuilder.buildDynamicInvocation( |
| 423 left, selector, <ir.Primitive>[right]); | 431 left, selector, <ir.Primitive>[right]); |
| 424 } | 432 } |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 583 irBuilder.buildTry( | 591 irBuilder.buildTry( |
| 584 tryStatementInfo: new TryStatementInfo(), | 592 tryStatementInfo: new TryStatementInfo(), |
| 585 buildTryBlock: subbuild(node.body), | 593 buildTryBlock: subbuild(node.body), |
| 586 catchClauseInfos: catchClauseInfos); | 594 catchClauseInfos: catchClauseInfos); |
| 587 } | 595 } |
| 588 } | 596 } |
| 589 | 597 |
| 590 class NullCapturedVariables extends DartCapturedVariables { | 598 class NullCapturedVariables extends DartCapturedVariables { |
| 591 NullCapturedVariables() : super(null); | 599 NullCapturedVariables() : super(null); |
| 592 } | 600 } |
| OLD | NEW |