Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a3ab97b authored by Makoto Onuki's avatar Makoto Onuki Committed by Gerrit Code Review
Browse files

Merge "[ravenwood] Make all classes and methods non-final" into main

parents fecb931f 5d19c9b0
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -5,6 +5,8 @@
# Keep all classes / methods / fields, but make the methods throw.
# Keep all classes / methods / fields, but make the methods throw.
--default-throw
--default-throw


--delete-finals

# Uncomment below lines to enable each feature.
# Uncomment below lines to enable each feature.


#--default-method-call-hook
#--default-method-call-hook
+2 −0
Original line number Original line Diff line number Diff line
@@ -2,6 +2,8 @@


--debug
--debug


--delete-finals

# Uncomment below lines to enable each feature.
# Uncomment below lines to enable each feature.


#--default-method-call-hook
#--default-method-call-hook
+2 −0
Original line number Original line Diff line number Diff line
@@ -411,6 +411,8 @@ class HostStubGen(val options: HostStubGenOptions) {
            stats = stats,
            stats = stats,
            enablePreTrace = options.enablePreTrace.get,
            enablePreTrace = options.enablePreTrace.get,
            enablePostTrace = options.enablePostTrace.get,
            enablePostTrace = options.enablePostTrace.get,
            deleteClassFinals = options.deleteFinals.get,
            deleteMethodFinals = options.deleteFinals.get,
        )
        )
        outVisitor = BaseAdapter.getVisitor(
        outVisitor = BaseAdapter.getVisitor(
            classInternalName, classes, outVisitor, filter,
            classInternalName, classes, outVisitor, filter,
+5 −0
Original line number Original line Diff line number Diff line
@@ -106,6 +106,8 @@ class HostStubGenOptions(


        var cleanUpOnError: SetOnce<Boolean> = SetOnce(false),
        var cleanUpOnError: SetOnce<Boolean> = SetOnce(false),


        var deleteFinals: SetOnce<Boolean> = SetOnce(false),

        var enableClassChecker: SetOnce<Boolean> = SetOnce(false),
        var enableClassChecker: SetOnce<Boolean> = SetOnce(false),
        var enablePreTrace: SetOnce<Boolean> = SetOnce(false),
        var enablePreTrace: SetOnce<Boolean> = SetOnce(false),
        var enablePostTrace: SetOnce<Boolean> = SetOnce(false),
        var enablePostTrace: SetOnce<Boolean> = SetOnce(false),
@@ -218,6 +220,8 @@ class HostStubGenOptions(
                        "--gen-keep-all-file" ->
                        "--gen-keep-all-file" ->
                            ret.inputJarAsKeepAllFile.set(nextArg())
                            ret.inputJarAsKeepAllFile.set(nextArg())


                        "--delete-finals" -> ret.deleteFinals.set(true)

                        // Following options are for debugging.
                        // Following options are for debugging.
                        "--enable-class-checker" -> ret.enableClassChecker.set(true)
                        "--enable-class-checker" -> ret.enableClassChecker.set(true)
                        "--no-class-checker" -> ret.enableClassChecker.set(false)
                        "--no-class-checker" -> ret.enableClassChecker.set(false)
@@ -293,6 +297,7 @@ class HostStubGenOptions(
              defaultMethodCallHook=$defaultMethodCallHook,
              defaultMethodCallHook=$defaultMethodCallHook,
              policyOverrideFiles=${policyOverrideFiles.toTypedArray().contentToString()},
              policyOverrideFiles=${policyOverrideFiles.toTypedArray().contentToString()},
              defaultPolicy=$defaultPolicy,
              defaultPolicy=$defaultPolicy,
              deleteFinals=$deleteFinals,
              cleanUpOnError=$cleanUpOnError,
              cleanUpOnError=$cleanUpOnError,
              enableClassChecker=$enableClassChecker,
              enableClassChecker=$enableClassChecker,
              enablePreTrace=$enablePreTrace,
              enablePreTrace=$enablePreTrace,
+31 −4
Original line number Original line Diff line number Diff line
@@ -50,7 +50,13 @@ abstract class BaseAdapter(
        val errors: HostStubGenErrors,
        val errors: HostStubGenErrors,
        val stats: HostStubGenStats?,
        val stats: HostStubGenStats?,
        val enablePreTrace: Boolean,
        val enablePreTrace: Boolean,
        val enablePostTrace: Boolean
        val enablePostTrace: Boolean,
        val deleteClassFinals: Boolean,
        val deleteMethodFinals: Boolean,
        // We don't remove finals from fields, because final fields have a stronger memory
        // guarantee than non-final fields, see:
        // https://docs.oracle.com/javase/specs/jls/se22/html/jls-17.html#jls-17.5
        // i.e. changing a final field to non-final _could_ result in different behavior.
    )
    )


    protected lateinit var currentPackageName: String
    protected lateinit var currentPackageName: String
@@ -58,14 +64,33 @@ abstract class BaseAdapter(
    protected var redirectionClass: String? = null
    protected var redirectionClass: String? = null
    protected lateinit var classPolicy: FilterPolicyWithReason
    protected lateinit var classPolicy: FilterPolicyWithReason


    private fun isEnum(access: Int): Boolean {
        return (access and Opcodes.ACC_ENUM) != 0
    }

    protected fun modifyClassAccess(access: Int): Int {
        if (options.deleteClassFinals && !isEnum(access)) {
            return access and Opcodes.ACC_FINAL.inv()
        }
        return access
    }

    protected fun modifyMethodAccess(access: Int): Int {
        if (options.deleteMethodFinals) {
            return access and Opcodes.ACC_FINAL.inv()
        }
        return access
    }

    override fun visit(
    override fun visit(
        version: Int,
        version: Int,
        access: Int,
        origAccess: Int,
        name: String,
        name: String,
        signature: String?,
        signature: String?,
        superName: String?,
        superName: String?,
        interfaces: Array<String>,
        interfaces: Array<String>,
    ) {
    ) {
        val access = modifyClassAccess(origAccess)
        super.visit(version, access, name, signature, superName, interfaces)
        super.visit(version, access, name, signature, superName, interfaces)
        currentClassName = name
        currentClassName = name
        currentPackageName = getPackageNameFromFullClassName(name)
        currentPackageName = getPackageNameFromFullClassName(name)
@@ -130,13 +155,14 @@ abstract class BaseAdapter(
        }
        }
    }
    }


    override fun visitMethod(
    final override fun visitMethod(
        access: Int,
        origAccess: Int,
        name: String,
        name: String,
        descriptor: String,
        descriptor: String,
        signature: String?,
        signature: String?,
        exceptions: Array<String>?,
        exceptions: Array<String>?,
    ): MethodVisitor? {
    ): MethodVisitor? {
        val access = modifyMethodAccess(origAccess)
        if (skipMemberModificationNestCount > 0) {
        if (skipMemberModificationNestCount > 0) {
            return super.visitMethod(access, name, descriptor, signature, exceptions)
            return super.visitMethod(access, name, descriptor, signature, exceptions)
        }
        }
@@ -176,6 +202,7 @@ abstract class BaseAdapter(
                if (newAccess == NOT_COMPATIBLE) {
                if (newAccess == NOT_COMPATIBLE) {
                    return null
                    return null
                }
                }
                newAccess = modifyMethodAccess(newAccess)


                log.v(
                log.v(
                    "Emitting %s.%s%s as %s %s", currentClassName, name, descriptor,
                    "Emitting %s.%s%s as %s %s", currentClassName, name, descriptor,
Loading