| 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 dart2js.js_emitter.program_builder; | 5 library dart2js.js_emitter.program_builder; |
| 6 | 6 |
| 7 import 'js_emitter.dart' show computeMixinClass; | 7 import 'js_emitter.dart' show computeMixinClass; |
| 8 import 'model.dart'; | 8 import 'model.dart'; |
| 9 | 9 |
| 10 import '../common.dart'; | 10 import '../common.dart'; |
| 11 import '../js/js.dart' as js; | 11 import '../js/js.dart' as js; |
| 12 | 12 |
| 13 import '../js_backend/js_backend.dart' show | 13 import '../js_backend/js_backend.dart' show |
| 14 Namer, | 14 Namer, |
| 15 JavaScriptBackend, | 15 JavaScriptBackend, |
| 16 JavaScriptConstantCompiler; | 16 JavaScriptConstantCompiler; |
| 17 | 17 |
| 18 import 'js_emitter.dart' show | 18 import 'js_emitter.dart' show |
| 19 ClassStubGenerator, | 19 ClassStubGenerator, |
| 20 CodeEmitterTask, | 20 CodeEmitterTask, |
| 21 InterceptorStubGenerator, | 21 InterceptorStubGenerator, |
| 22 MainCallStubGenerator, | 22 MainCallStubGenerator, |
| 23 ParameterStubGenerator, | 23 ParameterStubGenerator, |
| 24 RuntimeTypeGenerator, | 24 RuntimeTypeGenerator, |
| 25 TypeTestProperties; | 25 TypeTestProperties; |
| 26 | 26 |
| 27 import '../elements/elements.dart' show ParameterElement; | 27 import '../elements/elements.dart' show ParameterElement, MethodElement; |
| 28 | 28 |
| 29 import '../universe/universe.dart' show Universe; | 29 import '../universe/universe.dart' show Universe; |
| 30 import '../deferred_load.dart' show DeferredLoadTask, OutputUnit; | 30 import '../deferred_load.dart' show DeferredLoadTask, OutputUnit; |
| 31 import '../constants/expressions.dart' show ConstantExpression, ConstantValue; | 31 import '../constants/expressions.dart' show ConstantExpression, ConstantValue; |
| 32 | 32 |
| 33 part 'registry.dart'; | 33 part 'registry.dart'; |
| 34 | 34 |
| 35 class ProgramBuilder { | 35 class ProgramBuilder { |
| 36 final Compiler _compiler; | 36 final Compiler _compiler; |
| 37 final Namer namer; | 37 final Namer namer; |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 selectors.forEach((String name, Selector selector) { | 364 selectors.forEach((String name, Selector selector) { |
| 365 noSuchMethodStubs | 365 noSuchMethodStubs |
| 366 .add(classStubGenerator.generateStubForNoSuchMethod(name, | 366 .add(classStubGenerator.generateStubForNoSuchMethod(name, |
| 367 selector)); | 367 selector)); |
| 368 }); | 368 }); |
| 369 } | 369 } |
| 370 | 370 |
| 371 if (element == backend.closureClass) { | 371 if (element == backend.closureClass) { |
| 372 // We add a special getter here to allow for tearing off a closure from | 372 // We add a special getter here to allow for tearing off a closure from |
| 373 // itself. | 373 // itself. |
| 374 String name = namer.getterForPublicMember(Compiler.CALL_OPERATOR_NAME); | 374 String name = namer.getterForMember(Selector.CALL_NAME); |
| 375 js.Fun function = js.js('function() { return this; }'); | 375 js.Fun function = js.js('function() { return this; }'); |
| 376 callStubs.add(_buildStubMethod(name, function)); | 376 callStubs.add(_buildStubMethod(name, function)); |
| 377 } | 377 } |
| 378 | 378 |
| 379 ClassElement implementation = element.implementation; | 379 ClassElement implementation = element.implementation; |
| 380 | 380 |
| 381 // MixinApplications run through the members of their mixin. Here, we are | 381 // MixinApplications run through the members of their mixin. Here, we are |
| 382 // only interested in direct members. | 382 // only interested in direct members. |
| 383 if (!onlyForRti && !element.isMixinApplication) { | 383 if (!onlyForRti && !element.isMixinApplication) { |
| 384 implementation.forEachMember(visitMember, includeBackendMembers: true); | 384 implementation.forEachMember(visitMember, includeBackendMembers: true); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 optionalParameterDefaultValues = <ConstantValue>[]; | 478 optionalParameterDefaultValues = <ConstantValue>[]; |
| 479 signature.forEachOptionalParameter((ParameterElement parameter) { | 479 signature.forEachOptionalParameter((ParameterElement parameter) { |
| 480 ConstantExpression def = | 480 ConstantExpression def = |
| 481 backend.constants.getConstantForVariable(parameter); | 481 backend.constants.getConstantForVariable(parameter); |
| 482 optionalParameterDefaultValues.add(def.value); | 482 optionalParameterDefaultValues.add(def.value); |
| 483 }); | 483 }); |
| 484 } | 484 } |
| 485 return optionalParameterDefaultValues; | 485 return optionalParameterDefaultValues; |
| 486 } | 486 } |
| 487 | 487 |
| 488 DartMethod _buildMethod(FunctionElement element) { | 488 DartMethod _buildMethod(MethodElement element) { |
| 489 String name = namer.methodPropertyName(element); | 489 String name = namer.methodPropertyName(element); |
| 490 js.Expression code = backend.generatedCode[element]; | 490 js.Expression code = backend.generatedCode[element]; |
| 491 | 491 |
| 492 // TODO(kasperl): Figure out under which conditions code is null. | 492 // TODO(kasperl): Figure out under which conditions code is null. |
| 493 if (code == null) return null; | 493 if (code == null) return null; |
| 494 | 494 |
| 495 bool canTearOff = false; | 495 bool canTearOff = false; |
| 496 String tearOffName; | 496 String tearOffName; |
| 497 bool isClosure = false; | 497 bool isClosure = false; |
| 498 bool isNotApplyTarget = !element.isFunction || element.isAccessor; | 498 bool isNotApplyTarget = !element.isFunction || element.isAccessor; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 | 571 |
| 572 js.Expression _generateFunctionType(DartType type) { | 572 js.Expression _generateFunctionType(DartType type) { |
| 573 if (type.containsTypeVariables) { | 573 if (type.containsTypeVariables) { |
| 574 js.Expression thisAccess = js.js(r'this.$receiver'); | 574 js.Expression thisAccess = js.js(r'this.$receiver'); |
| 575 return backend.rti.getSignatureEncoding(type, thisAccess); | 575 return backend.rti.getSignatureEncoding(type, thisAccess); |
| 576 } else { | 576 } else { |
| 577 return js.number(backend.emitter.metadataCollector.reifyType(type)); | 577 return js.number(backend.emitter.metadataCollector.reifyType(type)); |
| 578 } | 578 } |
| 579 } | 579 } |
| 580 | 580 |
| 581 List<ParameterStubMethod> _generateParameterStubs(FunctionElement element, | 581 List<ParameterStubMethod> _generateParameterStubs(MethodElement element, |
| 582 bool canTearOff) { | 582 bool canTearOff) { |
| 583 | 583 |
| 584 if (!_methodNeedsStubs(element)) return const <ParameterStubMethod>[]; | 584 if (!_methodNeedsStubs(element)) return const <ParameterStubMethod>[]; |
| 585 | 585 |
| 586 ParameterStubGenerator generator = | 586 ParameterStubGenerator generator = |
| 587 new ParameterStubGenerator(_compiler, namer, backend); | 587 new ParameterStubGenerator(_compiler, namer, backend); |
| 588 return generator.generateParameterStubs(element, canTearOff: canTearOff); | 588 return generator.generateParameterStubs(element, canTearOff: canTearOff); |
| 589 } | 589 } |
| 590 | 590 |
| 591 /// Builds a stub method. | 591 /// Builds a stub method. |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 _registry.registerConstant(outputUnit, constantValue); | 754 _registry.registerConstant(outputUnit, constantValue); |
| 755 assert(!_constants.containsKey(constantValue)); | 755 assert(!_constants.containsKey(constantValue)); |
| 756 String name = namer.constantName(constantValue); | 756 String name = namer.constantName(constantValue); |
| 757 String constantObject = namer.globalObjectForConstant(constantValue); | 757 String constantObject = namer.globalObjectForConstant(constantValue); |
| 758 Holder holder = _registry.registerHolder(constantObject); | 758 Holder holder = _registry.registerHolder(constantObject); |
| 759 Constant constant = new Constant(name, holder, constantValue); | 759 Constant constant = new Constant(name, holder, constantValue); |
| 760 _constants[constantValue] = constant; | 760 _constants[constantValue] = constant; |
| 761 } | 761 } |
| 762 } | 762 } |
| 763 } | 763 } |
| OLD | NEW |