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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/ssa/codegen.dart

Issue 12334070: Support runtime check of function types. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Handle function types in checked mode. Created 7 years, 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 part of ssa; 5 part of ssa;
6 6
7 class SsaCodeGeneratorTask extends CompilerTask { 7 class SsaCodeGeneratorTask extends CompilerTask {
8 8
9 final JavaScriptBackend backend; 9 final JavaScriptBackend backend;
10 10
(...skipping 2228 matching lines...) Expand 10 before | Expand all | Expand 10 after
2239 world.registerStaticUse(helper); 2239 world.registerStaticUse(helper);
2240 String helperName = backend.namer.isolateAccess(helper); 2240 String helperName = backend.namer.isolateAccess(helper);
2241 push(new js.Call(new js.VariableUse(helperName), arguments)); 2241 push(new js.Call(new js.VariableUse(helperName), arguments));
2242 if (negative) push(new js.Prefix('!', pop())); 2242 if (negative) push(new js.Prefix('!', pop()));
2243 } 2243 }
2244 2244
2245 void checkType(HInstruction input, DartType type, {bool negative: false}) { 2245 void checkType(HInstruction input, DartType type, {bool negative: false}) {
2246 assert(invariant(input, !type.isMalformed, 2246 assert(invariant(input, !type.isMalformed,
2247 message: 'Attempt to check malformed type $type')); 2247 message: 'Attempt to check malformed type $type'));
2248 Element element = type.element; 2248 Element element = type.element;
2249
2250 if (element == backend.jsArrayClass) { 2249 if (element == backend.jsArrayClass) {
2251 checkArray(input, negative ? '!==': '==='); 2250 checkArray(input, negative ? '!==': '===');
2252 return; 2251 return;
2253 } else if (element == backend.jsMutableArrayClass) { 2252 } else if (element == backend.jsMutableArrayClass) {
2254 if (negative) { 2253 if (negative) {
2255 checkImmutableArray(input); 2254 checkImmutableArray(input);
2256 } else { 2255 } else {
2257 checkMutableArray(input); 2256 checkMutableArray(input);
2258 } 2257 }
2259 return; 2258 return;
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
2542 assert(node.isCheckedModeCheck || node.isCastTypeCheck); 2541 assert(node.isCheckedModeCheck || node.isCastTypeCheck);
2543 DartType type = node.typeExpression; 2542 DartType type = node.typeExpression;
2544 if (type.kind == TypeKind.FUNCTION) { 2543 if (type.kind == TypeKind.FUNCTION) {
2545 // TODO(5022): We currently generate $isFunction checks for 2544 // TODO(5022): We currently generate $isFunction checks for
2546 // function types. 2545 // function types.
2547 world.registerIsCheck( 2546 world.registerIsCheck(
2548 compiler.functionClass.computeType(compiler), work.resolutionTree); 2547 compiler.functionClass.computeType(compiler), work.resolutionTree);
2549 } 2548 }
2550 world.registerIsCheck(type, work.resolutionTree); 2549 world.registerIsCheck(type, work.resolutionTree);
2551 2550
2551 CheckedModeHelper helper;
2552 FunctionElement helperElement; 2552 FunctionElement helperElement;
2553 if (node.isBooleanConversionCheck) { 2553 if (node.isBooleanConversionCheck) {
2554 helperElement = 2554 helper =
2555 compiler.findHelper(const SourceString('boolConversionCheck')); 2555 const CheckedModeHelper(const SourceString('boolConversionCheck'));
2556 } else { 2556 } else {
2557 helperElement = backend.getCheckedModeHelper(type, 2557 helper =
2558 typeCast: node.isCastTypeCheck); 2558 backend.getCheckedModeHelper(type, typeCast: node.isCastTypeCheck);
2559 } 2559 }
2560 world.registerStaticUse(helperElement); 2560
2561 push(helper.generateCall(this, node));
2562 /*world.registerStaticUse(helper.getElement(compiler));
2561 List<js.Expression> arguments = <js.Expression>[]; 2563 List<js.Expression> arguments = <js.Expression>[];
2562 use(node.checkedInput); 2564 use(node.checkedInput);
2563 arguments.add(pop()); 2565 arguments.add(pop());
2564 int parameterCount = 2566 int parameterCount =
2565 helperElement.computeSignature(compiler).parameterCount; 2567 helperElement.computeSignature(compiler).parameterCount;
2566 // TODO(johnniwinther): Refactor this to avoid using the parameter count 2568 // TODO(johnniwinther): Refactor this to avoid using the parameter count
2567 // to determine how the helper should be called. 2569 // to determine how the helper should be called.
2568 if (node.typeExpression.kind == TypeKind.TYPE_VARIABLE) { 2570 if (node.typeExpression.kind == TypeKind.TYPE_VARIABLE) {
2569 assert(parameterCount == 2); 2571 assert(parameterCount == 2);
2570 use(node.typeRepresentation); 2572 use(node.typeRepresentation);
2571 arguments.add(pop()); 2573 arguments.add(pop());
2572 } else if (parameterCount == 2) { 2574 } else if (parameterCount == 2) {
2573 // 2 arguments implies that the method is either [propertyTypeCheck], 2575 // 2 arguments implies that the method is either [propertyTypeCheck],
2574 // [propertyTypeCast] or [assertObjectIsSubtype]. 2576 // [propertyTypeCast] or [assertObjectIsSubtype].
2575 assert(!type.isMalformed); 2577 assert(!type.isMalformed);
2576 String additionalArgument = backend.namer.operatorIs(type.element); 2578 String additionalArgument = backend.namer.operatorIsType(type);
2577 arguments.add(js.string(additionalArgument)); 2579 arguments.add(js.string(additionalArgument));
2578 } else if (parameterCount == 3) { 2580 } else if (parameterCount == 3) {
2579 // 3 arguments implies that the method is [malformedTypeCheck]. 2581 // 3 arguments implies that the method is [malformedTypeCheck].
2580 assert(type.isMalformed); 2582 assert(type.isMalformed);
2581 String reasons = Types.fetchReasonsFromMalformedType(type); 2583 String reasons = Types.fetchReasonsFromMalformedType(type);
2582 arguments.add(js.string('$type')); 2584 arguments.add(js.string('$type'));
2583 // TODO(johnniwinther): Handle escaping correctly. 2585 // TODO(johnniwinther): Handle escaping correctly.
2584 arguments.add(js.string(reasons)); 2586 arguments.add(js.string(reasons));
2585 } else if (parameterCount == 4) { 2587 } else if (parameterCount == 4) {
2586 Element element = type.element; 2588 Element element = type.element;
2587 String isField = backend.namer.operatorIs(element); 2589 String isField = backend.namer.operatorIs(element);
2588 arguments.add(js.string(isField)); 2590 arguments.add(js.string(isField));
2589 use(node.typeRepresentation); 2591 use(node.typeRepresentation);
2590 arguments.add(pop()); 2592 arguments.add(pop());
2591 String asField = backend.namer.substitutionName(element); 2593 String asField = backend.namer.substitutionName(element);
2592 arguments.add(js.string(asField)); 2594 arguments.add(js.string(asField));
2593 } else { 2595 } else {
2594 assert(!type.isMalformed); 2596 assert(!type.isMalformed);
2595 // No additional arguments needed. 2597 // No additional arguments needed.
2596 } 2598 }
2597 String helperName = backend.namer.isolateAccess(helperElement); 2599 String helperName = backend.namer.isolateAccess(helperElement);
2598 push(new js.Call(new js.VariableUse(helperName), arguments)); 2600 push(new js.Call(new js.VariableUse(helperName), arguments));*/
2599 } 2601 }
2600 } 2602 }
2601 2603
2602 class SsaOptimizedCodeGenerator extends SsaCodeGenerator { 2604 class SsaOptimizedCodeGenerator extends SsaCodeGenerator {
2603 SsaOptimizedCodeGenerator(backend, work) : super(backend, work); 2605 SsaOptimizedCodeGenerator(backend, work) : super(backend, work);
2604 2606
2605 HBasicBlock beginGraph(HGraph graph) { 2607 HBasicBlock beginGraph(HGraph graph) {
2606 return graph.entry; 2608 return graph.entry;
2607 } 2609 }
2608 2610
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
3036 if (leftType.canBeNull() && rightType.canBeNull()) { 3038 if (leftType.canBeNull() && rightType.canBeNull()) {
3037 if (left.isConstantNull() || right.isConstantNull() || 3039 if (left.isConstantNull() || right.isConstantNull() ||
3038 (leftType.isPrimitive() && leftType == rightType)) { 3040 (leftType.isPrimitive() && leftType == rightType)) {
3039 return '=='; 3041 return '==';
3040 } 3042 }
3041 return null; 3043 return null;
3042 } else { 3044 } else {
3043 return '==='; 3045 return '===';
3044 } 3046 }
3045 } 3047 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698