diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java b/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java index 8f284c416fc..ffffaffb1ec 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java @@ -19,7 +19,7 @@ import java.util.List; */ public class CallableMethod implements Callable { private String owner; - private final Method signature; + private final JvmMethodSignature signature; private int invokeOpcode; private final List valueParameterTypes; private ClassDescriptor thisClass = null; @@ -27,7 +27,7 @@ public class CallableMethod implements Callable { private CallableDescriptor receiverFunction = null; private Type generateCalleeType = null; - public CallableMethod(String owner, Method signature, int invokeOpcode, List valueParameterTypes) { + public CallableMethod(String owner, JvmMethodSignature signature, int invokeOpcode, List valueParameterTypes) { this.owner = owner; this.signature = signature; this.invokeOpcode = invokeOpcode; @@ -38,7 +38,7 @@ public class CallableMethod implements Callable { return owner; } - public Method getSignature() { + public JvmMethodSignature getSignature() { return signature; } @@ -67,7 +67,7 @@ public class CallableMethod implements Callable { } void invoke(InstructionAdapter v) { - v.visitMethodInsn(getInvokeOpcode(), getOwner(), getSignature().getName(), getSignature().getDescriptor()); + v.visitMethodInsn(getInvokeOpcode(), getOwner(), getSignature().getAsmMethod().getName(), getSignature().getAsmMethod().getDescriptor()); } public void requestGenerateCallee(Type objectType) { @@ -80,14 +80,14 @@ public class CallableMethod implements Callable { public void invokeWithDefault(InstructionAdapter v, int mask) { v.iconst(mask); - String desc = getSignature().getDescriptor().replace(")", "I)"); - if("".equals(getSignature().getName())) { + String desc = getSignature().getAsmMethod().getDescriptor().replace(")", "I)"); + if("".equals(getSignature().getAsmMethod().getName())) { v.visitMethodInsn(Opcodes.INVOKESPECIAL, getOwner(), "", desc); } else { if(getInvokeOpcode() != Opcodes.INVOKESTATIC) desc = desc.replace("(", "(L" + getOwner() + ";"); - v.visitMethodInsn(Opcodes.INVOKESTATIC, getInvokeOpcode() == Opcodes.INVOKEINTERFACE ? getOwner() + "$$TImpl" : getOwner(), getSignature().getName() + "$default", desc); + v.visitMethodInsn(Opcodes.INVOKESTATIC, getInvokeOpcode() == Opcodes.INVOKEINTERFACE ? getOwner() + "$$TImpl" : getOwner(), getSignature().getAsmMethod().getName() + "$default", desc); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index 75241d6dc74..b98897f0b03 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -10,7 +10,6 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.JetDeclarationWithBody; import org.jetbrains.jet.lang.psi.JetExpression; -import org.jetbrains.jet.lang.psi.JetFunctionLiteral; import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -54,7 +53,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { public static CallableMethod asCallableMethod(FunctionDescriptor fd) { Method descriptor = erasedInvokeSignature(fd); String owner = getInternalClassName(fd); - final CallableMethod result = new CallableMethod(owner, descriptor, INVOKEVIRTUAL, Arrays.asList(descriptor.getArgumentTypes())); + final CallableMethod result = new CallableMethod(owner, new JvmMethodSignature(descriptor, null), INVOKEVIRTUAL, Arrays.asList(descriptor.getArgumentTypes())); if (fd.getReceiverParameter().exists()) { result.setNeedsReceiver(fd); } @@ -63,7 +62,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { } public Method invokeSignature(FunctionDescriptor fd) { - return state.getTypeMapper().mapSignature("invoke", fd); + return state.getTypeMapper().mapSignature("invoke", fd).getAsmMethod(); } public GeneratedAnonymousClassDescriptor gen(JetFunctionLiteralExpression fun) { @@ -100,7 +99,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { generateBridge(name, funDescriptor, fun, cv); captureThis = generateBody(funDescriptor, cv, fun.getFunctionLiteral()); ClassDescriptor thisDescriptor = context.getThisDescriptor(); - final Type enclosingType = thisDescriptor == null ? null : Type.getObjectType(thisDescriptor.getName()); + final Type enclosingType = thisDescriptor == null ? null : state.getTypeMapper().mapType(thisDescriptor.getDefaultType()); if (enclosingType == null) captureThis = false; @@ -164,9 +163,9 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { Collections.emptyList(), Collections.singleton((funDescriptor.getReceiverParameter().exists() ? JetStandardClasses.getReceiverFunction(arity) : JetStandardClasses.getFunction(arity)).getDefaultType()), JetScope.EMPTY, Collections.emptySet(), null); - final CodegenContext.ClosureContext closureContext = context.intoClosure(funDescriptor, function, name, this); + final CodegenContext.ClosureContext closureContext = context.intoClosure(funDescriptor, function, name, this, state.getTypeMapper()); FunctionCodegen fc = new FunctionCodegen(closureContext, cv, state); - fc.generateMethod(body, invokeSignature(funDescriptor), funDescriptor); + fc.generateMethod(body, new JvmMethodSignature(invokeSignature(funDescriptor), null), funDescriptor); return closureContext.outerWasUsed; } @@ -177,7 +176,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { if(bridge.getDescriptor().equals(delegate.getDescriptor())) return; - final MethodVisitor mv = cv.newMethod(fun, ACC_PUBLIC, "invoke", bridge.getDescriptor(), state.getTypeMapper().genericSignature(funDescriptor), new String[0]); + final MethodVisitor mv = cv.newMethod(fun, ACC_PUBLIC, "invoke", bridge.getDescriptor(), null, new String[0]); if (cv.generateCode()) { mv.visitCode(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java index a5d3447e98c..88ce2d7883b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java @@ -104,24 +104,24 @@ public abstract class CodegenContext { return new ClassContext(descriptor, kind, this, typeMapper); } - public CodegenContext intoAnonymousClass(@NotNull ObjectOrClosureCodegen closure, ClassDescriptor descriptor, OwnerKind kind) { - return new AnonymousClassContext(descriptor, kind, this, closure); + public CodegenContext intoAnonymousClass(@NotNull ObjectOrClosureCodegen closure, ClassDescriptor descriptor, OwnerKind kind, JetTypeMapper typeMapper) { + return new AnonymousClassContext(descriptor, kind, this, closure, typeMapper); } public MethodContext intoFunction(FunctionDescriptor descriptor) { return new MethodContext(descriptor, getContextKind(), this); } - public ConstructorContext intoConstructor(ConstructorDescriptor descriptor) { + public ConstructorContext intoConstructor(ConstructorDescriptor descriptor, JetTypeMapper typeMapper) { if(descriptor == null) { descriptor = new ConstructorDescriptorImpl(getThisDescriptor(), Collections.emptyList(), true) .initialize(Collections.emptyList(), Collections.emptyList(), Modality.OPEN, Visibility.PUBLIC); } - return new ConstructorContext(descriptor, getContextKind(), this); + return new ConstructorContext(descriptor, getContextKind(), this, typeMapper); } - public ClosureContext intoClosure(FunctionDescriptor funDescriptor, ClassDescriptor classDescriptor, String internalClassName, ClosureCodegen closureCodegen) { - return new ClosureContext(funDescriptor, classDescriptor, this, closureCodegen, internalClassName); + public ClosureContext intoClosure(FunctionDescriptor funDescriptor, ClassDescriptor classDescriptor, String internalClassName, ClosureCodegen closureCodegen, JetTypeMapper typeMapper) { + return new ClosureContext(funDescriptor, classDescriptor, this, closureCodegen, internalClassName, typeMapper); } public FrameMap prepareFrame(JetTypeMapper mapper) { @@ -170,12 +170,12 @@ public abstract class CodegenContext { return parentContext != null ? parentContext.lookupInContext(d, v, result) : null; } - public Type enclosingClassType() { + public Type enclosingClassType(JetTypeMapper typeMapper) { CodegenContext cur = getParentContext(); while(cur != null && !(cur.getContextDescriptor() instanceof ClassDescriptor)) cur = cur.getParentContext(); - return cur == null ? null : Type.getObjectType(cur.getContextDescriptor().getName()); + return cur == null ? null : typeMapper.mapType(((ClassDescriptor)cur.getContextDescriptor()).getDefaultType()); } public int getTypeInfoConstantIndex(JetType type) { @@ -290,8 +290,8 @@ public abstract class CodegenContext { return getParentContext().lookupInContext(d, v, result); } - public Type enclosingClassType() { - return getParentContext().enclosingClassType(); + public Type enclosingClassType(JetTypeMapper typeMapper) { + return getParentContext().enclosingClassType(typeMapper); } @Override @@ -305,10 +305,10 @@ public abstract class CodegenContext { } public static class ConstructorContext extends MethodContext { - public ConstructorContext(ConstructorDescriptor contextType, OwnerKind kind, CodegenContext parent) { + public ConstructorContext(ConstructorDescriptor contextType, OwnerKind kind, CodegenContext parent, JetTypeMapper typeMapper) { super(contextType, kind, parent); - final Type type = enclosingClassType(); + final Type type = enclosingClassType(typeMapper); outerExpression = type != null ? local1 : null; @@ -323,7 +323,7 @@ public abstract class CodegenContext { public ClassContext(ClassDescriptor contextType, OwnerKind contextKind, CodegenContext parentContext, JetTypeMapper typeMapper) { super(contextType, contextKind, parentContext, null); - final Type type = enclosingClassType(); + final Type type = enclosingClassType(typeMapper); outerExpression = type != null ? StackValue.field(type, typeMapper.getFQName(contextType), "this$0", false) : null; @@ -341,10 +341,10 @@ public abstract class CodegenContext { } public static class AnonymousClassContext extends CodegenContext { - public AnonymousClassContext(ClassDescriptor contextType, OwnerKind contextKind, CodegenContext parentContext, @NotNull ObjectOrClosureCodegen closure) { + public AnonymousClassContext(ClassDescriptor contextType, OwnerKind contextKind, CodegenContext parentContext, @NotNull ObjectOrClosureCodegen closure, JetTypeMapper typeMapper) { super(contextType, contextKind, parentContext, closure); - final Type type = enclosingClassType(); + final Type type = enclosingClassType(typeMapper); outerExpression = type != null ? StackValue.field(type, closure.state.getTypeMapper().mapType(contextType.getDefaultType(), OwnerKind.IMPLEMENTATION).getInternalName(), "this$0", false) : null; @@ -364,11 +364,11 @@ public abstract class CodegenContext { public static class ClosureContext extends ReceiverContext { private ClassDescriptor classDescriptor; - public ClosureContext(FunctionDescriptor contextType, ClassDescriptor classDescriptor, CodegenContext parentContext, @NotNull ObjectOrClosureCodegen closureCodegen, String internalClassName) { + public ClosureContext(FunctionDescriptor contextType, ClassDescriptor classDescriptor, CodegenContext parentContext, @NotNull ObjectOrClosureCodegen closureCodegen, String internalClassName, JetTypeMapper typeMapper) { super(contextType, OwnerKind.IMPLEMENTATION, parentContext, closureCodegen); this.classDescriptor = classDescriptor; - final Type type = enclosingClassType(); + final Type type = enclosingClassType(typeMapper); outerExpression = type != null ? StackValue.field(type, internalClassName, "this$0", false) : null; diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index e77bf07342d..a24e486308e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -43,9 +43,6 @@ public class ExpressionCodegen extends JetVisitor { private static final String CLASS_NO_PATTERN_MATCHED_EXCEPTION = "jet/NoPatternMatchedException"; private static final String CLASS_TYPE_CAST_EXCEPTION = "jet/TypeCastException"; - private final Stack