Extension closures test fixed
This commit is contained in:
@@ -93,7 +93,7 @@ public class ClosureCodegen {
|
|||||||
|
|
||||||
private void generateBody(String className, FunctionDescriptor funDescriptor, ClassVisitor cv, Project project, List<JetElement> body) {
|
private void generateBody(String className, FunctionDescriptor funDescriptor, ClassVisitor cv, Project project, List<JetElement> body) {
|
||||||
FunctionCodegen fc = new FunctionCodegen(null, cv, state);
|
FunctionCodegen fc = new FunctionCodegen(null, cv, state);
|
||||||
fc.generatedMethod(body, OwnerKind.IMPLEMENTATION, invokeSignature(funDescriptor), null, funDescriptor.getUnsubstitutedValueParameters(), null);
|
fc.generatedMethod(body, OwnerKind.IMPLEMENTATION, invokeSignature(funDescriptor), funDescriptor.getReceiverType(), funDescriptor.getUnsubstitutedValueParameters(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateBridge(String className, FunctionDescriptor funDescriptor, ClassVisitor cv) {
|
private void generateBridge(String className, FunctionDescriptor funDescriptor, ClassVisitor cv) {
|
||||||
@@ -107,8 +107,15 @@ public class ClosureCodegen {
|
|||||||
|
|
||||||
iv.load(0, Type.getObjectType(className));
|
iv.load(0, Type.getObjectType(className));
|
||||||
|
|
||||||
final List<ValueParameterDescriptor> params = funDescriptor.getUnsubstitutedValueParameters();
|
final JetType receiverType = funDescriptor.getReceiverType();
|
||||||
int count = 1;
|
int count = 1;
|
||||||
|
if (receiverType != null) {
|
||||||
|
StackValue.local(count, JetTypeMapper.TYPE_OBJECT).put(JetTypeMapper.TYPE_OBJECT, iv);
|
||||||
|
StackValue.onStack(JetTypeMapper.TYPE_OBJECT).upcast(state.getTypeMapper().mapType(receiverType), iv);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<ValueParameterDescriptor> params = funDescriptor.getUnsubstitutedValueParameters();
|
||||||
for (ValueParameterDescriptor param : params) {
|
for (ValueParameterDescriptor param : params) {
|
||||||
StackValue.local(count, JetTypeMapper.TYPE_OBJECT).put(JetTypeMapper.TYPE_OBJECT, iv);
|
StackValue.local(count, JetTypeMapper.TYPE_OBJECT).put(JetTypeMapper.TYPE_OBJECT, iv);
|
||||||
StackValue.onStack(JetTypeMapper.TYPE_OBJECT).upcast(state.getTypeMapper().mapType(param.getOutType()), iv);
|
StackValue.onStack(JetTypeMapper.TYPE_OBJECT).upcast(state.getTypeMapper().mapType(param.getOutType()), iv);
|
||||||
|
|||||||
@@ -851,7 +851,7 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
// TODO handle more levels of class nestng
|
// TODO handle more levels of class nestng
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return StackValue.local(0, JetTypeMapper.TYPE_OBJECT);
|
return thisExpression != null ? thisExpression : StackValue.local(0, JetTypeMapper.TYPE_OBJECT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,8 +74,15 @@ public class FunctionCodegen {
|
|||||||
mv.visitCode();
|
mv.visitCode();
|
||||||
FrameMap frameMap = new FrameMap();
|
FrameMap frameMap = new FrameMap();
|
||||||
|
|
||||||
if (kind != OwnerKind.NAMESPACE || receiverType != null) {
|
int thisIdx = -1;
|
||||||
|
if (kind != OwnerKind.NAMESPACE) {
|
||||||
frameMap.enterTemp(); // 0 slot for this
|
frameMap.enterTemp(); // 0 slot for this
|
||||||
|
thisIdx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (receiverType != null) {
|
||||||
|
thisIdx++;
|
||||||
|
frameMap.enterTemp(); // Next slot for fake this
|
||||||
}
|
}
|
||||||
|
|
||||||
Type[] argTypes = jvmSignature.getArgumentTypes();
|
Type[] argTypes = jvmSignature.getArgumentTypes();
|
||||||
@@ -84,7 +91,7 @@ public class FunctionCodegen {
|
|||||||
frameMap.enter(parameter, argTypes[i].getSize());
|
frameMap.enter(parameter, argTypes[i].getSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
StackValue thisExpression = receiverType == null ? null : StackValue.local(0, state.getTypeMapper().mapType(receiverType));
|
StackValue thisExpression = receiverType == null ? null : StackValue.local(thisIdx, state.getTypeMapper().mapType(receiverType));
|
||||||
ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, jvmSignature.getReturnType(), contextDesc, kind, thisExpression, state);
|
ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, jvmSignature.getReturnType(), contextDesc, kind, thisExpression, state);
|
||||||
if (kind instanceof OwnerKind.DelegateKind) {
|
if (kind instanceof OwnerKind.DelegateKind) {
|
||||||
OwnerKind.DelegateKind dk = (OwnerKind.DelegateKind) kind;
|
OwnerKind.DelegateKind dk = (OwnerKind.DelegateKind) kind;
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
|
class Point(val x : Int, val y : Int)
|
||||||
|
|
||||||
fun box() : String {
|
fun box() : String {
|
||||||
val answer = apply("OK", { String.() : Int =>
|
val answer = apply(Point(3, 5), { Point.(scalar : Int) : Point =>
|
||||||
length
|
Point(x * scalar, y * scalar)
|
||||||
})
|
})
|
||||||
|
|
||||||
return if (answer == 2) "OK" else "FAIL"
|
return if (answer.x == 6 && answer.y == 10) "OK" else "FAIL"
|
||||||
}
|
}
|
||||||
|
|
||||||
fun apply(arg:String, f : {String.() : Int}) : Int {
|
fun apply(arg:Point, f : {Point.(scalar : Int) : Point}) : Point {
|
||||||
return arg.f()
|
return arg.f(2)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user