You can use this for incremental compilation or:
"I made a quick test with this
const val DEBUG = true
Then in Vector2:
fun slerp(b: Vector2, t: RealT): Vector2 {
if (DEBUG) {
require(this.isNormalized() && b.isNormalized()) { "Both this and b vector must be normalized!" }
}
val theta: RealT = angleTo(b)
return rotated((theta * t))
}
Note: if (DEBUG) is line 402.
This leads to this bytecode:
L0
ALOAD 1
LDC "b"
INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
L1
LINENUMBER 402 L1
NOP
L2
LINENUMBER 403 L2
ALOAD 0
INVOKEVIRTUAL godot/core/Vector2.isNormalized ()Z
IFEQ L3
ALOAD 1
INVOKEVIRTUAL godot/core/Vector2.isNormalized ()Z
IFEQ L3
L4
ICONST_1
GOTO L5
L3
ICONST_0
L5
ISTORE 4
L6
L7
ILOAD 4
IFNE L8
L9
L10
LINENUMBER 521 L10
L11
ICONST_0
ISTORE 5
L12
LINENUMBER 403 L12
LDC "Both this and b vector must be normalized!"
L13
L14
LINENUMBER 403 L14
ASTORE 5
L15
NEW java/lang/IllegalArgumentException
DUP
ALOAD 5
INVOKEVIRTUAL java/lang/Object.toString ()Ljava/lang/String;
INVOKESPECIAL java/lang/IllegalArgumentException.<init> (Ljava/lang/String;)V
ATHROW
L8
LINENUMBER 405 L8
ALOAD 0
ALOAD 1
INVOKEVIRTUAL godot/core/Vector2.angleTo (Lgodot/core/Vector2;)D
DSTORE 4
L16
LINENUMBER 406 L16
ALOAD 0
DLOAD 4
DLOAD 2
DMUL
INVOKEVIRTUAL godot/core/Vector2.rotated (D)Lgodot/core/Vector2;
ARETURN
L17
LOCALVARIABLE $i$a$-require-Vector2$slerp$1 I L12 L14 5
LOCALVARIABLE theta D L16 L17 4
LOCALVARIABLE this Lgodot/core/Vector2; L0 L17 0
LOCALVARIABLE b Lgodot/core/Vector2; L0 L17 1
LOCALVARIABLE t D L0 L17 2
MAXSTACK = 5
MAXLOCALS = 6
As we can see we have no operation for if line, and then all require expression code.
If I set
const val DEBUG = false
Then this leads to this bytecode:
L0
ALOAD 1
LDC "b"
INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
L1
LINENUMBER 402 L1
NOP
L2
LINENUMBER 405 L2
ALOAD 0
ALOAD 1
INVOKEVIRTUAL godot/core/Vector2.angleTo (Lgodot/core/Vector2;)D
DSTORE 4
L3
LINENUMBER 406 L3
ALOAD 0
DLOAD 4
DLOAD 2
DMUL
INVOKEVIRTUAL godot/core/Vector2.rotated (D)Lgodot/core/Vector2;
ARETURN
L4
LOCALVARIABLE theta D L3 L4 4
LOCALVARIABLE this Lgodot/core/Vector2; L0 L4 0
LOCALVARIABLE b Lgodot/core/Vector2; L0 L4 1
LOCALVARIABLE t D L0 L4 2
MAXSTACK = 5
MAXLOCALS = 6
"
All require code is removed.
As we’re “dexifying” our jar for android and graal native image rely on jvm compiled bytecode, this should do the job !
https://discuss.kotlinlang.org/t/any-plans-for-having-conditional-compiling/1041/15