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'; |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 backend.constants.getStaticNonFinalFieldsForEmission(); | 203 backend.constants.getStaticNonFinalFieldsForEmission(); |
204 return Elements.sortedByPosition(staticNonFinalFields) | 204 return Elements.sortedByPosition(staticNonFinalFields) |
205 .map(_buildStaticField) | 205 .map(_buildStaticField) |
206 .toList(growable: false); | 206 .toList(growable: false); |
207 } | 207 } |
208 | 208 |
209 StaticField _buildStaticField(Element element) { | 209 StaticField _buildStaticField(Element element) { |
210 JavaScriptConstantCompiler handler = backend.constants; | 210 JavaScriptConstantCompiler handler = backend.constants; |
211 ConstantValue initialValue = handler.getInitialValueFor(element).value; | 211 ConstantValue initialValue = handler.getInitialValueFor(element).value; |
212 js.Expression code = _task.emitter.constantReference(initialValue); | 212 js.Expression code = _task.emitter.constantReference(initialValue); |
213 String name = namer.globalPropertyName(element); | 213 String name = namer.getNameOfGlobalField(element); |
214 bool isFinal = false; | 214 bool isFinal = false; |
215 bool isLazy = false; | 215 bool isLazy = false; |
216 return new StaticField(element, | 216 return new StaticField(element, |
217 name, _registry.registerHolder(r'$'), code, | 217 name, _registry.registerHolder(r'$'), code, |
218 isFinal, isLazy); | 218 isFinal, isLazy); |
219 } | 219 } |
220 | 220 |
221 List<StaticField> _buildStaticLazilyInitializedFields( | 221 List<StaticField> _buildStaticLazilyInitializedFields( |
222 LibrariesMap librariesMap) { | 222 LibrariesMap librariesMap) { |
223 // TODO(floitsch): lazy fields should just be in their respective | 223 // TODO(floitsch): lazy fields should just be in their respective |
(...skipping 11 matching lines...) Expand all Loading... |
235 .toList(growable: false); | 235 .toList(growable: false); |
236 } | 236 } |
237 | 237 |
238 StaticField _buildLazyField(Element element) { | 238 StaticField _buildLazyField(Element element) { |
239 js.Expression code = backend.generatedCode[element]; | 239 js.Expression code = backend.generatedCode[element]; |
240 // The code is null if we ended up not needing the lazily | 240 // The code is null if we ended up not needing the lazily |
241 // initialized field after all because of constant folding | 241 // initialized field after all because of constant folding |
242 // before code generation. | 242 // before code generation. |
243 if (code == null) return null; | 243 if (code == null) return null; |
244 | 244 |
245 String name = namer.globalPropertyName(element); | 245 String name = namer.getNameOfGlobalField(element); |
246 bool isFinal = element.isFinal; | 246 bool isFinal = element.isFinal; |
247 bool isLazy = true; | 247 bool isLazy = true; |
248 return new StaticField(element, | 248 return new StaticField(element, |
249 name, _registry.registerHolder(r'$'), code, | 249 name, _registry.registerHolder(r'$'), code, |
250 isFinal, isLazy); | 250 isFinal, isLazy); |
251 } | 251 } |
252 | 252 |
253 List<Library> _buildLibraries(LibrariesMap librariesMap) { | 253 List<Library> _buildLibraries(LibrariesMap librariesMap) { |
254 List<Library> libraries = new List<Library>(librariesMap.length); | 254 List<Library> libraries = new List<Library>(librariesMap.length); |
255 int count = 0; | 255 int count = 0; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 staticFieldsForReflection); | 288 staticFieldsForReflection); |
289 } | 289 } |
290 | 290 |
291 /// HACK for Incremental Compilation. | 291 /// HACK for Incremental Compilation. |
292 /// | 292 /// |
293 /// Returns a class that contains the fields of a class. | 293 /// Returns a class that contains the fields of a class. |
294 Class buildFieldsHackForIncrementalCompilation(ClassElement element) { | 294 Class buildFieldsHackForIncrementalCompilation(ClassElement element) { |
295 assert(_compiler.hasIncrementalSupport); | 295 assert(_compiler.hasIncrementalSupport); |
296 | 296 |
297 List<Field> instanceFields = _buildFields(element, false); | 297 List<Field> instanceFields = _buildFields(element, false); |
298 String name = namer.className(element); | 298 String name = namer.getNameOfClass(element); |
299 | 299 |
300 return new Class( | 300 return new Class( |
301 element, name, null, [], instanceFields, [], [], [], [], [], null, | 301 element, name, null, [], instanceFields, [], [], [], [], [], null, |
302 isDirectlyInstantiated: true, | 302 isDirectlyInstantiated: true, |
303 onlyForRti: false, | 303 onlyForRti: false, |
304 isNative: element.isNative); | 304 isNative: element.isNative); |
305 } | 305 } |
306 | 306 |
307 Class _buildClass(ClassElement element) { | 307 Class _buildClass(ClassElement element) { |
308 bool onlyForRti = _task.typeTestRegistry.rtiNeededClasses.contains(element); | 308 bool onlyForRti = _task.typeTestRegistry.rtiNeededClasses.contains(element); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 TypeTestProperties typeTests = | 369 TypeTestProperties typeTests = |
370 runtimeTypeGenerator.generateIsTests( | 370 runtimeTypeGenerator.generateIsTests( |
371 element, | 371 element, |
372 storeFunctionTypeInMetadata: _storeFunctionTypesInMetadata); | 372 storeFunctionTypeInMetadata: _storeFunctionTypesInMetadata); |
373 | 373 |
374 List<StubMethod> isChecks = <StubMethod>[]; | 374 List<StubMethod> isChecks = <StubMethod>[]; |
375 typeTests.properties.forEach((String name, js.Node code) { | 375 typeTests.properties.forEach((String name, js.Node code) { |
376 isChecks.add(_buildStubMethod(name, code)); | 376 isChecks.add(_buildStubMethod(name, code)); |
377 }); | 377 }); |
378 | 378 |
379 String name = namer.className(element); | 379 String name = namer.getNameOfClass(element); |
380 String holderName = namer.globalObjectFor(element); | 380 String holderName = namer.globalObjectFor(element); |
381 Holder holder = _registry.registerHolder(holderName); | 381 Holder holder = _registry.registerHolder(holderName); |
382 bool isInstantiated = | 382 bool isInstantiated = |
383 _compiler.codegenWorld.directlyInstantiatedClasses.contains(element); | 383 _compiler.codegenWorld.directlyInstantiatedClasses.contains(element); |
384 | 384 |
385 Class result; | 385 Class result; |
386 if (element.isMixinApplication && !onlyForRti) { | 386 if (element.isMixinApplication && !onlyForRti) { |
387 assert(!element.isNative); | 387 assert(!element.isNative); |
388 assert(methods.isEmpty); | 388 assert(methods.isEmpty); |
389 | 389 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 Method buildMethodHackForIncrementalCompilation(FunctionElement element) { | 434 Method buildMethodHackForIncrementalCompilation(FunctionElement element) { |
435 assert(_compiler.hasIncrementalSupport); | 435 assert(_compiler.hasIncrementalSupport); |
436 if (element.isInstanceMember) { | 436 if (element.isInstanceMember) { |
437 return _buildMethod(element); | 437 return _buildMethod(element); |
438 } else { | 438 } else { |
439 return _buildStaticMethod(element); | 439 return _buildStaticMethod(element); |
440 } | 440 } |
441 } | 441 } |
442 | 442 |
443 DartMethod _buildMethod(FunctionElement element) { | 443 DartMethod _buildMethod(FunctionElement element) { |
444 String name = namer.methodPropertyName(element); | 444 String name = namer.getNameOfInstanceMember(element); |
445 js.Expression code = backend.generatedCode[element]; | 445 js.Expression code = backend.generatedCode[element]; |
446 | 446 |
447 // TODO(kasperl): Figure out under which conditions code is null. | 447 // TODO(kasperl): Figure out under which conditions code is null. |
448 if (code == null) return null; | 448 if (code == null) return null; |
449 | 449 |
450 bool canTearOff = false; | 450 bool canTearOff = false; |
451 String tearOffName; | 451 String tearOffName; |
452 bool isClosure = false; | 452 bool isClosure = false; |
453 bool isNotApplyTarget = !element.isFunction || element.isAccessor; | 453 bool isNotApplyTarget = !element.isFunction || element.isAccessor; |
454 | 454 |
455 bool canBeReflected = _methodCanBeReflected(element); | 455 bool canBeReflected = _methodCanBeReflected(element); |
456 bool needsStubs = _methodNeedsStubs(element); | 456 bool needsStubs = _methodNeedsStubs(element); |
457 bool canBeApplied = _methodCanBeApplied(element); | 457 bool canBeApplied = _methodCanBeApplied(element); |
458 | 458 |
459 String aliasName = backend.isAliasedSuperMember(element) | 459 String aliasName = backend.isAliasedSuperMember(element) |
460 ? namer.aliasedSuperMemberPropertyName(element) | 460 ? namer.getNameOfAliasedSuperMember(element) |
461 : null; | 461 : null; |
462 | 462 |
463 if (isNotApplyTarget) { | 463 if (isNotApplyTarget) { |
464 canTearOff = false; | 464 canTearOff = false; |
465 } else { | 465 } else { |
466 if (element.enclosingClass.isClosure) { | 466 if (element.enclosingClass.isClosure) { |
467 canTearOff = false; | 467 canTearOff = false; |
468 isClosure = true; | 468 isClosure = true; |
469 } else { | 469 } else { |
470 // Careful with operators. | 470 // Careful with operators. |
471 canTearOff = universe.hasInvokedGetter(element, _compiler.world) || | 471 canTearOff = universe.hasInvokedGetter(element, _compiler.world) || |
472 (canBeReflected && !element.isOperator); | 472 (canBeReflected && !element.isOperator); |
473 assert(canTearOff || | 473 assert(canTearOff || |
474 !universe.methodsNeedingSuperGetter.contains(element)); | 474 !universe.methodsNeedingSuperGetter.contains(element)); |
475 tearOffName = namer.getterForElement(element); | 475 tearOffName = namer.getterName(element); |
476 } | 476 } |
477 } | 477 } |
478 | 478 |
479 if (canTearOff) { | 479 if (canTearOff) { |
480 assert(invariant(element, !element.isGenerativeConstructor)); | 480 assert(invariant(element, !element.isGenerativeConstructor)); |
481 assert(invariant(element, !element.isGenerativeConstructorBody)); | 481 assert(invariant(element, !element.isGenerativeConstructorBody)); |
482 assert(invariant(element, !element.isConstructor)); | 482 assert(invariant(element, !element.isConstructor)); |
483 } | 483 } |
484 | 484 |
485 String callName = null; | 485 String callName = null; |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
611 Holder holder = _registry.registerHolder(holderName); | 611 Holder holder = _registry.registerHolder(holderName); |
612 | 612 |
613 List<String> names = backend.oneShotInterceptors.keys.toList()..sort(); | 613 List<String> names = backend.oneShotInterceptors.keys.toList()..sort(); |
614 return names.map((String name) { | 614 return names.map((String name) { |
615 js.Expression code = stubGenerator.generateOneShotInterceptor(name); | 615 js.Expression code = stubGenerator.generateOneShotInterceptor(name); |
616 return new StaticStubMethod(name, holder, code); | 616 return new StaticStubMethod(name, holder, code); |
617 }); | 617 }); |
618 } | 618 } |
619 | 619 |
620 StaticDartMethod _buildStaticMethod(FunctionElement element) { | 620 StaticDartMethod _buildStaticMethod(FunctionElement element) { |
621 String name = namer.methodPropertyName(element); | 621 String name = namer.getNameOfMember(element); |
622 String holder = namer.globalObjectFor(element); | 622 String holder = namer.globalObjectFor(element); |
623 js.Expression code = backend.generatedCode[element]; | 623 js.Expression code = backend.generatedCode[element]; |
624 | 624 |
625 bool isApplyTarget = !element.isConstructor && !element.isAccessor; | 625 bool isApplyTarget = !element.isConstructor && !element.isAccessor; |
626 bool canBeApplied = _methodCanBeApplied(element); | 626 bool canBeApplied = _methodCanBeApplied(element); |
627 bool canBeReflected = _methodCanBeReflected(element); | 627 bool canBeReflected = _methodCanBeReflected(element); |
628 | 628 |
629 bool needsTearOff = isApplyTarget && | 629 bool needsTearOff = isApplyTarget && |
630 (canBeReflected || | 630 (canBeReflected || |
631 universe.staticFunctionsNeedingGetter.contains(element)); | 631 universe.staticFunctionsNeedingGetter.contains(element)); |
632 | 632 |
633 String tearOffName = | 633 String tearOffName = |
634 needsTearOff ? namer.staticClosureName(element) : null; | 634 needsTearOff ? namer.getStaticClosureName(element) : null; |
635 | 635 |
636 String callName = null; | 636 String callName = null; |
637 if (needsTearOff) { | 637 if (needsTearOff) { |
638 Selector callSelector = | 638 Selector callSelector = |
639 new Selector.fromElement(element).toCallSelector(); | 639 new Selector.fromElement(element).toCallSelector(); |
640 callName = namer.invocationName(callSelector); | 640 callName = namer.invocationName(callSelector); |
641 } | 641 } |
642 | 642 |
643 return new StaticDartMethod(element, | 643 return new StaticDartMethod(element, |
644 name, _registry.registerHolder(holder), code, | 644 name, _registry.registerHolder(holder), code, |
(...skipping 13 matching lines...) Expand all Loading... |
658 _registry.registerConstant(outputUnit, constantValue); | 658 _registry.registerConstant(outputUnit, constantValue); |
659 assert(!_constants.containsKey(constantValue)); | 659 assert(!_constants.containsKey(constantValue)); |
660 String name = namer.constantName(constantValue); | 660 String name = namer.constantName(constantValue); |
661 String constantObject = namer.globalObjectForConstant(constantValue); | 661 String constantObject = namer.globalObjectForConstant(constantValue); |
662 Holder holder = _registry.registerHolder(constantObject); | 662 Holder holder = _registry.registerHolder(constantObject); |
663 Constant constant = new Constant(name, holder, constantValue); | 663 Constant constant = new Constant(name, holder, constantValue); |
664 _constants[constantValue] = constant; | 664 _constants[constantValue] = constant; |
665 } | 665 } |
666 } | 666 } |
667 } | 667 } |
OLD | NEW |