[codegen] added konan.internal.NoReorderFields to disable field reordering

This commit is contained in:
Vasily Levchenko
2018-08-10 12:22:47 +03:00
parent 8c975e5873
commit cdbefa6710
4 changed files with 14 additions and 0 deletions
@@ -135,6 +135,9 @@ private fun Context.getDeclaredFields(classDescriptor: ClassDescriptor): List<Ir
// TODO: hack over missed parents in deserialized fields/property declarations. // TODO: hack over missed parents in deserialized fields/property declarations.
fields.forEach{it.parent = irClass} fields.forEach{it.parent = irClass}
if (classDescriptor.hasAnnotation(FqName.fromSegments(listOf("konan", "internal", "NoReorderFields"))))
return fields
return fields.sortedBy { return fields.sortedBy {
it.fqNameSafe.localHash.value it.fqNameSafe.localHash.value
} }
@@ -65,3 +65,10 @@ annotation class InlineConstructor
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY) @Retention(AnnotationRetention.BINARY)
internal annotation class Frozen internal annotation class Frozen
/**
* Fields of annotated class won't be sorted.
*/
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
internal annotation class NoReorderFields
@@ -18,6 +18,7 @@ package konan.ref
import kotlinx.cinterop.COpaquePointer import kotlinx.cinterop.COpaquePointer
import konan.internal.ExportForCppRuntime import konan.internal.ExportForCppRuntime
import konan.internal.NoReorderFields
/** /**
* Theory of operations: * Theory of operations:
@@ -42,6 +43,7 @@ import konan.internal.ExportForCppRuntime
*/ */
// Clear holding the counter object, which refers to the actual object. // Clear holding the counter object, which refers to the actual object.
@NoReorderFields
internal class WeakReferenceCounter(var referred: COpaquePointer?) : WeakReferenceImpl() { internal class WeakReferenceCounter(var referred: COpaquePointer?) : WeakReferenceImpl() {
// Spinlock, potentially taken when materializing or removing 'referred' object. // Spinlock, potentially taken when materializing or removing 'referred' object.
var lock: Int = 0 var lock: Int = 0
@@ -17,6 +17,7 @@
package konan.worker package konan.worker
import konan.internal.Frozen import konan.internal.Frozen
import konan.internal.NoReorderFields
import konan.SymbolName import konan.SymbolName
import kotlinx.cinterop.NativePtr import kotlinx.cinterop.NativePtr
@@ -123,6 +124,7 @@ external private fun checkIfFrozen(ref: Any?)
* Otherwise memory leak could happen. * Otherwise memory leak could happen.
*/ */
@Frozen @Frozen
@NoReorderFields
class AtomicReference<T>(private var value: T? = null) { class AtomicReference<T>(private var value: T? = null) {
// A spinlock to fix potential ARC race. Not an AtomicInt just for the effeciency sake. // A spinlock to fix potential ARC race. Not an AtomicInt just for the effeciency sake.
private var lock: Int = 0 private var lock: Int = 0