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

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

Issue 2711783006: Remove HRuntimeType scheme for function types. (Closed)
Patch Set: fix mock library Created 3 years, 10 months 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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 import '../common.dart'; 5 import '../common.dart';
6 import '../core_types.dart'; 6 import '../core_types.dart';
7 import '../elements/elements.dart' show ErroneousElement; 7 import '../elements/elements.dart' show ErroneousElement;
8 import '../elements/entities.dart'; 8 import '../elements/entities.dart';
9 import '../elements/resolution_types.dart' show MalformedType; 9 import '../elements/resolution_types.dart' show MalformedType;
10 import '../elements/types.dart'; 10 import '../elements/types.dart';
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 CallStructure get callStructure => CallStructure.TWO_ARGS; 82 CallStructure get callStructure => CallStructure.TWO_ARGS;
83 83
84 void generateAdditionalArguments(SsaCodeGenerator codegen, 84 void generateAdditionalArguments(SsaCodeGenerator codegen,
85 HTypeConversion node, List<jsAst.Expression> arguments) { 85 HTypeConversion node, List<jsAst.Expression> arguments) {
86 assert(node.typeExpression.isTypeVariable); 86 assert(node.typeExpression.isTypeVariable);
87 codegen.use(node.typeRepresentation); 87 codegen.use(node.typeRepresentation);
88 arguments.add(codegen.pop()); 88 arguments.add(codegen.pop());
89 } 89 }
90 } 90 }
91 91
92 class FunctionTypeRepresentationCheckedModeHelper extends CheckedModeHelper {
93 const FunctionTypeRepresentationCheckedModeHelper(String name) : super(name);
94
95 CallStructure get callStructure => CallStructure.TWO_ARGS;
96
97 void generateAdditionalArguments(SsaCodeGenerator codegen,
98 HTypeConversion node, List<jsAst.Expression> arguments) {
99 codegen.use(node.typeRepresentation);
100 arguments.add(codegen.pop());
101 }
102 }
103
92 class SubtypeCheckedModeHelper extends CheckedModeHelper { 104 class SubtypeCheckedModeHelper extends CheckedModeHelper {
93 const SubtypeCheckedModeHelper(String name) : super(name); 105 const SubtypeCheckedModeHelper(String name) : super(name);
94 106
95 CallStructure get callStructure => const CallStructure.unnamed(4); 107 CallStructure get callStructure => const CallStructure.unnamed(4);
96 108
97 void generateAdditionalArguments(SsaCodeGenerator codegen, 109 void generateAdditionalArguments(SsaCodeGenerator codegen,
98 HTypeConversion node, List<jsAst.Expression> arguments) { 110 HTypeConversion node, List<jsAst.Expression> arguments) {
111 // TODO(sra): Move these calls into the SSA graph so that the arguments can
112 // be optimized, e,g, GVNed.
99 InterfaceType type = node.typeExpression; 113 InterfaceType type = node.typeExpression;
100 ClassEntity element = type.element; 114 ClassEntity element = type.element;
101 jsAst.Name isField = codegen.backend.namer.operatorIs(element); 115 jsAst.Name isField = codegen.backend.namer.operatorIs(element);
102 arguments.add(js.quoteName(isField)); 116 arguments.add(js.quoteName(isField));
103 codegen.use(node.typeRepresentation); 117 codegen.use(node.typeRepresentation);
104 arguments.add(codegen.pop()); 118 arguments.add(codegen.pop());
105 jsAst.Name asField = codegen.backend.namer.substitutionName(element); 119 jsAst.Name asField = codegen.backend.namer.substitutionName(element);
106 arguments.add(js.quoteName(asField)); 120 arguments.add(js.quoteName(asField));
107 } 121 }
108 } 122 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 const PropertyCheckedModeHelper('listSuperTypeCast'), 156 const PropertyCheckedModeHelper('listSuperTypeCast'),
143 const PropertyCheckedModeHelper('listSuperTypeCheck'), 157 const PropertyCheckedModeHelper('listSuperTypeCheck'),
144 const PropertyCheckedModeHelper('interceptedTypeCast'), 158 const PropertyCheckedModeHelper('interceptedTypeCast'),
145 const PropertyCheckedModeHelper('interceptedTypeCheck'), 159 const PropertyCheckedModeHelper('interceptedTypeCheck'),
146 const SubtypeCheckedModeHelper('subtypeCast'), 160 const SubtypeCheckedModeHelper('subtypeCast'),
147 const SubtypeCheckedModeHelper('assertSubtype'), 161 const SubtypeCheckedModeHelper('assertSubtype'),
148 const TypeVariableCheckedModeHelper('subtypeOfRuntimeTypeCast'), 162 const TypeVariableCheckedModeHelper('subtypeOfRuntimeTypeCast'),
149 const TypeVariableCheckedModeHelper('assertSubtypeOfRuntimeType'), 163 const TypeVariableCheckedModeHelper('assertSubtypeOfRuntimeType'),
150 const PropertyCheckedModeHelper('propertyTypeCast'), 164 const PropertyCheckedModeHelper('propertyTypeCast'),
151 const PropertyCheckedModeHelper('propertyTypeCheck'), 165 const PropertyCheckedModeHelper('propertyTypeCheck'),
166 const FunctionTypeRepresentationCheckedModeHelper('functionTypeCast'),
167 const FunctionTypeRepresentationCheckedModeHelper('functionTypeCheck'),
152 ]; 168 ];
153 169
154 // Checked mode helpers indexed by name. 170 // Checked mode helpers indexed by name.
155 static final Map<String, CheckedModeHelper> checkedModeHelperByName = 171 static final Map<String, CheckedModeHelper> checkedModeHelperByName =
156 new Map<String, CheckedModeHelper>.fromIterable(helpers, 172 new Map<String, CheckedModeHelper>.fromIterable(helpers,
157 key: (helper) => helper.name); 173 key: (helper) => helper.name);
158 174
159 /** 175 /**
160 * Returns the checked mode helper that will be needed to do a type check/type 176 * Returns the checked mode helper that will be needed to do a type check/type
161 * cast on [type] at runtime. Note that this method is being called both by 177 * cast on [type] at runtime. Note that this method is being called both by
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 if (nativeCheckOnly) return null; 221 if (nativeCheckOnly) return null;
206 return 'voidTypeCheck'; 222 return 'voidTypeCheck';
207 } 223 }
208 224
209 if (type.isTypeVariable) { 225 if (type.isTypeVariable) {
210 return typeCast 226 return typeCast
211 ? 'subtypeOfRuntimeTypeCast' 227 ? 'subtypeOfRuntimeTypeCast'
212 : 'assertSubtypeOfRuntimeType'; 228 : 'assertSubtypeOfRuntimeType';
213 } 229 }
214 230
215 if (type.isFunctionType) return null; 231 if (type.isFunctionType) {
232 return typeCast ? 'functionTypeCast' : 'functionTypeCheck';
233 }
216 234
217 assert(invariant(NO_LOCATION_SPANNABLE, type.isInterfaceType, 235 assert(invariant(NO_LOCATION_SPANNABLE, type.isInterfaceType,
218 message: "Unexpected type: $type")); 236 message: "Unexpected type: $type"));
219 InterfaceType interfaceType = type; 237 InterfaceType interfaceType = type;
220 ClassEntity element = interfaceType.element; 238 ClassEntity element = interfaceType.element;
221 bool nativeCheck = true; 239 bool nativeCheck = true;
222 // TODO(13955), TODO(9731). The test for non-primitive types should use an 240 // TODO(13955), TODO(9731). The test for non-primitive types should use an
223 // interceptor. The interceptor should be an argument to HTypeConversion so 241 // interceptor. The interceptor should be an argument to HTypeConversion so
224 // that it can be optimized by standard interceptor optimizations. 242 // that it can be optimized by standard interceptor optimizations.
225 // nativeCheckOnly || emitter.nativeEmitter.requiresNativeIsCheck(element); 243 // nativeCheckOnly || emitter.nativeEmitter.requiresNativeIsCheck(element);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 303
286 if (nativeCheck) { 304 if (nativeCheck) {
287 // TODO(karlklose): can we get rid of this branch when we use 305 // TODO(karlklose): can we get rid of this branch when we use
288 // interceptors? 306 // interceptors?
289 return 'intercepted$suffix'; 307 return 'intercepted$suffix';
290 } else { 308 } else {
291 return 'property$suffix'; 309 return 'property$suffix';
292 } 310 }
293 } 311 }
294 } 312 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698