Package gnu.expr

Class Declaration

All Implemented Interfaces:
SourceLocator, SourceLocator, Locator

public class Declaration extends SourceLocator.Simple
The static information associated with a local variable binding.
  • Field Details

    • id

      protected int id
      Unique id number, to ease print-outs and debugging. If negative, a code to specify a builtin function.
    • context

      public ScopeExp context
    • type

      public Type type
      The type of the value of this Declaration. It is null if the type is un-specified and not yet inferred. Will get set implicitly by getType, to avoid inconsistencies.
    • typeExp

      public Expression typeExp
    • base

      public Declaration base
      If non-null, field is relative to base. If IS_FLUID, base points to IS_UNKNOWN Symbol.
    • getterMethod

      public Method getterMethod
    • setterMethod

      public Method setterMethod
    • PRIVATE_PREFIX

      public static final String PRIVATE_PREFIX
      This prefix is used in field names for a declaration that has both EXTERNAL_ACCESS and IS_PRIVATE set.
      See Also:
    • PROCEDURE

      public static final int PROCEDURE
      True if in the function namespace, for languages that distinguishes them. I.e. a function definition or macro definition.
      See Also:
    • IS_ALIAS

      public static final int IS_ALIAS
      See Also:
    • NOT_DEFINING

      public static final int NOT_DEFINING
      Set if this is just a declaration, not a definition.
      See Also:
    • EXPORT_SPECIFIED

      public static final int EXPORT_SPECIFIED
      See Also:
    • STATIC_SPECIFIED

      public static final int STATIC_SPECIFIED
      See Also:
    • NONSTATIC_SPECIFIED

      public static final int NONSTATIC_SPECIFIED
      See Also:
    • TYPE_SPECIFIED

      public static final int TYPE_SPECIFIED
      See Also:
    • IS_CONSTANT

      public static final int IS_CONSTANT
      See Also:
    • IS_SYNTAX

      public static final int IS_SYNTAX
      See Also:
    • IS_UNKNOWN

      public static final int IS_UNKNOWN
      See Also:
    • IS_IMPORTED

      public static final int IS_IMPORTED
      See Also:
    • IS_CAPTURED

      public static final int IS_CAPTURED
      See Also:
    • IS_SINGLE_VALUE

      public static final int IS_SINGLE_VALUE
      See Also:
    • EXTERNAL_ACCESS

      public static final int EXTERNAL_ACCESS
      This flag bit is set if this can be be accessed from other modules. Ignored unless PRIVATE. Used when an exported macro references a non-exported name.
      See Also:
    • FIELD_OR_METHOD

      public static final int FIELD_OR_METHOD
      True if this is a field or method in a class definition.
      See Also:
    • IS_NAMESPACE_PREFIX

      public static final int IS_NAMESPACE_PREFIX
      Set if this declares a namespace prefix (as in XML namespaces).
      See Also:
    • PRIVATE_ACCESS

      public static final int PRIVATE_ACCESS
      See Also:
    • PRIVATE_SPECIFIED

      public static final int PRIVATE_SPECIFIED
      See Also:
    • PROTECTED_ACCESS

      public static final int PROTECTED_ACCESS
      See Also:
    • PUBLIC_ACCESS

      public static final int PUBLIC_ACCESS
      See Also:
    • PACKAGE_ACCESS

      public static final int PACKAGE_ACCESS
      See Also:
    • IS_DYNAMIC

      public static final int IS_DYNAMIC
      See Also:
    • EARLY_INIT

      public static final int EARLY_INIT
      Initialize in <init>/<clinit> rather than in run/$run$.
      See Also:
    • MODULE_REFERENCE

      public static final int MODULE_REFERENCE
      A reference to a module instance.
      See Also:
    • VOLATILE_ACCESS

      public static final long VOLATILE_ACCESS
      See Also:
    • TRANSIENT_ACCESS

      public static final long TRANSIENT_ACCESS
      See Also:
    • ENUM_ACCESS

      public static final long ENUM_ACCESS
      See Also:
    • FINAL_ACCESS

      public static final long FINAL_ACCESS
      See Also:
    • ABSTRACT_ACCESS

      public static final long ABSTRACT_ACCESS
      See Also:
    • SYNCHRONIZED_ACCESS

      public static final long SYNCHRONIZED_ACCESS
      See Also:
    • STRICTFP_ACCESS

      public static final long STRICTFP_ACCESS
      See Also:
    • CLASS_ACCESS_FLAGS

      public static final long CLASS_ACCESS_FLAGS
      See Also:
    • FIELD_ACCESS_FLAGS

      public static final long FIELD_ACCESS_FLAGS
      See Also:
    • METHOD_ACCESS_FLAGS

      public static final long METHOD_ACCESS_FLAGS
      See Also:
    • MAYBE_UNINITIALIZED_ACCESS

      public static final long MAYBE_UNINITIALIZED_ACCESS
      See Also:
    • ALLOCATE_ON_STACK

      public static final long ALLOCATE_ON_STACK
      Allocate variable on JVM stack as an optimization. This means load is implemented as a dup instruction. (This is no faster on decent JVMs, but the bytecode is more compact.) Note this may cause an InternalError if this is loaded when the JVM stack has grown since the variable was initialized.
      See Also:
    • PATTERN_NESTED

      public static final long PATTERN_NESTED
      True for a variable inside a pattern, but not the top of the pattern. E.g. for a pattern [a [b c]] there is a main declaration for the incoming value - which does not have PATTERN_NESTED set. There are three declarations a, b, and c - which do have PATTERN_NESTED set. In addition there may be helper variables which are anonymous (i.e. getSymbol() returns null), like the match for the sequence [b c]; these also have PATTERN_NESTED set.
      See Also:
    • SKIP_FOR_METHOD_PARAMETER

      public static final long SKIP_FOR_METHOD_PARAMETER
      See parameterForMethod()
      See Also:
    • IS_REST_PARAMETER

      public static final long IS_REST_PARAMETER
      See Also:
    • IS_PARAMETER

      public static final long IS_PARAMETER
      See Also:
    • IS_SUPPLIED_PARAMETER

      public static final long IS_SUPPLIED_PARAMETER
      Is this a supplied-parameter variable? If IS_SUPPLIED_PARAMETER is true and IS_PARAMETER is false then this is a boolean variable which reports if the previous parameter was provided by the argument list, rather than defaulted. If IS_SUPPLIED_PARAMETER is true and IS_PARAMETER is true then this is an optional or keyword parameter that has corresponding supplied-parameter later in the parameter list.
      See Also:
    • KEYWORDS_OK

      public static final long KEYWORDS_OK
      Applies to a 'rest' parameter if it can match keywords.
      See Also:
    • DONT_COPY

      public static final long DONT_COPY
      See Also:
    • SCAN_OWNER

      public static final long SCAN_OWNER
      See Also:
    • flags

      protected long flags
    • firstCall

      public ApplyExp firstCall
      List of ApplyExp where this declaration is the function called. The applications are chained using their nextCall fields. This is list is built twice: First in PushApply (for use during InlineCalls), then the list is clearest, then rebuilt in FindTailCalls. This is because InlineCalls may inline and re-arrange the call graph. The chain is not built the second time if STATIC_SPECIFIED.
  • Constructor Details

    • Declaration

      public Declaration(Object name, Type type)
    • Declaration

      public Declaration(Variable var)
    • Declaration

      public Declaration(Object name)
    • Declaration

      public Declaration(Object name, Field field)
  • Method Details

    • setCode

      public void setCode(int code)
    • getCode

      public int getCode()
    • getTypeExp

      public final Expression getTypeExp()
    • getType

      public final Type getType()
    • getTypeExpRaw

      public Expression getTypeExpRaw()
    • setType

      public final void setType(Type type)
    • setTypeExp

      public final void setTypeExp(Expression typeExp)
    • setType

      public final void setType(Expression typeExp, Type type)
    • getName

      public final String getName()
    • setName

      public final void setName(Object symbol)
    • getSymbol

      public final Object getSymbol()
    • setSymbol

      public final void setSymbol(Object symbol)
    • nextDecl

      public final Declaration nextDecl()
    • setNext

      public final void setNext(Declaration next)
    • getVariable

      public Variable getVariable()
    • getScanNesting

      public int getScanNesting()
      If non-zero, indicates this names a 'scan' of a sequence. The value property is a sequence; the declaration names "each" of the elements. This field is the amount of nesting within scan ('...') contexts.
    • setScanNesting

      public void setScanNesting(int value)
    • isSimple

      public final boolean isSimple()
    • setSimple

      public final void setSimple(boolean b)
    • setSyntax

      public final void setSyntax()
    • getContext

      public final ScopeExp getContext()
      Return the ScopeExp that contains (declares) this Declaration.
    • loadFieldLocation

      public Type loadFieldLocation(Declaration owner, Compilation comp)
    • load

      public void load(AccessExp access, int flags, Compilation comp, Target target)
    • compileStore

      public void compileStore(Compilation comp)
    • isCompiletimeConstant

      public boolean isCompiletimeConstant()
    • needsExternalAccess

      public final boolean needsExternalAccess()
    • needsContext

      public final boolean needsContext()
      If we need a 'context' supplied from a ReferenceExp or 'this.
    • getFlag

      public final boolean getFlag(long flag)
    • setFlag

      public final void setFlag(boolean setting, long flag)
    • setFlag

      public final void setFlag(long flag)
    • isPublic

      public final boolean isPublic()
    • isPrivate

      public final boolean isPrivate()
    • isModuleLocal

      public final boolean isModuleLocal()
    • setPrivate

      public final void setPrivate(boolean isPrivate)
    • getAccessFlags

      public short getAccessFlags(short defaultFlags)
    • isAlias

      public final boolean isAlias()
    • setAlias

      public final void setAlias(boolean flag)
    • isFluid

      public final boolean isFluid()
      True if this is a fluid binding (in a FluidLetExp). Also true if this binding is the one re-bound by a FluidLetExp.
    • setFluid

      public final void setFluid(boolean fluid)
    • isProcedureDecl

      public final boolean isProcedureDecl()
    • setProcedureDecl

      public final void setProcedureDecl(boolean val)
    • isClassMethod

      public final boolean isClassMethod()
    • isClassField

      public final boolean isClassField()
    • isNamespaceDecl

      public final boolean isNamespaceDecl()
    • parameterForMethod

      public final boolean parameterForMethod()
      Is this a parameter for the generated method? For example if a lambda's parameter is the pattern [x y] then there is an anonymous parameter p0 that is the incoming 2-element sequence plus named parameters x and y. The later two are parameters for the generated method, but the anonymous p0 is not.
    • isIndirectBinding

      public final boolean isIndirectBinding()
      True if the value of the variable is the contents of a Location.
      See Also:
      • INDIRECT_BINDING
    • setIndirectBinding

      public final void setIndirectBinding(boolean indirectBinding)
      Note that the value of the variable is the contents of a Location.
      See Also:
      • INDIRECT_BINDING
    • maybeIndirectBinding

      public void maybeIndirectBinding(Compilation comp)
    • inExternalModule

      public boolean inExternalModule(Compilation comp)
    • isGuard

      public boolean isGuard()
      Does this encapsulate a boolean guard expression? In that case this is an unnamed pseudo-parameter, that matches no actual arguments but where getInitValue() is the expression.
    • getCanRead

      public final boolean getCanRead()
    • setCanRead

      public final void setCanRead(boolean read)
    • setCanRead

      public final void setCanRead()
    • getCanReadOrCall

      public final boolean getCanReadOrCall()
    • getCanCall

      public final boolean getCanCall()
    • setCanCall

      public final void setCanCall(boolean called)
    • setCanCall

      public final void setCanCall()
    • getCanWrite

      public final boolean getCanWrite()
    • setCanWrite

      public final void setCanWrite(boolean written)
    • setCanWrite

      public final void setCanWrite()
    • isThisParameter

      public final boolean isThisParameter()
      Is this an implicit 'this' parameter?
    • mayBeAccessedUninitialized

      public boolean mayBeAccessedUninitialized()
    • ignorable

      public boolean ignorable()
      True if we never need to access this declaration.
    • isStatic

      public boolean isStatic()
    • isLexical

      public final boolean isLexical()
    • isUnknown

      public static final boolean isUnknown(Declaration decl)
    • addCaller

      public void addCaller(ApplyExp exp)
      Add a call to the list headed by firstCall.
    • clearCallList

      public void clearCallList()
      Clear the list of callers headed by firstCall.
    • numAnnotations

      public int numAnnotations()
      The number of annotations associated with the declaration.
    • getAnnotation

      public Expression getAnnotation(int i)
      Indexed get of one of the annotations associated with this declaration.
    • getAnnotation

      public <T extends Annotation> T getAnnotation(Class<T> clas)
    • getAnnotation

      public AnnotationEntry getAnnotation(String className)
    • setAnnotation

      public void setAnnotation(int i, Expression ann)
      Replace one of the annotations associated with this declaration.
    • addAnnotation

      public void addAnnotation(Expression exp)
      Add an annotation to the set of our annotations.
      Parameters:
      exp - A constant-valued expression that evaluates to an Annotation.
    • compileAnnotations

      public void compileAnnotations(AttrContainer container, ElementType etype)
    • pushIndirectBinding

      public void pushIndirectBinding(Compilation comp)
      Create a Location object, given that isIndirectBinding(). Assume the initial value is already pushed on the stack; leaves initialized Location object on stack.
    • allocateVariable

      public final Variable allocateVariable(CodeAttr code)
    • allocateVariable

      public final Variable allocateVariable(CodeAttr code, boolean autoPopScope)
    • getImplementationType

      public Type getImplementationType()
    • printInfo

      public void printInfo(gnu.kawa.io.OutPort out)
    • printInfo

      public void printInfo(StringBuffer sbuf)
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • followAliases

      public static Declaration followAliases(Declaration decl)
    • makeField

      public void makeField(Compilation comp, Expression value)
    • makeField

      public void makeField(ClassType frameType, Compilation comp, Expression value)
    • maybeSourceName

      public void maybeSourceName(AttrContainer member, String expName)
      Add SourceName annotation to member, if needed.
    • getDeclarationFromStatic

      public static Declaration getDeclarationFromStatic(String cname, String fname)
      Create a declaration corresponding to a static field.
      Parameters:
      cname - name of class containing field
      fname - name of static field
    • getDeclarationValueFromStatic

      public static Declaration getDeclarationValueFromStatic(String className, String fieldName, String name)
      Similar to getDeclarationFromStatic, but also do noteValue with the field's value.
    • getDeclaration

      public static Declaration getDeclaration(Named proc)
    • getDeclaration

      public static Declaration getDeclaration(Object proc, String name)
    • getInitValue

      public Expression getInitValue()
      Get the "initial value" expression. This is used for the initializing value in a LetExp, a parameter's default value, or for pattern-matching.
    • setInitValue

      public void setInitValue(Expression init)
    • hasUnknownValue

      public boolean hasUnknownValue()
    • getValue

      public final Expression getValue()
      The value of this Declaration, if known. Usually the expression used to initialize the Declaration, or null if the Declaration can be assigned a different value after initialization. Note that this is the semantic value: If the INDIRECT_LOCATION is set, then getValue is the value after de-referencing the resulting Location. An exception is if isAlias(); in that case getValue() is an expression yielding a Location which needs to be de-referenced to get this Declaration's actual value.
    • getValueRaw

      public Expression getValueRaw()
    • setValue

      public final void setValue(Expression value)
      Set the value associated with this Declaration. Most code should use noteValue instead.
    • getConstantValue

      public final Object getConstantValue()
      If getValue() is a constant, return the constant value, otherwise null.
    • hasConstantValue

      public final boolean hasConstantValue()
    • getLambdaValue

      public LambdaExp getLambdaValue()
    • noteValue

      public void noteValue(Expression value)
    • noteValueConstant

      public void noteValueConstant(Object value)
    • noteValueUnknown

      public void noteValueUnknown()
    • noteValueFromSet

      public void noteValueFromSet(SetExp setter)
    • noteValueFromLet

      public void noteValueFromLet(ScopeExp letter)
    • noteValueFromApply

      public void noteValueFromApply(ApplyExp app, int index)
    • patchSymbolFromSet

      public boolean patchSymbolFromSet()
      Set symbol from initializing SetExp. Used for an export-only alias, for handling export-with-rename.
    • getField

      public Field getField()
    • setField

      public void setField(Field field)