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

Side by Side Diff: pkg/compiler/lib/src/ssa/builder_kernel.dart

Issue 2588263004: Kernel-ify buildIsNode logic and add generics type variable checking in buildIsNode. (Closed)
Patch Set: . Created 4 years 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 'package:kernel/ast.dart' as ir; 5 import 'package:kernel/ast.dart' as ir;
6 6
7 import '../closure.dart'; 7 import '../closure.dart';
8 import '../common.dart'; 8 import '../common.dart';
9 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; 9 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
10 import '../common/names.dart'; 10 import '../common/names.dart';
(...skipping 1924 matching lines...) Expand 10 before | Expand all | Expand 10 after
1935 } 1935 }
1936 1936
1937 @override 1937 @override
1938 void visitIsExpression(ir.IsExpression isExpression) { 1938 void visitIsExpression(ir.IsExpression isExpression) {
1939 isExpression.operand.accept(this); 1939 isExpression.operand.accept(this);
1940 HInstruction expression = pop(); 1940 HInstruction expression = pop();
1941 push(buildIsNode(isExpression, isExpression.type, expression)); 1941 push(buildIsNode(isExpression, isExpression.type, expression));
1942 } 1942 }
1943 1943
1944 HInstruction buildIsNode( 1944 HInstruction buildIsNode(
1945 ir.Node node, ir.DartType dart_type, HInstruction expression) { 1945 ir.Node node, ir.DartType type, HInstruction expression) {
1946 // TODO(sra): Convert the type testing logic here to use ir.DartType. 1946 if (type is ir.InvalidType) {
1947 DartType type = astAdapter.getDartType(dart_type); 1947 generateTypeError(node,
1948 1948 (astAdapter.getDartType(type).element as ErroneousElement).message);
Siggi Cherem (dart-lang) 2016/12/20 22:37:30 we call astAdapter.getDartType on all branches her
Emily Fortuna 2016/12/22 19:22:12 Done.
1949 type = localsHandler.substInContext(type).unaliased; 1949 return new HIs.compound(astAdapter.getDartType(type), expression, pop(),
Siggi Cherem (dart-lang) 2016/12/20 22:37:29 Are the kernel type-variables substituted by the t
1950 1950 commonMasks.boolType);
1951 if (type is MethodTypeVariableType) { 1951 } else if (type is ir.FunctionType) {
Siggi Cherem (dart-lang) 2016/12/20 22:37:30 style nit (here and below): I know this comes from
Emily Fortuna 2016/12/22 19:22:12 ah, I didn't know this was the preferred style. Fi
1952 return graph.addConstantBool(true, closedWorld); 1952 List arguments = [
1953 } 1953 buildFunctionType(astAdapter.getDartType(type)),
1954 1954 expression
1955 if (type is MalformedType) { 1955 ];
1956 ErroneousElement element = type.element; 1956 _pushDynamicInvocation(node, null, arguments,
1957 generateTypeError(node, element.message);
1958 return new HIs.compound(type, expression, pop(), commonMasks.boolType);
1959 }
1960
1961 if (type.isFunctionType) {
1962 List arguments = <HInstruction>[buildFunctionType(type), expression];
1963 _pushDynamicInvocation(node, commonMasks.boolType, arguments,
1964 selector: new Selector.call( 1957 selector: new Selector.call(
1965 new PrivateName('_isTest', astAdapter.jsHelperLibrary), 1958 new PrivateName('_isTest', backend.helpers.jsHelperLibrary),
1966 CallStructure.ONE_ARG)); 1959 CallStructure.ONE_ARG));
1967 return new HIs.compound(type, expression, pop(), commonMasks.boolType); 1960 return new HIs.compound(astAdapter.getDartType(type), expression, pop(),
1968 } 1961 commonMasks.boolType);
1969 1962 } else if (type is ir.TypeParameterType) {
1970 if (type.isTypeVariable) { 1963 HInstruction runtimeType = typeBuilder.addTypeVariableReference(
1971 HInstruction runtimeType = 1964 astAdapter.getDartType(type), sourceElement);
1972 typeBuilder.addTypeVariableReference(type, sourceElement);
1973 _pushStaticInvocation(astAdapter.checkSubtypeOfRuntimeType, 1965 _pushStaticInvocation(astAdapter.checkSubtypeOfRuntimeType,
1974 <HInstruction>[expression, runtimeType], commonMasks.boolType); 1966 <HInstruction>[expression, runtimeType], commonMasks.boolType);
1975 return new HIs.variable(type, expression, pop(), commonMasks.boolType); 1967 return new HIs.variable(astAdapter.getDartType(type), expression, pop(),
1968 commonMasks.boolType);
1969 } else if (_isInterfaceWithNoRawTypes(type)) {
1970 HInstruction representations =
1971 typeBuilder.buildTypeArgumentRepresentations(
1972 astAdapter.getDartType(type), sourceElement);
1973 add(representations);
1974 ClassElement element = astAdapter.getDartType(type).element;
1975 js.Name operator = backend.namer.operatorIs(element);
1976 HInstruction isFieldName =
1977 graph.addConstantStringFromName(operator, closedWorld);
1978 HInstruction asFieldName =
1979 closedWorld.hasAnyStrictSubtype(element)
1980 ? graph.addConstantStringFromName(
1981 backend.namer.substitutionName(element), closedWorld)
1982 : graph.addConstantNull(closedWorld);
1983 List<HInstruction> inputs = <HInstruction>[
1984 expression,
1985 isFieldName,
1986 representations,
1987 asFieldName
1988 ];
1989 _pushStaticInvocation(
1990 astAdapter.checkSubtype, inputs, commonMasks.boolType);
1991 return new HIs.compound(astAdapter.getDartType(type), expression, pop(),
1992 commonMasks.boolType);
1993 } else {
1994 if (backend.hasDirectCheckFor(astAdapter.getDartType(type))) {
1995 return new HIs.direct(
1996 astAdapter.getDartType(type), expression, commonMasks.boolType);
1997 }
1998 // The interceptor is not always needed. It is removed by optimization
1999 // when the receiver type or tested type permit.
2000 return new HIs.raw(astAdapter.getDartType(type), expression,
2001 _interceptorFor(expression), commonMasks.boolType);
1976 } 2002 }
2003 }
1977 2004
1978 // TODO(sra): Type with type parameters. 2005 bool _isInterfaceWithNoRawTypes(ir.DartType type) {
Siggi Cherem (dart-lang) 2016/12/20 22:37:30 nit: we might need a different name here. One idea
Emily Fortuna 2016/12/22 19:22:12 Done.
1979 2006 return type is ir.InterfaceType &&
1980 if (backend.hasDirectCheckFor(type)) { 2007 (type as ir.InterfaceType)
1981 return new HIs.direct(type, expression, commonMasks.boolType); 2008 .typeArguments
1982 } 2009 .any((ir.DartType typeArgType) => typeArgType is! ir.DynamicType);
Siggi Cherem (dart-lang) 2016/12/20 22:37:30 I believe we should also exclude a couple other ca
Emily Fortuna 2016/12/22 19:22:12 Done.
1983
1984 // The interceptor is not always needed. It is removed by optimization
1985 // when the receiver type or tested type permit.
1986 HInterceptor interceptor = _interceptorFor(expression);
1987 return new HIs.raw(type, expression, interceptor, commonMasks.boolType);
1988 } 2010 }
1989 2011
1990 @override 2012 @override
1991 void visitThrow(ir.Throw throwNode) { 2013 void visitThrow(ir.Throw throwNode) {
1992 _visitThrowExpression(throwNode.expression); 2014 _visitThrowExpression(throwNode.expression);
1993 if (isReachable) { 2015 if (isReachable) {
1994 push(new HThrowExpression(pop(), null)); 2016 push(new HThrowExpression(pop(), null));
1995 isReachable = false; 2017 isReachable = false;
1996 } 2018 }
1997 } 2019 }
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
2279 kernelBuilder.open(exitBlock); 2301 kernelBuilder.open(exitBlock);
2280 enterBlock.setBlockFlow( 2302 enterBlock.setBlockFlow(
2281 new HTryBlockInformation( 2303 new HTryBlockInformation(
2282 kernelBuilder.wrapStatementGraph(bodyGraph), 2304 kernelBuilder.wrapStatementGraph(bodyGraph),
2283 exception, 2305 exception,
2284 kernelBuilder.wrapStatementGraph(catchGraph), 2306 kernelBuilder.wrapStatementGraph(catchGraph),
2285 kernelBuilder.wrapStatementGraph(finallyGraph)), 2307 kernelBuilder.wrapStatementGraph(finallyGraph)),
2286 exitBlock); 2308 exitBlock);
2287 } 2309 }
2288 } 2310 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698