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

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: format 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 FunctionWithRepresentationCheckedModeHelper extends CheckedModeHelper {
Emily Fortuna 2017/02/25 00:26:02 Can you add a comment here to explain what you mea
sra1 2017/02/28 05:16:03 Done.
93 const FunctionWithRepresentationCheckedModeHelper(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) {
99 InterfaceType type = node.typeExpression; 111 InterfaceType type = node.typeExpression;
100 ClassEntity element = type.element; 112 ClassEntity element = type.element;
101 jsAst.Name isField = codegen.backend.namer.operatorIs(element); 113 jsAst.Name isField = codegen.backend.namer.operatorIs(element);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 const PropertyCheckedModeHelper('listSuperTypeCast'), 154 const PropertyCheckedModeHelper('listSuperTypeCast'),
143 const PropertyCheckedModeHelper('listSuperTypeCheck'), 155 const PropertyCheckedModeHelper('listSuperTypeCheck'),
144 const PropertyCheckedModeHelper('interceptedTypeCast'), 156 const PropertyCheckedModeHelper('interceptedTypeCast'),
145 const PropertyCheckedModeHelper('interceptedTypeCheck'), 157 const PropertyCheckedModeHelper('interceptedTypeCheck'),
146 const SubtypeCheckedModeHelper('subtypeCast'), 158 const SubtypeCheckedModeHelper('subtypeCast'),
147 const SubtypeCheckedModeHelper('assertSubtype'), 159 const SubtypeCheckedModeHelper('assertSubtype'),
148 const TypeVariableCheckedModeHelper('subtypeOfRuntimeTypeCast'), 160 const TypeVariableCheckedModeHelper('subtypeOfRuntimeTypeCast'),
149 const TypeVariableCheckedModeHelper('assertSubtypeOfRuntimeType'), 161 const TypeVariableCheckedModeHelper('assertSubtypeOfRuntimeType'),
150 const PropertyCheckedModeHelper('propertyTypeCast'), 162 const PropertyCheckedModeHelper('propertyTypeCast'),
151 const PropertyCheckedModeHelper('propertyTypeCheck'), 163 const PropertyCheckedModeHelper('propertyTypeCheck'),
164 const FunctionWithRepresentationCheckedModeHelper('functionTypeCast'),
165 const FunctionWithRepresentationCheckedModeHelper('functionTypeCheck'),
152 ]; 166 ];
153 167
154 // Checked mode helpers indexed by name. 168 // Checked mode helpers indexed by name.
155 static final Map<String, CheckedModeHelper> checkedModeHelperByName = 169 static final Map<String, CheckedModeHelper> checkedModeHelperByName =
156 new Map<String, CheckedModeHelper>.fromIterable(helpers, 170 new Map<String, CheckedModeHelper>.fromIterable(helpers,
157 key: (helper) => helper.name); 171 key: (helper) => helper.name);
158 172
159 /** 173 /**
160 * Returns the checked mode helper that will be needed to do a type check/type 174 * 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 175 * 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; 219 if (nativeCheckOnly) return null;
206 return 'voidTypeCheck'; 220 return 'voidTypeCheck';
207 } 221 }
208 222
209 if (type.isTypeVariable) { 223 if (type.isTypeVariable) {
210 return typeCast 224 return typeCast
211 ? 'subtypeOfRuntimeTypeCast' 225 ? 'subtypeOfRuntimeTypeCast'
212 : 'assertSubtypeOfRuntimeType'; 226 : 'assertSubtypeOfRuntimeType';
213 } 227 }
214 228
215 if (type.isFunctionType) return null; 229 if (type.isFunctionType) {
230 return typeCast ? 'functionTypeCast' : 'functionTypeCheck';
231 }
216 232
217 assert(invariant(NO_LOCATION_SPANNABLE, type.isInterfaceType, 233 assert(invariant(NO_LOCATION_SPANNABLE, type.isInterfaceType,
218 message: "Unexpected type: $type")); 234 message: "Unexpected type: $type"));
219 InterfaceType interfaceType = type; 235 InterfaceType interfaceType = type;
220 ClassEntity element = interfaceType.element; 236 ClassEntity element = interfaceType.element;
221 bool nativeCheck = true; 237 bool nativeCheck = true;
222 // TODO(13955), TODO(9731). The test for non-primitive types should use an 238 // TODO(13955), TODO(9731). The test for non-primitive types should use an
223 // interceptor. The interceptor should be an argument to HTypeConversion so 239 // interceptor. The interceptor should be an argument to HTypeConversion so
224 // that it can be optimized by standard interceptor optimizations. 240 // that it can be optimized by standard interceptor optimizations.
225 // nativeCheckOnly || emitter.nativeEmitter.requiresNativeIsCheck(element); 241 // nativeCheckOnly || emitter.nativeEmitter.requiresNativeIsCheck(element);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 301
286 if (nativeCheck) { 302 if (nativeCheck) {
287 // TODO(karlklose): can we get rid of this branch when we use 303 // TODO(karlklose): can we get rid of this branch when we use
288 // interceptors? 304 // interceptors?
289 return 'intercepted$suffix'; 305 return 'intercepted$suffix';
290 } else { 306 } else {
291 return 'property$suffix'; 307 return 'property$suffix';
292 } 308 }
293 } 309 }
294 } 310 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698