Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: pkg/compiler/lib/src/js_backend/codegen/codegen.dart

Issue 1424923004: Add StaticUse for more precise registration of statically known element use. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 code_generator; 5 library code_generator;
6 6
7 import 'glue.dart'; 7 import 'glue.dart';
8 8
9 import '../../closure.dart' show 9 import '../../closure.dart' show
10 ClosureClassElement; 10 ClosureClassElement;
11 import '../../common.dart'; 11 import '../../common.dart';
12 import '../../common/codegen.dart' show 12 import '../../common/codegen.dart' show
13 CodegenRegistry; 13 CodegenRegistry;
14 import '../../constants/values.dart'; 14 import '../../constants/values.dart';
15 import '../../dart_types.dart'; 15 import '../../dart_types.dart';
16 import '../../elements/elements.dart'; 16 import '../../elements/elements.dart';
17 import '../../io/source_information.dart' show 17 import '../../io/source_information.dart' show
18 SourceInformation; 18 SourceInformation;
19 import '../../js/js.dart' as js; 19 import '../../js/js.dart' as js;
20 import '../../tree_ir/tree_ir_nodes.dart' as tree_ir; 20 import '../../tree_ir/tree_ir_nodes.dart' as tree_ir;
21 import '../../tree_ir/tree_ir_nodes.dart' show 21 import '../../tree_ir/tree_ir_nodes.dart' show
22 BuiltinMethod, 22 BuiltinMethod,
23 BuiltinOperator; 23 BuiltinOperator;
24 import '../../types/types.dart' show 24 import '../../types/types.dart' show
25 TypeMask; 25 TypeMask;
26 import '../../universe/call_structure.dart' show
27 CallStructure;
26 import '../../universe/selector.dart' show 28 import '../../universe/selector.dart' show
27 Selector; 29 Selector;
28 import '../../universe/universe.dart' show 30 import '../../universe/universe.dart' show
29 UniverseSelector; 31 UniverseSelector;
32 import '../../universe/use.dart' show
33 StaticUse;
30 import '../../util/maplet.dart'; 34 import '../../util/maplet.dart';
31 35
32 class CodegenBailout { 36 class CodegenBailout {
33 final tree_ir.Node node; 37 final tree_ir.Node node;
34 final String reason; 38 final String reason;
35 CodegenBailout(this.node, this.reason); 39 CodegenBailout(this.node, this.reason);
36 String get message { 40 String get message {
37 return 'bailout${node != null ? " on $node" : ""}: $reason'; 41 return 'bailout${node != null ? " on $node" : ""}: $reason';
38 } 42 }
39 } 43 }
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 @override 233 @override
230 js.Expression visitConstant(tree_ir.Constant node) { 234 js.Expression visitConstant(tree_ir.Constant node) {
231 return buildConstant( 235 return buildConstant(
232 node.value, 236 node.value,
233 sourceInformation: node.sourceInformation); 237 sourceInformation: node.sourceInformation);
234 } 238 }
235 239
236 js.Expression buildStaticInvoke(Element target, 240 js.Expression buildStaticInvoke(Element target,
237 List<js.Expression> arguments, 241 List<js.Expression> arguments,
238 {SourceInformation sourceInformation}) { 242 {SourceInformation sourceInformation}) {
239 registry.registerStaticInvocation(target.declaration); 243 if (target.isConstructor) {
244 // TODO(johnniwinther): Avoid dependency on [isGenerativeConstructor] by
245 // using backend-specific [StatisUse] classes.
246 registry.registerStaticUse(
247 new StaticUse.constructorInvoke(target.declaration,
248 new CallStructure.unnamed(arguments.length)));
249 } else {
250 registry.registerStaticUse(
251 new StaticUse.staticInvoke(target.declaration,
252 new CallStructure.unnamed(arguments.length)));
253 }
240 js.Expression elementAccess = glue.staticFunctionAccess(target); 254 js.Expression elementAccess = glue.staticFunctionAccess(target);
241 return new js.Call(elementAccess, arguments, 255 return new js.Call(elementAccess, arguments,
242 sourceInformation: sourceInformation); 256 sourceInformation: sourceInformation);
243 } 257 }
244 258
245 @override 259 @override
246 js.Expression visitInvokeConstructor(tree_ir.InvokeConstructor node) { 260 js.Expression visitInvokeConstructor(tree_ir.InvokeConstructor node) {
247 if (node.constant != null) return giveup(node); 261 if (node.constant != null) return giveup(node);
248 262
249 registry.registerInstantiatedType(node.type); 263 registry.registerInstantiation(node.type);
250 FunctionElement target = node.target; 264 FunctionElement target = node.target;
251 List<js.Expression> arguments = visitExpressionList(node.arguments); 265 List<js.Expression> arguments = visitExpressionList(node.arguments);
252 return buildStaticInvoke( 266 return buildStaticInvoke(
253 target, arguments, sourceInformation: node.sourceInformation); 267 target,
268 arguments,
269 sourceInformation: node.sourceInformation);
254 } 270 }
255 271
256 void registerMethodInvoke(tree_ir.InvokeMethod node) { 272 void registerMethodInvoke(tree_ir.InvokeMethod node) {
257 Selector selector = node.selector; 273 Selector selector = node.selector;
258 TypeMask mask = node.mask; 274 TypeMask mask = node.mask;
259 if (selector.isGetter) { 275 if (selector.isGetter) {
260 registry.registerDynamicGetter(new UniverseSelector(selector, mask)); 276 registry.registerDynamicUse(new UniverseSelector(selector, mask));
261 } else if (selector.isSetter) { 277 } else if (selector.isSetter) {
262 registry.registerDynamicSetter(new UniverseSelector(selector, mask)); 278 registry.registerDynamicUse(new UniverseSelector(selector, mask));
263 } else { 279 } else {
264 assert(invariant(CURRENT_ELEMENT_SPANNABLE, 280 assert(invariant(CURRENT_ELEMENT_SPANNABLE,
265 selector.isCall || selector.isOperator || 281 selector.isCall || selector.isOperator ||
266 selector.isIndex || selector.isIndexSet, 282 selector.isIndex || selector.isIndexSet,
267 message: 'unexpected kind ${selector.kind}')); 283 message: 'unexpected kind ${selector.kind}'));
268 // TODO(sigurdm): We should find a better place to register the call. 284 // TODO(sigurdm): We should find a better place to register the call.
269 Selector call = new Selector.callClosureFrom(selector); 285 Selector call = new Selector.callClosureFrom(selector);
270 registry.registerDynamicInvocation(new UniverseSelector(call, null)); 286 registry.registerDynamicUse(new UniverseSelector(call, null));
271 registry.registerDynamicInvocation(new UniverseSelector(selector, mask)); 287 registry.registerDynamicUse(new UniverseSelector(selector, mask));
272 } 288 }
273 } 289 }
274 290
275 @override 291 @override
276 js.Expression visitInvokeMethod(tree_ir.InvokeMethod node) { 292 js.Expression visitInvokeMethod(tree_ir.InvokeMethod node) {
277 registerMethodInvoke(node); 293 registerMethodInvoke(node);
278 return js.propertyCall(visitExpression(node.receiver), 294 return js.propertyCall(visitExpression(node.receiver),
279 glue.invocationName(node.selector), 295 glue.invocationName(node.selector),
280 visitExpressionList(node.arguments)) 296 visitExpressionList(node.arguments))
281 .withSourceInformation(node.sourceInformation); 297 .withSourceInformation(node.sourceInformation);
282 } 298 }
283 299
284 @override 300 @override
285 js.Expression visitInvokeStatic(tree_ir.InvokeStatic node) { 301 js.Expression visitInvokeStatic(tree_ir.InvokeStatic node) {
286 FunctionElement target = node.target; 302 FunctionElement target = node.target;
287 List<js.Expression> arguments = visitExpressionList(node.arguments); 303 List<js.Expression> arguments = visitExpressionList(node.arguments);
288 return buildStaticInvoke(target, arguments, 304 return buildStaticInvoke(target, arguments,
289 sourceInformation: node.sourceInformation); 305 sourceInformation: node.sourceInformation);
290 } 306 }
291 307
292 @override 308 @override
293 js.Expression visitInvokeMethodDirectly(tree_ir.InvokeMethodDirectly node) { 309 js.Expression visitInvokeMethodDirectly(tree_ir.InvokeMethodDirectly node) {
294 registry.registerDirectInvocation(node.target.declaration);
295 if (node.target is ConstructorBodyElement) { 310 if (node.target is ConstructorBodyElement) {
311 registry.registerStaticUse(
312 new StaticUse.constructorBodyInvoke(
313 node.target.declaration,
314 new CallStructure.unnamed(node.arguments.length)));
296 // A constructor body cannot be overriden or intercepted, so we can 315 // A constructor body cannot be overriden or intercepted, so we can
297 // use the short form for this invocation. 316 // use the short form for this invocation.
298 return js.js('#.#(#)', 317 return js.js('#.#(#)',
299 [visitExpression(node.receiver), 318 [visitExpression(node.receiver),
300 glue.instanceMethodName(node.target), 319 glue.instanceMethodName(node.target),
301 visitExpressionList(node.arguments)]) 320 visitExpressionList(node.arguments)])
302 .withSourceInformation(node.sourceInformation); 321 .withSourceInformation(node.sourceInformation);
303 } 322 }
323 registry.registerStaticUse(
324 new StaticUse.superInvoke(
325 node.target.declaration,
326 new CallStructure.unnamed(node.arguments.length)));
304 return js.js('#.#.call(#, #)', 327 return js.js('#.#.call(#, #)',
305 [glue.prototypeAccess(node.target.enclosingClass), 328 [glue.prototypeAccess(node.target.enclosingClass),
306 glue.invocationName(node.selector), 329 glue.invocationName(node.selector),
307 visitExpression(node.receiver), 330 visitExpression(node.receiver),
308 visitExpressionList(node.arguments)]) 331 visitExpressionList(node.arguments)])
309 .withSourceInformation(node.sourceInformation); 332 .withSourceInformation(node.sourceInformation);
310 } 333 }
311 334
312 @override 335 @override
313 js.Expression visitLiteralList(tree_ir.LiteralList node) { 336 js.Expression visitLiteralList(tree_ir.LiteralList node) {
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
671 return new js.ObjectInitializer(const <js.Property>[]); 694 return new js.ObjectInitializer(const <js.Property>[]);
672 } 695 }
673 696
674 @override 697 @override
675 js.Expression visitCreateInstance(tree_ir.CreateInstance node) { 698 js.Expression visitCreateInstance(tree_ir.CreateInstance node) {
676 ClassElement classElement = node.classElement; 699 ClassElement classElement = node.classElement;
677 // TODO(asgerf): To allow inlining of InvokeConstructor, CreateInstance must 700 // TODO(asgerf): To allow inlining of InvokeConstructor, CreateInstance must
678 // carry a DartType so we can register the instantiated type 701 // carry a DartType so we can register the instantiated type
679 // with its type arguments. Otherwise dataflow analysis is 702 // with its type arguments. Otherwise dataflow analysis is
680 // needed to reconstruct the instantiated type. 703 // needed to reconstruct the instantiated type.
681 registry.registerInstantiatedClass(classElement); 704 registry.registerInstantiation(classElement.rawType);
682 if (classElement is ClosureClassElement) { 705 if (classElement is ClosureClassElement) {
683 registry.registerInstantiatedClosure(classElement.methodElement); 706 registry.registerInstantiatedClosure(classElement.methodElement);
684 } 707 }
685 js.Expression instance = new js.New( 708 js.Expression instance = new js.New(
686 glue.constructorAccess(classElement), 709 glue.constructorAccess(classElement),
687 visitExpressionList(node.arguments)) 710 visitExpressionList(node.arguments))
688 .withSourceInformation(node.sourceInformation); 711 .withSourceInformation(node.sourceInformation);
689 712
690 List<tree_ir.Expression> typeInformation = node.typeInformation; 713 List<tree_ir.Expression> typeInformation = node.typeInformation;
691 assert(typeInformation.isEmpty || 714 assert(typeInformation.isEmpty ||
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 registry.registerSpecializedGetInterceptor(node.interceptedClasses); 746 registry.registerSpecializedGetInterceptor(node.interceptedClasses);
724 js.Name helperName = glue.getInterceptorName(node.interceptedClasses); 747 js.Name helperName = glue.getInterceptorName(node.interceptedClasses);
725 js.Expression globalHolder = glue.getInterceptorLibrary(); 748 js.Expression globalHolder = glue.getInterceptorLibrary();
726 return js.js('#.#(#)', 749 return js.js('#.#(#)',
727 [globalHolder, helperName, visitExpression(node.input)]) 750 [globalHolder, helperName, visitExpression(node.input)])
728 .withSourceInformation(node.sourceInformation); 751 .withSourceInformation(node.sourceInformation);
729 } 752 }
730 753
731 @override 754 @override
732 js.Expression visitGetField(tree_ir.GetField node) { 755 js.Expression visitGetField(tree_ir.GetField node) {
733 registry.registerFieldGetter(node.field); 756 registry.registerStaticUse(new StaticUse.fieldGet(node.field));
734 return new js.PropertyAccess( 757 return new js.PropertyAccess(
735 visitExpression(node.object), 758 visitExpression(node.object),
736 glue.instanceFieldPropertyName(node.field)); 759 glue.instanceFieldPropertyName(node.field));
737 } 760 }
738 761
739 @override 762 @override
740 js.Assignment visitSetField(tree_ir.SetField node) { 763 js.Assignment visitSetField(tree_ir.SetField node) {
741 registry.registerFieldSetter(node.field); 764 registry.registerStaticUse(new StaticUse.fieldSet(node.field));
742 js.PropertyAccess field = 765 js.PropertyAccess field =
743 new js.PropertyAccess( 766 new js.PropertyAccess(
744 visitExpression(node.object), 767 visitExpression(node.object),
745 glue.instanceFieldPropertyName(node.field)); 768 glue.instanceFieldPropertyName(node.field));
746 return new js.Assignment(field, visitExpression(node.value)); 769 return new js.Assignment(field, visitExpression(node.value));
747 } 770 }
748 771
749 @override 772 @override
750 js.Expression visitGetStatic(tree_ir.GetStatic node) { 773 js.Expression visitGetStatic(tree_ir.GetStatic node) {
751 assert(node.element is FieldElement || node.element is FunctionElement); 774 assert(node.element is FieldElement || node.element is FunctionElement);
752 if (node.element is FunctionElement) { 775 if (node.element is FunctionElement) {
753 // Tear off a method. 776 // Tear off a method.
754 registry.registerGetOfStaticFunction(node.element.declaration); 777 registry.registerStaticUse(
778 new StaticUse.staticTearOff(node.element.declaration));
755 return glue.isolateStaticClosureAccess(node.element); 779 return glue.isolateStaticClosureAccess(node.element);
756 } 780 }
757 if (glue.isLazilyInitialized(node.element)) { 781 if (glue.isLazilyInitialized(node.element)) {
758 // Read a lazily initialized field. 782 // Read a lazily initialized field.
759 registry.registerStaticUse(node.element.declaration); 783 registry.registerStaticUse(
784 new StaticUse.staticInit(node.element.declaration));
760 js.Expression getter = glue.isolateLazyInitializerAccess(node.element); 785 js.Expression getter = glue.isolateLazyInitializerAccess(node.element);
761 return new js.Call(getter, <js.Expression>[], 786 return new js.Call(getter, <js.Expression>[],
762 sourceInformation: node.sourceInformation); 787 sourceInformation: node.sourceInformation);
763 } 788 }
764 // Read an eagerly initialized field. 789 // Read an eagerly initialized field.
765 registry.registerStaticUse(node.element.declaration); 790 registry.registerStaticUse(
791 new StaticUse.staticGet(node.element.declaration));
766 return glue.staticFieldAccess(node.element); 792 return glue.staticFieldAccess(node.element);
767 } 793 }
768 794
769 @override 795 @override
770 js.Expression visitSetStatic(tree_ir.SetStatic node) { 796 js.Expression visitSetStatic(tree_ir.SetStatic node) {
771 assert(node.element is FieldElement); 797 assert(node.element is FieldElement);
772 registry.registerStaticUse(node.element.declaration); 798 registry.registerStaticUse(
799 new StaticUse.staticSet(node.element.declaration));
773 js.Expression field = glue.staticFieldAccess(node.element); 800 js.Expression field = glue.staticFieldAccess(node.element);
774 js.Expression value = visitExpression(node.value); 801 js.Expression value = visitExpression(node.value);
775 return new js.Assignment(field, value); 802 return new js.Assignment(field, value);
776 } 803 }
777 804
778 @override 805 @override
779 js.Expression visitGetLength(tree_ir.GetLength node) { 806 js.Expression visitGetLength(tree_ir.GetLength node) {
780 return new js.PropertyAccess.field(visitExpression(node.object), 'length'); 807 return new js.PropertyAccess.field(visitExpression(node.object), 'length');
781 } 808 }
782 809
783 @override 810 @override
784 js.Expression visitGetIndex(tree_ir.GetIndex node) { 811 js.Expression visitGetIndex(tree_ir.GetIndex node) {
785 return new js.PropertyAccess( 812 return new js.PropertyAccess(
786 visitExpression(node.object), 813 visitExpression(node.object),
787 visitExpression(node.index)); 814 visitExpression(node.index));
788 } 815 }
789 816
790 @override 817 @override
791 js.Expression visitSetIndex(tree_ir.SetIndex node) { 818 js.Expression visitSetIndex(tree_ir.SetIndex node) {
792 return js.js('#[#] = #', 819 return js.js('#[#] = #',
793 [visitExpression(node.object), 820 [visitExpression(node.object),
794 visitExpression(node.index), 821 visitExpression(node.index),
795 visitExpression(node.value)]); 822 visitExpression(node.value)]);
796 } 823 }
797 824
798 js.Expression buildStaticHelperInvocation( 825 js.Expression buildStaticHelperInvocation(
799 FunctionElement helper, 826 FunctionElement helper,
800 List<js.Expression> arguments, 827 List<js.Expression> arguments,
801 {SourceInformation sourceInformation}) { 828 {SourceInformation sourceInformation}) {
802 registry.registerStaticUse(helper); 829 registry.registerStaticUse(new StaticUse.staticInvoke(
830 helper, new CallStructure.unnamed(arguments.length)));
803 return buildStaticInvoke( 831 return buildStaticInvoke(
804 helper, arguments, sourceInformation: sourceInformation); 832 helper, arguments, sourceInformation: sourceInformation);
805 } 833 }
806 834
807 @override 835 @override
808 js.Expression visitReifyRuntimeType(tree_ir.ReifyRuntimeType node) { 836 js.Expression visitReifyRuntimeType(tree_ir.ReifyRuntimeType node) {
809 js.Expression typeToString = buildStaticHelperInvocation( 837 js.Expression typeToString = buildStaticHelperInvocation(
810 glue.getRuntimeTypeToString(), 838 glue.getRuntimeTypeToString(),
811 [visitExpression(node.value)], 839 [visitExpression(node.value)],
812 sourceInformation: node.sourceInformation); 840 sourceInformation: node.sourceInformation);
(...skipping 24 matching lines...) Expand all
837 @override 865 @override
838 js.Expression visitTypeExpression(tree_ir.TypeExpression node) { 866 js.Expression visitTypeExpression(tree_ir.TypeExpression node) {
839 List<js.Expression> arguments = visitExpressionList(node.arguments); 867 List<js.Expression> arguments = visitExpressionList(node.arguments);
840 return glue.generateTypeRepresentation(node.dartType, arguments, registry); 868 return glue.generateTypeRepresentation(node.dartType, arguments, registry);
841 } 869 }
842 870
843 js.Node handleForeignCode(tree_ir.ForeignCode node) { 871 js.Node handleForeignCode(tree_ir.ForeignCode node) {
844 if (node.dependency != null) { 872 if (node.dependency != null) {
845 // Dependency is only used if [node] calls a Dart function. Currently only 873 // Dependency is only used if [node] calls a Dart function. Currently only
846 // through foreign function `RAW_DART_FUNCTION_REF`. 874 // through foreign function `RAW_DART_FUNCTION_REF`.
847 registry.registerStaticUse(node.dependency); 875 registry.registerStaticUse(
876 new StaticUse.staticInvoke(
877 node.dependency,
878 new CallStructure.unnamed(node.arguments.length)));
848 } 879 }
849 // TODO(sra): Should this be in CodegenRegistry? 880 // TODO(sra,johnniwinther): Should this be in CodegenRegistry?
850 glue.registerNativeBehavior(node.nativeBehavior, node); 881 glue.registerNativeBehavior(node.nativeBehavior, node);
851 return node.codeTemplate.instantiate(visitExpressionList(node.arguments)); 882 return node.codeTemplate.instantiate(visitExpressionList(node.arguments));
852 } 883 }
853 884
854 @override 885 @override
855 js.Expression visitForeignExpression(tree_ir.ForeignExpression node) { 886 js.Expression visitForeignExpression(tree_ir.ForeignExpression node) {
856 return handleForeignCode(node); 887 return handleForeignCode(node);
857 } 888 }
858 889
859 @override 890 @override
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 // No normalization required since output is always uint32. 934 // No normalization required since output is always uint32.
904 return js.js('# >>> #', args); 935 return js.js('# >>> #', args);
905 case BuiltinOperator.NumBitNot: 936 case BuiltinOperator.NumBitNot:
906 return js.js('(~#) >>> 0', args); 937 return js.js('(~#) >>> 0', args);
907 case BuiltinOperator.NumNegate: 938 case BuiltinOperator.NumNegate:
908 return js.js('-#', args); 939 return js.js('-#', args);
909 case BuiltinOperator.StringConcatenate: 940 case BuiltinOperator.StringConcatenate:
910 if (args.isEmpty) return js.string(''); 941 if (args.isEmpty) return js.string('');
911 return args.reduce((e1,e2) => new js.Binary('+', e1, e2)); 942 return args.reduce((e1,e2) => new js.Binary('+', e1, e2));
912 case BuiltinOperator.Identical: 943 case BuiltinOperator.Identical:
913 registry.registerStaticInvocation(glue.identicalFunction); 944 registry.registerStaticUse(new StaticUse.staticInvoke(
945 glue.identicalFunction, new CallStructure.unnamed(args.length)));
914 return buildStaticHelperInvocation(glue.identicalFunction, args); 946 return buildStaticHelperInvocation(glue.identicalFunction, args);
915 case BuiltinOperator.StrictEq: 947 case BuiltinOperator.StrictEq:
916 return new js.Binary('===', args[0], args[1]); 948 return new js.Binary('===', args[0], args[1]);
917 case BuiltinOperator.StrictNeq: 949 case BuiltinOperator.StrictNeq:
918 return new js.Binary('!==', args[0], args[1]); 950 return new js.Binary('!==', args[0], args[1]);
919 case BuiltinOperator.LooseEq: 951 case BuiltinOperator.LooseEq:
920 return new js.Binary('==', args[0], args[1]); 952 return new js.Binary('==', args[0], args[1]);
921 case BuiltinOperator.LooseNeq: 953 case BuiltinOperator.LooseNeq:
922 return new js.Binary('!=', args[0], args[1]); 954 return new js.Binary('!=', args[0], args[1]);
923 case BuiltinOperator.IsFalsy: 955 case BuiltinOperator.IsFalsy:
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1048 void registerDefaultParameterValues(ExecutableElement element) { 1080 void registerDefaultParameterValues(ExecutableElement element) {
1049 if (element is! FunctionElement) return; 1081 if (element is! FunctionElement) return;
1050 FunctionElement function = element; 1082 FunctionElement function = element;
1051 if (function.isStatic) return; // Defaults are inlined at call sites. 1083 if (function.isStatic) return; // Defaults are inlined at call sites.
1052 function.functionSignature.forEachOptionalParameter((param) { 1084 function.functionSignature.forEachOptionalParameter((param) {
1053 ConstantValue constant = glue.getDefaultParameterValue(param); 1085 ConstantValue constant = glue.getDefaultParameterValue(param);
1054 registry.registerCompileTimeConstant(constant); 1086 registry.registerCompileTimeConstant(constant);
1055 }); 1087 });
1056 } 1088 }
1057 } 1089 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart ('k') | pkg/compiler/lib/src/js_backend/codegen/glue.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698