From 19337d619ef3561d9c65e9b617ae36e511ee4ef0 Mon Sep 17 00:00:00 2001 From: xehpuk Date: Fri, 16 Jan 2026 01:50:35 +0100 Subject: [PATCH] fix(Strava): Fix `Overwrite media upload parameters` patch --- patches/build.gradle.kts | 3 +- .../patches/instagram/feed/Fingerprints.kt | 2 +- .../instagram/hide/explore/HideExploreFeed.kt | 2 +- .../instagram/hide/navigation/Fingerprints.kt | 2 +- .../misc/share/EditShareLinksPatch.kt | 2 +- .../misc/extension/SharedExtensionPatch.kt | 6 +- .../patches/twitter/misc/hook/HookPatch.kt | 2 +- .../twitter/misc/hook/json/JsonHookPatch.kt | 6 +- .../patches/viber/misc/navbar/Fingerprints.kt | 4 +- .../playercontrols/PlayerControlsPatch.kt | 2 + .../kotlin/app/revanced/util/BytecodeUtils.kt | 81 +++++++++++++++++-- 11 files changed, 92 insertions(+), 20 deletions(-) diff --git a/patches/build.gradle.kts b/patches/build.gradle.kts index fa7bd65bd6..694454bc99 100644 --- a/patches/build.gradle.kts +++ b/patches/build.gradle.kts @@ -43,7 +43,8 @@ tasks { kotlin { compilerOptions { - freeCompilerArgs = listOf("-Xcontext-receivers") + // FIXME Update Kotlin to v2.2 + freeCompilerArgs = listOf("-Xcontext-parameters") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt index cf8c611181..9e511d0ac8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt @@ -7,7 +7,7 @@ internal val mainFeedRequestClassFingerprint = fingerprint { strings("Request{mReason=", ", mInstanceNumber=") } -context(BytecodePatchContext) +context(_: BytecodePatchContext) internal val initMainFeedRequestFingerprint get() = fingerprint { custom { method, classDef -> method.name == "" && diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/HideExploreFeed.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/HideExploreFeed.kt index a2c7d5ba59..82db78dfd3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/HideExploreFeed.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/HideExploreFeed.kt @@ -7,7 +7,7 @@ import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -context(BytecodePatchContext) +context(_: BytecodePatchContext) internal fun Fingerprint.replaceJsonFieldWithBogus( key: String, ) { diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt index cc762c1237..f7a311772e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt @@ -15,7 +15,7 @@ private val navigationButtonsEnumClassDef = fingerprint { strings("FEED", "fragment_feed", "SEARCH", "fragment_search") } -context(BytecodePatchContext) +context(_: BytecodePatchContext) internal val navigationButtonsEnumInitFingerprint get() = fingerprint { custom { method, classDef -> method.name == "" diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt index b6d968c652..280174300a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt @@ -7,7 +7,7 @@ import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -context(BytecodePatchContext) +context(_: BytecodePatchContext) internal fun editShareLinksPatch(block: MutableMethod.(index: Int, register: Int) -> Unit) { val fingerprintsToPatch = arrayOf( permalinkResponseJsonParserFingerprint, diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt index e6d78b7776..78a8fc5022 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt @@ -90,10 +90,10 @@ class ExtensionHook internal constructor( private val insertIndexResolver: BytecodePatchContext.(Method) -> Int, private val contextRegisterResolver: BytecodePatchContext.(Method) -> String, ) { - context(BytecodePatchContext) + context(context: BytecodePatchContext) operator fun invoke(extensionClassDescriptor: String) { - val insertIndex = insertIndexResolver(fingerprint.method) - val contextRegister = contextRegisterResolver(fingerprint.method) + val insertIndex = context.insertIndexResolver(fingerprint.method) + val contextRegister = context.contextRegisterResolver(fingerprint.method) fingerprint.method.addInstruction( insertIndex, diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HookPatch.kt index 682bb4f379..ce16f49eb8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HookPatch.kt @@ -19,6 +19,6 @@ fun hookPatch( ) execute { - addJsonHook(JsonHook(hookClassDescriptor)) + addJsonHook(JsonHook(this, hookClassDescriptor)) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt index 56785cae4c..83f6f54acf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt @@ -14,7 +14,7 @@ import java.io.InvalidClassException * * @param jsonHook The [JsonHook] to add. */ -context(BytecodePatchContext) +context(_: BytecodePatchContext) fun addJsonHook( jsonHook: JsonHook, ) { @@ -92,14 +92,14 @@ val jsonHookPatch = bytecodePatch( * @param descriptor The class descriptor of the hook. * @throws ClassNotFoundException If the class could not be found. */ -context(BytecodePatchContext) class JsonHook( + context: BytecodePatchContext, internal val descriptor: String, ) { internal var added = false init { - classBy { it.type == descriptor }?.let { + context.classBy { it.type == descriptor }?.let { it.mutableClass.also { classDef -> if ( classDef.superclass != JSON_HOOK_CLASS_DESCRIPTOR || diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt index 2f2a7bda3d..cdd2171f87 100644 --- a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt @@ -6,11 +6,11 @@ internal val tabIdClassFingerprint = fingerprint { strings("shouldShowTabId") } -context(BytecodePatchContext) +context(_: BytecodePatchContext) internal val shouldShowTabIdMethodFingerprint get() = fingerprint { parameters("I", "I") returns("Z") - custom { methodDef, classDef -> + custom { _, classDef -> classDef == tabIdClassFingerprint.classDef } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt index e5949586de..93c4f63369 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt @@ -2,6 +2,7 @@ package app.revanced.patches.youtube.misc.playercontrols import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch @@ -188,6 +189,7 @@ fun initializeBottomControl(descriptor: String) { * Injects the code to change the visibility of controls. * @param descriptor The descriptor of the method which should be called. */ +context(_: BytecodePatchContext) fun injectVisibilityCheckCall(descriptor: String) { visibilityMethod.addInstruction( visibilityInsertIndex++, diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index f5a39a9969..51ceffa7da 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -13,6 +13,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableClass import app.revanced.patcher.util.proxy.mutableTypes.MutableField import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod +import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch @@ -24,6 +25,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode.* import com.android.tools.smali.dexlib2.analysis.reflection.util.ReflectionUtils +import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.formatter.DexFormatter import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.* @@ -33,6 +35,7 @@ import com.android.tools.smali.dexlib2.iface.reference.Reference import com.android.tools.smali.dexlib2.iface.reference.StringReference import com.android.tools.smali.dexlib2.iface.value.* import com.android.tools.smali.dexlib2.immutable.ImmutableField +import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.value.* import com.android.tools.smali.dexlib2.util.MethodUtil import java.util.* @@ -229,10 +232,10 @@ private fun Method.findInstructionIndexFromToString(fieldName: String): Int { * * @param fieldName The name of the field to find. Partial matches are allowed. */ -context(BytecodePatchContext) +context(context: BytecodePatchContext) internal fun Method.findMethodFromToString(fieldName: String): MutableMethod { val methodUsageIndex = findInstructionIndexFromToString(fieldName) - return navigate(this).to(methodUsageIndex).stop() + return context.navigate(this).to(methodUsageIndex).stop() } /** @@ -848,6 +851,7 @@ private fun MutableMethod.checkReturnType(expectedTypes: Iterable>) { * * @see returnLate */ +context(_: BytecodePatchContext?) fun MutableMethod.returnEarly() { val value = when (returnType) { "V" -> null @@ -864,6 +868,7 @@ fun MutableMethod.returnEarly() { overrideReturnValue(value, false) } +context(_: BytecodePatchContext?) private fun MutableMethod.returnString(value: String, late: Boolean) { checkReturnType(String::class.java.allAssignableTypes()) overrideReturnValue(ImmutableStringEncodedValue(value), late) @@ -875,6 +880,7 @@ private fun MutableMethod.returnString(value: String, late: Boolean) { * * @see returnLate */ +context(_: BytecodePatchContext?) fun MutableMethod.returnEarly(value: String) = returnString(value, false) /** @@ -883,8 +889,10 @@ fun MutableMethod.returnEarly(value: String) = returnString(value, false) * * @see returnEarly */ +context(_: BytecodePatchContext?) fun MutableMethod.returnLate(value: String) = returnString(value, true) +context(_: BytecodePatchContext?) private fun MutableMethod.returnByte(value: Byte, late: Boolean) { checkReturnType(Byte::class.javaObjectType.allAssignableTypes() + Byte::class.javaPrimitiveType!!) overrideReturnValue(ImmutableByteEncodedValue(value), late) @@ -896,6 +904,7 @@ private fun MutableMethod.returnByte(value: Byte, late: Boolean) { * * @see returnLate */ +context(_: BytecodePatchContext?) fun MutableMethod.returnEarly(value: Byte) = returnByte(value, false) /** @@ -904,8 +913,10 @@ fun MutableMethod.returnEarly(value: Byte) = returnByte(value, false) * * @see returnEarly */ +context(_: BytecodePatchContext?) fun MutableMethod.returnLate(value: Byte) = returnByte(value, true) +context(_: BytecodePatchContext?) private fun MutableMethod.returnBoolean(value: Boolean, late: Boolean) { checkReturnType(Boolean::class.javaObjectType.allAssignableTypes() + Boolean::class.javaPrimitiveType!!) overrideReturnValue(ImmutableBooleanEncodedValue.forBoolean(value), late) @@ -917,6 +928,7 @@ private fun MutableMethod.returnBoolean(value: Boolean, late: Boolean) { * * @see returnLate */ +context(_: BytecodePatchContext?) fun MutableMethod.returnEarly(value: Boolean) = returnBoolean(value, false) /** @@ -925,8 +937,10 @@ fun MutableMethod.returnEarly(value: Boolean) = returnBoolean(value, false) * * @see returnEarly */ +context(_: BytecodePatchContext?) fun MutableMethod.returnLate(value: Boolean) = returnBoolean(value, true) +context(_: BytecodePatchContext?) private fun MutableMethod.returnShort(value: Short, late: Boolean) { checkReturnType(Short::class.javaObjectType.allAssignableTypes() + Short::class.javaPrimitiveType!!) overrideReturnValue(ImmutableShortEncodedValue(value), late) @@ -938,6 +952,7 @@ private fun MutableMethod.returnShort(value: Short, late: Boolean) { * * @see returnLate */ +context(_: BytecodePatchContext?) fun MutableMethod.returnEarly(value: Short) = returnShort(value, false) /** @@ -946,8 +961,10 @@ fun MutableMethod.returnEarly(value: Short) = returnShort(value, false) * * @see returnEarly */ +context(_: BytecodePatchContext?) fun MutableMethod.returnLate(value: Short) = returnShort(value, true) +context(_: BytecodePatchContext?) private fun MutableMethod.returnChar(value: Char, late: Boolean) { checkReturnType(Char::class.javaObjectType.allAssignableTypes() + Char::class.javaPrimitiveType!!) overrideReturnValue(ImmutableCharEncodedValue(value), late) @@ -959,6 +976,7 @@ private fun MutableMethod.returnChar(value: Char, late: Boolean) { * * @see returnLate */ +context(_: BytecodePatchContext?) fun MutableMethod.returnEarly(value: Char) = returnChar(value, false) /** @@ -967,8 +985,10 @@ fun MutableMethod.returnEarly(value: Char) = returnChar(value, false) * * @see returnEarly */ +context(_: BytecodePatchContext?) fun MutableMethod.returnLate(value: Char) = returnChar(value, true) +context(_: BytecodePatchContext?) private fun MutableMethod.returnInt(value: Int, late: Boolean) { checkReturnType(Int::class.javaObjectType.allAssignableTypes() + Int::class.javaPrimitiveType!!) overrideReturnValue(ImmutableIntEncodedValue(value), late) @@ -980,6 +1000,7 @@ private fun MutableMethod.returnInt(value: Int, late: Boolean) { * * @see returnLate */ +context(_: BytecodePatchContext?) fun MutableMethod.returnEarly(value: Int) = returnInt(value, false) /** @@ -988,8 +1009,10 @@ fun MutableMethod.returnEarly(value: Int) = returnInt(value, false) * * @see returnEarly */ +context(_: BytecodePatchContext?) fun MutableMethod.returnLate(value: Int) = returnInt(value, true) +context(_: BytecodePatchContext?) private fun MutableMethod.returnFloat(value: Float, late: Boolean) { checkReturnType(Float::class.javaObjectType.allAssignableTypes() + Float::class.javaPrimitiveType!!) overrideReturnValue(ImmutableFloatEncodedValue(value), late) @@ -1001,6 +1024,7 @@ private fun MutableMethod.returnFloat(value: Float, late: Boolean) { * * @see returnLate */ +context(_: BytecodePatchContext?) fun MutableMethod.returnEarly(value: Float) = returnFloat(value, false) /** @@ -1009,8 +1033,10 @@ fun MutableMethod.returnEarly(value: Float) = returnFloat(value, false) * * @see returnEarly */ +context(_: BytecodePatchContext?) fun MutableMethod.returnLate(value: Float) = returnFloat(value, true) +context(_: BytecodePatchContext?) private fun MutableMethod.returnLong(value: Long, late: Boolean) { checkReturnType(Long::class.javaObjectType.allAssignableTypes() + Long::class.javaPrimitiveType!!) overrideReturnValue(ImmutableLongEncodedValue(value), late) @@ -1022,6 +1048,7 @@ private fun MutableMethod.returnLong(value: Long, late: Boolean) { * * @see returnLate */ +context(_: BytecodePatchContext?) fun MutableMethod.returnEarly(value: Long) = returnLong(value, false) /** @@ -1030,8 +1057,10 @@ fun MutableMethod.returnEarly(value: Long) = returnLong(value, false) * * @see returnEarly */ +context(_: BytecodePatchContext?) fun MutableMethod.returnLate(value: Long) = returnLong(value, true) +context(_: BytecodePatchContext?) private fun MutableMethod.returnDouble(value: Double, late: Boolean) { checkReturnType(Double::class.javaObjectType.allAssignableTypes() + Double::class.javaPrimitiveType!!) overrideReturnValue(ImmutableDoubleEncodedValue(value), late) @@ -1043,6 +1072,7 @@ private fun MutableMethod.returnDouble(value: Double, late: Boolean) { * * @see returnLate */ +context(_: BytecodePatchContext?) fun MutableMethod.returnEarly(value: Double) = returnDouble(value, false) /** @@ -1051,18 +1081,23 @@ fun MutableMethod.returnEarly(value: Double) = returnDouble(value, false) * * @see returnEarly */ +context(_: BytecodePatchContext?) fun MutableMethod.returnLate(value: Double) = returnDouble(value, true) +context(context: BytecodePatchContext?) private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: Boolean) { + val neededRegisters: Int val instructions = if (value == null) { require(!returnLate) { "Cannot return late for method of void type" } + neededRegisters = 0 "return-void" } else { val encodedValue = DexFormatter.INSTANCE.getEncodedValue(value) when (value) { is NullEncodedValue -> { + neededRegisters = 1 """ const/4 v0, 0x0 return-object v0 @@ -1070,6 +1105,7 @@ private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: } is StringEncodedValue -> { + neededRegisters = 1 """ const-string v0, $encodedValue return-object v0 @@ -1077,6 +1113,7 @@ private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: } is ByteEncodedValue -> { + neededRegisters = 1 if (returnType == "B") { """ const/4 v0, $encodedValue @@ -1093,6 +1130,7 @@ private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: } is BooleanEncodedValue -> { + neededRegisters = 1 val encodedValue = value.value.toHexString() if (returnType == "Z") { """ @@ -1110,6 +1148,7 @@ private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: } is ShortEncodedValue -> { + neededRegisters = 1 if (returnType == "S") { """ const/16 v0, $encodedValue @@ -1126,6 +1165,7 @@ private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: } is CharEncodedValue -> { + neededRegisters = 1 if (returnType == "C") { """ const/16 v0, $encodedValue @@ -1142,6 +1182,7 @@ private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: } is IntEncodedValue -> { + neededRegisters = 1 if (returnType == "I") { """ const v0, $encodedValue @@ -1158,6 +1199,7 @@ private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: } is FloatEncodedValue -> { + neededRegisters = 1 val encodedValue = "${encodedValue}f" if (returnType == "F") { """ @@ -1175,6 +1217,7 @@ private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: } is LongEncodedValue -> { + neededRegisters = 2 val encodedValue = "${encodedValue}L" if (returnType == "J") { """ @@ -1184,7 +1227,7 @@ private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: } else { """ const-wide v0, $encodedValue - invoke-static { v0 }, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long; + invoke-static { v0, v1 }, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long; move-result-object v0 return-object v0 """ @@ -1192,6 +1235,7 @@ private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: } is DoubleEncodedValue -> { + neededRegisters = 2 if (returnType == "D") { """ const-wide v0, $encodedValue @@ -1200,7 +1244,7 @@ private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: } else { """ const-wide v0, $encodedValue - invoke-static { v0 }, Ljava/lang/Double;->valueOf(D)Ljava/lang/Double; + invoke-static { v0, v1 }, Ljava/lang/Double;->valueOf(D)Ljava/lang/Double; move-result-object v0 return-object v0 """ @@ -1211,14 +1255,39 @@ private fun MutableMethod.overrideReturnValue(value: EncodedValue?, returnLate: } } + val helperMethodInvocationInstructions: String? = run { + if (neededRegisters <= implementation!!.registerCount) { + return@run null + } + requireNotNull(context) { "BytecodePatchContext needed for helper method creation." } + val helperMethod = ImmutableMethod( + definingClass, + "$name\$helper", + listOf(), + returnType, + AccessFlags.PRIVATE.value or AccessFlags.STATIC.value, + setOf(), + setOf(), + MutableMethodImplementation(neededRegisters) + ).toMutable().apply { + addInstructions(instructions) + } + context.classBy { it.type == definingClass }!!.mutableClass.methods.add(helperMethod) + """ + invoke-static { }, $helperMethod + move-result-object v0 + return-object v0 + """ + } + if (returnLate) { findInstructionIndicesReversedOrThrow { opcode == RETURN || opcode == RETURN_WIDE || opcode == RETURN_OBJECT }.forEach { index -> - addInstructionsAtControlFlowLabel(index, instructions) + addInstructionsAtControlFlowLabel(index, helperMethodInvocationInstructions ?: instructions) } } else { - addInstructions(0, instructions) + addInstructions(0, helperMethodInvocationInstructions ?: instructions) } }