Identity fix, removed primitive box/unbox

This commit is contained in:
Mikhael Bogdanov
2014-01-31 12:06:42 +04:00
parent 77979cce1b
commit d6feea6a17
2 changed files with 18 additions and 7 deletions
@@ -1368,10 +1368,12 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
ClassDescriptor captureThis = closure.getCaptureThis(); ClassDescriptor captureThis = closure.getCaptureThis();
if (captureThis != null) { if (captureThis != null) {
StackValue thisOrOuter = generateThisOrOuter(captureThis, false); StackValue thisOrOuter = generateThisOrOuter(captureThis, false);
if (inliner.shouldPutValue(OBJECT_TYPE, thisOrOuter, context, null)) {
thisOrOuter.put(OBJECT_TYPE, v); assert !isPrimitive(thisOrOuter.type) : "This or outer should be non primitive: " + thisOrOuter.type;
if (inliner.shouldPutValue(thisOrOuter.type, thisOrOuter, context, null)) {
thisOrOuter.put(thisOrOuter.type, v);
} }
inliner.putCapturedInLocal(OBJECT_TYPE, thisOrOuter, null, paramIndex++); inliner.putCapturedInLocal(thisOrOuter.type, thisOrOuter, null, paramIndex++);
} }
JetType captureReceiver = closure.getCaptureReceiverType(); JetType captureReceiver = closure.getCaptureReceiverType();
@@ -52,6 +52,7 @@ import java.io.StringWriter;
import java.util.*; import java.util.*;
import static org.jetbrains.jet.codegen.AsmUtil.getMethodAsmFlags; import static org.jetbrains.jet.codegen.AsmUtil.getMethodAsmFlags;
import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.asmTypeForAnonymousClass; import static org.jetbrains.jet.codegen.binding.CodegenBinding.asmTypeForAnonymousClass;
public class InlineCodegen implements ParentCodegenAware, Inliner { public class InlineCodegen implements ParentCodegenAware, Inliner {
@@ -236,13 +237,13 @@ public class InlineCodegen implements ParentCodegenAware, Inliner {
@Override @Override
public void putInLocal(Type type, StackValue stackValue, ValueParameterDescriptor valueParameterDescriptor) { public void putInLocal(@NotNull Type type, @Nullable StackValue stackValue, ValueParameterDescriptor valueParameterDescriptor) {
putCapturedInLocal(type, stackValue, valueParameterDescriptor, -1); putCapturedInLocal(type, stackValue, valueParameterDescriptor, -1);
} }
@Override @Override
public void putCapturedInLocal( public void putCapturedInLocal(
Type type, StackValue stackValue, ValueParameterDescriptor valueParameterDescriptor, int index @NotNull Type type, @Nullable StackValue stackValue, @Nullable ValueParameterDescriptor valueParameterDescriptor, int index
) { ) {
if (!disabled && notSeparateInline && Type.VOID_TYPE != type) { if (!disabled && notSeparateInline && Type.VOID_TYPE != type) {
//TODO remap only inlinable closure => otherwise we could get a lot of problem //TODO remap only inlinable closure => otherwise we could get a lot of problem
@@ -261,7 +262,7 @@ public class InlineCodegen implements ParentCodegenAware, Inliner {
} }
@Override @Override
public boolean shouldPutValue(Type type, StackValue stackValue, MethodContext context, ValueParameterDescriptor descriptor) { public boolean shouldPutValue(@NotNull Type type, @Nullable StackValue stackValue, MethodContext context, ValueParameterDescriptor descriptor) {
//boolean isInline = true/*context.isInlineFunction() || context.getParentContext() instanceof ClosureContext*/; //boolean isInline = true/*context.isInlineFunction() || context.getParentContext() instanceof ClosureContext*/;
//if (stackValue != null && isInline && stackValue instanceof StackValue.Local) { //if (stackValue != null && isInline && stackValue instanceof StackValue.Local) {
// if (isInvokeOnInlinable(type.getClassName(), "invoke") && (descriptor == null || !InlineUtil.hasNoinlineAnnotation(descriptor))) { // if (isInvokeOnInlinable(type.getClassName(), "invoke") && (descriptor == null || !InlineUtil.hasNoinlineAnnotation(descriptor))) {
@@ -269,7 +270,15 @@ public class InlineCodegen implements ParentCodegenAware, Inliner {
// return false; // return false;
// } // }
//} //}
boolean shouldPut = false == (stackValue != null && stackValue instanceof StackValue.Local);
//remap only inline functions (and maybe non primitives)
//TODO - clean asserion and remapping logic
if (stackValue == null || isPrimitive(type) ^ isPrimitive(stackValue.type)) {
//don't remap boxing/unboxing primitives - lost identity and perfomance
return true;
}
boolean shouldPut = !(stackValue != null && stackValue instanceof StackValue.Local);
if (shouldPut) { if (shouldPut) {
//we could recapture field of anonymous objects cause they couldn't change //we could recapture field of anonymous objects cause they couldn't change
boolean isInlineClosure = codegen.getContext().isInlineClosure(); boolean isInlineClosure = codegen.getContext().isInlineClosure();