org.omegahat.Environment.Language.UserClasses
Class UserClassGenerator

java.lang.Object
  |
  +--org.omegahat.Environment.Compile.DynamicCompiler
        |
        +--org.omegahat.Environment.GUITools.EvaluableInterfaceGenerator
              |
              +--org.omegahat.Environment.Language.UserClasses.UserClassGenerator
All Implemented Interfaces:
jas.RuntimeConstants

public class UserClassGenerator
extends EvaluableInterfaceGenerator

Used to define and create new Java classes, each of which implements an Omeghat user-level class via interpreted methods and constructors. An object of this class is usually instantiated with a ClassDefinition object (which should have been evaluated) and this object becomes a dedicated compiler for this definition. It generates the Java byte-code containing fields, methods and constructors which are implemented by calls to the appropriate functions.


Field Summary
protected  ClassDefinition omegaClassDef
          A reference to the object which was used to define the user-level class before being compiled by this object.
 
Fields inherited from class org.omegahat.Environment.GUITools.EvaluableInterfaceGenerator
interfaces, separator, signaturePrefix, signatureSuffix, useSuperClassConstructors
 
Fields inherited from class org.omegahat.Environment.Compile.DynamicCompiler
BOTH, classDef, className, debug, GET, output, packageName, SET, superClassName
 
Fields inherited from interface jas.RuntimeConstants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, CONSTANT_CLASS, CONSTANT_DOUBLE, CONSTANT_FIELD, CONSTANT_FLOAT, CONSTANT_INTEGER, CONSTANT_INTERFACEMETHOD, CONSTANT_LONG, CONSTANT_METHOD, CONSTANT_NAMEANDTYPE, CONSTANT_STRING, CONSTANT_UNICODE, CONSTANT_UTF8, JAVA_MAGIC, JAVA_MINOR_VERSION, JAVA_VERSION, opc_aaload, opc_aastore, opc_aconst_null, opc_aload, opc_aload_0, opc_aload_1, opc_aload_2, opc_aload_3, opc_anewarray, opc_areturn, opc_arraylength, opc_astore, opc_astore_0, opc_astore_1, opc_astore_2, opc_astore_3, opc_athrow, opc_baload, opc_bastore, opc_bipush, opc_breakpoint, opc_caload, opc_castore, opc_checkcast, opc_d2f, opc_d2i, opc_d2l, opc_dadd, opc_daload, opc_dastore, opc_dcmpg, opc_dcmpl, opc_dconst_0, opc_dconst_1, opc_ddiv, opc_dead, opc_dload, opc_dload_0, opc_dload_1, opc_dload_2, opc_dload_3, opc_dmul, opc_dneg, opc_drem, opc_dreturn, opc_dstore, opc_dstore_0, opc_dstore_1, opc_dstore_2, opc_dstore_3, opc_dsub, opc_dup, opc_dup_x1, opc_dup_x2, opc_dup2, opc_dup2_x1, opc_dup2_x2, opc_f2d, opc_f2i, opc_f2l, opc_fadd, opc_faload, opc_fastore, opc_fcmpg, opc_fcmpl, opc_fconst_0, opc_fconst_1, opc_fconst_2, opc_fdiv, opc_fload, opc_fload_0, opc_fload_1, opc_fload_2, opc_fload_3, opc_fmul, opc_fneg, opc_frem, opc_freturn, opc_fstore, opc_fstore_0, opc_fstore_1, opc_fstore_2, opc_fstore_3, opc_fsub, opc_getfield, opc_getstatic, opc_goto, opc_goto_w, opc_i2b, opc_i2c, opc_i2d, opc_i2f, opc_i2l, opc_i2s, opc_iadd, opc_iaload, opc_iand, opc_iastore, opc_iconst_0, opc_iconst_1, opc_iconst_2, opc_iconst_3, opc_iconst_4, opc_iconst_5, opc_iconst_m1, opc_idiv, opc_if_acmpeq, opc_if_acmpne, opc_if_icmpeq, opc_if_icmpge, opc_if_icmpgt, opc_if_icmple, opc_if_icmplt, opc_if_icmpne, opc_ifeq, opc_ifge, opc_ifgt, opc_ifle, opc_iflt, opc_ifne, opc_ifnonnull, opc_ifnull, opc_iinc, opc_iload, opc_iload_0, opc_iload_1, opc_iload_2, opc_iload_3, opc_imul, opc_ineg, opc_instanceof, opc_int2byte, opc_int2char, opc_int2short, opc_invokeinterface, opc_invokenonvirtual, opc_invokespecial, opc_invokestatic, opc_invokevirtual, opc_ior, opc_irem, opc_ireturn, opc_ishl, opc_ishr, opc_istore, opc_istore_0, opc_istore_1, opc_istore_2, opc_istore_3, opc_isub, opc_iushr, opc_ixor, opc_jsr, opc_jsr_w, opc_l2d, opc_l2f, opc_l2i, opc_label, opc_ladd, opc_laload, opc_land, opc_lastore, opc_lcmp, opc_lconst_0, opc_lconst_1, opc_ldc, opc_ldc_w, opc_ldc2_w, opc_ldiv, opc_lload, opc_lload_0, opc_lload_1, opc_lload_2, opc_lload_3, opc_lmul, opc_lneg, opc_lookupswitch, opc_lor, opc_lrem, opc_lreturn, opc_lshl, opc_lshr, opc_lstore, opc_lstore_0, opc_lstore_1, opc_lstore_2, opc_lstore_3, opc_lsub, opc_lushr, opc_lxor, opc_monitorenter, opc_monitorexit, opc_multianewarray, opc_new, opc_newarray, opc_nop, opc_pop, opc_pop2, opc_putfield, opc_putstatic, opc_ret, opc_return, opc_saload, opc_sastore, opc_sipush, opc_swap, opc_tableswitch, opc_try, opc_wide, opc_xxxunusedxxx, opcLengths, opcNames, T_BOOLEAN, T_BYTE, T_CHAR, T_CLASS, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT
 
