Constructor with default arguments for inner class

#KT-2852 Fixed
This commit is contained in:
Natalia.Ukhorskaya
2012-12-24 14:33:54 +04:00
parent 93b7e9add9
commit 538aa869b4
7 changed files with 147 additions and 4 deletions
@@ -551,6 +551,9 @@ public class FunctionCodegen extends GenerationStateAware {
ReceiverParameterDescriptor receiverParameter = functionDescriptor.getReceiverParameter();
boolean hasReceiver = receiverParameter != null;
// TODO change this condition when nested classes will be implemented
// Has outer in local variables (constructor for inner class)
boolean hasOuter = functionDescriptor instanceof ConstructorDescriptor && functionDescriptor.getExpectedThisObject() != null;
boolean isStatic = isStatic(kind);
if (kind == OwnerKind.TRAIT_IMPL) {
@@ -583,7 +586,7 @@ public class FunctionCodegen extends GenerationStateAware {
genStubCode(mv);
}
else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
generateDefaultImpl(owner, state, jvmSignature, functionDescriptor, kind, receiverParameter, hasReceiver, isStatic,
generateDefaultImpl(owner, state, jvmSignature, functionDescriptor, kind, receiverParameter, hasReceiver, hasOuter, isStatic,
ownerInternalName,
isConstructor, mv, iv, loadStrategy);
}
@@ -596,7 +599,7 @@ public class FunctionCodegen extends GenerationStateAware {
FunctionDescriptor functionDescriptor,
OwnerKind kind,
ReceiverParameterDescriptor receiverParameter,
boolean hasReceiver,
boolean hasReceiver, boolean hasOuter,
boolean aStatic,
JvmClassName ownerInternalName,
boolean constructor,
@@ -612,6 +615,10 @@ public class FunctionCodegen extends GenerationStateAware {
frameMap.leaveTemp(OBJECT_TYPE);
}
if (hasOuter) {
frameMap.enterTemp(OBJECT_TYPE);
}
ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, jvmSignature.getReturnType(), owner, state);
int var = 0;
@@ -619,6 +626,10 @@ public class FunctionCodegen extends GenerationStateAware {
var++;
}
if (hasOuter) {
var++;
}
Type receiverType;
if (hasReceiver) {
receiverType = state.getTypeMapper().mapType(receiverParameter.getType());
@@ -631,7 +642,7 @@ public class FunctionCodegen extends GenerationStateAware {
Type[] argTypes = jvmSignature.getArgumentTypes();
List<ValueParameterDescriptor> paramDescrs = functionDescriptor.getValueParameters();
for (int i = 0; i < paramDescrs.size(); i++) {
Type argType = argTypes[i + (hasReceiver ? 1 : 0)];
Type argType = argTypes[i + ((hasReceiver || hasOuter) ? 1 : 0)];
int size = argType.getSize();
frameMap.enter(paramDescrs.get(i), argType);
var += size;
@@ -644,12 +655,17 @@ public class FunctionCodegen extends GenerationStateAware {
mv.visitVarInsn(ALOAD, var++);
}
if (hasOuter) {
iv.load(var, ownerInternalName.getAsmType());
var++;
}
if (hasReceiver) {
iv.load(var, receiverType);
var += receiverType.getSize();
}
int extra = hasReceiver ? 1 : 0;
int extra = (hasReceiver || hasOuter) ? 1 : 0;
for (int index = 0; index < paramDescrs.size(); index++) {
ValueParameterDescriptor parameterDescriptor = paramDescrs.get(index);