blob: eacad03fccd8fa02fa34601a65e7c781d5cbfc4b [file] [log] [blame]
// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.desugar;
import com.android.tools.r8.ir.code.Invoke;
import com.android.tools.r8.ir.code.Position;
import com.android.tools.r8.ir.code.ValueType;
import java.util.ArrayList;
import java.util.List;
// Source code for the static method in a stateful lambda class which creates and initializes
// a new instance.
final class LambdaCreateInstanceSourceCode extends SynthesizedLambdaSourceCode {
LambdaCreateInstanceSourceCode(LambdaClass lambda, Position callerPosition) {
super(lambda, lambda.createInstanceMethod, callerPosition, null);
}
@Override
protected void prepareInstructions() {
// Create and initialize an instance.
int instance = nextRegister(ValueType.OBJECT);
add(builder -> builder.addNewInstance(instance, lambda.type));
int paramCount = proto.parameters.values.length;
List<ValueType> types = new ArrayList<>(paramCount + 1);
List<Integer> registers = new ArrayList<>(paramCount + 1);
types.add(ValueType.OBJECT);
registers.add(instance);
for (int i = 0; i < paramCount; ++i) {
types.add(ValueType.fromDexType(proto.parameters.values[i]));
registers.add(getParamRegister(i));
}
add(
builder ->
builder.addInvoke(
Invoke.Type.DIRECT,
lambda.constructor,
lambda.constructor.proto,
types,
registers,
false /* isInterface */));
add(builder -> builder.addReturn(instance));
}
}