Class SuperConstructorAsmGenerator
- All Implemented Interfaces:
org.objectweb.asm.Opcodes
super(...) constructor call
when the IR does not already contain one. Handles the function super-chain (skipping bytecode-less
abstract function traits), Scenario-2 wrapper bases, and the Any-is-a-Java-interface case
(which maps to java/lang/Object). Extracted from AsmStructureCreator; depends only on the
name converter, with the per-constructor MethodVisitor passed per call.-
Field Summary
Fields inherited from interface org.objectweb.asm.Opcodes
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V9 -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription(package private) StringdetermineSuperclassName(IRConstruct construct) Determine the JVM superclass name for a construct.(package private) booleanhasThisDelegation(OperationInstr operation) Check if constructor delegates to another constructor via this().(package private) voidinjectSuperConstructorCall(org.objectweb.asm.MethodVisitor mv, IRConstruct construct) Inject appropriate super constructor call for the construct.(package private) booleanneedsSuperCallInjected(IRConstruct construct) Check if construct needs a super constructor call injected.
-
Constructor Details
-
SuperConstructorAsmGenerator
SuperConstructorAsmGenerator(FullyQualifiedJvmName jvmNameConverter)
-
-
Method Details
-
determineSuperclassName
Determine the JVM superclass name for a construct.The resolved super type is supplied by the IR (
IRConstruct.getSuperType()) — Scenario-2 wrapper bases, the function super-chain (including extern Java-backed abstract functions such as SignalHandler), and aggregate supers are all resolved there, so this method is a mechanical map from the resolved EK9 super symbol to its JVM internal name. Empty super (orAnyfor a function) means extendjava/lang/Object; theAny-is-an-interface case for aggregates is handled by the caller, which addsimplements Any. -
injectSuperConstructorCall
Inject appropriate super constructor call for the construct.Determines the correct superclass to call based on construct type: - Scenario 2 function wrappers: call base function's constructor (e.g., Acceptor) - Functions with super function: call super function's constructor - Functions without super function: call Object's constructor - Classes extending Any: call Object's constructor (Any is interface in Java) - Classes with explicit superclass: call that superclass's constructor - Classes without superclass: call Object's constructor
-
needsSuperCallInjected
Check if construct needs a super constructor call injected.Returns true when the IR does NOT contain a super() call but bytecode requires one. The actual super to call is determined by injectSuperConstructorCall() - this method just determines IF we need to inject a call.
For functions: inject super call only if super function has no bytecode (IR won't have call). If super function HAS bytecode, IR already contains the super() call. For aggregates: inject if no explicit superclass or extends Any.
- Parameters:
construct- The IR construct to check- Returns:
- true if super() call needs to be injected
-
hasThisDelegation
Check if constructor delegates to another constructor via this(). Detects this() calls by looking for CALL instructions with target="this" and method="<init>".- Parameters:
operation- The constructor operation IR- Returns:
- true if constructor contains this() delegation
-