Constructor Summary
UserClassGenerator()
          Default constructor.
UserClassGenerator(ClassDefinition def)
          Constructor taking a ClassDefinition object, which is stored in the omegaClassDef field for future processing via a call to make().
UserClassGenerator(ClassDefinition def, boolean make)
          Constructor taking the partially processed definition of the class, storing it in omegaClassDef and then optionally generating the Java byte code for the new Java class used to implement this class defintion.
UserClassGenerator(java.lang.String name, java.lang.String baseClass, java.lang.String[] interfaces)
          Specify the name of the class to be created, the name of the base class which it will extend and a list of the interfaces classes it will implement.
 
Method Summary
 boolean addClassMethod(java.lang.String name, java.lang.String sig, Function f)
          Method that defines the method for an interpreted function by providing its skeleton and stub for calling the appropriate function.
 jas.CodeAttr addConstructor(java.lang.reflect.Constructor constructor)
          Add the constructor inherited from the base class, potentially ignoring it if the user-class has overridden it.
 jas.CodeAttr addConstructor(java.lang.String sig, Function constructor)
          Add a constructor corresponding to the specified Function definition, arranging to call this function.
 boolean addConstructors()
          Add the default constructors to the class being defined, either copying those inherited from the parent/base class or providing our own which take a Function and Evaluator or just a function.
 boolean addEvaluatorField()
          Adds the field to store the Evaluator to use when evaluating an Omegahat function, and also generates the accessor methods for this field, but with a method returning a default evaluator from the get method.
 boolean addEvaluatorGetMethod(java.lang.String name, java.lang.String className)
          Generates the method to get the Evaluator associated with the instance of the new class, and if it is null to obtain this from the Omegahat System.Globals class which stores the default evaluator.
 boolean addEvaluatorGetMethod(java.lang.String name, java.lang.String className, int permission)
           
 boolean addLocalField(LocalVariable var)
          Method to add a field to the new class based on the specification in LocalVariable.
