1418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file 2418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager// for details. All rights reserved. Use of this source code is governed by a 3418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager// BSD-style license that can be found in the LICENSE file. 4418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager 5418d1ca139ea11316113beafbb3b3dd3fd5587aMads Agerpackage com.android.tools.r8.ir.desugar; 6418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager 7418d1ca139ea11316113beafbb3b3dd3fd5587aMads Agerimport com.android.tools.r8.graph.DexItemFactory; 8418d1ca139ea11316113beafbb3b3dd3fd5587aMads Agerimport com.android.tools.r8.graph.DexMethod; 9418d1ca139ea11316113beafbb3b3dd3fd5587aMads Agerimport com.android.tools.r8.graph.DexType; 10418d1ca139ea11316113beafbb3b3dd3fd5587aMads Agerimport com.android.tools.r8.graph.DexTypeList; 112da874a28e1a98dc5d2500a554f9143d6309a132Stephan Herhutimport com.android.tools.r8.ir.synthetic.SingleBlockSourceCode; 12418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager 13418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager// Represents source code of synthesized lambda class methods. 14418d1ca139ea11316113beafbb3b3dd3fd5587aMads Agerabstract class SynthesizedLambdaSourceCode extends SingleBlockSourceCode { 152da874a28e1a98dc5d2500a554f9143d6309a132Stephan Herhut 16418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager final DexMethod currentMethod; 17418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager final LambdaClass lambda; 18418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager 19418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager SynthesizedLambdaSourceCode(DexType receiver, LambdaClass lambda, DexMethod currentMethod) { 20418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager super(receiver, currentMethod.proto); 21418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager this.lambda = lambda; 22418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager this.currentMethod = currentMethod; 23418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager } 24418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager 25418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager SynthesizedLambdaSourceCode(LambdaClass lambda, DexMethod currentMethod) { 26418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager this(lambda.type, lambda, currentMethod); 27418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager } 28418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager 29418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager final LambdaDescriptor descriptor() { 30418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager return lambda.descriptor; 31418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager } 32418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager 33418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager final DexType[] captures() { 34418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager DexTypeList captures = descriptor().captures; 35418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager assert captures != null; 36418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager return captures.values; 37418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager } 38418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager 39418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager final DexItemFactory factory() { 40418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager return lambda.rewriter.factory; 41418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager } 42418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager 43418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager final int enforceParameterType(int register, DexType paramType, DexType enforcedType) { 44418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager // `paramType` must be either same as `enforcedType` or both must be class 45418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager // types and `enforcedType` must be a subclass of `paramType` in which case 46418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager // a cast need to be inserted. 47418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager if (paramType != enforcedType) { 48418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager assert LambdaDescriptor.isSameOrDerived(factory(), enforcedType, paramType); 49418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager add(builder -> builder.addCheckCast(register, enforcedType)); 50418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager } 51418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager return register; 52418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager } 53418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager 54418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager @Override 55418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager public String toString() { 56418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager return currentMethod.toSourceString(); 57418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager } 58418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager} 59418d1ca139ea11316113beafbb3b3dd3fd5587aMads Ager 60