Record Class CallDetails
The targetTypeName is the type where the method is actually defined,
which may be a parent class if the method is inherited. This enables correct
method resolution for both JVM (INVOKEVIRTUAL) and LLVM (vtable dispatch) backends.
The isVirtualCall flag indicates whether the call requires runtime
polymorphic dispatch (vtable lookup) or can use static dispatch (direct call).
Virtual calls are needed for non-final methods on non-final classes where the
runtime type may differ from the static type.
The isExplicitTraitDefaultCall flag indicates an explicit call to a trait's
default method implementation using TraitName.method() syntax. In JVM bytecode,
this requires INVOKESPECIAL to bypass virtual dispatch and call the interface's
default method directly (similar to super calls).
The isExternTarget flag is TRUE exactly when the type the call NAMES is externally linked
(IR lane F, Steve 2026-10-28: "extern should be externally linked in some way; defaulted/synthetic methods are
not external"). Externally linked means the type's code is not produced from EK9 source in this program: it is
EXTERN (a built-in such as String or Stdout, or a defines extern library type;
Java on the JVM, the C runtime natively) or a PRE_BUILT parameterisation (bytecode shipped in ek9-lang),
or it is a runtime helper class with no EK9 symbol (Ek9CycleGuard, Ek9Sort, ...). It is FALSE
for a user EK9 type - even for its defaulted or synthesised members (_i_init, <init>,
_isSet) - and for a type the compiler generates for this program (a Scenario 2 delegation wrapper for a
parameterisation with no pre-built class, a Scenario 3 monomorphisation, a dynamic class or function). THE
decision is IsExternallyLinked, reached through
DispatchFacts.externallyLinked; ExternTargetInvariant checks every CALL of every IR fixture.
toString() does not render it. The LLVM branch reads it for super(...) lowering (review B-R1):
a user base class is therefore NOT a C-runtime type.
metaData is nullable, and its absence is meaningful only together with kind().
Purity, complexity and side-effects are properties of the callee that the user authored - as pure,
complexity measured by phase 5 from their code. Every CALL is exactly one CallDetails.Kind:
CallDetails.Kind.PROGRAM- metadata present: the callee is EK9 language surface, and every field was READ from its resolved symbol (or, for a target with no resolvable member, from the OperatorMap declaration of that operator). Phase 12 may evaluate it.CallDetails.Kind.PLUMBING- the callee is compiler↔runtime PLUMBING that the lowering invented (_true,_ofFalse, theEk9Async/Ek9Sort/... stream helpers). It has no EK9 symbol because it is not part of the program at all, so no edit by a user or an AI can change it. Stamping a program-property field on it is a category error, so it carries no metadata.CallDetails.Kind.SYNTHESISED_MEMBER- a compiler-synthesised member with no symbol (_i_init,_c_init,_fieldSetStatus,_copyAccepts;IsSynthesisedMember): never measured, so no metadata - but NOT plumbing, because the body is in this IR.CallDetails.Kind.UNRESOLVED- no metadata and none of the above: a phase-7 site that did not read the callee it resolved. A defect, never a legitimate state; an IR reader must treat the call as UNKNOWN, never as effect-free.
The plumbing mark is DERIVED from targetTypeName/methodName through
CompilerPlumbingCalls - the same predicate every synthesis site already asks before it drops
the metadata - rather than stored as a second copy that could disagree with it. Name matching is sound
there because the plumbing names cannot be written in EK9 (a leading _ is a syntax error; the
helper types live in org.ek9.lang and carry no @Ek9Class).
There is deliberately no "default" or "unresolved" tuple. A fabricated pure=true is worse
than no answer, because Phase 12 acts on it. See
docs/ir-and-codegen/EK9_CALL_METADATA_ROOT_C_PLAN.md and
docs/ir-and-codegen/EK9_ESCAPE_MUTATION_IR_SUFFICIENCY.md §10.1/§11.
statementOwned is TRUE when the call's closeable result is owned by the evaluation that makes it - its
block statement, or, for code in no statement, a returning variable's or a property's initialiser or a text's string
- so that evaluation closes it when it finishes. Phase 5 decides it on the call's resolved symbol
(support/MarkStatementOwned); IR generation only reads it. It is a binary field, deliberately NOT
rendered by toString(): the close the statement emits is what the IR shows.
boundToNamedType is TRUE for a call that must run the NAMED type's own implementation on a receiver
whose class may override it (D38): a generated comparison's field-set-status step reads the status of the fields
THAT operator compares, on this and on param alike. It is never virtual. Rendered
bound=true; a back end calls the named type's method directly (JVM INVOKESPECIAL - the receiver is
typed as the class being generated; native: the named type's function, never the vtable slot). It is the
any-receiver sibling of Contract 19's CALL (Owner)super._x().
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enumThe four kinds of CALL - see the record javadoc. -
Constructor Summary
ConstructorsConstructorDescriptionCallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget) A call whose result no statement owns - every call other than the closeable temporaries phase 5 marked.CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned) A call that is not bound to its named type - every call other than D38's field-set-status step.CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned, boolean boundToNamedType) A call with today's ownership conventions (CallConventions.DEFAULT).CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned, boolean boundToNamedType, CallConventions conventions) Creates an instance of aCallDetailsrecord class. -
Method Summary
Modifier and TypeMethodDescriptionReturns the value of theargumentsrecord component.booleanReturns the value of theboundToNamedTyperecord component.Returns the value of theconventionsrecord component.final booleanIndicates whether some other object is "equal to" this one.final inthashCode()Returns a hash code value for this object.booleanReturns the value of theisExplicitTraitDefaultCallrecord component.booleanReturns the value of theisExternTargetrecord component.booleanTHE plumbing mark: the callee is compiler↔runtime lowering, not part of the program.booleanReturns the value of theisTraitCallrecord component.booleanReturns the value of theisVirtualCallrecord component.kind()What kind of callee this CALL reaches - see the record javadoc.metaData()Returns the value of themetaDatarecord component.Returns the value of themethodNamerecord component.Returns the value of theparameterTypesrecord component.Returns the value of thereturnTypeNamerecord component.booleanReturns the value of thestatementOwnedrecord component.Returns the value of thetargetObjectrecord component.Returns the value of thetargetTypeNamerecord component.toString()Returns a string representation of this record class.withConventions(CallConventions newConventions) This call with different ownership conventions (EK9_IR_OWNERSHIP_MODEL.md §5); everything else unchanged.withStatementOwned(boolean newStatementOwned) This call with phase 5's decision on whether the statement making it owns (and closes) the closeable it returns (support/MarkStatementOwned); everything else unchanged.
-
Constructor Details
-
CallDetails
public CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned, boolean boundToNamedType, CallConventions conventions) Creates an instance of aCallDetailsrecord class.- Parameters:
targetObject- the value for thetargetObjectrecord componenttargetTypeName- the value for thetargetTypeNamerecord componentmethodName- the value for themethodNamerecord componentparameterTypes- the value for theparameterTypesrecord componentreturnTypeName- the value for thereturnTypeNamerecord componentarguments- the value for theargumentsrecord componentmetaData- the value for themetaDatarecord componentisVirtualCall- the value for theisVirtualCallrecord componentisTraitCall- the value for theisTraitCallrecord componentisExplicitTraitDefaultCall- the value for theisExplicitTraitDefaultCallrecord componentisExternTarget- the value for theisExternTargetrecord componentstatementOwned- the value for thestatementOwnedrecord componentboundToNamedType- the value for theboundToNamedTyperecord componentconventions- the value for theconventionsrecord component
-
CallDetails
public CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned, boolean boundToNamedType) A call with today's ownership conventions (CallConventions.DEFAULT). -
CallDetails
public CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned) A call that is not bound to its named type - every call other than D38's field-set-status step. -
CallDetails
public CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget) A call whose result no statement owns - every call other than the closeable temporaries phase 5 marked.
-
-
Method Details
-
withConventions
This call with different ownership conventions (EK9_IR_OWNERSHIP_MODEL.md §5); everything else unchanged. -
withStatementOwned
This call with phase 5's decision on whether the statement making it owns (and closes) the closeable it returns (support/MarkStatementOwned); everything else unchanged. THE way to set it on a built call - never a field-by-field copy of the record. -
kind
What kind of callee this CALL reaches - see the record javadoc. THE single question an IR reader asks before trusting (or refusing to trust)metaData(). -
isPlumbing
public boolean isPlumbing()THE plumbing mark: the callee is compiler↔runtime lowering, not part of the program. -
toString
-
hashCode
-
equals
Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. Reference components are compared withObjects::equals(Object,Object); primitive components are compared with thecomparemethod from their corresponding wrapper classes. -
targetObject
Returns the value of thetargetObjectrecord component.- Returns:
- the value of the
targetObjectrecord component
-
targetTypeName
Returns the value of thetargetTypeNamerecord component.- Returns:
- the value of the
targetTypeNamerecord component
-
methodName
Returns the value of themethodNamerecord component.- Returns:
- the value of the
methodNamerecord component
-
parameterTypes
-
returnTypeName
Returns the value of thereturnTypeNamerecord component.- Returns:
- the value of the
returnTypeNamerecord component
-
arguments
-
metaData
Returns the value of themetaDatarecord component.- Returns:
- the value of the
metaDatarecord component
-
isVirtualCall
public boolean isVirtualCall()Returns the value of theisVirtualCallrecord component.- Returns:
- the value of the
isVirtualCallrecord component
-
isTraitCall
public boolean isTraitCall()Returns the value of theisTraitCallrecord component.- Returns:
- the value of the
isTraitCallrecord component
-
isExplicitTraitDefaultCall
public boolean isExplicitTraitDefaultCall()Returns the value of theisExplicitTraitDefaultCallrecord component.- Returns:
- the value of the
isExplicitTraitDefaultCallrecord component
-
isExternTarget
public boolean isExternTarget()Returns the value of theisExternTargetrecord component.- Returns:
- the value of the
isExternTargetrecord component
-
statementOwned
public boolean statementOwned()Returns the value of thestatementOwnedrecord component.- Returns:
- the value of the
statementOwnedrecord component
-
boundToNamedType
public boolean boundToNamedType()Returns the value of theboundToNamedTyperecord component.- Returns:
- the value of the
boundToNamedTyperecord component
-
conventions
Returns the value of theconventionsrecord component.- Returns:
- the value of the
conventionsrecord component
-