Split AsmUtils to descriptors dependent and independent parts
This commit is contained in:
@@ -221,7 +221,7 @@ public abstract class AnnotationCodegen {
|
|||||||
private static boolean isInvisibleFromTheOutside(@Nullable DeclarationDescriptor descriptor) {
|
private static boolean isInvisibleFromTheOutside(@Nullable DeclarationDescriptor descriptor) {
|
||||||
if (isAccessor(descriptor)) return true;
|
if (isAccessor(descriptor)) return true;
|
||||||
if (descriptor instanceof MemberDescriptor) {
|
if (descriptor instanceof MemberDescriptor) {
|
||||||
return AsmUtil.getVisibilityAccessFlag((MemberDescriptor) descriptor) == Opcodes.ACC_PRIVATE;
|
return DescriptorAsmUtil.getVisibilityAccessFlag((MemberDescriptor) descriptor) == Opcodes.ACC_PRIVATE;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,8 +50,9 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
import static org.jetbrains.kotlin.codegen.AsmUtil.CAPTURED_THIS_FIELD;
|
||||||
import static org.jetbrains.kotlin.codegen.CallableReferenceUtilKt.*;
|
import static org.jetbrains.kotlin.codegen.CallableReferenceUtilKt.*;
|
||||||
|
import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.*;
|
||||||
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConst;
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConst;
|
||||||
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.CLOSURE;
|
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.CLOSURE;
|
||||||
import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION;
|
import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION;
|
||||||
@@ -139,7 +140,7 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
|
|||||||
|
|
||||||
this.asmType = typeMapper.mapClass(classDescriptor);
|
this.asmType = typeMapper.mapClass(classDescriptor);
|
||||||
|
|
||||||
visibilityFlag = AsmUtil.getVisibilityAccessFlagForClass(classDescriptor);
|
visibilityFlag = DescriptorAsmUtil.getVisibilityAccessFlagForClass(classDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -298,7 +298,7 @@ public class ConstructorCodegen {
|
|||||||
|
|
||||||
int k = 1;
|
int k = 1;
|
||||||
for (FieldInfo info : argsFromClosure) {
|
for (FieldInfo info : argsFromClosure) {
|
||||||
k = AsmUtil.genAssignInstanceFieldFromParam(info, k, iv);
|
k = DescriptorAsmUtil.genAssignInstanceFieldFromParam(info, k, iv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -127,8 +127,8 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) {
|
|||||||
substituteCount: Int
|
substituteCount: Int
|
||||||
) {
|
) {
|
||||||
val typeMapper = state.typeMapper
|
val typeMapper = state.typeMapper
|
||||||
val isStatic = AsmUtil.isStaticMethod(contextKind, functionDescriptor)
|
val isStatic = DescriptorAsmUtil.isStaticMethod(contextKind, functionDescriptor)
|
||||||
val baseMethodFlags = AsmUtil.getCommonCallableFlags(functionDescriptor, state) and Opcodes.ACC_VARARGS.inv()
|
val baseMethodFlags = DescriptorAsmUtil.getCommonCallableFlags(functionDescriptor, state) and Opcodes.ACC_VARARGS.inv()
|
||||||
val remainingParameters = getRemainingParameters(functionDescriptor.original, substituteCount)
|
val remainingParameters = getRemainingParameters(functionDescriptor.original, substituteCount)
|
||||||
val remainingParametersDeclarations =
|
val remainingParametersDeclarations =
|
||||||
remainingParameters.map { DescriptorToSourceUtils.descriptorToDeclaration(it) as? KtParameter }
|
remainingParameters.map { DescriptorToSourceUtils.descriptorToDeclaration(it) as? KtParameter }
|
||||||
|
|||||||
+27
-438
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.codegen;
|
package org.jetbrains.kotlin.codegen;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.intellij.openapi.util.Pair;
|
import com.intellij.openapi.util.Pair;
|
||||||
import com.intellij.psi.tree.IElementType;
|
import com.intellij.psi.tree.IElementType;
|
||||||
@@ -14,7 +13,6 @@ import kotlin.Unit;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
||||||
import org.jetbrains.kotlin.builtins.PrimitiveType;
|
|
||||||
import org.jetbrains.kotlin.codegen.binding.CalculatedClosure;
|
import org.jetbrains.kotlin.codegen.binding.CalculatedClosure;
|
||||||
import org.jetbrains.kotlin.codegen.binding.CodegenBinding;
|
import org.jetbrains.kotlin.codegen.binding.CodegenBinding;
|
||||||
import org.jetbrains.kotlin.codegen.context.CodegenContext;
|
import org.jetbrains.kotlin.codegen.context.CodegenContext;
|
||||||
@@ -22,16 +20,15 @@ import org.jetbrains.kotlin.codegen.intrinsics.HashCode;
|
|||||||
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods;
|
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods;
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState;
|
import org.jetbrains.kotlin.codegen.state.GenerationState;
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
|
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
|
||||||
import org.jetbrains.kotlin.config.*;
|
import org.jetbrains.kotlin.config.JvmDefaultMode;
|
||||||
|
import org.jetbrains.kotlin.config.JvmTarget;
|
||||||
|
import org.jetbrains.kotlin.config.LanguageFeature;
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings;
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation;
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation;
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens;
|
import org.jetbrains.kotlin.lexer.KtTokens;
|
||||||
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities;
|
|
||||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames;
|
|
||||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil;
|
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil;
|
||||||
import org.jetbrains.kotlin.metadata.jvm.serialization.JvmStringTable;
|
import org.jetbrains.kotlin.metadata.jvm.serialization.JvmStringTable;
|
||||||
import org.jetbrains.kotlin.name.ClassId;
|
|
||||||
import org.jetbrains.kotlin.name.FqName;
|
|
||||||
import org.jetbrains.kotlin.name.Name;
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.protobuf.MessageLite;
|
import org.jetbrains.kotlin.protobuf.MessageLite;
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer;
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer;
|
||||||
@@ -41,7 +38,9 @@ import org.jetbrains.kotlin.resolve.InlineClassDescriptorResolver;
|
|||||||
import org.jetbrains.kotlin.resolve.InlineClassesUtilsKt;
|
import org.jetbrains.kotlin.resolve.InlineClassesUtilsKt;
|
||||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver;
|
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver;
|
||||||
import org.jetbrains.kotlin.resolve.inline.InlineUtil;
|
import org.jetbrains.kotlin.resolve.inline.InlineUtil;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.*;
|
import org.jetbrains.kotlin.resolve.jvm.AsmTypes;
|
||||||
|
import org.jetbrains.kotlin.resolve.jvm.InlineClassManglingRulesKt;
|
||||||
|
import org.jetbrains.kotlin.resolve.jvm.RuntimeAssertionInfo;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt;
|
import org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin;
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin;
|
||||||
import org.jetbrains.kotlin.serialization.DescriptorSerializer;
|
import org.jetbrains.kotlin.serialization.DescriptorSerializer;
|
||||||
@@ -50,15 +49,14 @@ import org.jetbrains.kotlin.types.KotlinType;
|
|||||||
import org.jetbrains.kotlin.types.SimpleType;
|
import org.jetbrains.kotlin.types.SimpleType;
|
||||||
import org.jetbrains.org.objectweb.asm.*;
|
import org.jetbrains.org.objectweb.asm.*;
|
||||||
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
|
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
|
||||||
import org.jetbrains.org.objectweb.asm.commons.Method;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isBoolean;
|
import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isBoolean;
|
||||||
import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isPrimitiveClass;
|
import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isPrimitiveClass;
|
||||||
|
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
||||||
import static org.jetbrains.kotlin.codegen.CodegenUtilKt.isToArrayFromCollection;
|
import static org.jetbrains.kotlin.codegen.CodegenUtilKt.isToArrayFromCollection;
|
||||||
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConstOrHasJvmFieldAnnotation;
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConstOrHasJvmFieldAnnotation;
|
||||||
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface;
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface;
|
||||||
@@ -70,81 +68,14 @@ import static org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt.h
|
|||||||
import static org.jetbrains.kotlin.types.TypeUtils.isNullableType;
|
import static org.jetbrains.kotlin.types.TypeUtils.isNullableType;
|
||||||
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
||||||
|
|
||||||
public class AsmUtil {
|
public class DescriptorAsmUtil {
|
||||||
|
|
||||||
private static final Set<Type> STRING_BUILDER_OBJECT_APPEND_ARG_TYPES = Sets.newHashSet(
|
private static final Set<Type> STRING_BUILDER_OBJECT_APPEND_ARG_TYPES = Sets.newHashSet(
|
||||||
getType(String.class),
|
getType(String.class),
|
||||||
getType(StringBuffer.class),
|
getType(StringBuffer.class),
|
||||||
getType(CharSequence.class)
|
getType(CharSequence.class)
|
||||||
);
|
);
|
||||||
|
|
||||||
private static final int NO_FLAG_LOCAL = 0;
|
private DescriptorAsmUtil() {
|
||||||
public static final int NO_FLAG_PACKAGE_PRIVATE = 0;
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private static final Map<DescriptorVisibility, Integer> visibilityToAccessFlag = ImmutableMap.<DescriptorVisibility, Integer>builder()
|
|
||||||
.put(DescriptorVisibilities.PRIVATE, ACC_PRIVATE)
|
|
||||||
.put(DescriptorVisibilities.PRIVATE_TO_THIS, ACC_PRIVATE)
|
|
||||||
.put(DescriptorVisibilities.PROTECTED, ACC_PROTECTED)
|
|
||||||
.put(JavaDescriptorVisibilities.PROTECTED_STATIC_VISIBILITY, ACC_PROTECTED)
|
|
||||||
.put(JavaDescriptorVisibilities.PROTECTED_AND_PACKAGE, ACC_PROTECTED)
|
|
||||||
.put(DescriptorVisibilities.PUBLIC, ACC_PUBLIC)
|
|
||||||
.put(DescriptorVisibilities.INTERNAL, ACC_PUBLIC)
|
|
||||||
.put(DescriptorVisibilities.LOCAL, NO_FLAG_LOCAL)
|
|
||||||
.put(JavaDescriptorVisibilities.PACKAGE_VISIBILITY, NO_FLAG_PACKAGE_PRIVATE)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
public static final String CAPTURED_PREFIX = "$";
|
|
||||||
|
|
||||||
public static final String THIS = "this";
|
|
||||||
|
|
||||||
public static final String THIS_IN_DEFAULT_IMPLS = "$this";
|
|
||||||
|
|
||||||
public static final String LABELED_THIS_FIELD = THIS + "_";
|
|
||||||
|
|
||||||
public static final String CAPTURED_LABELED_THIS_FIELD = CAPTURED_PREFIX + LABELED_THIS_FIELD;
|
|
||||||
|
|
||||||
public static final String INLINE_DECLARATION_SITE_THIS = "this_";
|
|
||||||
|
|
||||||
public static final String LABELED_THIS_PARAMETER = CAPTURED_PREFIX + THIS + "$";
|
|
||||||
|
|
||||||
public static final String CAPTURED_THIS_FIELD = "this$0";
|
|
||||||
|
|
||||||
public static final String RECEIVER_PARAMETER_NAME = "$receiver";
|
|
||||||
|
|
||||||
/*
|
|
||||||
This is basically an old convention. Starting from Kotlin 1.3, it was replaced with `$this_<label>`.
|
|
||||||
Note that it is still used for inlined callable references and anonymous callable extension receivers
|
|
||||||
even in 1.3.
|
|
||||||
*/
|
|
||||||
public static final String CAPTURED_RECEIVER_FIELD = "receiver$0";
|
|
||||||
|
|
||||||
// For non-inlined callable references ('kotlin.jvm.internal.CallableReference' has a 'receiver' field)
|
|
||||||
public static final String BOUND_REFERENCE_RECEIVER = "receiver";
|
|
||||||
|
|
||||||
public static final String LOCAL_FUNCTION_VARIABLE_PREFIX = "$fun$";
|
|
||||||
|
|
||||||
private static final ImmutableMap<Integer, JvmPrimitiveType> primitiveTypeByAsmSort;
|
|
||||||
private static final ImmutableMap<Type, Type> primitiveTypeByBoxedType;
|
|
||||||
|
|
||||||
static {
|
|
||||||
ImmutableMap.Builder<Integer, JvmPrimitiveType> typeBySortBuilder = ImmutableMap.builder();
|
|
||||||
ImmutableMap.Builder<Type, Type> typeByWrapperBuilder = ImmutableMap.builder();
|
|
||||||
for (JvmPrimitiveType primitiveType : JvmPrimitiveType.values()) {
|
|
||||||
Type asmType = Type.getType(primitiveType.getDesc());
|
|
||||||
typeBySortBuilder.put(asmType.getSort(), primitiveType);
|
|
||||||
typeByWrapperBuilder.put(asmTypeByFqNameWithoutInnerClasses(primitiveType.getWrapperFqName()), asmType);
|
|
||||||
}
|
|
||||||
primitiveTypeByAsmSort = typeBySortBuilder.build();
|
|
||||||
primitiveTypeByBoxedType = typeByWrapperBuilder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
private AsmUtil() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static String getCapturedFieldName(@NotNull String originalName) {
|
|
||||||
return CAPTURED_PREFIX + originalName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -204,21 +135,6 @@ public class AsmUtil {
|
|||||||
return getLabeledThisName(callableName.asString(), prefix, defaultName);
|
return getLabeledThisName(callableName.asString(), prefix, defaultName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static String getLabeledThisName(@NotNull String callableName, @NotNull String prefix, @NotNull String defaultName) {
|
|
||||||
if (!Name.isValidIdentifier(callableName)) {
|
|
||||||
return defaultName;
|
|
||||||
}
|
|
||||||
|
|
||||||
return prefix + VariableAsmNameManglingUtils.mangleNameIfNeeded(callableName);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static Type boxType(@NotNull Type type) {
|
|
||||||
Type boxedType = boxPrimitiveType(type);
|
|
||||||
return boxedType != null ? boxedType : type;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static Type boxType(@NotNull Type type, @NotNull KotlinType kotlinType, @NotNull KotlinTypeMapper typeMapper) {
|
public static Type boxType(@NotNull Type type, @NotNull KotlinType kotlinType, @NotNull KotlinTypeMapper typeMapper) {
|
||||||
if (InlineClassesUtilsKt.isInlineClassType(kotlinType)) {
|
if (InlineClassesUtilsKt.isInlineClassType(kotlinType)) {
|
||||||
@@ -229,52 +145,6 @@ public class AsmUtil {
|
|||||||
return boxedPrimitiveType != null ? boxedPrimitiveType : type;
|
return boxedPrimitiveType != null ? boxedPrimitiveType : type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static Type boxPrimitiveType(@NotNull Type type) {
|
|
||||||
JvmPrimitiveType jvmPrimitiveType = primitiveTypeByAsmSort.get(type.getSort());
|
|
||||||
return jvmPrimitiveType != null ? asmTypeByFqNameWithoutInnerClasses(jvmPrimitiveType.getWrapperFqName()) : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static Type unboxType(@NotNull Type boxedType) {
|
|
||||||
Type primitiveType = unboxPrimitiveTypeOrNull(boxedType);
|
|
||||||
if (primitiveType == null) {
|
|
||||||
throw new UnsupportedOperationException("Unboxing: " + boxedType);
|
|
||||||
}
|
|
||||||
return primitiveType;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static Type unboxPrimitiveTypeOrNull(@NotNull Type boxedType) {
|
|
||||||
return primitiveTypeByBoxedType.get(boxedType);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isBoxedPrimitiveType(@NotNull Type boxedType) {
|
|
||||||
return primitiveTypeByBoxedType.get(boxedType) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static Type unboxUnlessPrimitive(@NotNull Type boxedOrPrimitiveType) {
|
|
||||||
if (isPrimitive(boxedOrPrimitiveType)) return boxedOrPrimitiveType;
|
|
||||||
return unboxType(boxedOrPrimitiveType);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isBoxedTypeOf(@NotNull Type boxedType, @NotNull Type unboxedType) {
|
|
||||||
return unboxPrimitiveTypeOrNull(boxedType) == unboxedType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isIntPrimitive(Type type) {
|
|
||||||
return type == Type.INT_TYPE || type == Type.SHORT_TYPE || type == Type.BYTE_TYPE || type == Type.CHAR_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isIntOrLongPrimitive(Type type) {
|
|
||||||
return isIntPrimitive(type) || type == Type.LONG_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isPrimitive(Type type) {
|
|
||||||
return type.getSort() != Type.OBJECT && type.getSort() != Type.ARRAY;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isPrimitiveNumberClassDescriptor(DeclarationDescriptor descriptor) {
|
public static boolean isPrimitiveNumberClassDescriptor(DeclarationDescriptor descriptor) {
|
||||||
if (!(descriptor instanceof ClassDescriptor)) {
|
if (!(descriptor instanceof ClassDescriptor)) {
|
||||||
return false;
|
return false;
|
||||||
@@ -282,29 +152,6 @@ public class AsmUtil {
|
|||||||
return isPrimitiveClass((ClassDescriptor) descriptor) && !isBoolean((ClassDescriptor) descriptor);
|
return isPrimitiveClass((ClassDescriptor) descriptor) && !isBoolean((ClassDescriptor) descriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static Type correctElementType(@NotNull Type type) {
|
|
||||||
String internalName = type.getInternalName();
|
|
||||||
assert internalName.charAt(0) == '[';
|
|
||||||
return Type.getType(internalName.substring(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static Type getArrayType(@NotNull Type componentType) {
|
|
||||||
return Type.getType("[" + componentType.getDescriptor());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static PrimitiveType asmPrimitiveTypeToLangPrimitiveType(Type type) {
|
|
||||||
JvmPrimitiveType jvmPrimitiveType = primitiveTypeByAsmSort.get(type.getSort());
|
|
||||||
return jvmPrimitiveType != null ? jvmPrimitiveType.getPrimitiveType() : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static Method method(@NotNull String name, @NotNull Type returnType, @NotNull Type... parameterTypes) {
|
|
||||||
return new Method(name, Type.getMethodDescriptor(returnType, parameterTypes));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isAbstractMethod(FunctionDescriptor functionDescriptor, OwnerKind kind, JvmDefaultMode jvmDefaultMode) {
|
public static boolean isAbstractMethod(FunctionDescriptor functionDescriptor, OwnerKind kind, JvmDefaultMode jvmDefaultMode) {
|
||||||
return (functionDescriptor.getModality() == Modality.ABSTRACT ||
|
return (functionDescriptor.getModality() == Modality.ABSTRACT ||
|
||||||
(isJvmInterface(functionDescriptor.getContainingDeclaration()) && !JvmAnnotationUtilKt
|
(isJvmInterface(functionDescriptor.getContainingDeclaration()) && !JvmAnnotationUtilKt
|
||||||
@@ -420,7 +267,7 @@ public class AsmUtil {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public static Integer getVisibilityAccessFlag(DescriptorVisibility visibility) {
|
public static Integer getVisibilityAccessFlag(DescriptorVisibility visibility) {
|
||||||
return visibilityToAccessFlag.get(visibility);
|
return AsmUtil.getVisibilityAccessFlag(visibility.getDelegate());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -591,40 +438,6 @@ public class AsmUtil {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Type stringValueOfType(Type type) {
|
|
||||||
int sort = type.getSort();
|
|
||||||
return sort == Type.OBJECT || sort == Type.ARRAY
|
|
||||||
? OBJECT_TYPE
|
|
||||||
: sort == Type.BYTE || sort == Type.SHORT ? Type.INT_TYPE : type;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Type stringBuilderAppendType(Type type) {
|
|
||||||
switch (type.getSort()) {
|
|
||||||
case Type.OBJECT:
|
|
||||||
return STRING_BUILDER_OBJECT_APPEND_ARG_TYPES.contains(type) ? type : OBJECT_TYPE;
|
|
||||||
case Type.ARRAY:
|
|
||||||
return OBJECT_TYPE;
|
|
||||||
case Type.BYTE:
|
|
||||||
case Type.SHORT:
|
|
||||||
return Type.INT_TYPE;
|
|
||||||
default:
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void genThrow(@NotNull InstructionAdapter v, @NotNull String exception, @Nullable String message) {
|
|
||||||
v.anew(Type.getObjectType(exception));
|
|
||||||
v.dup();
|
|
||||||
if (message != null) {
|
|
||||||
v.aconst(message);
|
|
||||||
v.invokespecial(exception, "<init>", "(Ljava/lang/String;)V", false);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
v.invokespecial(exception, "<init>", "()V", false);
|
|
||||||
}
|
|
||||||
v.athrow();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void genClosureFields(
|
public static void genClosureFields(
|
||||||
@NotNull CalculatedClosure closure,
|
@NotNull CalculatedClosure closure,
|
||||||
ClassBuilder v,
|
ClassBuilder v,
|
||||||
@@ -688,12 +501,6 @@ public class AsmUtil {
|
|||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void genStringBuilderConstructor(InstructionAdapter v) {
|
|
||||||
v.visitTypeInsn(NEW, "java/lang/StringBuilder");
|
|
||||||
v.dup();
|
|
||||||
v.invokespecial("java/lang/StringBuilder", "<init>", "()V", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void genInvokeAppendMethod(@NotNull InstructionAdapter v, @NotNull Type type, @Nullable KotlinType kotlinType) {
|
public static void genInvokeAppendMethod(@NotNull InstructionAdapter v, @NotNull Type type, @Nullable KotlinType kotlinType) {
|
||||||
genInvokeAppendMethod(v, type, kotlinType, null);
|
genInvokeAppendMethod(v, type, kotlinType, null);
|
||||||
}
|
}
|
||||||
@@ -723,6 +530,20 @@ public class AsmUtil {
|
|||||||
v.invokevirtual("java/lang/StringBuilder", "append", "(" + appendParameterType.getDescriptor() + ")Ljava/lang/StringBuilder;", false);
|
v.invokevirtual("java/lang/StringBuilder", "append", "(" + appendParameterType.getDescriptor() + ")Ljava/lang/StringBuilder;", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Type stringBuilderAppendType(Type type) {
|
||||||
|
switch (type.getSort()) {
|
||||||
|
case Type.OBJECT:
|
||||||
|
return STRING_BUILDER_OBJECT_APPEND_ARG_TYPES.contains(type) ? type : OBJECT_TYPE;
|
||||||
|
case Type.ARRAY:
|
||||||
|
return OBJECT_TYPE;
|
||||||
|
case Type.BYTE:
|
||||||
|
case Type.SHORT:
|
||||||
|
return Type.INT_TYPE;
|
||||||
|
default:
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static StackValue genToString(
|
public static StackValue genToString(
|
||||||
@NotNull StackValue receiver,
|
@NotNull StackValue receiver,
|
||||||
@NotNull Type receiverType,
|
@NotNull Type receiverType,
|
||||||
@@ -834,11 +655,6 @@ public class AsmUtil {
|
|||||||
mv.visitInsn(L2I);
|
mv.visitInsn(L2I);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void genInvertBoolean(InstructionAdapter v) {
|
|
||||||
v.iconst(1);
|
|
||||||
v.xor(Type.INT_TYPE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static StackValue genEqualsForExpressionsOnStack(
|
public static StackValue genEqualsForExpressionsOnStack(
|
||||||
@NotNull IElementType opToken,
|
@NotNull IElementType opToken,
|
||||||
@@ -909,24 +725,6 @@ public class AsmUtil {
|
|||||||
v.invokestatic(IntrinsicMethods.INTRINSICS_CLASS_NAME, "areEqual", "(" + left.getDescriptor() + right.getDescriptor() + ")Z", false);
|
v.invokestatic(IntrinsicMethods.INTRINSICS_CLASS_NAME, "areEqual", "(" + left.getDescriptor() + right.getDescriptor() + ")Z", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void numConst(int value, Type type, InstructionAdapter v) {
|
|
||||||
if (type == Type.FLOAT_TYPE) {
|
|
||||||
v.fconst(value);
|
|
||||||
}
|
|
||||||
else if (type == Type.DOUBLE_TYPE) {
|
|
||||||
v.dconst(value);
|
|
||||||
}
|
|
||||||
else if (type == Type.LONG_TYPE) {
|
|
||||||
v.lconst(value);
|
|
||||||
}
|
|
||||||
else if (type == Type.CHAR_TYPE || type == Type.BYTE_TYPE || type == Type.SHORT_TYPE || type == Type.INT_TYPE) {
|
|
||||||
v.iconst(value);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new IllegalArgumentException("Primitive numeric type expected, got: " + type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void genIncrement(Type baseType, int myDelta, InstructionAdapter v) {
|
public static void genIncrement(Type baseType, int myDelta, InstructionAdapter v) {
|
||||||
Type operationType = numberFunctionOperandType(baseType);
|
Type operationType = numberFunctionOperandType(baseType);
|
||||||
numConst(myDelta, operationType, v);
|
numConst(myDelta, operationType, v);
|
||||||
@@ -934,27 +732,6 @@ public class AsmUtil {
|
|||||||
StackValue.coerce(operationType, baseType, v);
|
StackValue.coerce(operationType, baseType, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void swap(InstructionAdapter v, Type stackTop, Type afterTop) {
|
|
||||||
if (stackTop.getSize() == 1) {
|
|
||||||
if (afterTop.getSize() == 1) {
|
|
||||||
v.swap();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
v.dupX2();
|
|
||||||
v.pop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (afterTop.getSize() == 1) {
|
|
||||||
v.dup2X1();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
v.dup2X2();
|
|
||||||
}
|
|
||||||
v.pop2();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void genNotNullAssertionsForParameters(
|
static void genNotNullAssertionsForParameters(
|
||||||
@NotNull InstructionAdapter v,
|
@NotNull InstructionAdapter v,
|
||||||
@NotNull GenerationState state,
|
@NotNull GenerationState state,
|
||||||
@@ -1075,26 +852,6 @@ public class AsmUtil {
|
|||||||
v.visitLabel(start);
|
v.visitLabel(start);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void pushDefaultValueOnStack(@NotNull Type type, @NotNull InstructionAdapter v) {
|
|
||||||
v.visitInsn(defaultValueOpcode(type));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int defaultValueOpcode(@NotNull Type type) {
|
|
||||||
if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) {
|
|
||||||
return ACONST_NULL;
|
|
||||||
}
|
|
||||||
if (type.getSort() == Type.FLOAT) {
|
|
||||||
return FCONST_0;
|
|
||||||
}
|
|
||||||
if (type.getSort() == Type.DOUBLE) {
|
|
||||||
return DCONST_0;
|
|
||||||
}
|
|
||||||
if (type.getSort() == Type.LONG) {
|
|
||||||
return LCONST_0;
|
|
||||||
}
|
|
||||||
return ICONST_0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isInstancePropertyWithStaticBackingField(@NotNull PropertyDescriptor propertyDescriptor) {
|
public static boolean isInstancePropertyWithStaticBackingField(@NotNull PropertyDescriptor propertyDescriptor) {
|
||||||
return propertyDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE &&
|
return propertyDescriptor.getKind() != CallableMemberDescriptor.Kind.FAKE_OVERRIDE &&
|
||||||
isObject(propertyDescriptor.getContainingDeclaration());
|
isObject(propertyDescriptor.getContainingDeclaration());
|
||||||
@@ -1128,135 +885,6 @@ public class AsmUtil {
|
|||||||
&& getVisibilityForBackingField(propertyDescriptor, false) == ACC_PUBLIC;
|
&& getVisibilityForBackingField(propertyDescriptor, false) == ACC_PUBLIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Type comparisonOperandType(Type left, Type right) {
|
|
||||||
if (left == Type.DOUBLE_TYPE || right == Type.DOUBLE_TYPE) return Type.DOUBLE_TYPE;
|
|
||||||
if (left == Type.FLOAT_TYPE || right == Type.FLOAT_TYPE) return Type.FLOAT_TYPE;
|
|
||||||
if (left == Type.LONG_TYPE || right == Type.LONG_TYPE) return Type.LONG_TYPE;
|
|
||||||
if (left == Type.CHAR_TYPE || right == Type.CHAR_TYPE) return Type.CHAR_TYPE;
|
|
||||||
return Type.INT_TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static Type numberFunctionOperandType(@NotNull Type expectedType) {
|
|
||||||
if (expectedType == Type.SHORT_TYPE || expectedType == Type.BYTE_TYPE || expectedType == Type.CHAR_TYPE) {
|
|
||||||
return Type.INT_TYPE;
|
|
||||||
}
|
|
||||||
return expectedType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void pop(@NotNull MethodVisitor v, @NotNull Type type) {
|
|
||||||
if (type.getSize() == 2) {
|
|
||||||
v.visitInsn(Opcodes.POP2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
v.visitInsn(Opcodes.POP);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void pop2(@NotNull MethodVisitor v, @NotNull Type topOfStack, @NotNull Type afterTop) {
|
|
||||||
if (topOfStack.getSize() == 1 && afterTop.getSize() == 1) {
|
|
||||||
v.visitInsn(POP2);
|
|
||||||
} else {
|
|
||||||
pop(v, topOfStack);
|
|
||||||
pop(v, afterTop);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void pop2(@NotNull MethodVisitor v, @NotNull Type type) {
|
|
||||||
if (type.getSize() == 2) {
|
|
||||||
v.visitInsn(Opcodes.POP2);
|
|
||||||
v.visitInsn(Opcodes.POP2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
v.visitInsn(Opcodes.POP2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void dup(@NotNull InstructionAdapter v, @NotNull Type type) {
|
|
||||||
dup(v, type.getSize());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void dup(@NotNull InstructionAdapter v, int size) {
|
|
||||||
if (size == 2) {
|
|
||||||
v.dup2();
|
|
||||||
}
|
|
||||||
else if (size == 1) {
|
|
||||||
v.dup();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void dupx(@NotNull InstructionAdapter v, @NotNull Type type) {
|
|
||||||
dupx(v, type.getSize());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void dupx(@NotNull InstructionAdapter v, int size) {
|
|
||||||
if (size == 2) {
|
|
||||||
v.dup2X2();
|
|
||||||
}
|
|
||||||
else if (size == 1) {
|
|
||||||
v.dupX1();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Duplicate the element afterTop and push it on the top of the stack.
|
|
||||||
public static void dupSecond(@NotNull InstructionAdapter v, @NotNull Type topOfStack, @NotNull Type afterTop) {
|
|
||||||
if (afterTop.getSize() == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (topOfStack.getSize() == 0) {
|
|
||||||
dup(v, afterTop);
|
|
||||||
} else if (topOfStack.getSize() == 1 && afterTop.getSize() == 1) {
|
|
||||||
v.dup2();
|
|
||||||
v.pop();
|
|
||||||
} else {
|
|
||||||
swap(v, topOfStack, afterTop);
|
|
||||||
if (topOfStack.getSize() == 1 && afterTop.getSize() == 2) {
|
|
||||||
v.dup2X1();
|
|
||||||
} else if (topOfStack.getSize() == 2 && afterTop.getSize() == 1) {
|
|
||||||
v.dupX2();
|
|
||||||
} else /* top = 2, after top = 2 */ {
|
|
||||||
v.dup2X2();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void dup(@NotNull InstructionAdapter v, @NotNull Type topOfStack, @NotNull Type afterTop) {
|
|
||||||
if (topOfStack.getSize() == 0 && afterTop.getSize() == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (topOfStack.getSize() == 0) {
|
|
||||||
dup(v, afterTop);
|
|
||||||
}
|
|
||||||
else if (afterTop.getSize() == 0) {
|
|
||||||
dup(v, topOfStack);
|
|
||||||
}
|
|
||||||
else if (afterTop.getSize() == 1) {
|
|
||||||
if (topOfStack.getSize() == 1) {
|
|
||||||
dup(v, 2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
v.dup2X1();
|
|
||||||
v.pop2();
|
|
||||||
v.dupX2();
|
|
||||||
v.dupX2();
|
|
||||||
v.pop();
|
|
||||||
v.dup2X1();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
//Note: it's possible to write dup3 and dup4
|
|
||||||
throw new UnsupportedOperationException("Don't know how generate dup3/dup4 for: " + topOfStack + " and " + afterTop);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void writeAnnotationData(
|
public static void writeAnnotationData(
|
||||||
@NotNull AnnotationVisitor av,
|
@NotNull AnnotationVisitor av,
|
||||||
@NotNull DescriptorSerializer serializer,
|
@NotNull DescriptorSerializer serializer,
|
||||||
@@ -1268,38 +896,7 @@ public class AsmUtil {
|
|||||||
public static void writeAnnotationData(
|
public static void writeAnnotationData(
|
||||||
@NotNull AnnotationVisitor av, @NotNull MessageLite message, @NotNull JvmStringTable stringTable
|
@NotNull AnnotationVisitor av, @NotNull MessageLite message, @NotNull JvmStringTable stringTable
|
||||||
) {
|
) {
|
||||||
writeAnnotationData(av, JvmProtoBufUtil.writeData(message, stringTable), ArrayUtil.toStringArray(stringTable.getStrings()));
|
AsmUtil.writeAnnotationData(av, JvmProtoBufUtil.writeData(message, stringTable), ArrayUtil.toStringArray(stringTable.getStrings()));
|
||||||
}
|
|
||||||
|
|
||||||
public static void writeAnnotationData(
|
|
||||||
@NotNull AnnotationVisitor av, @NotNull String[] data, @NotNull String[] strings
|
|
||||||
) {
|
|
||||||
AnnotationVisitor dataVisitor = av.visitArray(JvmAnnotationNames.METADATA_DATA_FIELD_NAME);
|
|
||||||
for (String string : data) {
|
|
||||||
dataVisitor.visit(null, string);
|
|
||||||
}
|
|
||||||
dataVisitor.visitEnd();
|
|
||||||
|
|
||||||
AnnotationVisitor stringsVisitor = av.visitArray(JvmAnnotationNames.METADATA_STRINGS_FIELD_NAME);
|
|
||||||
for (String string : strings) {
|
|
||||||
stringsVisitor.visit(null, string);
|
|
||||||
}
|
|
||||||
stringsVisitor.visitEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static Type asmTypeByFqNameWithoutInnerClasses(@NotNull FqName fqName) {
|
|
||||||
return Type.getObjectType(internalNameByFqNameWithoutInnerClasses(fqName));
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static Type asmTypeByClassId(@NotNull ClassId classId) {
|
|
||||||
return Type.getObjectType(classId.asString().replace('.', '$'));
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static String internalNameByFqNameWithoutInnerClasses(@NotNull FqName fqName) {
|
|
||||||
return JvmClassName.byFqNameWithoutInnerClasses(fqName).getInternalName();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void putJavaLangClassInstance(
|
public static void putJavaLangClassInstance(
|
||||||
@@ -1312,21 +909,13 @@ public class AsmUtil {
|
|||||||
v.aconst(boxType(type, kotlinType, typeMapper));
|
v.aconst(boxType(type, kotlinType, typeMapper));
|
||||||
}
|
}
|
||||||
else if (isPrimitive(type)) {
|
else if (isPrimitive(type)) {
|
||||||
v.getstatic(boxType(type).getInternalName(), "TYPE", "Ljava/lang/Class;");
|
v.getstatic(AsmUtil.boxType(type).getInternalName(), "TYPE", "Ljava/lang/Class;");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
v.aconst(type);
|
v.aconst(type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void wrapJavaClassIntoKClass(@NotNull InstructionAdapter v) {
|
|
||||||
v.invokestatic(REFLECTION, "getOrCreateKotlinClass", Type.getMethodDescriptor(K_CLASS_TYPE, getType(Class.class)), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void wrapJavaClassesIntoKClasses(@NotNull InstructionAdapter v) {
|
|
||||||
v.invokestatic(REFLECTION, "getOrCreateKotlinClasses", Type.getMethodDescriptor(K_CLASS_ARRAY_TYPE, getType(Class[].class)), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getReceiverIndex(@NotNull CodegenContext context, @NotNull CallableMemberDescriptor descriptor) {
|
public static int getReceiverIndex(@NotNull CodegenContext context, @NotNull CallableMemberDescriptor descriptor) {
|
||||||
OwnerKind kind = context.getContextKind();
|
OwnerKind kind = context.getContextKind();
|
||||||
//Trait always should have this descriptor
|
//Trait always should have this descriptor
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.codegen
|
package org.jetbrains.kotlin.codegen
|
||||||
|
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.genTotalOrderEqualsForExpressionOnStack
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.genTotalOrderEqualsForExpressionOnStack
|
||||||
import org.jetbrains.kotlin.codegen.context.ClassContext
|
import org.jetbrains.kotlin.codegen.context.ClassContext
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
||||||
|
|||||||
@@ -54,7 +54,6 @@ import org.jetbrains.kotlin.lexer.KtTokens;
|
|||||||
import org.jetbrains.kotlin.load.java.DescriptorsJvmAbiUtil;
|
import org.jetbrains.kotlin.load.java.DescriptorsJvmAbiUtil;
|
||||||
import org.jetbrains.kotlin.load.kotlin.DescriptorBasedTypeSignatureMappingKt;
|
import org.jetbrains.kotlin.load.kotlin.DescriptorBasedTypeSignatureMappingKt;
|
||||||
import org.jetbrains.kotlin.load.kotlin.MethodSignatureMappingKt;
|
import org.jetbrains.kotlin.load.kotlin.MethodSignatureMappingKt;
|
||||||
import org.jetbrains.kotlin.load.kotlin.TypeSignatureMappingKt;
|
|
||||||
import org.jetbrains.kotlin.name.Name;
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.psi.*;
|
import org.jetbrains.kotlin.psi.*;
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt;
|
import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt;
|
||||||
@@ -98,8 +97,11 @@ import java.util.function.Supplier;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isInt;
|
import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isInt;
|
||||||
|
import static org.jetbrains.kotlin.codegen.AsmUtil.boxType;
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
||||||
import static org.jetbrains.kotlin.codegen.CodegenUtilKt.*;
|
import static org.jetbrains.kotlin.codegen.CodegenUtilKt.*;
|
||||||
|
import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.boxType;
|
||||||
|
import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.*;
|
||||||
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.*;
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.*;
|
||||||
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.*;
|
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.*;
|
||||||
import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtilsKt.*;
|
import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtilsKt.*;
|
||||||
@@ -1526,7 +1528,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
assert !functionIndex.isEmpty();
|
assert !functionIndex.isEmpty();
|
||||||
|
|
||||||
String localVariableName = AsmUtil.LOCAL_FUNCTION_VARIABLE_PREFIX
|
String localVariableName = AsmUtil.LOCAL_FUNCTION_VARIABLE_PREFIX
|
||||||
+ VariableAsmNameManglingUtils.mangleNameIfNeeded(functionDescriptor.getName().asString())
|
+ CommonVariableAsmNameManglingUtils.mangleNameIfNeeded(functionDescriptor.getName().asString())
|
||||||
+ "$" + functionIndex;
|
+ "$" + functionIndex;
|
||||||
|
|
||||||
v.visitLocalVariable(localVariableName, type.getDescriptor(), null, scopeStart, blockEnd, index);
|
v.visitLocalVariable(localVariableName, type.getDescriptor(), null, scopeStart, blockEnd, index);
|
||||||
@@ -1814,7 +1816,8 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
|
|
||||||
FunctionDescriptor originalSuspendLambdaDescriptor = getOriginalSuspendLambdaDescriptorFromContext(context);
|
FunctionDescriptor originalSuspendLambdaDescriptor = getOriginalSuspendLambdaDescriptorFromContext(context);
|
||||||
boolean isVoidCoroutineLambda =
|
boolean isVoidCoroutineLambda =
|
||||||
originalSuspendLambdaDescriptor != null && DescriptorBasedTypeSignatureMappingKt.hasVoidReturnType(originalSuspendLambdaDescriptor);
|
originalSuspendLambdaDescriptor != null && DescriptorBasedTypeSignatureMappingKt
|
||||||
|
.hasVoidReturnType(originalSuspendLambdaDescriptor);
|
||||||
|
|
||||||
KotlinType originalReturnTypeOfSuspendFunctionReturningUnboxedInlineClass =
|
KotlinType originalReturnTypeOfSuspendFunctionReturningUnboxedInlineClass =
|
||||||
CoroutineCodegenUtilKt.originalReturnTypeOfSuspendFunctionReturningUnboxedInlineClass(
|
CoroutineCodegenUtilKt.originalReturnTypeOfSuspendFunctionReturningUnboxedInlineClass(
|
||||||
@@ -2272,7 +2275,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
fieldAccessorKind = AccessorKind.NORMAL;
|
fieldAccessorKind = AccessorKind.NORMAL;
|
||||||
}
|
}
|
||||||
boolean isStaticBackingField = DescriptorUtils.isStaticDeclaration(propertyDescriptor) ||
|
boolean isStaticBackingField = DescriptorUtils.isStaticDeclaration(propertyDescriptor) ||
|
||||||
AsmUtil.isInstancePropertyWithStaticBackingField(propertyDescriptor);
|
DescriptorAsmUtil.isInstancePropertyWithStaticBackingField(propertyDescriptor);
|
||||||
boolean isSuper = superCallTarget != null;
|
boolean isSuper = superCallTarget != null;
|
||||||
boolean isExtensionProperty = propertyDescriptor.getExtensionReceiverParameter() != null;
|
boolean isExtensionProperty = propertyDescriptor.getExtensionReceiverParameter() != null;
|
||||||
|
|
||||||
@@ -2285,7 +2288,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
CodegenContext<?> backingFieldContext = getBackingFieldContext(fieldAccessorKind, containingDeclaration);
|
CodegenContext<?> backingFieldContext = getBackingFieldContext(fieldAccessorKind, containingDeclaration);
|
||||||
boolean isPrivateProperty =
|
boolean isPrivateProperty =
|
||||||
fieldAccessorKind != AccessorKind.NORMAL &&
|
fieldAccessorKind != AccessorKind.NORMAL &&
|
||||||
(AsmUtil.getVisibilityForBackingField(propertyDescriptor, isDelegatedProperty) & ACC_PRIVATE) != 0;
|
(DescriptorAsmUtil.getVisibilityForBackingField(propertyDescriptor, isDelegatedProperty) & ACC_PRIVATE) != 0;
|
||||||
DeclarationDescriptor ownerDescriptor;
|
DeclarationDescriptor ownerDescriptor;
|
||||||
boolean skipPropertyAccessors;
|
boolean skipPropertyAccessors;
|
||||||
|
|
||||||
@@ -3031,7 +3034,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
int accessFlag = AsmUtil.getVisibilityAccessFlag(companionObjectDescriptor);
|
int accessFlag = DescriptorAsmUtil.getVisibilityAccessFlag(companionObjectDescriptor);
|
||||||
|
|
||||||
CodegenContext context = contextBeforeInline.getFirstCrossInlineOrNonInlineContext();
|
CodegenContext context = contextBeforeInline.getFirstCrossInlineOrNonInlineContext();
|
||||||
boolean isInlineMethodContext = context.isInlineMethodContext();
|
boolean isInlineMethodContext = context.isInlineMethodContext();
|
||||||
@@ -4001,7 +4004,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
Type rightType = right754Type.isNullable ? AsmUtil.boxType(right754Type.type) : right754Type.type;
|
Type rightType = right754Type.isNullable ? AsmUtil.boxType(right754Type.type) : right754Type.type;
|
||||||
gen(right, rightType);
|
gen(right, rightType);
|
||||||
|
|
||||||
AsmUtil.genIEEE754EqualForNullableTypesCall(v, leftType, rightType);
|
DescriptorAsmUtil.genIEEE754EqualForNullableTypesCall(v, leftType, rightType);
|
||||||
|
|
||||||
if (opToken == KtTokens.EXCLEQ) {
|
if (opToken == KtTokens.EXCLEQ) {
|
||||||
genInvertBoolean(v);
|
genInvertBoolean(v);
|
||||||
|
|||||||
@@ -67,8 +67,10 @@ import java.io.StringWriter;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
import static org.jetbrains.kotlin.codegen.AsmUtil.CAPTURED_THIS_FIELD;
|
||||||
|
import static org.jetbrains.kotlin.codegen.AsmUtil.boxType;
|
||||||
import static org.jetbrains.kotlin.codegen.CodegenUtilKt.generateBridgeForMainFunctionIfNecessary;
|
import static org.jetbrains.kotlin.codegen.CodegenUtilKt.generateBridgeForMainFunctionIfNecessary;
|
||||||
|
import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.*;
|
||||||
import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION;
|
import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION;
|
||||||
import static org.jetbrains.kotlin.codegen.state.KotlinTypeMapper.isAccessor;
|
import static org.jetbrains.kotlin.codegen.state.KotlinTypeMapper.isAccessor;
|
||||||
import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION;
|
import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION;
|
||||||
@@ -609,7 +611,7 @@ public class FunctionCodegen {
|
|||||||
else if (isCompatibilityStubInDefaultImpls(functionDescriptor, context, jvmDefaultMode)) {
|
else if (isCompatibilityStubInDefaultImpls(functionDescriptor, context, jvmDefaultMode)) {
|
||||||
FunctionDescriptor compatibility = ((DefaultImplsClassContext) context.getParentContext()).getInterfaceContext()
|
FunctionDescriptor compatibility = ((DefaultImplsClassContext) context.getParentContext()).getInterfaceContext()
|
||||||
.getAccessorForJvmDefaultCompatibility(functionDescriptor);
|
.getAccessorForJvmDefaultCompatibility(functionDescriptor);
|
||||||
int flags = AsmUtil.getMethodAsmFlags(functionDescriptor, OwnerKind.DEFAULT_IMPLS, context.getState());
|
int flags = DescriptorAsmUtil.getMethodAsmFlags(functionDescriptor, OwnerKind.DEFAULT_IMPLS, context.getState());
|
||||||
assert (flags & Opcodes.ACC_ABSTRACT) == 0 : "Interface method with body should be non-abstract" + functionDescriptor;
|
assert (flags & Opcodes.ACC_ABSTRACT) == 0 : "Interface method with body should be non-abstract" + functionDescriptor;
|
||||||
CallableMethod method = typeMapper.mapToCallableMethod(compatibility, false);
|
CallableMethod method = typeMapper.mapToCallableMethod(compatibility, false);
|
||||||
|
|
||||||
@@ -761,7 +763,7 @@ public class FunctionCodegen {
|
|||||||
generateLocalVariablesForParameters(mv,
|
generateLocalVariablesForParameters(mv,
|
||||||
jvmMethodSignature, functionDescriptor,
|
jvmMethodSignature, functionDescriptor,
|
||||||
thisType, methodBegin, methodEnd, functionDescriptor.getValueParameters(),
|
thisType, methodBegin, methodEnd, functionDescriptor.getValueParameters(),
|
||||||
AsmUtil.isStaticMethod(ownerKind, functionDescriptor), state
|
DescriptorAsmUtil.isStaticMethod(ownerKind, functionDescriptor), state
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -809,7 +811,7 @@ public class FunctionCodegen {
|
|||||||
: nameForDestructuredParameter;
|
: nameForDestructuredParameter;
|
||||||
break;
|
break;
|
||||||
case RECEIVER:
|
case RECEIVER:
|
||||||
parameterName = AsmUtil.getNameForReceiverParameter(
|
parameterName = DescriptorAsmUtil.getNameForReceiverParameter(
|
||||||
functionDescriptor, typeMapper.getBindingContext(), state.getLanguageVersionSettings());
|
functionDescriptor, typeMapper.getBindingContext(), state.getLanguageVersionSettings());
|
||||||
break;
|
break;
|
||||||
case OUTER:
|
case OUTER:
|
||||||
@@ -1411,7 +1413,7 @@ public class FunctionCodegen {
|
|||||||
if (isVarargInvoke) {
|
if (isVarargInvoke) {
|
||||||
assert argTypes.length == 1 && argTypes[0].equals(AsmUtil.getArrayType(OBJECT_TYPE)) :
|
assert argTypes.length == 1 && argTypes[0].equals(AsmUtil.getArrayType(OBJECT_TYPE)) :
|
||||||
"Vararg invoke must have one parameter of type [Ljava/lang/Object;: " + bridge;
|
"Vararg invoke must have one parameter of type [Ljava/lang/Object;: " + bridge;
|
||||||
AsmUtil.generateVarargInvokeArityAssert(iv, originalArgTypes.length);
|
DescriptorAsmUtil.generateVarargInvokeArityAssert(iv, originalArgTypes.length);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
assert argTypes.length == originalArgTypes.length :
|
assert argTypes.length == originalArgTypes.length :
|
||||||
@@ -1616,7 +1618,7 @@ public class FunctionCodegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//noinspection ConstantConditions
|
//noinspection ConstantConditions
|
||||||
StackValue stackValue = AsmUtil.genNotNullAssertions(
|
StackValue stackValue = DescriptorAsmUtil.genNotNullAssertions(
|
||||||
state,
|
state,
|
||||||
StackValue.onStack(delegateToMethod.getReturnType(), delegatedTo.getReturnType()),
|
StackValue.onStack(delegateToMethod.getReturnType(), delegatedTo.getReturnType()),
|
||||||
RuntimeAssertionInfo.create(
|
RuntimeAssertionInfo.create(
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import org.jetbrains.org.objectweb.asm.commons.Method;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
||||||
|
import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.*;
|
||||||
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.JAVA_STRING_TYPE;
|
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.JAVA_STRING_TYPE;
|
||||||
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE;
|
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE;
|
||||||
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
||||||
|
|||||||
@@ -64,14 +64,16 @@ import java.util.*;
|
|||||||
|
|
||||||
import static org.jetbrains.kotlin.builtins.StandardNames.ENUM_VALUES;
|
import static org.jetbrains.kotlin.builtins.StandardNames.ENUM_VALUES;
|
||||||
import static org.jetbrains.kotlin.builtins.StandardNames.ENUM_VALUE_OF;
|
import static org.jetbrains.kotlin.builtins.StandardNames.ENUM_VALUE_OF;
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
import static org.jetbrains.kotlin.codegen.AsmUtil.CAPTURED_THIS_FIELD;
|
||||||
import static org.jetbrains.kotlin.codegen.CodegenUtilKt.isGenericToArray;
|
import static org.jetbrains.kotlin.codegen.CodegenUtilKt.isGenericToArray;
|
||||||
import static org.jetbrains.kotlin.codegen.CodegenUtilKt.isNonGenericToArray;
|
import static org.jetbrains.kotlin.codegen.CodegenUtilKt.isNonGenericToArray;
|
||||||
|
import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.*;
|
||||||
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.*;
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.*;
|
||||||
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.enumEntryNeedSubclass;
|
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.enumEntryNeedSubclass;
|
||||||
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.getDelegatedLocalVariableMetadata;
|
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.getDelegatedLocalVariableMetadata;
|
||||||
import static org.jetbrains.kotlin.load.java.DescriptorsJvmAbiUtil.*;
|
import static org.jetbrains.kotlin.load.java.DescriptorsJvmAbiUtil.*;
|
||||||
import static org.jetbrains.kotlin.load.java.JvmAbi.*;
|
import static org.jetbrains.kotlin.load.java.JvmAbi.HIDDEN_INSTANCE_FIELD;
|
||||||
|
import static org.jetbrains.kotlin.load.java.JvmAbi.INSTANCE_FIELD;
|
||||||
import static org.jetbrains.kotlin.resolve.BindingContext.INDEXED_LVALUE_GET;
|
import static org.jetbrains.kotlin.resolve.BindingContext.INDEXED_LVALUE_GET;
|
||||||
import static org.jetbrains.kotlin.resolve.BindingContext.INDEXED_LVALUE_SET;
|
import static org.jetbrains.kotlin.resolve.BindingContext.INDEXED_LVALUE_SET;
|
||||||
import static org.jetbrains.kotlin.resolve.BindingContextUtils.getNotNull;
|
import static org.jetbrains.kotlin.resolve.BindingContextUtils.getNotNull;
|
||||||
|
|||||||
@@ -57,8 +57,8 @@ import org.jetbrains.org.objectweb.asm.commons.Method;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.calculateInnerClassAccessFlags;
|
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive;
|
import static org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive;
|
||||||
|
import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.calculateInnerClassAccessFlags;
|
||||||
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isNonDefaultInterfaceMember;
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isNonDefaultInterfaceMember;
|
||||||
import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtilsKt.getInlineName;
|
import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtilsKt.getInlineName;
|
||||||
import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED;
|
import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED;
|
||||||
@@ -258,7 +258,7 @@ public abstract class MemberCodegen<T extends KtPureElement/* TODO: & KtDeclarat
|
|||||||
@NotNull Method syntheticMethod,
|
@NotNull Method syntheticMethod,
|
||||||
@NotNull Annotations annotations
|
@NotNull Annotations annotations
|
||||||
) {
|
) {
|
||||||
int flags = ACC_DEPRECATED | ACC_STATIC | ACC_SYNTHETIC | AsmUtil.getVisibilityAccessFlag(descriptor);
|
int flags = ACC_DEPRECATED | ACC_STATIC | ACC_SYNTHETIC | DescriptorAsmUtil.getVisibilityAccessFlag(descriptor);
|
||||||
MethodVisitor mv = v.newMethod(JvmDeclarationOriginKt.OtherOrigin(descriptor), flags, syntheticMethod.getName(),
|
MethodVisitor mv = v.newMethod(JvmDeclarationOriginKt.OtherOrigin(descriptor), flags, syntheticMethod.getName(),
|
||||||
syntheticMethod.getDescriptor(), null, null);
|
syntheticMethod.getDescriptor(), null, null);
|
||||||
AnnotationCodegen.forMethod(mv, this, state).genAnnotations(new AnnotatedImpl(annotations), Type.VOID_TYPE, null);
|
AnnotationCodegen.forMethod(mv, this, state).genAnnotations(new AnnotatedImpl(annotations), Type.VOID_TYPE, null);
|
||||||
|
|||||||
@@ -225,7 +225,7 @@ class MultifileClassCodegenImpl(
|
|||||||
|
|
||||||
private fun shouldGenerateInFacade(descriptor: MemberDescriptor): Boolean {
|
private fun shouldGenerateInFacade(descriptor: MemberDescriptor): Boolean {
|
||||||
if (DescriptorVisibilities.isPrivate(descriptor.visibility)) return false
|
if (DescriptorVisibilities.isPrivate(descriptor.visibility)) return false
|
||||||
if (AsmUtil.getVisibilityAccessFlag(descriptor) == Opcodes.ACC_PRIVATE) return false
|
if (DescriptorAsmUtil.getVisibilityAccessFlag(descriptor) == Opcodes.ACC_PRIVATE) return false
|
||||||
|
|
||||||
if (!state.classBuilderMode.generateBodies) return true
|
if (!state.classBuilderMode.generateBodies) return true
|
||||||
|
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ class MultifileClassPartCodegen(
|
|||||||
val extraFlags = if (shouldGeneratePartHierarchy) JvmAnnotationNames.METADATA_MULTIFILE_PARTS_INHERIT_FLAG else 0
|
val extraFlags = if (shouldGeneratePartHierarchy) JvmAnnotationNames.METADATA_MULTIFILE_PARTS_INHERIT_FLAG else 0
|
||||||
|
|
||||||
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART, extraFlags) { av ->
|
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.MULTIFILE_CLASS_PART, extraFlags) { av ->
|
||||||
AsmUtil.writeAnnotationData(av, serializer, packageProto)
|
DescriptorAsmUtil.writeAnnotationData(av, serializer, packageProto)
|
||||||
av.visit(JvmAnnotationNames.METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME, facadeClassType.internalName)
|
av.visit(JvmAnnotationNames.METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME, facadeClassType.internalName)
|
||||||
|
|
||||||
val kotlinPackageFqName = element.packageFqName
|
val kotlinPackageFqName = element.packageFqName
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ import org.jetbrains.org.objectweb.asm.Type;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.writeAnnotationData;
|
import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.writeAnnotationData;
|
||||||
import static org.jetbrains.kotlin.load.java.JvmAnnotationNames.METADATA_PACKAGE_NAME_FIELD_NAME;
|
import static org.jetbrains.kotlin.load.java.JvmAnnotationNames.METADATA_PACKAGE_NAME_FIELD_NAME;
|
||||||
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
||||||
|
|
||||||
|
|||||||
@@ -44,8 +44,8 @@ import org.jetbrains.org.objectweb.asm.commons.Method;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.getDeprecatedAccessFlag;
|
import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.getDeprecatedAccessFlag;
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.getVisibilityForBackingField;
|
import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.getVisibilityForBackingField;
|
||||||
import static org.jetbrains.kotlin.codegen.FunctionCodegen.processInterfaceMethod;
|
import static org.jetbrains.kotlin.codegen.FunctionCodegen.processInterfaceMethod;
|
||||||
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConstOrHasJvmFieldAnnotation;
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConstOrHasJvmFieldAnnotation;
|
||||||
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface;
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface;
|
||||||
@@ -408,7 +408,7 @@ public class PropertyCodegen {
|
|||||||
ClassBuilder builder = v;
|
ClassBuilder builder = v;
|
||||||
|
|
||||||
FieldOwnerContext backingFieldContext = context;
|
FieldOwnerContext backingFieldContext = context;
|
||||||
if (AsmUtil.isInstancePropertyWithStaticBackingField(propertyDescriptor) ) {
|
if (DescriptorAsmUtil.isInstancePropertyWithStaticBackingField(propertyDescriptor) ) {
|
||||||
modifiers |= ACC_STATIC;
|
modifiers |= ACC_STATIC;
|
||||||
|
|
||||||
if (DescriptorsJvmAbiUtil.isPropertyWithBackingFieldInOuterClass(propertyDescriptor)) {
|
if (DescriptorsJvmAbiUtil.isPropertyWithBackingFieldInOuterClass(propertyDescriptor)) {
|
||||||
@@ -419,7 +419,7 @@ public class PropertyCodegen {
|
|||||||
}
|
}
|
||||||
modifiers |= getVisibilityForBackingField(propertyDescriptor, isDelegate);
|
modifiers |= getVisibilityForBackingField(propertyDescriptor, isDelegate);
|
||||||
|
|
||||||
if (AsmUtil.isPropertyWithBackingFieldCopyInOuterClass(propertyDescriptor)) {
|
if (DescriptorAsmUtil.isPropertyWithBackingFieldCopyInOuterClass(propertyDescriptor)) {
|
||||||
ImplementationBodyCodegen parentBodyCodegen = (ImplementationBodyCodegen) memberCodegen.getParentCodegen();
|
ImplementationBodyCodegen parentBodyCodegen = (ImplementationBodyCodegen) memberCodegen.getParentCodegen();
|
||||||
parentBodyCodegen.addCompanionObjectPropertyToCopy(propertyDescriptor, defaultValue);
|
parentBodyCodegen.addCompanionObjectPropertyToCopy(propertyDescriptor, defaultValue);
|
||||||
}
|
}
|
||||||
@@ -513,7 +513,7 @@ public class PropertyCodegen {
|
|||||||
private void generateAccessor(@Nullable KtPropertyAccessor accessor, @NotNull PropertyAccessorDescriptor descriptor) {
|
private void generateAccessor(@Nullable KtPropertyAccessor accessor, @NotNull PropertyAccessorDescriptor descriptor) {
|
||||||
if (context instanceof MultifileClassFacadeContext &&
|
if (context instanceof MultifileClassFacadeContext &&
|
||||||
(DescriptorVisibilities.isPrivate(descriptor.getVisibility()) ||
|
(DescriptorVisibilities.isPrivate(descriptor.getVisibility()) ||
|
||||||
AsmUtil.getVisibilityAccessFlag(descriptor) == Opcodes.ACC_PRIVATE)) {
|
DescriptorAsmUtil.getVisibilityAccessFlag(descriptor) == Opcodes.ACC_PRIVATE)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,8 +92,8 @@ class PropertyReferenceCodegen(
|
|||||||
element,
|
element,
|
||||||
state.classFileVersion,
|
state.classFileVersion,
|
||||||
ACC_FINAL or ACC_SUPER or
|
ACC_FINAL or ACC_SUPER or
|
||||||
AsmUtil.getVisibilityAccessFlagForClass(classDescriptor) or
|
DescriptorAsmUtil.getVisibilityAccessFlagForClass(classDescriptor) or
|
||||||
AsmUtil.getSyntheticAccessFlagForLambdaClass(classDescriptor),
|
DescriptorAsmUtil.getSyntheticAccessFlagForLambdaClass(classDescriptor),
|
||||||
asmType.internalName,
|
asmType.internalName,
|
||||||
null,
|
null,
|
||||||
superAsmType.internalName,
|
superAsmType.internalName,
|
||||||
@@ -108,7 +108,7 @@ class PropertyReferenceCodegen(
|
|||||||
if (JvmCodegenUtil.isConst(closure)) {
|
if (JvmCodegenUtil.isConst(closure)) {
|
||||||
generateConstInstance(asmType, wrapperMethod.returnType)
|
generateConstInstance(asmType, wrapperMethod.returnType)
|
||||||
} else {
|
} else {
|
||||||
AsmUtil.genClosureFields(closure, v, typeMapper, state.languageVersionSettings)
|
DescriptorAsmUtil.genClosureFields(closure, v, typeMapper, state.languageVersionSettings)
|
||||||
}
|
}
|
||||||
|
|
||||||
generateConstructor()
|
generateConstructor()
|
||||||
|
|||||||
@@ -46,7 +46,9 @@ import org.jetbrains.org.objectweb.asm.commons.Method;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
import static org.jetbrains.kotlin.codegen.AsmUtil.NO_FLAG_PACKAGE_PRIVATE;
|
||||||
|
import static org.jetbrains.kotlin.codegen.AsmUtil.asmTypeByFqNameWithoutInnerClasses;
|
||||||
|
import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.genAreEqualCall;
|
||||||
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.*;
|
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.*;
|
||||||
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
package org.jetbrains.kotlin.codegen
|
package org.jetbrains.kotlin.codegen
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.writeAnnotationData
|
|
||||||
import org.jetbrains.kotlin.codegen.context.CodegenContext
|
import org.jetbrains.kotlin.codegen.context.CodegenContext
|
||||||
import org.jetbrains.kotlin.codegen.context.MethodContext
|
import org.jetbrains.kotlin.codegen.context.MethodContext
|
||||||
import org.jetbrains.kotlin.codegen.context.ScriptContext
|
import org.jetbrains.kotlin.codegen.context.ScriptContext
|
||||||
@@ -71,7 +70,7 @@ class ScriptCodegen private constructor(
|
|||||||
val serializer = DescriptorSerializer.create(scriptDescriptor, JvmSerializerExtension(v.serializationBindings, state), null)
|
val serializer = DescriptorSerializer.create(scriptDescriptor, JvmSerializerExtension(v.serializationBindings, state), null)
|
||||||
val classProto = serializer.classProto(scriptDescriptor).build()
|
val classProto = serializer.classProto(scriptDescriptor).build()
|
||||||
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.CLASS, JvmAnnotationNames.METADATA_SCRIPT_FLAG) { av ->
|
writeKotlinMetadata(v, state, KotlinClassHeader.Kind.CLASS, JvmAnnotationNames.METADATA_SCRIPT_FLAG) { av ->
|
||||||
writeAnnotationData(av, serializer, classProto)
|
DescriptorAsmUtil.writeAnnotationData(av, serializer, classProto)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.codegen
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||||
import org.jetbrains.kotlin.resolve.jvm.checkers.isValidDalvikCharacter
|
|
||||||
|
|
||||||
const val DESTRUCTURED_LAMBDA_ARGUMENT_VARIABLE_PREFIX = "\$dstr\$"
|
const val DESTRUCTURED_LAMBDA_ARGUMENT_VARIABLE_PREFIX = "\$dstr\$"
|
||||||
|
|
||||||
@@ -26,25 +25,3 @@ fun getNameForDestructuredParameterOrNull(valueParameterDescriptor: ValueParamet
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun mangleNameIfNeeded(name: String): String {
|
|
||||||
if (name.all { it.isValidCharacter() }) {
|
|
||||||
return name
|
|
||||||
}
|
|
||||||
|
|
||||||
return buildString {
|
|
||||||
for (c in name) {
|
|
||||||
if (c.isValidCharacter()) {
|
|
||||||
append(c)
|
|
||||||
} else {
|
|
||||||
val hexString = Integer.toHexString(c.toInt())
|
|
||||||
assert(hexString.length <= 4)
|
|
||||||
append("_u").append(hexString)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun Char.isValidCharacter(): Boolean {
|
|
||||||
return this != '$' && this != '-' && isValidDalvikCharacter(this)
|
|
||||||
}
|
|
||||||
@@ -20,6 +20,7 @@ import com.intellij.openapi.util.Pair;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil;
|
import org.jetbrains.kotlin.codegen.AsmUtil;
|
||||||
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil;
|
||||||
import org.jetbrains.kotlin.codegen.context.EnclosedValueDescriptor;
|
import org.jetbrains.kotlin.codegen.context.EnclosedValueDescriptor;
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature;
|
import org.jetbrains.kotlin.config.LanguageFeature;
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings;
|
import org.jetbrains.kotlin.config.LanguageVersionSettings;
|
||||||
@@ -113,7 +114,7 @@ public final class MutableClosure implements CalculatedClosure {
|
|||||||
return AsmUtil.CAPTURED_RECEIVER_FIELD;
|
return AsmUtil.CAPTURED_RECEIVER_FIELD;
|
||||||
}
|
}
|
||||||
|
|
||||||
String labeledThis = AsmUtil.getNameForCapturedReceiverField(
|
String labeledThis = DescriptorAsmUtil.getNameForCapturedReceiverField(
|
||||||
enclosingFunWithReceiverDescriptor, bindingContext, languageVersionSettings);
|
enclosingFunWithReceiverDescriptor, bindingContext, languageVersionSettings);
|
||||||
|
|
||||||
return AsmUtil.getCapturedFieldName(labeledThis);
|
return AsmUtil.getCapturedFieldName(labeledThis);
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ fun InstructionAdapter.generateClosureFieldsInitializationFromParameters(
|
|||||||
k += fieldInfo.fieldType.size
|
k += fieldInfo.fieldType.size
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
k = AsmUtil.genAssignInstanceFieldFromParam(fieldInfo, k, this)
|
k = DescriptorAsmUtil.genAssignInstanceFieldFromParam(fieldInfo, k, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
return boundReferenceReceiverFieldInfo?.let { Pair(boundReferenceReceiverParameterIndex, it) }
|
return boundReferenceReceiverFieldInfo?.let { Pair(boundReferenceReceiverParameterIndex, it) }
|
||||||
@@ -122,7 +122,7 @@ internal fun generateCallableReferenceDeclarationContainerClass(
|
|||||||
// TODO: would it work for arrays?
|
// TODO: would it work for arrays?
|
||||||
val containerKotlinType = container.defaultType
|
val containerKotlinType = container.defaultType
|
||||||
val containerType = typeMapper.mapClass(container)
|
val containerType = typeMapper.mapClass(container)
|
||||||
AsmUtil.putJavaLangClassInstance(iv, containerType, containerKotlinType, typeMapper)
|
DescriptorAsmUtil.putJavaLangClassInstance(iv, containerType, containerKotlinType, typeMapper)
|
||||||
}
|
}
|
||||||
container is PackageFragmentDescriptor -> {
|
container is PackageFragmentDescriptor -> {
|
||||||
iv.aconst(typeMapper.mapOwner(descriptor))
|
iv.aconst(typeMapper.mapOwner(descriptor))
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
|
|||||||
import org.jetbrains.kotlin.config.JvmDefaultMode;
|
import org.jetbrains.kotlin.config.JvmDefaultMode;
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities;
|
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities;
|
||||||
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor;
|
|
||||||
import org.jetbrains.kotlin.name.Name;
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.psi.KtFile;
|
import org.jetbrains.kotlin.psi.KtFile;
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt;
|
import org.jetbrains.kotlin.resolve.jvm.annotations.JvmAnnotationUtilKt;
|
||||||
|
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor;
|
||||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager;
|
import org.jetbrains.kotlin.storage.LockBasedStorageManager;
|
||||||
import org.jetbrains.kotlin.storage.NullableLazyValue;
|
import org.jetbrains.kotlin.storage.NullableLazyValue;
|
||||||
import org.jetbrains.kotlin.types.KotlinType;
|
import org.jetbrains.kotlin.types.KotlinType;
|
||||||
@@ -27,7 +27,7 @@ import org.jetbrains.org.objectweb.asm.Type;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.getVisibilityAccessFlag;
|
import static org.jetbrains.kotlin.codegen.DescriptorAsmUtil.getVisibilityAccessFlag;
|
||||||
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isInSamePackage;
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isInSamePackage;
|
||||||
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isNonDefaultInterfaceMember;
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isNonDefaultInterfaceMember;
|
||||||
import static org.jetbrains.kotlin.resolve.inline.InlineOnlyKt.isInlineOnlyPrivateInBytecode;
|
import static org.jetbrains.kotlin.resolve.inline.InlineOnlyKt.isInlineOnlyPrivateInBytecode;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.codegen.context;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil;
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil;
|
||||||
import org.jetbrains.kotlin.codegen.JvmCodegenUtil;
|
import org.jetbrains.kotlin.codegen.JvmCodegenUtil;
|
||||||
import org.jetbrains.kotlin.codegen.OwnerKind;
|
import org.jetbrains.kotlin.codegen.OwnerKind;
|
||||||
import org.jetbrains.kotlin.codegen.StackValue;
|
import org.jetbrains.kotlin.codegen.StackValue;
|
||||||
@@ -67,7 +67,7 @@ public class MethodContext extends CodegenContext<CallableMemberDescriptor> {
|
|||||||
@SuppressWarnings("ConstantConditions")
|
@SuppressWarnings("ConstantConditions")
|
||||||
KotlinType kotlinType = getCallableDescriptorWithReceiver().getExtensionReceiverParameter().getType();
|
KotlinType kotlinType = getCallableDescriptorWithReceiver().getExtensionReceiverParameter().getType();
|
||||||
Type asmType = typeMapper.mapType(kotlinType);
|
Type asmType = typeMapper.mapType(kotlinType);
|
||||||
return StackValue.local(AsmUtil.getReceiverIndex(this, getContextDescriptor()), asmType, kotlinType);
|
return StackValue.local(DescriptorAsmUtil.getReceiverIndex(this, getContextDescriptor()), asmType, kotlinType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -311,7 +311,7 @@ class CoroutineCodegenForLambda private constructor(
|
|||||||
val untypedAsmMethod = typeMapper.mapAsmMethod(untypedDescriptor)
|
val untypedAsmMethod = typeMapper.mapAsmMethod(untypedDescriptor)
|
||||||
val jvmMethodSignature = typeMapper.mapSignatureSkipGeneric(untypedDescriptor)
|
val jvmMethodSignature = typeMapper.mapSignatureSkipGeneric(untypedDescriptor)
|
||||||
val mv = v.newMethod(
|
val mv = v.newMethod(
|
||||||
OtherOrigin(element, funDescriptor), AsmUtil.getVisibilityAccessFlag(untypedDescriptor) or Opcodes.ACC_FINAL,
|
OtherOrigin(element, funDescriptor), DescriptorAsmUtil.getVisibilityAccessFlag(untypedDescriptor) or Opcodes.ACC_FINAL,
|
||||||
untypedAsmMethod.name, untypedAsmMethod.descriptor, null, ArrayUtil.EMPTY_STRING_ARRAY
|
untypedAsmMethod.name, untypedAsmMethod.descriptor, null, ArrayUtil.EMPTY_STRING_ARRAY
|
||||||
)
|
)
|
||||||
mv.visitCode()
|
mv.visitCode()
|
||||||
@@ -448,7 +448,7 @@ class CoroutineCodegenForLambda private constructor(
|
|||||||
} else {
|
} else {
|
||||||
load(index, fieldInfoForCoroutineLambdaParameter.fieldType)
|
load(index, fieldInfoForCoroutineLambdaParameter.fieldType)
|
||||||
}
|
}
|
||||||
AsmUtil.genAssignInstanceFieldFromParam(
|
DescriptorAsmUtil.genAssignInstanceFieldFromParam(
|
||||||
fieldInfoForCoroutineLambdaParameter,
|
fieldInfoForCoroutineLambdaParameter,
|
||||||
index,
|
index,
|
||||||
this,
|
this,
|
||||||
@@ -486,7 +486,7 @@ class CoroutineCodegenForLambda private constructor(
|
|||||||
|
|
||||||
val name =
|
val name =
|
||||||
if (parameter is ReceiverParameterDescriptor)
|
if (parameter is ReceiverParameterDescriptor)
|
||||||
AsmUtil.getNameForReceiverParameter(originalSuspendFunctionDescriptor, bindingContext, languageVersionSettings)
|
DescriptorAsmUtil.getNameForReceiverParameter(originalSuspendFunctionDescriptor, bindingContext, languageVersionSettings)
|
||||||
else
|
else
|
||||||
(getNameForDestructuredParameterOrNull(parameter as ValueParameterDescriptor) ?: parameter.name.asString())
|
(getNameForDestructuredParameterOrNull(parameter as ValueParameterDescriptor) ?: parameter.name.asString())
|
||||||
val label = Label()
|
val label = Label()
|
||||||
@@ -778,7 +778,7 @@ class CoroutineCodegenForNamedFunction private constructor(
|
|||||||
serializer.functionProto(
|
serializer.functionProto(
|
||||||
createFreeFakeLambdaDescriptor(suspendFunctionJvmView, state.typeApproximator)
|
createFreeFakeLambdaDescriptor(suspendFunctionJvmView, state.typeApproximator)
|
||||||
)?.build() ?: return@writeKotlinMetadata
|
)?.build() ?: return@writeKotlinMetadata
|
||||||
AsmUtil.writeAnnotationData(av, serializer, functionProto)
|
DescriptorAsmUtil.writeAnnotationData(av, serializer, functionProto)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ fun generateParameterNames(
|
|||||||
if (!isEnumName) "\$enum\$name" else "\$enum\$ordinal"
|
if (!isEnumName) "\$enum\$name" else "\$enum\$ordinal"
|
||||||
}
|
}
|
||||||
JvmMethodParameterKind.RECEIVER -> {
|
JvmMethodParameterKind.RECEIVER -> {
|
||||||
AsmUtil.getNameForReceiverParameter(functionDescriptor, state.bindingContext, state.languageVersionSettings)
|
DescriptorAsmUtil.getNameForReceiverParameter(functionDescriptor, state.bindingContext, state.languageVersionSettings)
|
||||||
}
|
}
|
||||||
JvmMethodParameterKind.OUTER -> AsmUtil.CAPTURED_THIS_FIELD
|
JvmMethodParameterKind.OUTER -> AsmUtil.CAPTURED_THIS_FIELD
|
||||||
JvmMethodParameterKind.VALUE -> iterator.next().name.asString()
|
JvmMethodParameterKind.VALUE -> iterator.next().name.asString()
|
||||||
|
|||||||
+3
-3
@@ -235,7 +235,7 @@ class AnonymousObjectTransformer(
|
|||||||
}
|
}
|
||||||
return@action
|
return@action
|
||||||
}
|
}
|
||||||
AsmUtil.writeAnnotationData(av, newProto, newStringTable)
|
DescriptorAsmUtil.writeAnnotationData(av, newProto, newStringTable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -376,7 +376,7 @@ class AnonymousObjectTransformer(
|
|||||||
val capturedFieldInitializer = InstructionAdapter(constructorVisitor)
|
val capturedFieldInitializer = InstructionAdapter(constructorVisitor)
|
||||||
fieldInfoWithSkipped.forEachIndexed { paramIndex, fieldInfo ->
|
fieldInfoWithSkipped.forEachIndexed { paramIndex, fieldInfo ->
|
||||||
if (!newFieldsWithSkipped[paramIndex].skip) {
|
if (!newFieldsWithSkipped[paramIndex].skip) {
|
||||||
AsmUtil.genAssignInstanceFieldFromParam(fieldInfo, capturedIndexes[paramIndex], capturedFieldInitializer)
|
DescriptorAsmUtil.genAssignInstanceFieldFromParam(fieldInfo, capturedIndexes[paramIndex], capturedFieldInitializer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -419,7 +419,7 @@ class AnonymousObjectTransformer(
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
constructorVisitor.visitEnd()
|
constructorVisitor.visitEnd()
|
||||||
AsmUtil.genClosureFields(
|
DescriptorAsmUtil.genClosureFields(
|
||||||
toNameTypePair(filterSkipped(newFieldsWithSkipped)), classBuilder
|
toNameTypePair(filterSkipped(newFieldsWithSkipped)), classBuilder
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.codegen.inline
|
|||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.AsmUtil
|
||||||
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil
|
||||||
import org.jetbrains.kotlin.codegen.PropertyReferenceCodegen
|
import org.jetbrains.kotlin.codegen.PropertyReferenceCodegen
|
||||||
import org.jetbrains.kotlin.codegen.StackValue
|
import org.jetbrains.kotlin.codegen.StackValue
|
||||||
import org.jetbrains.kotlin.codegen.binding.CalculatedClosure
|
import org.jetbrains.kotlin.codegen.binding.CalculatedClosure
|
||||||
@@ -223,7 +224,7 @@ internal fun Type.boxReceiverForBoundReference() =
|
|||||||
AsmUtil.boxType(this)
|
AsmUtil.boxType(this)
|
||||||
|
|
||||||
internal fun Type.boxReceiverForBoundReference(kotlinType: KotlinType, typeMapper: KotlinTypeMapper) =
|
internal fun Type.boxReceiverForBoundReference(kotlinType: KotlinType, typeMapper: KotlinTypeMapper) =
|
||||||
AsmUtil.boxType(this, kotlinType, typeMapper)
|
DescriptorAsmUtil.boxType(this, kotlinType, typeMapper)
|
||||||
|
|
||||||
abstract class ExpressionLambda(isCrossInline: Boolean) : LambdaInfo(isCrossInline) {
|
abstract class ExpressionLambda(isCrossInline: Boolean) : LambdaInfo(isCrossInline) {
|
||||||
override fun generateLambdaBody(sourceCompiler: SourceCompilerForInline, reifiedTypeInliner: ReifiedTypeInliner<*>) {
|
override fun generateLambdaBody(sourceCompiler: SourceCompilerForInline, reifiedTypeInliner: ReifiedTypeInliner<*>) {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.codegen.inline
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.isSuspendFunctionTypeOrSubtype
|
import org.jetbrains.kotlin.builtins.isSuspendFunctionTypeOrSubtype
|
||||||
import org.jetbrains.kotlin.codegen.*
|
import org.jetbrains.kotlin.codegen.*
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.getMethodAsmFlags
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.getMethodAsmFlags
|
||||||
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
|
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
|||||||
|
|
||||||
class PsiInlineIntrinsicsSupport(private val state: GenerationState) : ReifiedTypeInliner.IntrinsicsSupport<KotlinType> {
|
class PsiInlineIntrinsicsSupport(private val state: GenerationState) : ReifiedTypeInliner.IntrinsicsSupport<KotlinType> {
|
||||||
override fun putClassInstance(v: InstructionAdapter, type: KotlinType) {
|
override fun putClassInstance(v: InstructionAdapter, type: KotlinType) {
|
||||||
AsmUtil.putJavaLangClassInstance(v, state.typeMapper.mapType(type), type, state.typeMapper)
|
DescriptorAsmUtil.putJavaLangClassInstance(v, state.typeMapper.mapType(type), type, state.typeMapper)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun generateTypeParameterContainer(v: InstructionAdapter, typeParameter: TypeParameterMarker) {
|
override fun generateTypeParameterContainer(v: InstructionAdapter, typeParameter: TypeParameterMarker) {
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ class PsiSourceCompilerForInline(private val codegen: ExpressionCodegen, overrid
|
|||||||
val jvmMethodSignature = state.typeMapper.mapSignatureSkipGeneric(invokeMethodDescriptor)
|
val jvmMethodSignature = state.typeMapper.mapSignatureSkipGeneric(invokeMethodDescriptor)
|
||||||
val asmMethod = jvmMethodSignature.asmMethod
|
val asmMethod = jvmMethodSignature.asmMethod
|
||||||
val methodNode = MethodNode(
|
val methodNode = MethodNode(
|
||||||
Opcodes.API_VERSION, AsmUtil.getMethodAsmFlags(invokeMethodDescriptor, OwnerKind.IMPLEMENTATION, state),
|
Opcodes.API_VERSION, DescriptorAsmUtil.getMethodAsmFlags(invokeMethodDescriptor, OwnerKind.IMPLEMENTATION, state),
|
||||||
asmMethod.name, asmMethod.descriptor, null, null
|
asmMethod.name, asmMethod.descriptor, null, null
|
||||||
)
|
)
|
||||||
val adapter = wrapWithMaxLocalCalc(methodNode)
|
val adapter = wrapWithMaxLocalCalc(methodNode)
|
||||||
@@ -274,7 +274,7 @@ class PsiSourceCompilerForInline(private val codegen: ExpressionCodegen, overrid
|
|||||||
|
|
||||||
val node = MethodNode(
|
val node = MethodNode(
|
||||||
Opcodes.API_VERSION,
|
Opcodes.API_VERSION,
|
||||||
AsmUtil.getMethodAsmFlags(callableDescriptor, context.contextKind, state) or if (callDefault) Opcodes.ACC_STATIC else 0,
|
DescriptorAsmUtil.getMethodAsmFlags(callableDescriptor, context.contextKind, state) or if (callDefault) Opcodes.ACC_STATIC else 0,
|
||||||
asmMethod.name,
|
asmMethod.name,
|
||||||
asmMethod.descriptor, null, null
|
asmMethod.descriptor, null, null
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.codegen.inline
|
package org.jetbrains.kotlin.codegen.inline
|
||||||
|
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil
|
||||||
import org.jetbrains.kotlin.codegen.OwnerKind
|
import org.jetbrains.kotlin.codegen.OwnerKind
|
||||||
import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner.Companion.isNeedClassReificationMarker
|
import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner.Companion.isNeedClassReificationMarker
|
||||||
import org.jetbrains.kotlin.codegen.optimization.common.InsnSequence
|
import org.jetbrains.kotlin.codegen.optimization.common.InsnSequence
|
||||||
@@ -50,7 +50,7 @@ fun extractDefaultLambdaOffsetAndDescriptor(
|
|||||||
val kind =
|
val kind =
|
||||||
if (DescriptorUtils.isInterface(containingDeclaration)) OwnerKind.DEFAULT_IMPLS
|
if (DescriptorUtils.isInterface(containingDeclaration)) OwnerKind.DEFAULT_IMPLS
|
||||||
else OwnerKind.getMemberOwnerKind(containingDeclaration)
|
else OwnerKind.getMemberOwnerKind(containingDeclaration)
|
||||||
val parameterOffsets = parameterOffsets(AsmUtil.isStaticMethod(kind, functionDescriptor), valueParameters)
|
val parameterOffsets = parameterOffsets(DescriptorAsmUtil.isStaticMethod(kind, functionDescriptor), valueParameters)
|
||||||
val valueParameterOffset = valueParameters.takeWhile { it.kind != JvmMethodParameterKind.VALUE }.size
|
val valueParameterOffset = valueParameters.takeWhile { it.kind != JvmMethodParameterKind.VALUE }.size
|
||||||
|
|
||||||
return functionDescriptor.valueParameters.filter {
|
return functionDescriptor.valueParameters.filter {
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ package org.jetbrains.kotlin.codegen.intrinsics
|
|||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.codegen.*
|
import org.jetbrains.kotlin.codegen.*
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.genInvokeAppendMethod
|
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.genStringBuilderConstructor
|
import org.jetbrains.kotlin.codegen.AsmUtil.genStringBuilderConstructor
|
||||||
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.genInvokeAppendMethod
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.KtBinaryExpression
|
import org.jetbrains.kotlin.psi.KtBinaryExpression
|
||||||
import org.jetbrains.kotlin.psi.KtCallableReferenceExpression
|
import org.jetbrains.kotlin.psi.KtCallableReferenceExpression
|
||||||
@@ -92,7 +92,7 @@ class Concat : IntrinsicMethod() {
|
|||||||
// in case of callable reference passed to a generic function, e.g.:
|
// in case of callable reference passed to a generic function, e.g.:
|
||||||
// charArrayOf('O', 'K').fold("", String::plus)
|
// charArrayOf('O', 'K').fold("", String::plus)
|
||||||
// TODO Make String::plus generic, and invoke proper StringBuilder#append.
|
// TODO Make String::plus generic, and invoke proper StringBuilder#append.
|
||||||
AsmUtil.genInvokeAppendMethod(v, AsmTypes.OBJECT_TYPE, null)
|
genInvokeAppendMethod(v, AsmTypes.OBJECT_TYPE, null)
|
||||||
v.invokevirtual("java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false)
|
v.invokevirtual("java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.codegen.intrinsics
|
package org.jetbrains.kotlin.codegen.intrinsics
|
||||||
|
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
|
||||||
import org.jetbrains.kotlin.codegen.Callable
|
import org.jetbrains.kotlin.codegen.Callable
|
||||||
import org.jetbrains.kotlin.codegen.CallableMethod
|
import org.jetbrains.kotlin.codegen.CallableMethod
|
||||||
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil
|
||||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE
|
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE
|
||||||
import org.jetbrains.org.objectweb.asm.Type
|
import org.jetbrains.org.objectweb.asm.Type
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ class Equals : IntrinsicMethod() {
|
|||||||
nullOrObject(method.dispatchReceiverType),
|
nullOrObject(method.dispatchReceiverType),
|
||||||
nullOrObject(method.extensionReceiverType)
|
nullOrObject(method.extensionReceiverType)
|
||||||
) {
|
) {
|
||||||
AsmUtil.genAreEqualCall(it)
|
DescriptorAsmUtil.genAreEqualCall(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.codegen.intrinsics
|
package org.jetbrains.kotlin.codegen.intrinsics
|
||||||
|
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.genIncrement
|
|
||||||
import org.jetbrains.kotlin.codegen.Callable
|
import org.jetbrains.kotlin.codegen.Callable
|
||||||
import org.jetbrains.kotlin.codegen.CallableMethod
|
import org.jetbrains.kotlin.codegen.CallableMethod
|
||||||
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.genIncrement
|
||||||
import org.jetbrains.kotlin.psi.KtPrefixExpression
|
import org.jetbrains.kotlin.psi.KtPrefixExpression
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.codegen.range
|
|||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
import org.jetbrains.kotlin.builtins.UnsignedTypes
|
import org.jetbrains.kotlin.builtins.UnsignedTypes
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitiveNumberClassDescriptor
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.isPrimitiveNumberClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils
|
import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
|||||||
+1
-1
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.codegen.range.forLoop
|
package org.jetbrains.kotlin.codegen.range.forLoop
|
||||||
|
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.genIncrement
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.genIncrement
|
||||||
import org.jetbrains.kotlin.codegen.ExpressionCodegen
|
import org.jetbrains.kotlin.codegen.ExpressionCodegen
|
||||||
import org.jetbrains.kotlin.codegen.StackValue
|
import org.jetbrains.kotlin.codegen.StackValue
|
||||||
import org.jetbrains.kotlin.codegen.range.comparison.ComparisonGenerator
|
import org.jetbrains.kotlin.codegen.range.comparison.ComparisonGenerator
|
||||||
|
|||||||
+2
-2
@@ -17,7 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.codegen.range.forLoop
|
package org.jetbrains.kotlin.codegen.range.forLoop
|
||||||
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.boxType
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil
|
||||||
import org.jetbrains.kotlin.codegen.ExpressionCodegen
|
import org.jetbrains.kotlin.codegen.ExpressionCodegen
|
||||||
import org.jetbrains.kotlin.codegen.StackValue
|
import org.jetbrains.kotlin.codegen.StackValue
|
||||||
import org.jetbrains.kotlin.psi.KtForExpression
|
import org.jetbrains.kotlin.psi.KtForExpression
|
||||||
@@ -79,7 +79,7 @@ class ForInArrayLoopGenerator(
|
|||||||
|
|
||||||
override fun assignToLoopParameter() {
|
override fun assignToLoopParameter() {
|
||||||
val arrayElParamType =
|
val arrayElParamType =
|
||||||
if (KotlinBuiltIns.isArray(loopRangeType)) boxType(asmElementType, elementType, codegen.state.typeMapper) else asmElementType
|
if (KotlinBuiltIns.isArray(loopRangeType)) DescriptorAsmUtil.boxType(asmElementType, elementType, codegen.state.typeMapper) else asmElementType
|
||||||
|
|
||||||
v.load(arrayVar, OBJECT_TYPE)
|
v.load(arrayVar, OBJECT_TYPE)
|
||||||
v.load(indexVar, Type.INT_TYPE)
|
v.load(indexVar, Type.INT_TYPE)
|
||||||
|
|||||||
@@ -12,10 +12,13 @@ import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor
|
|||||||
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
|
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
|
||||||
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
||||||
import org.jetbrains.kotlin.codegen.*
|
import org.jetbrains.kotlin.codegen.*
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.isStaticMethod
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.isStaticMethod
|
||||||
import org.jetbrains.kotlin.codegen.JvmCodegenUtil.*
|
import org.jetbrains.kotlin.codegen.JvmCodegenUtil.*
|
||||||
import org.jetbrains.kotlin.codegen.binding.CodegenBinding.*
|
import org.jetbrains.kotlin.codegen.binding.CodegenBinding.*
|
||||||
import org.jetbrains.kotlin.codegen.coroutines.*
|
import org.jetbrains.kotlin.codegen.coroutines.getOrCreateJvmSuspendFunctionView
|
||||||
|
import org.jetbrains.kotlin.codegen.coroutines.isSuspendFunctionNotSuspensionView
|
||||||
|
import org.jetbrains.kotlin.codegen.coroutines.originalReturnTypeOfSuspendFunctionReturningUnboxedInlineClass
|
||||||
|
import org.jetbrains.kotlin.codegen.coroutines.unwrapInitialDescriptorForSuspendFunction
|
||||||
import org.jetbrains.kotlin.codegen.inline.FictitiousArrayConstructor
|
import org.jetbrains.kotlin.codegen.inline.FictitiousArrayConstructor
|
||||||
import org.jetbrains.kotlin.codegen.signature.AsmTypeFactory
|
import org.jetbrains.kotlin.codegen.signature.AsmTypeFactory
|
||||||
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
|
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
|
||||||
@@ -51,7 +54,10 @@ import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression
|
|||||||
import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument
|
import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.VarargValueArgument
|
import org.jetbrains.kotlin.resolve.calls.model.VarargValueArgument
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.*
|
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.isPublishedApi
|
||||||
|
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.DEFAULT_CONSTRUCTOR_MARKER
|
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.DEFAULT_CONSTRUCTOR_MARKER
|
||||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE
|
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||||
|
|||||||
+2
-2
@@ -252,7 +252,7 @@ class ClassCodegen private constructor(
|
|||||||
writeKotlinMetadata(visitor, state, kind, extraFlags) {
|
writeKotlinMetadata(visitor, state, kind, extraFlags) {
|
||||||
if (metadata != null) {
|
if (metadata != null) {
|
||||||
metadataSerializer.serialize(metadata)?.let { (proto, stringTable) ->
|
metadataSerializer.serialize(metadata)?.let { (proto, stringTable) ->
|
||||||
AsmUtil.writeAnnotationData(it, proto, stringTable)
|
DescriptorAsmUtil.writeAnnotationData(it, proto, stringTable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -514,7 +514,7 @@ private val Modality.flags: Int
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val DescriptorVisibility.flags: Int
|
private val DescriptorVisibility.flags: Int
|
||||||
get() = AsmUtil.getVisibilityAccessFlag(this) ?: throw AssertionError("Unsupported visibility $this")
|
get() = DescriptorAsmUtil.getVisibilityAccessFlag(this) ?: throw AssertionError("Unsupported visibility $this")
|
||||||
|
|
||||||
internal val IrDeclaration.OtherOrigin: JvmDeclarationOrigin
|
internal val IrDeclaration.OtherOrigin: JvmDeclarationOrigin
|
||||||
get() {
|
get() {
|
||||||
|
|||||||
+1
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.unboxInlineClass
|
|||||||
import org.jetbrains.kotlin.backend.jvm.lower.suspendFunctionOriginal
|
import org.jetbrains.kotlin.backend.jvm.lower.suspendFunctionOriginal
|
||||||
import org.jetbrains.kotlin.codegen.*
|
import org.jetbrains.kotlin.codegen.*
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.*
|
import org.jetbrains.kotlin.codegen.AsmUtil.*
|
||||||
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.*
|
||||||
import org.jetbrains.kotlin.codegen.coroutines.SuspensionPointKind
|
import org.jetbrains.kotlin.codegen.coroutines.SuspensionPointKind
|
||||||
import org.jetbrains.kotlin.codegen.coroutines.generateCoroutineSuspendedCheck
|
import org.jetbrains.kotlin.codegen.coroutines.generateCoroutineSuspendedCheck
|
||||||
import org.jetbrains.kotlin.codegen.inline.*
|
import org.jetbrains.kotlin.codegen.inline.*
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
|||||||
import org.jetbrains.kotlin.backend.jvm.codegen.*
|
import org.jetbrains.kotlin.backend.jvm.codegen.*
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.isSmartcastFromHigherThanNullable
|
import org.jetbrains.kotlin.backend.jvm.ir.isSmartcastFromHigherThanNullable
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.AsmUtil
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.genAreEqualCall
|
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive
|
import org.jetbrains.kotlin.codegen.AsmUtil.isPrimitive
|
||||||
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.genAreEqualCall
|
||||||
import org.jetbrains.kotlin.codegen.StackValue
|
import org.jetbrains.kotlin.codegen.StackValue
|
||||||
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods
|
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicMethods
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
|||||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||||
import org.jetbrains.kotlin.ir.types.classOrNull
|
import org.jetbrains.kotlin.ir.types.classOrNull
|
||||||
import org.jetbrains.kotlin.ir.types.isNullable
|
import org.jetbrains.kotlin.ir.types.isNullable
|
||||||
import org.jetbrains.kotlin.ir.types.toKotlinType
|
|
||||||
import org.jetbrains.kotlin.ir.util.isEnumClass
|
import org.jetbrains.kotlin.ir.util.isEnumClass
|
||||||
import org.jetbrains.kotlin.ir.util.isEnumEntry
|
import org.jetbrains.kotlin.ir.util.isEnumEntry
|
||||||
import org.jetbrains.kotlin.ir.util.isIntegerConst
|
import org.jetbrains.kotlin.ir.util.isIntegerConst
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.backend.jvm.intrinsics
|
|||||||
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.backend.jvm.codegen.*
|
import org.jetbrains.kotlin.backend.jvm.codegen.*
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.AsmUtil
|
||||||
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil
|
||||||
import org.jetbrains.kotlin.config.JvmTarget
|
import org.jetbrains.kotlin.config.JvmTarget
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
||||||
@@ -35,7 +36,7 @@ object HashCode : IntrinsicMethod() {
|
|||||||
when {
|
when {
|
||||||
irFunction.origin == JvmLoweredDeclarationOrigin.INLINE_CLASS_GENERATED_IMPL_METHOD ||
|
irFunction.origin == JvmLoweredDeclarationOrigin.INLINE_CLASS_GENERATED_IMPL_METHOD ||
|
||||||
irFunction.origin == IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER ->
|
irFunction.origin == IrDeclarationOrigin.GENERATED_DATA_CLASS_MEMBER ->
|
||||||
AsmUtil.genHashCode(mv, mv, result.type, target)
|
DescriptorAsmUtil.genHashCode(mv, mv, result.type, target)
|
||||||
target == JvmTarget.JVM_1_6 || !AsmUtil.isPrimitive(result.type) -> {
|
target == JvmTarget.JVM_1_6 || !AsmUtil.isPrimitive(result.type) -> {
|
||||||
result.materializeAtBoxed(receiver.type)
|
result.materializeAtBoxed(receiver.type)
|
||||||
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "hashCode", "()I", false)
|
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "hashCode", "()I", false)
|
||||||
|
|||||||
+1
-2
@@ -17,9 +17,8 @@
|
|||||||
package org.jetbrains.kotlin.backend.jvm.intrinsics
|
package org.jetbrains.kotlin.backend.jvm.intrinsics
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil.genIncrement
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil.genIncrement
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
|
|
||||||
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
|
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
|
||||||
|
|
||||||
class Increment(private val myDelta: Int) : IntrinsicMethod() {
|
class Increment(private val myDelta: Int) : IntrinsicMethod() {
|
||||||
|
|||||||
@@ -26,11 +26,10 @@ import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
|
|||||||
import org.jetbrains.kotlin.asJava.UltraLightClassModifierExtension
|
import org.jetbrains.kotlin.asJava.UltraLightClassModifierExtension
|
||||||
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
|
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
|
||||||
import org.jetbrains.kotlin.asJava.elements.*
|
import org.jetbrains.kotlin.asJava.elements.*
|
||||||
import org.jetbrains.kotlin.asJava.elements.psiType
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
||||||
import org.jetbrains.kotlin.codegen.AsmUtil
|
import org.jetbrains.kotlin.codegen.DescriptorAsmUtil
|
||||||
import org.jetbrains.kotlin.codegen.JvmCodegenUtil
|
import org.jetbrains.kotlin.codegen.JvmCodegenUtil
|
||||||
import org.jetbrains.kotlin.codegen.OwnerKind
|
import org.jetbrains.kotlin.codegen.OwnerKind
|
||||||
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
|
import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter
|
||||||
@@ -320,7 +319,7 @@ private fun KtUltraLightClass.lightMethod(
|
|||||||
val name = if (descriptor is ConstructorDescriptor) name else support.typeMapper.mapFunctionName(descriptor, OwnerKind.IMPLEMENTATION)
|
val name = if (descriptor is ConstructorDescriptor) name else support.typeMapper.mapFunctionName(descriptor, OwnerKind.IMPLEMENTATION)
|
||||||
|
|
||||||
val accessFlags: Int by lazyPub {
|
val accessFlags: Int by lazyPub {
|
||||||
val asmFlags = AsmUtil.getMethodAsmFlags(
|
val asmFlags = DescriptorAsmUtil.getMethodAsmFlags(
|
||||||
descriptor,
|
descriptor,
|
||||||
OwnerKind.IMPLEMENTATION,
|
OwnerKind.IMPLEMENTATION,
|
||||||
support.deprecationResolver,
|
support.deprecationResolver,
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ plugins {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api(project(":core:compiler.common.jvm"))
|
api(project(":core:compiler.common.jvm"))
|
||||||
api(intellijCoreDep()) { includeJars("asm-all", rootProject = rootProject) }
|
api(project(":compiler:config.jvm"))
|
||||||
|
api(intellijCoreDep()) { includeJars("asm-all", "guava", rootProject = rootProject) }
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
|
|||||||
@@ -0,0 +1,450 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.codegen;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.kotlin.builtins.PrimitiveType;
|
||||||
|
import org.jetbrains.kotlin.descriptors.Visibilities;
|
||||||
|
import org.jetbrains.kotlin.descriptors.Visibility;
|
||||||
|
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities;
|
||||||
|
import org.jetbrains.kotlin.load.java.JvmAnnotationNames;
|
||||||
|
import org.jetbrains.kotlin.name.ClassId;
|
||||||
|
import org.jetbrains.kotlin.name.FqName;
|
||||||
|
import org.jetbrains.kotlin.name.Name;
|
||||||
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName;
|
||||||
|
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType;
|
||||||
|
import org.jetbrains.org.objectweb.asm.AnnotationVisitor;
|
||||||
|
import org.jetbrains.org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.jetbrains.org.objectweb.asm.Opcodes;
|
||||||
|
import org.jetbrains.org.objectweb.asm.Type;
|
||||||
|
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
|
||||||
|
import org.jetbrains.org.objectweb.asm.commons.Method;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.*;
|
||||||
|
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
||||||
|
|
||||||
|
public class AsmUtil {
|
||||||
|
private static final int NO_FLAG_LOCAL = 0;
|
||||||
|
public static final int NO_FLAG_PACKAGE_PRIVATE = 0;
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private static final Map<Visibility, Integer> visibilityToAccessFlag = ImmutableMap.<Visibility, Integer>builder()
|
||||||
|
.put(Visibilities.Private.INSTANCE, ACC_PRIVATE)
|
||||||
|
.put(Visibilities.PrivateToThis.INSTANCE, ACC_PRIVATE)
|
||||||
|
.put(Visibilities.Protected.INSTANCE, ACC_PROTECTED)
|
||||||
|
.put(JavaVisibilities.ProtectedStaticVisibility.INSTANCE, ACC_PROTECTED)
|
||||||
|
.put(JavaVisibilities.ProtectedAndPackage.INSTANCE, ACC_PROTECTED)
|
||||||
|
.put(Visibilities.Public.INSTANCE, ACC_PUBLIC)
|
||||||
|
.put(Visibilities.Internal.INSTANCE, ACC_PUBLIC)
|
||||||
|
.put(Visibilities.Local.INSTANCE, NO_FLAG_LOCAL)
|
||||||
|
.put(JavaVisibilities.PackageVisibility.INSTANCE, NO_FLAG_PACKAGE_PRIVATE)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
public static final String CAPTURED_PREFIX = "$";
|
||||||
|
|
||||||
|
public static final String THIS = "this";
|
||||||
|
|
||||||
|
public static final String THIS_IN_DEFAULT_IMPLS = "$this";
|
||||||
|
|
||||||
|
public static final String LABELED_THIS_FIELD = THIS + "_";
|
||||||
|
|
||||||
|
public static final String CAPTURED_LABELED_THIS_FIELD = CAPTURED_PREFIX + LABELED_THIS_FIELD;
|
||||||
|
|
||||||
|
public static final String INLINE_DECLARATION_SITE_THIS = "this_";
|
||||||
|
|
||||||
|
public static final String LABELED_THIS_PARAMETER = CAPTURED_PREFIX + THIS + "$";
|
||||||
|
|
||||||
|
public static final String CAPTURED_THIS_FIELD = "this$0";
|
||||||
|
|
||||||
|
public static final String RECEIVER_PARAMETER_NAME = "$receiver";
|
||||||
|
|
||||||
|
/*
|
||||||
|
This is basically an old convention. Starting from Kotlin 1.3, it was replaced with `$this_<label>`.
|
||||||
|
Note that it is still used for inlined callable references and anonymous callable extension receivers
|
||||||
|
even in 1.3.
|
||||||
|
*/
|
||||||
|
public static final String CAPTURED_RECEIVER_FIELD = "receiver$0";
|
||||||
|
|
||||||
|
// For non-inlined callable references ('kotlin.jvm.internal.CallableReference' has a 'receiver' field)
|
||||||
|
public static final String BOUND_REFERENCE_RECEIVER = "receiver";
|
||||||
|
|
||||||
|
public static final String LOCAL_FUNCTION_VARIABLE_PREFIX = "$fun$";
|
||||||
|
|
||||||
|
private static final ImmutableMap<Integer, JvmPrimitiveType> primitiveTypeByAsmSort;
|
||||||
|
private static final ImmutableMap<Type, Type> primitiveTypeByBoxedType;
|
||||||
|
|
||||||
|
static {
|
||||||
|
ImmutableMap.Builder<Integer, JvmPrimitiveType> typeBySortBuilder = ImmutableMap.builder();
|
||||||
|
ImmutableMap.Builder<Type, Type> typeByWrapperBuilder = ImmutableMap.builder();
|
||||||
|
for (JvmPrimitiveType primitiveType : JvmPrimitiveType.values()) {
|
||||||
|
Type asmType = Type.getType(primitiveType.getDesc());
|
||||||
|
typeBySortBuilder.put(asmType.getSort(), primitiveType);
|
||||||
|
typeByWrapperBuilder.put(asmTypeByFqNameWithoutInnerClasses(primitiveType.getWrapperFqName()), asmType);
|
||||||
|
}
|
||||||
|
primitiveTypeByAsmSort = typeBySortBuilder.build();
|
||||||
|
primitiveTypeByBoxedType = typeByWrapperBuilder.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private AsmUtil() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static String getCapturedFieldName(@NotNull String originalName) {
|
||||||
|
return CAPTURED_PREFIX + originalName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static String getLabeledThisName(@NotNull String callableName, @NotNull String prefix, @NotNull String defaultName) {
|
||||||
|
if (!Name.isValidIdentifier(callableName)) {
|
||||||
|
return defaultName;
|
||||||
|
}
|
||||||
|
|
||||||
|
return prefix + CommonVariableAsmNameManglingUtils.mangleNameIfNeeded(callableName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static Type boxType(@NotNull Type type) {
|
||||||
|
Type boxedType = boxPrimitiveType(type);
|
||||||
|
return boxedType != null ? boxedType : type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static Type boxPrimitiveType(@NotNull Type type) {
|
||||||
|
JvmPrimitiveType jvmPrimitiveType = primitiveTypeByAsmSort.get(type.getSort());
|
||||||
|
return jvmPrimitiveType != null ? asmTypeByFqNameWithoutInnerClasses(jvmPrimitiveType.getWrapperFqName()) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static Type unboxType(@NotNull Type boxedType) {
|
||||||
|
Type primitiveType = unboxPrimitiveTypeOrNull(boxedType);
|
||||||
|
if (primitiveType == null) {
|
||||||
|
throw new UnsupportedOperationException("Unboxing: " + boxedType);
|
||||||
|
}
|
||||||
|
return primitiveType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static Type unboxPrimitiveTypeOrNull(@NotNull Type boxedType) {
|
||||||
|
return primitiveTypeByBoxedType.get(boxedType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isBoxedPrimitiveType(@NotNull Type boxedType) {
|
||||||
|
return primitiveTypeByBoxedType.get(boxedType) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static Type unboxUnlessPrimitive(@NotNull Type boxedOrPrimitiveType) {
|
||||||
|
if (isPrimitive(boxedOrPrimitiveType)) return boxedOrPrimitiveType;
|
||||||
|
return unboxType(boxedOrPrimitiveType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isBoxedTypeOf(@NotNull Type boxedType, @NotNull Type unboxedType) {
|
||||||
|
return unboxPrimitiveTypeOrNull(boxedType) == unboxedType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isIntPrimitive(Type type) {
|
||||||
|
return type == Type.INT_TYPE || type == Type.SHORT_TYPE || type == Type.BYTE_TYPE || type == Type.CHAR_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isIntOrLongPrimitive(Type type) {
|
||||||
|
return isIntPrimitive(type) || type == Type.LONG_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isPrimitive(Type type) {
|
||||||
|
return type.getSort() != Type.OBJECT && type.getSort() != Type.ARRAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static Type correctElementType(@NotNull Type type) {
|
||||||
|
String internalName = type.getInternalName();
|
||||||
|
assert internalName.charAt(0) == '[';
|
||||||
|
return Type.getType(internalName.substring(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static Type getArrayType(@NotNull Type componentType) {
|
||||||
|
return Type.getType("[" + componentType.getDescriptor());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static PrimitiveType asmPrimitiveTypeToLangPrimitiveType(Type type) {
|
||||||
|
JvmPrimitiveType jvmPrimitiveType = primitiveTypeByAsmSort.get(type.getSort());
|
||||||
|
return jvmPrimitiveType != null ? jvmPrimitiveType.getPrimitiveType() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static Method method(@NotNull String name, @NotNull Type returnType, @NotNull Type... parameterTypes) {
|
||||||
|
return new Method(name, Type.getMethodDescriptor(returnType, parameterTypes));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Type stringValueOfType(Type type) {
|
||||||
|
int sort = type.getSort();
|
||||||
|
return sort == Type.OBJECT || sort == Type.ARRAY
|
||||||
|
? OBJECT_TYPE
|
||||||
|
: sort == Type.BYTE || sort == Type.SHORT ? Type.INT_TYPE : type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void genThrow(@NotNull InstructionAdapter v, @NotNull String exception, @Nullable String message) {
|
||||||
|
v.anew(Type.getObjectType(exception));
|
||||||
|
v.dup();
|
||||||
|
if (message != null) {
|
||||||
|
v.aconst(message);
|
||||||
|
v.invokespecial(exception, "<init>", "(Ljava/lang/String;)V", false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
v.invokespecial(exception, "<init>", "()V", false);
|
||||||
|
}
|
||||||
|
v.athrow();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void genStringBuilderConstructor(InstructionAdapter v) {
|
||||||
|
v.visitTypeInsn(NEW, "java/lang/StringBuilder");
|
||||||
|
v.dup();
|
||||||
|
v.invokespecial("java/lang/StringBuilder", "<init>", "()V", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void genInvertBoolean(InstructionAdapter v) {
|
||||||
|
v.iconst(1);
|
||||||
|
v.xor(Type.INT_TYPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void numConst(int value, Type type, InstructionAdapter v) {
|
||||||
|
if (type == Type.FLOAT_TYPE) {
|
||||||
|
v.fconst(value);
|
||||||
|
}
|
||||||
|
else if (type == Type.DOUBLE_TYPE) {
|
||||||
|
v.dconst(value);
|
||||||
|
}
|
||||||
|
else if (type == Type.LONG_TYPE) {
|
||||||
|
v.lconst(value);
|
||||||
|
}
|
||||||
|
else if (type == Type.CHAR_TYPE || type == Type.BYTE_TYPE || type == Type.SHORT_TYPE || type == Type.INT_TYPE) {
|
||||||
|
v.iconst(value);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new IllegalArgumentException("Primitive numeric type expected, got: " + type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void swap(InstructionAdapter v, Type stackTop, Type afterTop) {
|
||||||
|
if (stackTop.getSize() == 1) {
|
||||||
|
if (afterTop.getSize() == 1) {
|
||||||
|
v.swap();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
v.dupX2();
|
||||||
|
v.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (afterTop.getSize() == 1) {
|
||||||
|
v.dup2X1();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
v.dup2X2();
|
||||||
|
}
|
||||||
|
v.pop2();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void pushDefaultValueOnStack(@NotNull Type type, @NotNull InstructionAdapter v) {
|
||||||
|
v.visitInsn(defaultValueOpcode(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int defaultValueOpcode(@NotNull Type type) {
|
||||||
|
if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) {
|
||||||
|
return ACONST_NULL;
|
||||||
|
}
|
||||||
|
if (type.getSort() == Type.FLOAT) {
|
||||||
|
return FCONST_0;
|
||||||
|
}
|
||||||
|
if (type.getSort() == Type.DOUBLE) {
|
||||||
|
return DCONST_0;
|
||||||
|
}
|
||||||
|
if (type.getSort() == Type.LONG) {
|
||||||
|
return LCONST_0;
|
||||||
|
}
|
||||||
|
return ICONST_0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Type comparisonOperandType(Type left, Type right) {
|
||||||
|
if (left == Type.DOUBLE_TYPE || right == Type.DOUBLE_TYPE) return Type.DOUBLE_TYPE;
|
||||||
|
if (left == Type.FLOAT_TYPE || right == Type.FLOAT_TYPE) return Type.FLOAT_TYPE;
|
||||||
|
if (left == Type.LONG_TYPE || right == Type.LONG_TYPE) return Type.LONG_TYPE;
|
||||||
|
if (left == Type.CHAR_TYPE || right == Type.CHAR_TYPE) return Type.CHAR_TYPE;
|
||||||
|
return Type.INT_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static Type numberFunctionOperandType(@NotNull Type expectedType) {
|
||||||
|
if (expectedType == Type.SHORT_TYPE || expectedType == Type.BYTE_TYPE || expectedType == Type.CHAR_TYPE) {
|
||||||
|
return Type.INT_TYPE;
|
||||||
|
}
|
||||||
|
return expectedType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void pop(@NotNull MethodVisitor v, @NotNull Type type) {
|
||||||
|
if (type.getSize() == 2) {
|
||||||
|
v.visitInsn(Opcodes.POP2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
v.visitInsn(Opcodes.POP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void pop2(@NotNull MethodVisitor v, @NotNull Type topOfStack, @NotNull Type afterTop) {
|
||||||
|
if (topOfStack.getSize() == 1 && afterTop.getSize() == 1) {
|
||||||
|
v.visitInsn(POP2);
|
||||||
|
} else {
|
||||||
|
pop(v, topOfStack);
|
||||||
|
pop(v, afterTop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void pop2(@NotNull MethodVisitor v, @NotNull Type type) {
|
||||||
|
if (type.getSize() == 2) {
|
||||||
|
v.visitInsn(Opcodes.POP2);
|
||||||
|
v.visitInsn(Opcodes.POP2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
v.visitInsn(Opcodes.POP2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void dup(@NotNull InstructionAdapter v, @NotNull Type type) {
|
||||||
|
dup(v, type.getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void dup(@NotNull InstructionAdapter v, int size) {
|
||||||
|
if (size == 2) {
|
||||||
|
v.dup2();
|
||||||
|
}
|
||||||
|
else if (size == 1) {
|
||||||
|
v.dup();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void dupx(@NotNull InstructionAdapter v, @NotNull Type type) {
|
||||||
|
dupx(v, type.getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void dupx(@NotNull InstructionAdapter v, int size) {
|
||||||
|
if (size == 2) {
|
||||||
|
v.dup2X2();
|
||||||
|
}
|
||||||
|
else if (size == 1) {
|
||||||
|
v.dupX1();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Duplicate the element afterTop and push it on the top of the stack.
|
||||||
|
public static void dupSecond(@NotNull InstructionAdapter v, @NotNull Type topOfStack, @NotNull Type afterTop) {
|
||||||
|
if (afterTop.getSize() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (topOfStack.getSize() == 0) {
|
||||||
|
dup(v, afterTop);
|
||||||
|
} else if (topOfStack.getSize() == 1 && afterTop.getSize() == 1) {
|
||||||
|
v.dup2();
|
||||||
|
v.pop();
|
||||||
|
} else {
|
||||||
|
swap(v, topOfStack, afterTop);
|
||||||
|
if (topOfStack.getSize() == 1 && afterTop.getSize() == 2) {
|
||||||
|
v.dup2X1();
|
||||||
|
} else if (topOfStack.getSize() == 2 && afterTop.getSize() == 1) {
|
||||||
|
v.dupX2();
|
||||||
|
} else /* top = 2, after top = 2 */ {
|
||||||
|
v.dup2X2();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void dup(@NotNull InstructionAdapter v, @NotNull Type topOfStack, @NotNull Type afterTop) {
|
||||||
|
if (topOfStack.getSize() == 0 && afterTop.getSize() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (topOfStack.getSize() == 0) {
|
||||||
|
dup(v, afterTop);
|
||||||
|
}
|
||||||
|
else if (afterTop.getSize() == 0) {
|
||||||
|
dup(v, topOfStack);
|
||||||
|
}
|
||||||
|
else if (afterTop.getSize() == 1) {
|
||||||
|
if (topOfStack.getSize() == 1) {
|
||||||
|
dup(v, 2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
v.dup2X1();
|
||||||
|
v.pop2();
|
||||||
|
v.dupX2();
|
||||||
|
v.dupX2();
|
||||||
|
v.pop();
|
||||||
|
v.dup2X1();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//Note: it's possible to write dup3 and dup4
|
||||||
|
throw new UnsupportedOperationException("Don't know how generate dup3/dup4 for: " + topOfStack + " and " + afterTop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void writeAnnotationData(
|
||||||
|
@NotNull AnnotationVisitor av, @NotNull String[] data, @NotNull String[] strings
|
||||||
|
) {
|
||||||
|
AnnotationVisitor dataVisitor = av.visitArray(JvmAnnotationNames.METADATA_DATA_FIELD_NAME);
|
||||||
|
for (String string : data) {
|
||||||
|
dataVisitor.visit(null, string);
|
||||||
|
}
|
||||||
|
dataVisitor.visitEnd();
|
||||||
|
|
||||||
|
AnnotationVisitor stringsVisitor = av.visitArray(JvmAnnotationNames.METADATA_STRINGS_FIELD_NAME);
|
||||||
|
for (String string : strings) {
|
||||||
|
stringsVisitor.visit(null, string);
|
||||||
|
}
|
||||||
|
stringsVisitor.visitEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static Type asmTypeByFqNameWithoutInnerClasses(@NotNull FqName fqName) {
|
||||||
|
return Type.getObjectType(internalNameByFqNameWithoutInnerClasses(fqName));
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static Type asmTypeByClassId(@NotNull ClassId classId) {
|
||||||
|
return Type.getObjectType(classId.asString().replace('.', '$'));
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public static String internalNameByFqNameWithoutInnerClasses(@NotNull FqName fqName) {
|
||||||
|
return JvmClassName.byFqNameWithoutInnerClasses(fqName).getInternalName();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void wrapJavaClassIntoKClass(@NotNull InstructionAdapter v) {
|
||||||
|
v.invokestatic(REFLECTION, "getOrCreateKotlinClass", Type.getMethodDescriptor(K_CLASS_TYPE, getType(Class.class)), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void wrapJavaClassesIntoKClasses(@NotNull InstructionAdapter v) {
|
||||||
|
v.invokestatic(REFLECTION, "getOrCreateKotlinClasses", Type.getMethodDescriptor(K_CLASS_ARRAY_TYPE, getType(Class[].class)), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static Integer getVisibilityAccessFlag(Visibility visibility) {
|
||||||
|
return visibilityToAccessFlag.get(visibility);
|
||||||
|
}
|
||||||
|
}
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@file:JvmName("CommonVariableAsmNameManglingUtils")
|
||||||
|
package org.jetbrains.kotlin.codegen
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.resolve.jvm.checkers.isValidDalvikCharacter
|
||||||
|
|
||||||
|
fun mangleNameIfNeeded(name: String): String {
|
||||||
|
if (name.all { it.isValidCharacter() }) {
|
||||||
|
return name
|
||||||
|
}
|
||||||
|
|
||||||
|
return buildString {
|
||||||
|
for (c in name) {
|
||||||
|
if (c.isValidCharacter()) {
|
||||||
|
append(c)
|
||||||
|
} else {
|
||||||
|
val hexString = Integer.toHexString(c.toInt())
|
||||||
|
assert(hexString.length <= 4)
|
||||||
|
append("_u").append(hexString)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun Char.isValidCharacter(): Boolean {
|
||||||
|
return this != '$' && this != '-' && isValidDalvikCharacter(this)
|
||||||
|
}
|
||||||
+6
-2
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -10,7 +10,11 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.kotlin.builtins.PrimitiveType;
|
import org.jetbrains.kotlin.builtins.PrimitiveType;
|
||||||
import org.jetbrains.org.objectweb.asm.Type;
|
import org.jetbrains.org.objectweb.asm.Type;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
public class AsmTypes {
|
public class AsmTypes {
|
||||||
private static final Map<Class<?>, Type> TYPES_MAP = new HashMap<>();
|
private static final Map<Class<?>, Type> TYPES_MAP = new HashMap<>();
|
||||||
+3
-3
@@ -1,15 +1,15 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@file:JvmName("DalvikIdentifierUtils")
|
@file:JvmName("DalvikIdentifierUtils")
|
||||||
package org.jetbrains.kotlin.resolve.jvm.checkers
|
package org.jetbrains.kotlin.resolve.jvm.checkers
|
||||||
|
|
||||||
fun isValidDalvikIdentifier(identifier: String) = identifier.all { isValidDalvikCharacter(it) }
|
fun isValidDalvikIdentifier(identifier: String): Boolean = identifier.all { isValidDalvikCharacter(it) }
|
||||||
|
|
||||||
// https://source.android.com/devices/tech/dalvik/dex-format.html#string-syntax
|
// https://source.android.com/devices/tech/dalvik/dex-format.html#string-syntax
|
||||||
fun isValidDalvikCharacter(c: Char) = when (c) {
|
fun isValidDalvikCharacter(c: Char): Boolean = when (c) {
|
||||||
in 'A'..'Z' -> true
|
in 'A'..'Z' -> true
|
||||||
in 'a'..'z' -> true
|
in 'a'..'z' -> true
|
||||||
in '0'..'9' -> true
|
in '0'..'9' -> true
|
||||||
+1
-1
@@ -159,7 +159,7 @@ class SerializableCodegenImpl(
|
|||||||
exprCodegen.gen(expr, propAsmType)
|
exprCodegen.gen(expr, propAsmType)
|
||||||
val rhs = StackValue.onStack(propAsmType)
|
val rhs = StackValue.onStack(propAsmType)
|
||||||
// INVOKESTATIC kotlin/jvm/internal/Intrinsics.areEqual (Ljava/lang/Object;Ljava/lang/Object;)Z
|
// INVOKESTATIC kotlin/jvm/internal/Intrinsics.areEqual (Ljava/lang/Object;Ljava/lang/Object;)Z
|
||||||
AsmUtil.genEqualsForExpressionsOnStack(KtTokens.EXCLEQ, lhs, rhs).put(Type.BOOLEAN_TYPE, null, this)
|
DescriptorAsmUtil.genEqualsForExpressionsOnStack(KtTokens.EXCLEQ, lhs, rhs).put(Type.BOOLEAN_TYPE, null, this)
|
||||||
ifne(writeLabel)
|
ifne(writeLabel)
|
||||||
|
|
||||||
// output.shouldEncodeElementDefault(descriptor, i)
|
// output.shouldEncodeElementDefault(descriptor, i)
|
||||||
|
|||||||
Reference in New Issue
Block a user