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 '../../closure.dart' show ClosureFieldElement; | 7 import '../../closure.dart' show ClosureFieldElement; |
8 import '../../common.dart'; | 8 import '../../common.dart'; |
9 import '../../common/names.dart' show Names, Selectors; | 9 import '../../common/names.dart' show Names, Selectors; |
10 import '../../compiler.dart' show Compiler; | 10 import '../../compiler.dart' show Compiler; |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 // Interceptor class with implementations that directly call the | 344 // Interceptor class with implementations that directly call the |
345 // corresponding JavaScript member. We do not attempt to bind this when | 345 // corresponding JavaScript member. We do not attempt to bind this when |
346 // tearing off JavaScript methods as we cannot distinguish between calling | 346 // tearing off JavaScript methods as we cannot distinguish between calling |
347 // a regular getter that returns a JavaScript function and tearing off | 347 // a regular getter that returns a JavaScript function and tearing off |
348 // a method in the case where there exist multiple JavaScript classes | 348 // a method in the case where there exist multiple JavaScript classes |
349 // that conflict on whether the member is a getter or a method. | 349 // that conflict on whether the member is a getter or a method. |
350 var interceptorClass = _classes[helpers.jsJavaScriptObjectClass]; | 350 var interceptorClass = _classes[helpers.jsJavaScriptObjectClass]; |
351 var stubNames = new Set<String>(); | 351 var stubNames = new Set<String>(); |
352 librariesMap.forEach((LibraryElement library, List<Element> elements) { | 352 librariesMap.forEach((LibraryElement library, List<Element> elements) { |
353 for (Element e in elements) { | 353 for (Element e in elements) { |
354 if (e is ClassElement && backend.nativeData.isJsInterop(e)) { | 354 if (e is ClassElement && backend.nativeData.isJsInteropClass(e)) { |
355 e.declaration.forEachMember((_, Element member) { | 355 e.declaration.forEachMember((_, Element member) { |
356 var jsName = | 356 var jsName = |
357 backend.nativeData.getUnescapedJSInteropName(member.name); | 357 backend.nativeData.getUnescapedJSInteropName(member.name); |
358 if (!member.isInstanceMember) return; | 358 if (!member.isInstanceMember) return; |
359 if (member.isGetter || member.isField || member.isFunction) { | 359 if (member.isGetter || member.isField || member.isFunction) { |
360 var selectors = worldBuilder.getterInvocationsByName(member.name); | 360 var selectors = worldBuilder.getterInvocationsByName(member.name); |
361 if (selectors != null && !selectors.isEmpty) { | 361 if (selectors != null && !selectors.isEmpty) { |
362 for (var selector in selectors.keys) { | 362 for (var selector in selectors.keys) { |
363 var stubName = namer.invocationName(selector); | 363 var stubName = namer.invocationName(selector); |
364 if (stubNames.add(stubName.key)) { | 364 if (stubNames.add(stubName.key)) { |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 List<Field> staticFieldsForReflection = | 489 List<Field> staticFieldsForReflection = |
490 _buildFields(library, visitStatics: visitStatics); | 490 _buildFields(library, visitStatics: visitStatics); |
491 | 491 |
492 return new Library( | 492 return new Library( |
493 library, uri, statics, classes, staticFieldsForReflection); | 493 library, uri, statics, classes, staticFieldsForReflection); |
494 } | 494 } |
495 | 495 |
496 Class _buildClass(ClassElement element) { | 496 Class _buildClass(ClassElement element) { |
497 bool onlyForRti = collector.classesOnlyNeededForRti.contains(element); | 497 bool onlyForRti = collector.classesOnlyNeededForRti.contains(element); |
498 bool hasRtiField = backend.rtiNeed.classNeedsRtiField(element); | 498 bool hasRtiField = backend.rtiNeed.classNeedsRtiField(element); |
499 if (backend.nativeData.isJsInterop(element)) { | 499 if (backend.nativeData.isJsInteropClass(element)) { |
500 // TODO(jacobr): check whether the class has any active static fields | 500 // TODO(jacobr): check whether the class has any active static fields |
501 // if it does not we can suppress it completely. | 501 // if it does not we can suppress it completely. |
502 onlyForRti = true; | 502 onlyForRti = true; |
503 } | 503 } |
504 | 504 |
505 List<Method> methods = []; | 505 List<Method> methods = []; |
506 List<StubMethod> callStubs = <StubMethod>[]; | 506 List<StubMethod> callStubs = <StubMethod>[]; |
507 | 507 |
508 ClassStubGenerator classStubGenerator = new ClassStubGenerator( | 508 ClassStubGenerator classStubGenerator = new ClassStubGenerator( |
509 namer, backend, worldBuilder, closedWorld, | 509 namer, backend, worldBuilder, closedWorld, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
577 List<Field> staticFieldsForReflection = onlyForRti | 577 List<Field> staticFieldsForReflection = onlyForRti |
578 ? const <Field>[] | 578 ? const <Field>[] |
579 : _buildFields(element, | 579 : _buildFields(element, |
580 visitStatics: true, isHolderInterceptedClass: isInterceptedClass); | 580 visitStatics: true, isHolderInterceptedClass: isInterceptedClass); |
581 | 581 |
582 TypeTestProperties typeTests = runtimeTypeGenerator.generateIsTests(element, | 582 TypeTestProperties typeTests = runtimeTypeGenerator.generateIsTests(element, |
583 storeFunctionTypeInMetadata: _storeFunctionTypesInMetadata); | 583 storeFunctionTypeInMetadata: _storeFunctionTypesInMetadata); |
584 | 584 |
585 List<StubMethod> checkedSetters = <StubMethod>[]; | 585 List<StubMethod> checkedSetters = <StubMethod>[]; |
586 List<StubMethod> isChecks = <StubMethod>[]; | 586 List<StubMethod> isChecks = <StubMethod>[]; |
587 if (backend.nativeData.isJsInterop(element)) { | 587 if (backend.nativeData.isJsInteropClass(element)) { |
588 typeTests.properties.forEach((js.Name name, js.Node code) { | 588 typeTests.properties.forEach((js.Name name, js.Node code) { |
589 _classes[helpers.jsInterceptorClass] | 589 _classes[helpers.jsInterceptorClass] |
590 .isChecks | 590 .isChecks |
591 .add(_buildStubMethod(name, code)); | 591 .add(_buildStubMethod(name, code)); |
592 }); | 592 }); |
593 } else { | 593 } else { |
594 for (Field field in instanceFields) { | 594 for (Field field in instanceFields) { |
595 if (field.needsCheckedSetter) { | 595 if (field.needsCheckedSetter) { |
596 assert(!field.needsUncheckedSetter); | 596 assert(!field.needsUncheckedSetter); |
597 FieldElement element = field.element; | 597 FieldElement element = field.element; |
598 js.Expression code = backend.generatedCode[element]; | 598 js.Expression code = backend.generatedCode[element]; |
599 assert(code != null); | 599 assert(code != null); |
600 js.Name name = namer.deriveSetterName(field.accessorName); | 600 js.Name name = namer.deriveSetterName(field.accessorName); |
601 checkedSetters.add(_buildStubMethod(name, code, element: element)); | 601 checkedSetters.add(_buildStubMethod(name, code, element: element)); |
602 } | 602 } |
603 } | 603 } |
604 | 604 |
605 typeTests.properties.forEach((js.Name name, js.Node code) { | 605 typeTests.properties.forEach((js.Name name, js.Node code) { |
606 isChecks.add(_buildStubMethod(name, code)); | 606 isChecks.add(_buildStubMethod(name, code)); |
607 }); | 607 }); |
608 } | 608 } |
609 | 609 |
610 js.Name name = namer.className(element); | 610 js.Name name = namer.className(element); |
611 String holderName = namer.globalObjectFor(element); | 611 String holderName = namer.globalObjectFor(element); |
612 // TODO(floitsch): we shouldn't update the registry in the middle of | 612 // TODO(floitsch): we shouldn't update the registry in the middle of |
613 // building a class. | 613 // building a class. |
614 Holder holder = _registry.registerHolder(holderName); | 614 Holder holder = _registry.registerHolder(holderName); |
615 bool isInstantiated = !backend.nativeData.isJsInterop(element) && | 615 bool isInstantiated = !backend.nativeData.isJsInteropClass(element) && |
616 worldBuilder.directlyInstantiatedClasses.contains(element); | 616 worldBuilder.directlyInstantiatedClasses.contains(element); |
617 | 617 |
618 Class result; | 618 Class result; |
619 if (element.isMixinApplication && !onlyForRti) { | 619 if (element.isMixinApplication && !onlyForRti) { |
620 assert(!backend.nativeData.isNativeClass(element)); | 620 assert(!backend.nativeData.isNativeClass(element)); |
621 assert(methods.isEmpty); | 621 assert(methods.isEmpty); |
622 | 622 |
623 result = new MixinApplication( | 623 result = new MixinApplication( |
624 element, | 624 element, |
625 name, | 625 name, |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
975 Constant constant = new Constant(name, holder, constantValue); | 975 Constant constant = new Constant(name, holder, constantValue); |
976 _constants[constantValue] = constant; | 976 _constants[constantValue] = constant; |
977 } | 977 } |
978 } | 978 } |
979 | 979 |
980 Holder _registerStaticStateHolder() { | 980 Holder _registerStaticStateHolder() { |
981 return _registry.registerHolder(namer.staticStateHolder, | 981 return _registry.registerHolder(namer.staticStateHolder, |
982 isStaticStateHolder: true); | 982 isStaticStateHolder: true); |
983 } | 983 } |
984 } | 984 } |
OLD | NEW |