protected  boolean addStaticFields()
          Add the protected but also static field omegahatMethods of class MethodsCollection and also accessor methods for it.
 boolean addStaticInitializer()
          This creates a static method in the new class that is called when the class is initialized (first used) and attempts to locate the constructor and method tables for the class.
 int createFields(List vars)
           
 int createMethods(MethodsCollection methods)
           
 boolean createMethods(java.lang.String name, Method table)
           
 boolean make()
          The default method to compile the Java class specified by the contents of omegaClassDef, and adding the default class initialization for the newly defined class which loads the function and constructor tables from serialized objects identified by the Class resources.
 boolean make(boolean classInitialization)
          Compile the class definition specified in the current value of omegaClassDef.
 boolean make(ClassDefinition def, boolean initializeClass)
          Generate the Java byte-code defining the user-level class,
 java.lang.reflect.Method matchOverriddenMethod(Function f)
           
 short modifier(Modifier mod)
          Compute the appropriate Jas modifier from the Omegahat modifier, returning "protected" if mod is null.
 short modifier(Modifier mod, short defaultMod)
          Compute the Jas modifier from the Omegahat modifier "expression" object, using the specified default if the modifier is "missing" (null, usually a result of not being in the parsed input).
 ClassDefinition omegaClassDef()
          Accessor to the omegaClassDef field which stores the parsed and process input for the class specification before it was compiled.
 ClassDefinition omegaClassDef(ClassDefinition d)
           
 boolean overrides(java.lang.reflect.Constructor constructor)
           
 java.lang.Class returnType(Function f)
          Determine the appropriate return type from the specified function definition by consulting it and also the inherited methods of the same name from the base class and their return type.
 java.lang.String superClassName()
          Retrieves the name of the base class from which we want the new class to inherit, and if this is null, return java/lang/Object.
 
Methods inherited from class org.omegahat.Environment.GUITools.EvaluableInterfaceGenerator
addConstructor, addDispatchCall, addInterface, addMethod, addTarget, addTarget, createArgumentList, createArgumentList, createArgumentList, createArgumentList, derivedClassName, getStackSize, init, interfaces, make, numLocalVariables, separator, superClassConstructors, superClassConstructors
 
Methods inherited from class org.omegahat.Environment.Compile.DynamicCompiler
accessorBody, accessorBody, addField, addField, addField, addField, addField, addField, addFieldAccessors, addFieldAccessors, addFieldAccessors, addInheritedConstructors, addReturn, addReturn, classDef, classDef, className, className, className, className, Debug, Debug, file, file, findClass, findClass, initClassDef, loadCode, mapPrimitive, packageName, packageName, primitiveLoadOp, primitiveToClass, returnPrimitive, returnPrimitive, superClassName, warning, write, write, write, write, write
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

omegaClassDef

protected ClassDefinition omegaClassDef
A reference to the object which was used to define the user-level class before being compiled by this object.
Constructor Detail

UserClassGenerator

public UserClassGenerator()
Default constructor.

UserClassGenerator

public UserClassGenerator(java.lang.String name,
                          java.lang.String baseClass,
                          java.lang.String[] interfaces)
                   throws java.lang.ClassNotFoundException
Specify the name of the class to be created, the name of the base class which it will extend and a list of the interfaces classes it will implement.

UserClassGenerator

public UserClassGenerator(ClassDefinition def)
                   throws java.lang.ClassNotFoundException
Constructor taking a ClassDefinition object, which is stored in the omegaClassDef field for future processing via a call to make().

UserClassGenerator

public UserClassGenerator(ClassDefinition def,
                          boolean make)
                   throws java.lang.ClassNotFoundException
Constructor taking the partially processed definition of the class, storing it in omegaClassDef and then optionally generating the Java byte code for the new Java class used to implement this class defintion. Note that this does not load the class into the JVM.
Method Detail

addStaticFields

protected boolean addStaticFields()
Add the protected but also static field omegahatMethods of class MethodsCollection and also accessor methods for it.

make

public boolean make(ClassDefinition def,
                    boolean initializeClass)
Generate the Java byte-code defining the user-level class,
Parameters:
def - the definition of the class read and parsed from a file and/or generated programmatically.
initializeClass - flag indicating whether the static class initialization that is a call to loadTables() should be added to the newly generated class, or not. When the class is generated interactively within an Omegahat session, the UserClassEvaluator this step can be avoided (and the serialization of the method and constructor tables) as the tables are available directly from the ClassDefinition.

createFields

public int createFields(List vars)

createMethods

public int createMethods(MethodsCollection methods)

createMethods

public boolean createMethods(java.lang.String name,
                             Method table)

addClassMethod

public boolean addClassMethod(java.lang.String name,
                              java.lang.String sig,
                              Function f)
