Use localHash instead of hashCode for field ordering.

This commit is contained in:
Alexander Gorshenev
2017-02-08 19:53:49 +03:00
committed by alexander-gorshenev
parent c0fdbd0e21
commit 0eb9007add
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
internal fun createLlvmDeclarations(context: Context): LlvmDeclarations { internal fun createLlvmDeclarations(context: Context): LlvmDeclarations {
val generator = DeclarationsGeneratorVisitor(context) val generator = DeclarationsGeneratorVisitor(context)
@@ -72,17 +73,17 @@ internal class StaticFieldLlvmDeclarations(val storage: LLVMValueRef)
* All fields of the class instance. * All fields of the class instance.
* The order respects the class hierarchy, i.e. a class [fields] contains superclass [fields] as a prefix. * The order respects the class hierarchy, i.e. a class [fields] contains superclass [fields] as a prefix.
*/ */
private fun getFields(context: Context, classDescriptor: ClassDescriptor): List<PropertyDescriptor> { internal fun ContextUtils.getFields(classDescriptor: ClassDescriptor): List<PropertyDescriptor> {
val superClass = classDescriptor.getSuperClassNotAny() // TODO: what if Any has fields? val superClass = classDescriptor.getSuperClassNotAny() // TODO: what if Any has fields?
val superFields = if (superClass != null) getFields(context, superClass) else emptyList() val superFields = if (superClass != null) getFields(superClass) else emptyList()
return superFields + getDeclaredFields(context, classDescriptor) return superFields + getDeclaredFields(classDescriptor)
} }
/** /**
* Fields declared in the class. * Fields declared in the class.
*/ */
private fun getDeclaredFields(context: Context, classDescriptor: ClassDescriptor): List<PropertyDescriptor> { private fun ContextUtils.getDeclaredFields(classDescriptor: ClassDescriptor): List<PropertyDescriptor> {
// TODO: Here's what is going on here: // TODO: Here's what is going on here:
// The existence of a backing field for a property is only described in the IR, // The existence of a backing field for a property is only described in the IR,
// but not in the property descriptor. // but not in the property descriptor.
@@ -117,7 +118,7 @@ private fun getDeclaredFields(context: Context, classDescriptor: ClassDescriptor
properties.mapNotNull { it.backingField } properties.mapNotNull { it.backingField }
} }
return fields.sortedBy { return fields.sortedBy {
it.name.hashCode() it.fqNameSafe.localHash.value
} }
} }
@@ -212,7 +213,7 @@ private class DeclarationsGeneratorVisitor(override val context: Context) :
val internalName = qualifyInternalName(descriptor) val internalName = qualifyInternalName(descriptor)
val fields = getFields(context, descriptor) val fields = getFields(descriptor)
val bodyType = createClassBodyType("kclassbody:$internalName", fields) val bodyType = createClassBodyType("kclassbody:$internalName", fields)
val typeInfoPtr: ConstPointer val typeInfoPtr: ConstPointer