From 3512415f3f4bcf97fb0037f97b56c8b62864be7c Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Fri, 1 Jun 2012 19:18:56 +0400 Subject: [PATCH] replace String with JvmClassName --- .../jetbrains/jet/codegen/CallableMethod.java | 27 ++++++++++--------- .../jetbrains/jet/codegen/ClosureCodegen.java | 26 +++++++++--------- .../jet/codegen/ExpressionCodegen.java | 4 +-- .../codegen/ImplementationBodyCodegen.java | 2 +- .../jetbrains/jet/codegen/JetTypeMapper.java | 22 +++++++-------- .../org/jetbrains/jet/codegen/StackValue.java | 2 +- 6 files changed, 43 insertions(+), 40 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java b/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java index 311950b55e8..d1247c7a326 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java @@ -22,6 +22,7 @@ import org.jetbrains.jet.codegen.signature.JvmMethodSignature; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.resolve.java.JvmAbi; +import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.types.JetType; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; @@ -35,11 +36,11 @@ import java.util.List; */ public class CallableMethod implements Callable { @NotNull - private final String owner; - @NotNull - private final String defaultImplOwner; - @NotNull - private final String defaultImplParam; + private final JvmClassName owner; + @Nullable + private final JvmClassName defaultImplOwner; + @Nullable + private final JvmClassName defaultImplParam; private final JvmMethodSignature signature; private final int invokeOpcode; private ClassDescriptor thisClass = null; @@ -47,7 +48,7 @@ public class CallableMethod implements Callable { private CallableDescriptor receiverFunction = null; private Type generateCalleeType = null; - public CallableMethod(@NotNull String owner, @NotNull String defaultImplOwner, @NotNull String defaultImplParam, + public CallableMethod(@NotNull JvmClassName owner, @Nullable JvmClassName defaultImplOwner, @Nullable JvmClassName defaultImplParam, JvmMethodSignature signature, int invokeOpcode) { this.owner = owner; this.defaultImplOwner = defaultImplOwner; @@ -57,12 +58,12 @@ public class CallableMethod implements Callable { } @NotNull - public String getOwner() { + public JvmClassName getOwner() { return owner; } @NotNull - public String getDefaultImplParam() { + public JvmClassName getDefaultImplParam() { return defaultImplParam; } @@ -95,7 +96,7 @@ public class CallableMethod implements Callable { } void invoke(InstructionAdapter v) { - v.visitMethodInsn(getInvokeOpcode(), owner, getSignature().getAsmMethod().getName(), getSignature().getAsmMethod().getDescriptor()); + v.visitMethodInsn(getInvokeOpcode(), owner.getInternalName(), getSignature().getAsmMethod().getName(), getSignature().getAsmMethod().getDescriptor()); } public void requestGenerateCallee(Type objectType) { @@ -107,19 +108,19 @@ public class CallableMethod implements Callable { } public void invokeWithDefault(InstructionAdapter v, int mask) { - if (defaultImplOwner.length() == 0 || defaultImplParam.length() == 0) { + if (defaultImplOwner == null || defaultImplParam == null) { throw new IllegalStateException(); } v.iconst(mask); String desc = getSignature().getAsmMethod().getDescriptor().replace(")", "I)"); if("".equals(getSignature().getAsmMethod().getName())) { - v.visitMethodInsn(Opcodes.INVOKESPECIAL, defaultImplOwner, "", desc); + v.visitMethodInsn(Opcodes.INVOKESPECIAL, defaultImplOwner.getInternalName(), "", desc); } else { if(getInvokeOpcode() != Opcodes.INVOKESTATIC) - desc = desc.replace("(", "(L" + defaultImplParam + ";"); - v.visitMethodInsn(Opcodes.INVOKESTATIC, defaultImplOwner, + desc = desc.replace("(", "(" + defaultImplParam.getDescriptor()); + v.visitMethodInsn(Opcodes.INVOKESTATIC, defaultImplOwner.getInternalName(), getSignature().getAsmMethod().getName() + JvmAbi.DEFAULT_PARAMS_IMPL_SUFFIX, desc); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index 54120e35bc2..9424b51cdf3 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -22,6 +22,7 @@ package org.jetbrains.jet.codegen; import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.codegen.signature.BothSignatureWriter; import org.jetbrains.jet.codegen.signature.JvmMethodParameterKind; import org.jetbrains.jet.codegen.signature.JvmMethodSignature; @@ -89,13 +90,13 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { public static CallableMethod asCallableMethod(FunctionDescriptor fd) { JvmMethodSignature descriptor = erasedInvokeSignature(fd); - String owner = getInternalClassName(fd); - final CallableMethod result = new CallableMethod(owner, "", "", descriptor, INVOKEVIRTUAL); + 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(Type.getObjectType(getInternalClassName(fd))); + result.requestGenerateCallee(getInternalClassName(fd).getAsmType()); return result; } @@ -114,8 +115,8 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { SignatureWriter signatureWriter = new SignatureWriter(); final List parameters = funDescriptor.getValueParameters(); - final String funClass = getInternalClassName(funDescriptor); - signatureWriter.visitClassType(funClass); + final JvmClassName funClass = getInternalClassName(funDescriptor); + signatureWriter.visitClassType(funClass.getInternalName()); for (ValueParameterDescriptor parameter : parameters) { appendType(signatureWriter, parameter.getType(), '='); } @@ -128,7 +129,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { ACC_PUBLIC/*|ACC_SUPER*/, name.getInternalName(), null, - funClass, + funClass.getInternalName(), new String[0] ); cv.visitSource(fun.getContainingFile().getName(), null); @@ -248,7 +249,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { } } - private Method generateConstructor(String funClass, PsiElement fun) { + private Method generateConstructor(JvmClassName funClass, PsiElement fun) { int argCount = captureThis != null ? 1 : 0; argCount += (captureReceiver != null ? 1 : 0); @@ -306,8 +307,8 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { mv.visitCode(); InstructionAdapter iv = new InstructionAdapter(mv); - iv.load(0, Type.getObjectType(funClass)); - iv.invokespecial(funClass, "", "()V"); + iv.load(0, funClass.getAsmType()); + iv.invokespecial(funClass.getInternalName(), "", "()V"); i = 1; for (Type type : argTypes) { @@ -338,13 +339,14 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { return constructor; } - public static String getInternalClassName(FunctionDescriptor descriptor) { + @NotNull + public static JvmClassName getInternalClassName(FunctionDescriptor descriptor) { final int paramCount = descriptor.getValueParameters().size(); if (descriptor.getReceiverParameter().exists()) { - return "jet/ExtensionFunction" + paramCount; + return JvmClassName.byInternalName("jet/ExtensionFunction" + paramCount); } else { - return "jet/Function" + paramCount; + return JvmClassName.byInternalName("jet/Function" + paramCount); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index e93669b377b..a46d6e89564 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1249,8 +1249,8 @@ public class ExpressionCodegen extends JetVisitor { // TODO ugly CallableMethod callableMethod = typeMapper.mapToCallableMethod(propertyDescriptor.getGetter(), isSuper, contextKind()); invokeOpcode = callableMethod.getInvokeOpcode(); - owner = JvmClassName.byInternalName(callableMethod.getOwner()); - ownerParam = JvmClassName.byInternalName(callableMethod.getDefaultImplParam()); + owner = callableMethod.getOwner(); + ownerParam = callableMethod.getDefaultImplParam(); } return StackValue.property(propertyDescriptor.getName().getName(), owner, ownerParam, asmType(propertyDescriptor.getType()), isStatic, isInterface, isSuper, getter, setter, invokeOpcode); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index a7313822118..0532aefbae0 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("", "", "", constructorMethod, INVOKESPECIAL); + callableMethod = new CallableMethod(JvmClassName.byInternalName("Ignored"), null, null, constructorMethod, INVOKESPECIAL); } 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 e19b062da4a..1b165b6ed28 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -541,14 +541,14 @@ public class JetTypeMapper { } JvmMethodSignature descriptor = mapSignature(functionDescriptor.getOriginal(), true, kind); - String owner; - String ownerForDefaultImpl; - String ownerForDefaultParam; + JvmClassName owner; + JvmClassName ownerForDefaultImpl; + JvmClassName ownerForDefaultParam; int invokeOpcode; ClassDescriptor thisClass; if (functionParent instanceof NamespaceDescriptor) { assert !superCall; - owner = jvmClassNameForNamespace((NamespaceDescriptor) functionParent).getInternalName(); + owner = jvmClassNameForNamespace((NamespaceDescriptor) functionParent); ownerForDefaultImpl = ownerForDefaultParam = owner; invokeOpcode = INVOKESTATIC; thisClass = null; @@ -556,7 +556,7 @@ public class JetTypeMapper { else if (functionDescriptor instanceof ConstructorDescriptor) { assert !superCall; ClassDescriptor containingClass = (ClassDescriptor) functionParent; - owner = mapType(containingClass.getDefaultType(), MapTypeMode.IMPL).getInternalName(); + owner = JvmClassName.byType(mapType(containingClass.getDefaultType(), MapTypeMode.IMPL)); ownerForDefaultImpl = ownerForDefaultParam = owner; invokeOpcode = INVOKESPECIAL; thisClass = null; @@ -583,17 +583,17 @@ public class JetTypeMapper { boolean isInterface = originalIsInterface && currentIsInterface; Type type = mapType(receiver.getDefaultType(), MapTypeMode.TYPE_PARAMETER); - owner = type.getInternalName(); - ownerForDefaultParam = mapType(declarationOwner.getDefaultType(), MapTypeMode.TYPE_PARAMETER).getInternalName(); - ownerForDefaultImpl = ownerForDefaultParam - + (originalIsInterface ? JvmAbi.TRAIT_IMPL_SUFFIX : ""); + owner = JvmClassName.byType(type); + ownerForDefaultParam = JvmClassName.byType(mapType(declarationOwner.getDefaultType(), MapTypeMode.TYPE_PARAMETER)); + ownerForDefaultImpl = JvmClassName.byInternalName( + ownerForDefaultParam.getInternalName() + (originalIsInterface ? JvmAbi.TRAIT_IMPL_SUFFIX : "")); invokeOpcode = isInterface ? (superCall ? Opcodes.INVOKESTATIC : Opcodes.INVOKEINTERFACE) : (superCall ? Opcodes.INVOKESPECIAL : Opcodes.INVOKEVIRTUAL); if(isInterface && superCall) { descriptor = mapSignature(functionDescriptor, false, OwnerKind.TRAIT_IMPL); - owner += JvmAbi.TRAIT_IMPL_SUFFIX; + owner = JvmClassName.byInternalName(owner.getInternalName() + JvmAbi.TRAIT_IMPL_SUFFIX); } thisClass = receiver; } @@ -899,7 +899,7 @@ public class JetTypeMapper { if (mapped.getSort() != Type.OBJECT) { throw new IllegalStateException("type must have been mapped to object: " + defaultType + ", actual: " + mapped); } - String owner = mapped.getInternalName(); + JvmClassName owner = JvmClassName.byType(mapped); return new CallableMethod(owner, owner, owner, method, INVOKESPECIAL); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java index 2c8aa95caa2..1bb6577c3e0 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java @@ -1120,7 +1120,7 @@ public abstract class StackValue { if (thisObject.exists()) { if(receiverArgument.exists()) { if (callableMethod != null) { - codegen.generateFromResolvedCall(thisObject, Type.getObjectType(callableMethod.getOwner())); + codegen.generateFromResolvedCall(thisObject, callableMethod.getOwner().getAsmType()); } else { codegen.generateFromResolvedCall(thisObject, codegen.typeMapper.mapType(descriptor.getExpectedThisObject().getType(), MapTypeMode.VALUE));