Class SuperConstructorAsmGenerator

java.lang.Object
org.ek9lang.compiler.backend.jvm.SuperConstructorAsmGenerator
All Implemented Interfaces:
org.objectweb.asm.Opcodes

final class SuperConstructorAsmGenerator extends Object implements org.objectweb.asm.Opcodes
Resolves the JVM superclass of an EK9 construct and injects the 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
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    (package private) String
    Determine the JVM superclass name for a construct.
    (package private) boolean
    Check if constructor delegates to another constructor via this().
    (package private) void
    injectSuperConstructorCall(org.objectweb.asm.MethodVisitor mv, IRConstruct construct)
    Inject appropriate super constructor call for the construct.
    (package private) boolean
    Check if construct needs a super constructor call injected.

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

  • Method Details

    • determineSuperclassName

      String determineSuperclassName(IRConstruct construct)
      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 (or Any for a function) means extend java/lang/Object; the Any-is-an-interface case for aggregates is handled by the caller, which adds implements Any.

    • injectSuperConstructorCall

      void injectSuperConstructorCall(org.objectweb.asm.MethodVisitor mv, IRConstruct construct)
      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

      boolean needsSuperCallInjected(IRConstruct construct)
      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

      boolean hasThisDelegation(OperationInstr operation)
      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