Method that defines the method for an interpreted function by providing its skeleton and stub for calling the appropriate function.

The generated method appends each argument to a local FunctionCallArguments and then passes the name of the method, its signature (which is used to index the Function in the associated Method table), the argument list and finally the Evaluator local to the instance of the new class, to the method dispatchAndEval() in MethodsCollection.

Parameters:
name - the name of the method being defined
sign - the signature of the method being defined based on the types of its parameters. This is used to index the Function in the Method table for the group of methods with this name
f - the Function function being used to implement the new method, providing the signature and return type.

addStaticInitializer

public boolean addStaticInitializer()
This creates a static method in the new class that is called when the class is initialized (first used) and attempts to locate the constructor and method tables for the class. This is equivalent to having a block
static {
OmegahatUserClassHelper.loadTables(Class.forName("name of this class"));
}
in the class definition. The method that is created is named <clinit>

make

public boolean make()
The default method to compile the Java class specified by the contents of omegaClassDef, and adding the default class initialization for the newly defined class which loads the function and constructor tables from serialized objects identified by the Class resources.
Overrides:
make in class EvaluableInterfaceGenerator

make

public boolean make(boolean classInitialization)
Compile the class definition specified in the current value of omegaClassDef.
Parameters:
classInitialization - flag indicating whether we should add the static class initialization code which calls the loadTables() method in OmegahatUserClassHelper.

addLocalField

public boolean addLocalField(LocalVariable var)
                      throws java.lang.ClassNotFoundException
Method to add a field to the new class based on the specification in LocalVariable.

modifier

public short modifier(Modifier mod)
Compute the appropriate Jas modifier from the Omegahat modifier, returning "protected" if mod is null.

modifier

public short modifier(Modifier mod,
                      short defaultMod)
Compute the Jas modifier from the Omegahat modifier "expression" object, using the specified default if the modifier is "missing" (null, usually a result of not being in the parsed input).

addConstructor

public jas.CodeAttr addConstructor(java.lang.reflect.Constructor constructor)
Add the constructor inherited from the base class, potentially ignoring it if the user-class has overridden it.
Overrides:
addConstructor in class DynamicCompiler
Parameters:
constructor - a constructor object from the parent class from which the new class is being derived.

addConstructor

public jas.CodeAttr addConstructor(java.lang.String sig,
                                   Function constructor)
Add a constructor corresponding to the specified Function definition, arranging to call this function.

addConstructors

public boolean addConstructors()
Description copied from class: EvaluableInterfaceGenerator
Add the default constructors to the class being defined, either copying those inherited from the parent/base class or providing our own which take a Function and Evaluator or just a function.
Overrides:
addConstructors in class EvaluableInterfaceGenerator

overrides

public boolean overrides(java.lang.reflect.Constructor constructor)

addEvaluatorField

public boolean addEvaluatorField()
Adds the field to store the Evaluator to use when evaluating an Omegahat function, and also generates the accessor methods for this field, but with a method returning a default evaluator from the get method.

addEvaluatorGetMethod

public boolean addEvaluatorGetMethod(java.lang.String name,
                                     java.lang.String className)
Generates the method to get the Evaluator associated with the instance of the new class, and if it is null to obtain this from the Omegahat System.Globals class which stores the default evaluator.

addEvaluatorGetMethod

public boolean addEvaluatorGetMethod(java.lang.String name,
                                     java.lang.String className,
                                     int permission)

matchOverriddenMethod

public java.lang.reflect.Method matchOverriddenMethod(Function f)

returnType

public java.lang.Class returnType(Function f)
Determine the appropriate return type from the specified function definition by consulting it and also the inherited methods of the same name from the base class and their return type.

superClassName

public java.lang.String superClassName()
Retrieves the name of the base class from which we want the new class to inherit, and if this is null, return java/lang/Object.

Note that this does not require the L and ; prefix and suffix for a class name identifier.

This class name is stored in its internal form, i.e. with '/' rather than '.' separating the package components.

Overrides:
superClassName in class DynamicCompiler

omegaClassDef

public ClassDefinition omegaClassDef()
Accessor to the omegaClassDef field which stores the parsed and process input for the class specification before it was compiled.

omegaClassDef

public ClassDefinition omegaClassDef(ClassDefinition d)