when calling function stored in local variable as unary operation, don't forget to push function instance (KT-1953)

I'm sure that there are similar cases that still don't work;  please let me know if you find any
#KT-1953 fixed
This commit is contained in:
Dmitry Jemerov
2012-06-06 17:17:44 +02:00
parent 98c9569216
commit 5b987ccc15
4 changed files with 54 additions and 13 deletions
@@ -1023,19 +1023,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
int index = lookupLocal(descriptor); int index = lookupLocal(descriptor);
if (index >= 0) { if (index >= 0) {
if(descriptor instanceof VariableDescriptor) { return stackValueForLocal(descriptor, index);
Type sharedVarType = typeMapper.getSharedVarType(descriptor);
final JetType outType = ((VariableDescriptor) descriptor).getType();
if(sharedVarType != null) {
return StackValue.shared(index, asmType(outType));
}
else {
return StackValue.local(index, asmType(outType));
}
}
else {
return StackValue.local(index, TYPE_OBJECT);
}
} }
if (descriptor instanceof PropertyDescriptor) { if (descriptor instanceof PropertyDescriptor) {
@@ -1157,6 +1145,22 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
return value; return value;
} }
private StackValue stackValueForLocal(DeclarationDescriptor descriptor, int index) {
if(descriptor instanceof VariableDescriptor) {
Type sharedVarType = typeMapper.getSharedVarType(descriptor);
final JetType outType = ((VariableDescriptor) descriptor).getType();
if(sharedVarType != null) {
return StackValue.shared(index, asmType(outType));
}
else {
return StackValue.local(index, asmType(outType));
}
}
else {
return StackValue.local(index, TYPE_OBJECT);
}
}
public int lookupLocal(DeclarationDescriptor descriptor) { public int lookupLocal(DeclarationDescriptor descriptor) {
return myFrameMap.getIndex(descriptor); return myFrameMap.getIndex(descriptor);
} }
@@ -2198,6 +2202,10 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
} }
private StackValue invokeOperation(JetOperationExpression expression, FunctionDescriptor op, CallableMethod callable) { private StackValue invokeOperation(JetOperationExpression expression, FunctionDescriptor op, CallableMethod callable) {
int functionLocalIndex = myFrameMap.getIndex(op);
if (functionLocalIndex >= 0) {
stackValueForLocal(op, functionLocalIndex).put(ClosureCodegen.getInternalClassName(op).getAsmType(), v);
}
ResolvedCall<? extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference()); ResolvedCall<? extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
assert resolvedCall != null; assert resolvedCall != null;
genThisAndReceiverFromResolvedCall(StackValue.none(), resolvedCall, callable); genThisAndReceiverFromResolvedCall(StackValue.none(), resolvedCall, callable);
@@ -0,0 +1,9 @@
fun box(): String {
val sb = StringBuilder()
fun String.plus() {
sb.append(this)
}
+"OK"
return sb.toString()!!
}
@@ -0,0 +1,14 @@
class A {
private val sb: StringBuilder = StringBuilder()
fun String.plus {
sb.append(this)
}
fun foo(): String {
+"OK"
return sb.toString()!!
}
}
fun box(): String = A().foo()
@@ -96,4 +96,14 @@ public class ExtensionFunctionsTest extends CodegenTestCase {
createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.BUILTINS); createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.BUILTINS);
blackBoxFile("regressions/kt1290.kt"); blackBoxFile("regressions/kt1290.kt");
} }
public void testKt1953() throws Exception {
createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS);
blackBoxFile("regressions/kt1953.kt");
}
public void testKt1953Class() throws Exception {
createEnvironmentWithMockJdkAndIdeaAnnotations(CompilerSpecialMode.JDK_HEADERS);
blackBoxFile("regressions/kt1953_class.kt");
}
} }