From ebd04ad046329da5318791d7895c2c4bc059882a Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 1 Jun 2012 19:18:56 +0400 Subject: [PATCH] pass all CallableMethod data in constructor --- .../jetbrains/jet/codegen/CallableMethod.java | 28 ++++++++----------- .../jetbrains/jet/codegen/ClosureCodegen.java | 9 ++---- .../codegen/ImplementationBodyCodegen.java | 2 +- .../jetbrains/jet/codegen/JetTypeMapper.java | 11 +++----- 4 files changed, 20 insertions(+), 30 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java b/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java index d1247c7a326..f90b03c287b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java @@ -43,18 +43,26 @@ public class CallableMethod implements Callable { private final JvmClassName defaultImplParam; private final JvmMethodSignature signature; private final int invokeOpcode; - private ClassDescriptor thisClass = null; + private final ClassDescriptor thisClass; - private CallableDescriptor receiverFunction = null; - private Type generateCalleeType = null; + private final CallableDescriptor receiverFunction; + private final Type generateCalleeType; public CallableMethod(@NotNull JvmClassName owner, @Nullable JvmClassName defaultImplOwner, @Nullable JvmClassName defaultImplParam, - JvmMethodSignature signature, int invokeOpcode) { + JvmMethodSignature signature, int invokeOpcode, + @Nullable ClassDescriptor thisClass, @Nullable CallableDescriptor receiverFunction, @Nullable Type generateCalleeType) { this.owner = owner; this.defaultImplOwner = defaultImplOwner; this.defaultImplParam = defaultImplParam; this.signature = signature; this.invokeOpcode = invokeOpcode; + this.thisClass = thisClass; + this.receiverFunction = receiverFunction; + this.generateCalleeType = generateCalleeType; + + if (receiverFunction != null && receiverFunction.getOriginal() != receiverFunction) { + throw new IllegalArgumentException("receiver function parameter must be original: " + receiverFunction); + } } @NotNull @@ -79,10 +87,6 @@ public class CallableMethod implements Callable { return signature.getValueParameterTypes(); } - public void setNeedsReceiver(@Nullable CallableDescriptor receiverClass) { - this.receiverFunction = receiverClass.getOriginal(); - } - public JetType getThisType() { return thisClass.getDefaultType(); } @@ -91,18 +95,10 @@ public class CallableMethod implements Callable { return receiverFunction.getReceiverParameter().getType(); } - public void setNeedsThis(@Nullable ClassDescriptor receiverClass) { - this.thisClass = receiverClass; - } - void invoke(InstructionAdapter v) { v.visitMethodInsn(getInvokeOpcode(), owner.getInternalName(), getSignature().getAsmMethod().getName(), getSignature().getAsmMethod().getDescriptor()); } - public void requestGenerateCallee(Type objectType) { - generateCalleeType = objectType; - } - public Type getGenerateCalleeType() { return generateCalleeType; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index 9424b51cdf3..0a78318b80f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -91,12 +91,9 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { public static CallableMethod asCallableMethod(FunctionDescriptor fd) { JvmMethodSignature descriptor = erasedInvokeSignature(fd); JvmClassName owner = getInternalClassName(fd); - final CallableMethod result = new CallableMethod(owner, null, null, descriptor, INVOKEVIRTUAL); - if (fd.getReceiverParameter().exists()) { - result.setNeedsReceiver(fd); - } - result.setNeedsThis(getInternalType(fd)); - result.requestGenerateCallee(getInternalClassName(fd).getAsmType()); + final CallableMethod result = new CallableMethod( + owner, null, null, descriptor, INVOKEVIRTUAL, + getInternalType(fd), fd.getReceiverParameter().exists() ? fd.getOriginal() : null, getInternalClassName(fd).getAsmType()); return result; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 0532aefbae0..f3150f82b37 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -474,7 +474,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { signatureWriter.writeVoidReturn(); constructorMethod = signatureWriter.makeJvmMethodSignature(""); - callableMethod = new CallableMethod(JvmClassName.byInternalName("Ignored"), null, null, constructorMethod, INVOKESPECIAL); + callableMethod = new CallableMethod(JvmClassName.byInternalName("Ignored"), null, null, constructorMethod, INVOKESPECIAL, null, null, null); } else { callableMethod = typeMapper.mapToCallableMethod(constructorDescriptor, kind, typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration())); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 1b165b6ed28..ad30f9f1da9 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -601,13 +601,10 @@ public class JetTypeMapper { throw new UnsupportedOperationException("unknown function parent"); } - final CallableMethod result = new CallableMethod(owner, ownerForDefaultImpl, ownerForDefaultParam, descriptor, invokeOpcode); - result.setNeedsThis(thisClass); - if(functionDescriptor.getReceiverParameter().exists()) { - result.setNeedsReceiver(functionDescriptor); - } - return result; + return new CallableMethod( + owner, ownerForDefaultImpl, ownerForDefaultParam, descriptor, invokeOpcode, + thisClass, functionDescriptor.getReceiverParameter().exists() ? functionDescriptor.getOriginal() : null, null); } @NotNull @@ -900,7 +897,7 @@ public class JetTypeMapper { throw new IllegalStateException("type must have been mapped to object: " + defaultType + ", actual: " + mapped); } JvmClassName owner = JvmClassName.byType(mapped); - return new CallableMethod(owner, owner, owner, method, INVOKESPECIAL); + return new CallableMethod(owner, owner, owner, method, INVOKESPECIAL, null, null, null); }