You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2005/10/08 06:29:29 UTC
svn commit: r307257 [11/24] - in
/incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm: ./ bootJVM/
bootJVM/jni/ bootJVM/jni/src/ bootJVM/jni/src/gnu/
bootJVM/jni/src/gnu/classpath/ bootJVM/jni/src/gnu/classpath/0.16/
bootJVM/jni/src/gnu/classpath...
Added: incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/classfile.h
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/classfile.h?rev=307257&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/classfile.h (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/classfile.h Fri Oct 7 21:27:56 2005
@@ -0,0 +1,2543 @@
+#ifndef _classfile_h_included_
+#define _classfile_h_included_
+
+/*!
+ * @file classfile.h
+ *
+ * @brief Definitions for <em>The Java Virtual Machine Specification,
+ * version 2 Chapter 4, The Class File Format</em>.
+ *
+ * <em>The Class File Format</em>, from JDK 1.5 revision of this
+ * section, entitled <b>ClassFileFormat-final.draft.pdf</b>,
+ * has been used to define the contents of this file. Originally,
+ * the standard and well-published JDK 1.2 revision was used,
+ * and there are a number of intermediate and semi-official
+ * documents, but this seems to be the best and most accurate.
+ *
+ * ALL definitions that are not @e explicitly defined in this
+ * document, yet are either conveniently placed here due to
+ * intrinsic association with those that are in the document,
+ * or those needed for late binding into the runtime structures
+ * of this implementation, are prefixed with the string token
+ * @b LOCAL_ for ease of identification.
+ *
+ * Any field of any data structure that is not documented will have
+ * its definition in the JVM specfication itself. The larger structures
+ * tend to have at least some notes, but individual fields that are
+ * fully described in the JVM spec are likely not to have redundant
+ * commentary here.
+ *
+ * The JVM specification is available from Sun Microsystems' web site
+ * at http://java.sun.com/docs/books/vmspec/index.html and
+ * may be read online at
+http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html
+ *
+ * The Java 5 class file format is available as a PDF file separately at
+http://java.sun.com/docs/books/vmspec/2nd-edition/ClassFileFormat-final-draft.pdf
+ * and was the basis for the ClassFile structure of this implementation.
+ *
+ *
+ * @todo Need to verify which web document for the
+ * Java 5 class file definition is either "official",
+ * actually correct, or is the <em>de facto</em> standard.
+ *
+ *
+ * @section Control
+ *
+ * \$URL: https://svn.apache.org/path/name/classfile.h $ \$Id: classfile.h 0 09/28/2005 dlydick $
+ *
+ * Copyright 2005 The Apache Software Foundation
+ * or its licensors, as applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 ("the License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied.
+ *
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * @version \$LastChangedRevision: 0 $
+ *
+ * @date \$LastChangedDate: 09/28/2005 $
+ *
+ * @author \$LastChangedBy: dlydick $
+ * Original code contributed by Daniel Lydick on 09/28/2005.
+ *
+ * @section Reference
+ *
+ */
+
+ARCH_COPYRIGHT_APACHE(classfile, h, "$URL: https://svn.apache.org/path/name/classfile.h $ $Id: classfile.h 0 09/28/2005 dlydick $");
+
+
+/*!
+ * @brief Attributes of a field, method, or class.
+ *
+ * See spec section 4.8.
+ *
+ * The definitions of @link #u1 u1@endlink and @link #u2 u2@endlink
+ * and @link #u4 u4@endlink may be found in
+ * @link jvm/src/jrtypes.h jrtypes.h@endlink to decouple these
+ * primative types from class file specifics. This is because
+ * these three definitions are used all over the code
+ * and not just in class file areas.
+ *
+ * @internal typedef placed here to avoid forward reference.
+ *
+ */
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+
+ u1 info[1]; /**< Spec pseudo-code: @c @b info[attribute_length]; */
+
+} attribute_info;
+
+
+/*!
+ * @brief constant_pool entry.
+ *
+ * See spec section 4.5.
+ *
+ * @internal typedef placed here to avoid forward reference.
+ *
+ */
+typedef struct
+{
+ u1 tag;
+
+ u1 *info; /**< Spec pseudo-code says: @c @b info[]; */
+
+} cp_info;
+
+
+/*!
+ * @name Byte aligned structure entries.
+ *
+ * @brief Frame @p @b cp_info and @p @b attribute_info entries for
+ * correct byte alignment on real machine architectures that
+ * require it.
+ *
+ * The following structure is used for aligning (cp_info) data
+ * on 4-byte addresses with the exception of the one-byte @p @b tag
+ * field. The next one aligns (attribute_info) similarly.
+ * Doing this suppresses problem w/ C/C++ compilers
+ * where certain architectures yield a @b SIGSEGV on odd-aligned
+ * 16-bit integer accesses or non-4-byte aligned 32-bit integer
+ * accesses. For 16-bit accesses, such operations as,
+ *
+ * @verbatim
+
+ short x, *p; // (short)
+ ...
+ p = some_value();
+ ...
+ x = *p;
+
+ and for 32-bit accesses,
+
+ int x, *p; // (int), etc.
+ ...
+ p = some_value();
+ ...
+ x = *p;
+
+ @endverbatim
+ *
+ * both produce a @b SIGSEGV when @b p is not aligned on an 2- or 4-byte
+ * address, respectively.
+ *
+ * By introducing the command line option to force structure packing,
+ * this situation can occur (e.g.: GCC @c @b -fpack-struct option,
+ * which suppresses 4-byte structure alignment). Unfortunately, this
+ * option is needed in order to properly size the structures in this
+ * header file. Yet, some standard library calls fail when compiled
+ * like this (like @b fprintf(3) ), so choose judiciously.
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define CP_INFO_NUM_EMPTIES 3 /**< Size of padding for cp_info
+ * structures insize of cp_info_dup structure */
+
+/*!
+ * @brief Pad cp_info structures for proper multi-byte field
+ * address boundary alignment.
+ * @see FILL_INFO_DUP0 et al.
+ *
+ */
+typedef struct
+{
+ rbyte empty[CP_INFO_NUM_EMPTIES];
+ /**< Align @p @b tag u1 byte against
+ END of 4-byte word */
+
+ cp_info cp; /**< Misalign cp_info (on odd address) so that
+ * all items except @p @b tag are on even addresses.
+ * This assumes they are all u2 or u4.
+ */
+} cp_info_dup;
+
+
+#define ATTRIBUTE_INFO_NUM_EMPTIES 2 /**< Size of padding for
+ * attribute_info structures insize of
+ * attribute_info_dup structure */
+/*!
+ * @brief Pad attribute_info structures for proper multi-byte field
+ * address boundary alignment.
+ * @see FILL_INFO_DUP0 et al.
+ *
+ */
+typedef struct
+{
+ rbyte empty[ATTRIBUTE_INFO_NUM_EMPTIES]; /**< Align
+ * @p @b attribute_name_index u2 jshort
+ * against END of 4-byte word
+ */
+
+ attribute_info ai; /**< Misalign attribute_info (on non-4-byte
+ * address) so that @p @b attribute_length is on a
+ * 4-byte addresses. Subsequent members may not
+ * be 4-byte aligned, (per spec definitions),
+ * but those can be handled on a case-by-case basis.
+ * At least here, everything starts out on the correct
+ * alignment.
+ */
+
+} attribute_info_dup;
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @brief Field table entry.
+ *
+ * See spec section 4.6
+ *
+ * @internal typedef placed here to avoid forward reference.
+ *
+ */
+typedef struct
+{
+ u2 access_flags; /**< Bitwise access flags, containing various of
+ * the @link #ACC_PUBLIC ACC_xxx@endlink
+ * definitions */
+
+ u2 name_index; /**< Index into constant_pool of UTF8 string
+ * containing the name of this field */
+
+ u2 descriptor_index; /**< Index into constant_pool of UTF8 string
+ * containing the descriptor of this field */
+
+ u2 attributes_count; /**< Size of @p @b attributes */
+
+ attribute_info_dup **attributes; /**< Field attributes array.
+ * The spec pseudo-code defines this as:
+ @c @b attributes_info @c @b fields[attributes_count]
+ * but it is implemented as a pointer to an array
+ * of pointers. The length of this array is
+ * @c @b attributes_count elements.
+ *
+ * Notice that the @c @b attribute_info
+ * structure is found with this
+ * @c @b attribute_info_dup structure.
+ * The purpose for this is proper byte alignment
+ * of multi-byte items such as 2- and 4-byte
+ * integers on machine architectures that demand
+ * it lest they complain with @b SIGSEGV and the
+ * like.
+ */
+
+
+
+ /*!
+ * @brief Local implementation late binding extensions for fields.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ * @internal An @p @b oiflagJVM boolean is not needed since
+ * @p @b access_flags above contains this information
+ * in the @link #ACC_STATIC ACC_STATIC@endlink bit.
+ *
+ */
+ struct LOCAL_field_binding
+ {
+ jvm_field_index fluidxJVM; /**< JVM class table field
+ * lookup index of this field. If this is a
+ * class static field, use this value to index
+ * the @link #rclass.class_static_field_lookup
+ rclass.class_static_field_lookup@endlink
+ * array for the @link #ClassFile.fields
+ * ClassFile.fields[]@endlink index and in the
+ * @link #rclass.class_static_field_data
+ rclass.class_static_field_data@endlink
+ * array for the data jvalue.
+ *
+ * If this is an object instance field, use this
+ * value to index the
+ * @link #rclass.object_instance_field_lookup
+ rclass.object_instance_field_lookup@endlink
+ * array for the @link #ClassFile.fields
+ * ClassFile.fields[]@endlink index and in the
+ * @link #robject.object_instance_field_data
+ robject.object_instance_field_data@endlink
+ * array for the data jvalue.
+ */
+
+ } LOCAL_field_binding;
+
+} field_info;
+
+
+/*!
+ * @brief Method table entry.
+ *
+ * See spec section 4.7
+ *
+ * @internal typedef placed here to avoid forward reference.
+ *
+ */
+typedef struct
+{
+ u2 access_flags; /**< Bitwise access flags, containing various of
+ * the @link #ACC_PUBLIC ACC_xxx@endlink
+ * definitions */
+
+ u2 name_index; /**< Index into constant_pool of UTF8 string
+ * containing the name of this method */
+
+ u2 descriptor_index; /**< Index into constant_pool of UTF8 string
+ * containing the descriptor of this method */
+
+
+ u2 attributes_count; /**< Size of @p @b attributes */
+
+ attribute_info_dup **attributes; /**< Method attributes array.
+ * The spec pseudo-code defines this as:
+ @c @b attributes_info @c @b fields[attributes_count]
+ * but it is implemented as a pointer to an array
+ * of pointers. The length of this array is
+ * @c @b attributes_count elements.
+ *
+ * Notice that the @c @b attribute_info
+ * structure is found with this
+ * @c @b attribute_info_dup structure.
+ * The purpose for this is proper byte alignment
+ * of multi-byte items such as 2- and 4-byte
+ * integers on machine architectures that demand
+ * it lest they complain with @b SIGSEGV and the
+ * like.
+ */
+
+
+ /*** LOCAL IMPLEMENTATION LATE BINDING EXTENSIONS ***/
+
+ /*!
+ * @brief Local implementation late binding extensions for methods.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ */
+ struct LOCAL_method_binding
+ {
+ jvm_attribute_index codeatridxJVM; /**< JVM method attribute
+ * table index of the code for this method.
+ * It is @e required to have a valid attribute
+ * index here.
+ */
+
+ jvm_attribute_index excpatridxJVM; /**< JVM method attribute
+ * table index of the exceptions for this method
+ * A valid attribute index here is optional.
+ * Methods are not required to use exceptions.
+ */
+
+ jvm_native_method_ordinal nmordJVM; /**< JVM local native
+ * method ordinal number of this method if it
+ * is a native method. Not applicable otherwise.
+ * If the native method is @e not a local one,
+ * that is, not implemented within the core JVM
+ * code, then this value @e must be set to @link
+ #JVMCFG_JLOBJECT_NMO_NULL
+ JVMCFG_JLOBJECT_NMO_NULL@endlink
+ * (as known to the JVM core code), which is the
+ * same as
+ * @link #JLOBJECT_NMO_NULL
+ JLOBJECT_NMO_NULL@endlink
+ * (as known to the outside world throught the
+ * JNI interface).
+ */
+
+ } LOCAL_method_binding;
+
+} method_info;
+
+
+/* At last: The class file typedef itself! */
+
+/*!
+ * @name JVM spec Section 4.2: The ClassFile structure.
+ *
+ *
+ * <b>The following structure definition is NOT MEANT TO BE AN EXACT
+ * REPRESENTATION OF THE DATA STRUCTURES SHOWN IN THE JAVA CLASS FILE
+ * SPECIFICATION!</b> That document contains numerous pseudo-code
+ * representations of data structures. Instead, this definition is
+ * designed to be an actual real machine implementation of that
+ * specification.
+ *
+ * Each of the variable-length structures from the spec are stored as
+ * arrays of pointers to those structures, which are located in heap
+ * allocated memory areas and their length, being always defined in
+ * the spec as preceding the variable-length area, tells how many
+ * elements are found in each array. For example, @link
+ #ClassFile.constant_pool_count ClassFile.constant_pool_count@endlink
+ * and @link #ClassFile.constant_pool ClassFile.constant_pool@endlink.
+ * Each element may, of course, be of variable size according to its
+ * actual contents, and this will be reflected by the size of each heap
+ * allocation.
+ *
+ * Furthermore, any variable or data type marked @b LOCAL_ in this
+ * structure and its subsidiary components is a local implementation
+ * extension that is no found in the specification, but is used by
+ * the JVM runtime environment to facilitate processing, expecially to
+ * expedite class linkages. For example, CONSTANT_Class_info and
+ * CONSTANT_Class_info.LOCAL_Class_binding.
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+/*!
+ * @brief The @b ClassFile structure definition.
+ *
+ * See spec section 4.2.
+ *
+ */
+typedef struct
+{
+ u4 magic; /**< Magic number for this file type.
+ * It @e must contain the constant value
+ * @link #CLASSFILE_MAGIC CLASSFILE_MAGIC@endlink
+ */
+
+ u2 minor_version; /**< Minor class file version number */
+
+ u2 major_version; /**< Major class file version number */
+
+ u2 constant_pool_count; /**< Size of @p @b constant_pool plus one
+ * (which represents the unrepresented
+ * @c @b java.lang.Object ). Index zero
+ * of @p @b constant_pool is this unrepresented
+ * slot, and
+ * @c @b constant_pool[0] is a NULL
+ * pointer.
+ */
+
+ cp_info_dup **constant_pool; /**< Constant pool array. The spec
+ * pseudo-code defines this as:
+ <b><code>cp_info constant_pool[constant_pool_count -1]</code></b>
+ * but it is implemented as a pointer to an array
+ * of pointers. The length of this array is
+ * <b><code>constant_pool_count - 1</code></b>
+ * elements.
+ *
+ * Notice that the @c @b cp_info structure
+ * is found with this @c @b cp_info_dup
+ * structure. The purpose for this is proper
+ * byte alignment of multi-byte items such as
+ * 2- and 4-byte integers on machine architectures
+ * that demand it lest they complain with
+ * @b SIGSEGV and the like.
+ */
+
+ u2 access_flags; /**< Bitwise access flags, containing various of
+ * the @link #ACC_PUBLIC ACC_xxx@endlink
+ * definitions */
+
+ u2 this_class; /**< @b constant_pool index of the class of
+ * the @c @b this pointer, namely,
+ * what is the name of this selfsame class as
+ * found here in the class file. */
+
+ u2 super_class; /**< @p @b constant_pool index of the class of
+ * the @c @b super pointer, namely,
+ * what is the name of the super-class of this
+ * selfsame class as found here in the class
+ * file. */
+
+ u2 interfaces_count; /**< Size of @p @b interfaces */
+
+ u2 *interfaces; /**< Interface array. The spec
+ * pseudo-code defines this as:
+ * @c @b interfaces[interfaces_count]
+ * but it is implemented as an array of pointers.
+ * The length of this array is
+ * @c @b interfaces_count elements.
+ */
+
+ u2 fields_count; /**< Size of @p @b fields */
+
+ field_info **fields; /**< Fiels array. The spec
+ * pseudo-code defines this as:
+ * @c @b fields[fields_count]
+ * but it is implemented as a pointer to an array
+ * of pointers. The length of this array is
+ * @c @b fields_count elements.
+ */
+
+ u2 methods_count; /**< Size of @p @b methods */
+
+ method_info **methods; /**< Methods array. The spec
+ * pseudo-code defines this as:
+ * @c @b methods[methods_count]
+ * but it is implemented as a pointer to an array
+ * of pointers. The length of this array is
+ * @c @b methods_count elements.
+ */
+
+ u2 attributes_count; /**< Size of @p @b attributes */
+
+ attribute_info_dup **attributes; /**< Class file attributes array.
+ * The spec pseudo-code defines this as:
+ @c @b attributes_info @c @b fields[attributes_count]
+ * but it is implemented as a pointer to an array
+ * of pointers. The length of this array is
+ * @c @b attributes_count elements.
+ *
+ * Notice that the @c @b attribute_info
+ * structure is found with this
+ * @c @b attribute_info_dup structure.
+ * The purpose for this is proper byte alignment
+ * of multi-byte items such as 2- and 4-byte
+ * integers on machine architectures that demand
+ * it lest they complain with @b SIGSEGV and the
+ * like.
+ */
+
+} ClassFile;
+
+
+#define CLASSFILE_MAGIC 0xCAFEBABE /**< Magic number for class files */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name List of all class file versions
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define VERSION_MAJOR_JDK1 45
+#define VERSION_MAJOR_JDK2 46
+#define VERSION_MAJOR_JDK3 47
+#define VERSION_MAJOR_JDK4 48
+#define VERSION_MAJOR_JDK5 49
+
+/*@} */ /* End of grouped definitions */
+
+/*!
+ * @brief Default minor version number for primative pseudo-classes
+ *
+ */
+#define VERSION_MINOR_DEFAULT 0
+
+/*!
+ * @name Define range of supported class file versions
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define VERSION_MAJOR_LOW VERSION_MAJOR_JDK1
+#define VERSION_MINOR_LOW 0
+#define VERSION_MAJOR_HIGH VERSION_MAJOR_JDK5
+#define VERSION_MINOR_HIGH 0
+
+/*@} */ /* End of grouped definitions */
+
+
+
+/*!
+ * @name Table 4.1: Access Flags for Classes
+ *
+ * The first definition of all such tokens is found here. Throughout
+ * the spec, many of these symbols will be @e redefined to be the
+ * same value. Such redefinitions are commented here in source, but
+ * are not redefined <em>per se</em>. There is no "grand union"
+ * definition.
+ *
+ * For other @link #ACC_PUBLIC ACC_xxx@endlink definitions,
+ * see also table 4.4, 4.5, 4.7, where more definitions are found.
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+
+#define LOCAL_ACC_EMPTY 0x0000 /**< Not defined, empty (not in spec) */
+
+#define ACC_PUBLIC 0x0001 /**< Declared @b public; may be accessed
+ from outside its package. */
+
+#define ACC_FINAL 0x0010 /**< Declared @b final;no subclasses
+ allowed */
+
+#define ACC_SUPER 0x0020 /**< Treat superclass methods specially
+ when invoked by the
+ @b INVOKESPECIAL instruction*/
+
+#define ACC_INTERFACE 0x0200 /**< Is an interface, not a class. */
+
+#define ACC_ABSTRACT 0x0400 /**< Declared @c @b abstract ; may not
+ be instantiated. */
+
+#define ACC_SYNTHETIC 0x1000 /**< Declared @c @b synthetic ; not
+ present in the source code. */
+
+#define ACC_ANNOTATION 0x2000 /**< Declared as an annotation type */
+
+#define ACC_ENUM 0x4000 /**< Declared as an enum type */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @brief Root Java language object name
+ *
+ */
+
+#define CONSTANT_UTF8_JAVA_LANG_OBJECT "java/lang/Object"
+
+
+/*!
+ * @name Section 4.3: The Internal Form of Fully Qualified Class \
+and Interface Names
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define CLASSNAME_EXTERNAL_DELIMITER_CHAR '.'
+#define CLASSNAME_EXTERNAL_DELIMITER_STRING "."
+
+#define CLASSNAME_INTERNAL_DELIMITER_CHAR '/'
+#define CLASSNAME_INTERNAL_DELIMITER_STRING "/"
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.4: Descriptors-- Section 4.4.1: Grammar Notation
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define GRAMMAR_PARM_OPEN '(' /**< Open parenthesis for starting
+ a param defn */
+#define GRAMMAR_PARM_CLOSE ')' /**< Open parenthesis for starting
+ a param defn */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.4.2: Field Descriptors
+ *
+ * Table 4.2: BaseType Character Definitions
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define BASETYPE_CHAR_B 'B' /**< Signed byte */
+#define BASETYPE_CHAR_C 'C' /**< Unicode character */
+#define BASETYPE_CHAR_D 'D' /**< Double-precision floating-point
+ value */
+#define BASETYPE_CHAR_F 'F' /**< Single-precision floating-point
+ value */
+#define BASETYPE_CHAR_I 'I' /**< Integer */
+#define BASETYPE_CHAR_J 'J' /**< Long integer */
+
+
+/*!
+ * @internal @c @b L/class/name; includes
+ * @b _CHAR_ and @b _STRING_ forms
+ */
+
+#define BASETYPE_CHAR_L 'L' /**< an instance of class '/class/name'*/
+#define BASETYPE_STRING_L "L" /**< null-terminated string form
+ of BASETYPE_CHAR_L */
+
+#define BASETYPE_CHAR_L_TERM ';' /**< terminator for instance of
+ class */
+#define BASETYPE_STRING_L_TERM ";" /**< null-terminated string form
+ of BASETYPE_CHAR_L_TERM */
+
+
+
+#define BASETYPE_CHAR_S 'S' /**< Signed short */
+#define BASETYPE_CHAR_Z 'Z' /**< Boolean, @b true or @b false */
+
+#define BASETYPE_CHAR_ARRAY '[' /**< Reference to one array
+ dimension */
+#define BASETYPE_STRING_ARRAY "[" /**< null-terminated string form
+ of BASETYPE_CHAR_ARRAY */
+
+#define LOCAL_BASETYPE_ERROR '?' /**< Invalid basetype due to
+ malformed @p @b tag or other
+ error (not in spec) */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.4.3: Method Descriptors
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define METHOD_CHAR_VOID 'V' /**< No return type, instead:
+ (rvoid) fn(p1,p2,...) */
+#define METHOD_STRING_VOID "V" /**< null-terminated string form
+ of METHOD_CHAR_VOID */
+
+#define METHOD_PARM_MAX 255 /**< Max length of method
+ descriptor string */
+
+#define METHOD_CHAR_OPEN_PARM '(' /**< Open parameter list */
+#define METHOD_STRING_OPEN_PARM "(" /**< null-terminated string form
+ of METHOD_CHAR_OPEN_PARM */
+
+#define METHOD_CHAR_CLOSE_PARM ')' /**< Open parameter list */
+#define METHOD_STRING_CLOSE_PARM ")" /**< null-terminated string form
+ of METHOD_CHAR_OPEN_PARM */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.4.4: Signatures
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define BASETYPE_CHAR_T 'T' /**< a type variable signature */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.5: The Constant Pool
+ *
+ * typedef struct cp_info: See fwd refs above typedef ClassFile
+ *
+ * See also table 4.3: ConstantType Definitions
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define CONSTANT_CP_DEFAULT_INDEX 0 /**< References
+ @c @b java.lang.Object */
+#define CONSTANT_CP_START_INDEX 1 /**< Ref first constant item */
+
+/*@} */ /* End of grouped definitions */
+
+/*!
+ * @name Table 4.3: ConstantType Definitions
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define CONSTANT_Class 7
+#define CONSTANT_Fieldref 9
+#define CONSTANT_Methodref 10
+#define CONSTANT_InterfaceMethodref 11
+#define CONSTANT_String 8
+#define CONSTANT_Integer 3
+#define CONSTANT_Float 4
+#define CONSTANT_Long 5
+#define CONSTANT_Double 6
+#define CONSTANT_NameAndType 12
+#define CONSTANT_Utf8 1
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.5.1: The CONSTANT_Class_info structure
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u1 tag;
+ u2 name_index;
+
+
+ /*** LOCAL IMPLEMENTATION LATE BINDING EXTENSIONS ***/
+
+ /*!
+ * @brief Local implementation late binding extensions for
+ * @link #CONSTANT_Class_info CONSTANT_Class_info@endlink.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ */
+ struct LOCAL_Class_binding
+ {
+ jvm_class_index clsidxJVM; /**< JVM class table index of
+ this class */
+
+ } LOCAL_Class_binding;
+
+} CONSTANT_Class_info;
+
+
+#define CONSTANT_MAX_ARRAY_DIMS 255 /**< Highest number of array
+ dimensions */
+
+#define LOCAL_CONSTANT_NO_ARRAY_DIMS 0 /**< Not stated in spec, but
+ implied */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.5.2: The CONSTANT_Fieldref_info, \
+CONSTANT_Methodref_info, and \
+CONSTANT_InterfaceMethodref_info structures
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u1 tag;
+ u2 class_index;
+ u2 name_and_type_index;
+
+
+ /*** LOCAL IMPLEMENTATION LATE BINDING EXTENSIONS ***/
+
+ /*!
+ * @brief Local implementation late binding extensions for
+ * @link #CONSTANT_Fieldref_info CONSTANT_Fieldref_info@endlink.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ */
+ struct LOCAL_Fieldref_binding
+ {
+ jvm_class_index clsidxJVM; /**< JVM class table index of
+ this class */
+
+ jvm_field_index fluidxJVM; /**< JVM class table field lookup
+ index of this field */
+
+ rboolean oiflagJVM; /**< JVM class table flag: class
+ * static vs object instance
+ * field. This information is
+ * derived directly from the
+ * field's definition of its
+ * @link #field_info.access_flags
+ field_info.access_flags@endlink,
+ * namely @link #ACC_STATIC
+ ACC_STATIC@endlink. This
+ * information is duplicated here
+ * for a localized copy of this
+ * information for implementation
+ * convenience. It is not
+ * something that will ever change
+ * over the life of the loaded
+ * class. It is @link #rtrue
+ rtrue@endlink if this field is
+ * part of an object instance
+ * and @link #rfalse rfalse@endlink
+ * if it is part of a class static
+ * instance.
+ */
+
+ jvm_basetype jvaluetypeJVM; /**< JVM class table field type.
+ * It is needed to know which kind
+ * of load and store to use for
+ * a field access, which involves
+ * a member of a jvalue.
+ */
+
+ } LOCAL_Fieldref_binding;
+
+} CONSTANT_Fieldref_info;
+
+typedef struct
+{
+ u1 tag;
+ u2 class_index;
+ u2 name_and_type_index;
+
+
+ /*** LOCAL IMPLEMENTATION LATE BINDING EXTENSIONS ***/
+
+ /*!
+ * @brief Local implementation late binding extensions for
+ * @link #CONSTANT_Methodref_info CONSTANT_Methodref_info@endlink.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ */
+ struct LOCAL_Methodref_binding
+ {
+ jvm_class_index clsidxJVM; /**< JVM class table index of
+ this class */
+
+ jvm_method_index mthidxJVM; /**< JVM method table index
+ of this method */
+
+ jvm_attribute_index
+ codeatridxJVM; /**< JVM method attribute table
+ * index of the code for this
+ * method.
+ */
+
+ jvm_attribute_index
+ excpatridxJVM; /**< JVM method attribute table
+ * index of the exceptions for
+ * this method.
+ */
+
+ jvm_native_method_ordinal
+ nmordJVM; /**< JVM local native method
+ * ordinal number of this
+ * native method.
+ */
+
+ } LOCAL_Methodref_binding;
+
+} CONSTANT_Methodref_info;
+
+typedef struct
+{
+ u1 tag;
+ u2 class_index;
+ u2 name_and_type_index;
+
+
+ /*** LOCAL IMPLEMENTATION LATE BINDING EXTENSIONS ***/
+
+ /*!
+ * @brief Local implementation late binding extensions for
+ * @link #CONSTANT_InterfaceMethodref_info
+ CONSTANT_InterfaceMethodref_info@endlink.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ */
+ struct LOCAL_InterfaceMethodref_binding
+ {
+ jvm_class_index clsidxJVM; /**< JVM class table index of
+ this class */
+
+ jvm_method_index mthidxJVM; /**< JVM method table index of
+ this method */
+
+ jvm_attribute_index
+ codeatridxJVM; /**< JVM method attribute table
+ index of the code for this
+ method */
+
+ jvm_attribute_index
+ excpatridxJVM; /**< JVM method attribute table
+ * of the exceptions for this
+ * method.
+ */
+
+ jvm_native_method_ordinal
+ nmordJVM; /**< JVM local native method
+ * ordinal number of this native
+ * method.
+ */
+
+ } LOCAL_InterfaceMethodref_binding;
+
+} CONSTANT_InterfaceMethodref_info;
+
+
+#define METHOD_CHAR_INIT '<' /**< Special character for naming
+ of an object constructor method
+ name, that is, the
+ @c @b \<init\> method, and the
+ class constructor method
+ name, that is, the
+ @c @b \<clinit\> method */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.5.3: The CONSTANT_String_info structure
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u1 tag;
+ u2 string_index;
+
+ /*** LOCAL IMPLEMENTATION LATE BINDING EXTENSIONS ***/
+
+ /*!
+ * @brief Local implementation late binding extensions for
+ * @link #CONSTANT_String_info CONSTANT_String_info@endlink.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ */
+ struct LOCAL_String_binding
+ {
+ /*!
+ * @internal There is not late binding for this structure.
+ * However, to maintain compatibility with the
+ * @link #ALLOC_CP_INFO() ALLOC_CP_INFO()@endlink macro
+ * in @link jvm/src/classfile.c classfile.c@endlink,
+ * this empty structure is provided.
+ */
+ } LOCAL_String_binding;
+
+} CONSTANT_String_info;
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.5.4: The CONSTANT_Integer_info and
+ * CONSTANT_Float_info structures
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u1 tag;
+ u4 bytes;
+
+ /*** LOCAL IMPLEMENTATION LATE BINDING EXTENSIONS ***/
+
+ /*!
+ * @brief Local implementation late binding extensions for
+ * @link #CONSTANT_Integer_info CONSTANT_Integer_info@endlink.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ */
+ struct LOCAL_Integer_binding
+ {
+ /*!
+ * @internal There is not late binding for this structure.
+ * However, to maintain compatibility with the
+ * @link #ALLOC_CP_INFO() ALLOC_CP_INFO()@endlink macro
+ * in @link jvm/src/classfile.c classfile.c@endlink,
+ * this empty structure is provided.
+ */
+ } LOCAL_Integer_binding;
+
+} CONSTANT_Integer_info;
+
+typedef struct
+{
+ u1 tag;
+ u4 bytes;
+
+ /*** LOCAL IMPLEMENTATION LATE BINDING EXTENSIONS ***/
+
+ /*!
+ * @brief Local implementation late binding extensions for
+ * @link #CONSTANT_Float_info CONSTANT_Float_info@endlink.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ */
+ struct LOCAL_Float_binding
+ {
+ /*!
+ * @internal There is not late binding for this structure.
+ * However, to maintain compatibility with the
+ * @link #ALLOC_CP_INFO() ALLOC_CP_INFO()@endlink macro
+ * in @link jvm/src/classfile.c classfile.c@endlink,
+ * this empty structure is provided.
+ */
+ } LOCAL_Float_binding;
+
+} CONSTANT_Float_info;
+
+#ifdef CONFIG_WORDWIDTH64
+#define SPFTYPE_INT unsigned int /**< 32-bit value */
+#else
+#define SPFTYPE_INT unsigned int /**< 32-bit value */
+#endif
+
+/*
+ * Representation of special case single-precision floating point
+ * numbers
+ */
+
+#define FLOAT_POSITIVE_INFINITY 0x7f800000
+#define FLOAT_NEGATIVE_INFINITY 0xff800000
+
+#define FLOAT_IS_NAN(sfpval) \
+ (((0x7f800001 <= (SPFTYPE_INT) sfpval) && \
+ (0x7fffffff >= (SPFTYPE_INT) sfpval)) \
+ || \
+ ((0xff800001 <= (SPFTYPE_INT) sfpval) && \
+ (0xffffffff >= (SPFTYPE_INT) sfpval)))
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.5.5: The CONSTANT_Long_info and
+ * CONSTANT_Double_info structures
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u1 tag;
+ u4 high_bytes;
+ u4 low_bytes;
+
+ /*** LOCAL IMPLEMENTATION LATE BINDING EXTENSIONS ***/
+
+ /*!
+ * @brief Local implementation late binding extensions for
+ * @link #CONSTANT_Long_info CONSTANT_Long_info@endlink.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ */
+ struct LOCAL_Long_binding
+ {
+ /*!
+ * @internal There is not late binding for this structure.
+ * However, to maintain compatibility with the
+ * @link #ALLOC_CP_INFO() ALLOC_CP_INFO()@endlink macro
+ * in @link jvm/src/classfile.c classfile.c@endlink,
+ * this empty structure is provided.
+ */
+ } LOCAL_Long_binding;
+
+} CONSTANT_Long_info;
+
+typedef struct
+{
+ u1 tag;
+ u4 high_bytes;
+ u4 low_bytes;
+
+ /*** LOCAL IMPLEMENTATION LATE BINDING EXTENSIONS ***/
+
+ /*!
+ * @brief Local implementation late binding extensions for
+ * @link #CONSTANT_Double_info CONSTANT_Double_info@endlink.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ */
+ struct LOCAL_Double_binding
+ {
+ /*!
+ * @internal There is not late binding for this structure.
+ * However, to maintain compatibility with the
+ * @link #ALLOC_CP_INFO() ALLOC_CP_INFO()@endlink macro
+ * in @link jvm/src/classfile.c classfile.c@endlink,
+ * this empty structure is provided.
+ */
+ } LOCAL_Double_binding;
+
+} CONSTANT_Double_info;
+
+#ifdef CONFIG_WORDWIDTH64
+#define DPFTYPE_LONG unsigned long /**< 64-bit value */
+#define DPFTYPE_INT unsigned int /**< 32-bit value */
+#else
+#define DPFTYPE_LONG unsigned long long /**< 64-bit value */
+#define DPFTYPE_INT unsigned int /**< 32-bit value */
+#endif
+
+/*
+ * Representation of special case double-precision floating point
+ * numbers
+ */
+
+#define DOUBLE_POSITIVE_INFINITY 0x7ff0000000000000L
+#define DOUBLE_NEGATIVE_INFINITY 0xfff0000000000000L
+
+#define DOUBLE_IS_NAN(dfpval) \
+ (((0x7ff00000000000001 <= (DPFTYPE_LONG) dfpval) && \
+ (0x7fffffffffffffffL >= (DPFTYPE_LONG) dfpval)) || \
+ \
+ ((0xfff0000000000001L <= (DPFTYPE_INT) dfpval) && \
+ (0xffffffffffffffffL >= (DPFTYPE_INT) dfpval)))
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.5.6: The CONSTANT_NameAndType_info structure
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u1 tag;
+ u2 name_index;
+ u2 descriptor_index;
+
+ /*** LOCAL IMPLEMENTATION LATE BINDING EXTENSIONS ***/
+
+ /*!
+ * @brief Local implementation late binding extensions for @link
+ #CONSTANT_NameAndType_info CONSTANT_NameAndType_info@endlink.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ */
+ struct LOCAL_NameAndType_binding
+ {
+ /*!
+ * @internal There is not late binding for this structure.
+ * However, to maintain compatibility with the
+ * @link #ALLOC_CP_INFO() ALLOC_CP_INFO()@endlink macro
+ * in @link jvm/src/classfile.c classfile.c@endlink,
+ * this empty structure is provided.
+ */
+ } LOCAL_NameAndType_binding;
+
+} CONSTANT_NameAndType_info;
+
+#define CONSTANT_UTF8_INSTANCE_CONSTRUCTOR "<init>"
+
+#define CONSTANT_UTF8_INSTANCE_CONSTRUCTOR_DESCRIPTOR_DEFAULT "()V" /**<
+ (Not in this section of spec, but very relevant) */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.5.7: Support for the CONSTANT_Utf8_info structure
+ *
+ * <ul>
+ * <li>
+ * <b>SINGLE-BYTE UTF-8 FORMAT</b>:
+ * Range of 7-bit ASCII (ANSI alphabet 5),
+ * but @e without the @b NUL character 0x00
+ * </li>
+ *
+ * <li>
+ * <b>DOUBLE-BYTE UTF-8 FORMAT</b>:
+ * Range of 8th bit on ASCII (plus 7-bit ASCII
+ * NUL character: '\\u0000', namely '\\u0080'
+ * through '\\u00ff', then extending on up
+ * 3 more bits, thus adding '\\u100' through
+ * '\\u07ff'.
+ * </li>
+ *
+ * <li>
+ * <b>TRIPLE-BYTE UTF-8 FORMAT:</b>:
+ * Character ranges '\\u0800' through '\\uFFFF'
+ * </li>
+ *
+ * <li>
+ * <b>HEXTUPLE-BYTE UTF-16 FORMAT</b>:
+ * There is a typographical error in spec
+ * section 4.5.7 describing describing 21-bit
+ * character encoding. Therefore, this
+ * format has not been implemented pending
+ * proper resolution. It probably is correct
+ * to assume that the spurious "-1" in the
+ * second byte of the first triple should say
+ * "(bits 20-16)" instead of "(bits 20-16)-1".
+ * This needs to be researched and
+ * implemented for full spec compliance.
+ * </li>
+ *
+ * <li>
+ * <b>OTHER UTFx FORMATS</b>: The JVM does not (yet) recognized these.
+ * </li>
+ * </ul>
+ *
+ *
+ * @todo: Clarify the hextuple-byte UTF-16 encoding requirements, per
+ * above commentary.
+ *
+ */
+
+
+/*@{ */ /* Begin grouped definitions */
+
+/* SINGLE-BYTE UTF-8 FORMAT */
+
+#define UTF8_SINGLE_MIN 0x01 /**< '\\u0001', UTF-8 representation */
+#define UTF8_SINGLE_MAX 0x7f /**< '\\u007f', UTF-8 representation */
+
+#define UTF8_SINGLE_MASK1 0x80 /**< Bit 7 must be clear */
+#define UTF8_SINGLE_MASK0 0x7f /**< Bits 0-6 contain data
+ (except != 0, or NUL) */
+
+#define UNICODE_SINGLE_MIN 0x0001 /**< '\\u0001', Unicode
+ representation */
+#define UNICODE_SINGLE_MAX 0x007f /**< '\\u007f', Unicode
+ representation */
+
+
+/* DOUBLE-BYTE UTF-8 FORMAT */
+
+#define UTF8_DOUBLE_NUL 0x0000 /**< '\\u0000', UTF-8 representation */
+#define UTF8_DOUBLE_MIN 0x0080 /**< '\\u0080', UTF-8 representation */
+#define UTF8_DOUBLE_MAX 0x07ff /**< '\\u07ff', UTF-8 representation */
+
+#define UNICODE_DOUBLE_NUL 0x0000 /**< '\\u0000', Unicode
+ representation */
+#define UNICODE_DOUBLE_MIN 0x0080 /**< '\\u0080', Unicode
+ representation */
+#define UNICODE_DOUBLE_MAX 0x07ff /**< '\\u07ff', Unicode
+ representation */
+
+
+/* Definition of first byte (byte "x") of two-byte format: */
+
+#define UTF8_DOUBLE_FIRST_MASK1 0xe0 /**< Top 3 bits of first byte */
+#define UTF8_DOUBLE_FIRST_VAL 0xc0 /**< Top 3 bits are '110' */
+
+#define UTF8_DOUBLE_FIRST_MASK0 0x1f /**< Bottom 5 bits contain data
+ bits 10-6 */
+#define UTF8_DOUBLE_FIRST_SHIFT 6 /**< Move first byte up to bits
+ 10-6 */
+
+
+/* Definition of second byte (byte "y") of two-byte format: */
+
+#define UTF8_DOUBLE_SECOND_MASK1 0xc0 /**< Top 2 bits of second byte */
+#define UTF8_DOUBLE_SECOND_VAL 0x80 /**< Top 2 bits are '10' */
+
+#define UTF8_DOUBLE_SECOND_MASK0 0x3f /**< Bottom 6 bits contain data
+ bits 0-5 */
+
+
+/* TRIPLE-BYTE UTF-8 FORMAT: */
+
+#define UTF8_TRIPLE_MIN 0x0800 /**< '\\u0800', UTF-8 representation */
+#define UTF8_TRIPLE_MAX 0xffff /**< '\\uffff', UTF-8 representation */
+
+#define UNICODE_TRIPLE_MIN 0x0800 /**< '\\u0800', Unicode
+ representation */
+#define UNICODE_TRIPLE_MAX 0xffff /**< '\\uffff', Unicode
+ representation */
+
+
+/* Definition of first byte (byte "x") of three-byte format: */
+
+#define UTF8_TRIPLE_FIRST_MASK1 0xf0 /**! Top 4 bits of first byte */
+#define UTF8_TRIPLE_FIRST_VAL 0xe0 /**! Top 4 bits are '1110' */
+
+#define UTF8_TRIPLE_FIRST_MASK0 0x0f /**! Bottom 5 bits contain data
+ bits 15-12 */
+#define UTF8_TRIPLE_FIRST_SHIFT 12 /**! Move first byte up to
+ bits 15-12 */
+
+
+/* Definition of second byte (byte "y") of three-byte format: */
+
+#define UTF8_TRIPLE_SECOND_MASK1 0xc0 /**! Top 2 bits of second byte */
+#define UTF8_TRIPLE_SECOND_VAL 0x80 /**! Top 2 bits are '10' */
+
+#define UTF8_TRIPLE_SECOND_MASK0 0x3f /**! Bottom 6 bits contain data
+ bits 11-6 */
+#define UTF8_TRIPLE_SECOND_SHIFT 6 /**! Move second byte up to
+ bits 10-6 */
+
+
+/* Definition of third byte (byte "z") of three-byte format: */
+
+#define UTF8_TRIPLE_THIRD_MASK1 0xc0 /**! Top 2 bits of third byte */
+#define UTF8_TRIPLE_THIRD_VAL 0x80 /**! Top 2 bits are '10' */
+
+#define UTF8_TRIPLE_THIRD_MASK0 0x3f /**! Bottom 6 bits contain data
+ bits 5-0 */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.5.7: The CONSTANT_Utf8_info structure itself
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u1 tag;
+ u2 length;
+ u1 bytes[1]; /**< spec says:
+ <b><code>u1 bytes[length];</code></b> */
+
+ /*** LOCAL IMPLEMENTATION LATE BINDING EXTENSIONS ***/
+
+ /*!
+ * @brief Local implementation late binding extensions for
+ * @link #CONSTANT_Utf8_info CONSTANT_Utf8_info@endlink.
+ *
+ * Uses LOCAL_ as a prefix to signify an item that is @e not
+ * part of the JVM spec itself, but an implementation detail.
+ *
+ */
+ struct LOCAL_Utf8_binding
+ {
+ /*!
+ * @internal There is not late binding for this structure.
+ * However, to maintain compatibility with the
+ * @link #ALLOC_CP_INFO() ALLOC_CP_INFO()@endlink macro
+ * in @link jvm/src/classfile.c classfile.c@endlink,
+ * this empty structure is provided.
+ */
+ } LOCAL_Utf8_binding;
+
+} CONSTANT_Utf8_info;
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Forbidden UTF values.
+ *
+ * @brief No byte in bytes[] may contain these values because
+ * they present certain parsing problems in the Java subset of UTF-8.
+ *
+ */
+/*@{ */ /* Begin grouped definitions */
+
+#define UTF8_FORBIDDEN_ZERO 0x00 /**< Looks suspiciously like
+ ASCII NUL */
+
+#define UTF8_FORBIDDEN_MIN 0xf0 /**< Min of range for 4-byte UTF
+ values,etc */
+#define UTF8_FORBIDDEN_MAX 0xff /**< Max of forbidden range */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.6: Fields
+ *
+ * Table 4.4: Access Flags for Fields (New comments,
+ * plus new definitions)
+ *
+ * typedef struct field_info: See forward references
+ * above definition of ClassFile.
+ *
+ * Defined first in section 4.6 (Fields), possibly later also.
+ *
+ * For other @link #ACC_PUBLIC ACC_xxx@endlink definitions,
+ * see also table 4.1, 4.5, 4.7.
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+/* ACC_PUBLIC */
+
+#define ACC_PRIVATE 0x0002 /**< Declared @c @b private ; usable only
+ within the defining class. */
+
+#define ACC_PROTECTED 0x0004 /**< Declared @c @b protected ; may be
+ accessed within subclasses. */
+
+#define ACC_STATIC 0x0008 /**< Declared @c @b static . */
+
+/* ACC_FINAL ** Declared @c @b final ; no further
+ assignment after initialization. */
+
+#define ACC_VOLATILE 0x0040 /**< Declared @c @b volatile ; cannot be
+ cached */
+
+#define ACC_TRANSIENT 0x0080 /**< Declared @c @b transient ; not written
+ or read by a persistent object
+ manager */
+
+/* ACC_SYNTHETIC ** Declared @c @b synthetic ; not present
+ in the source code. */
+
+/* ACC_ENUM ** Declared as an enum type */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.7: Methods
+ *
+ * Table 4.5: Access Flags for methods (New comments,
+ * plus new definitions)
+ *
+ *
+ * typedef struct method_info: See forward references
+ * above definition of ClassFile
+ *
+ * Defined first in section 4.7 (Methods), possibly later also.
+ *
+ * For other @link #ACC_PUBLIC ACC_xxx@endlink definitions,
+ * see also table 4.1, 4.4, 4.7.
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+/* ACC_PUBLIC */
+/* ACC_PRIVATE */
+/* ACC_PROTECTED */
+/* ACC_STATIC */
+/* ACC_FINAL **Declared @c @b final ; may not be
+ overridden */
+#define ACC_SYNCHRONIZED 0x0010 /**< Declared @c @b synchronized ;
+ invokation is wrapped in a
+ monitor lock. */
+
+#define ACC_BRIDGE 0x0040 /**< A bridge method, generated by the
+ compiler. */
+
+#define ACC_VARARGS 0x0080 /**< Declared with variable number of
+ arguments. */
+
+#define ACC_NATIVE 0x0100 /**< Declared @c @b native ; implemented
+ in a language other than Java. */
+
+/* ACC_ABSTRACT ** Declared @c @b abstract ; no
+ implementation is provided. */
+
+#define ACC_STRICT 0x0800 /**< Declared @c @b strictfp ;
+ floating-point mode is FP-strict */
+
+/* ACC_SYNTHETIC ** Declared @c @b synthetic ; not
+ present in the source code. */
+
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.1: Defining and Naming new Attributes
+ *
+ * typedef struct attribute_info: See forward references
+ * above definition of ClassFile
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define LOCAL_CONSTANT_UTF8_UNKNOWN_ATTRIBUTE "Unknown" /**<
+ Not in spec*/
+
+#define LOCAL_UNKNOWN_ATTRIBUTE_ENUM 0 /**<
+ Not in spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.2: The ConstantValue Attribute
+ *
+ * See also table 4.6: Valid ConstantValue Field Types
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 constantvalue_index;
+
+} ConstantValue_attribute;
+
+#define CONSTANT_UTF8_CONSTANTVALUE_ATTRIBUTE "ConstantValue"
+
+#define CONSTANTVALUE_ATTRIBUTE_LENGTH 2
+#define LOCAL_CONSTANTVALUE_ATTRIBUTE_ENUM 1 /**< Not in spec */
+
+
+/* Table 4.6: Valid ConstantValue Field Types */
+
+/* CONSTANT_Long */
+/* CONSTANT_Float */
+/* CONSTANT_Double */
+/* CONSTANT_Integer */
+/* CONSTANT_String */
+
+/*@} */ /* End of grouped definitions */
+
+/*!
+ * @name Section 4.8.3: The Code Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+/*!
+ * @brief The class file @b exception_table structure, here named
+ * as @b exception_table_entry (to avoid naming conflicts in code
+ * versus spec requirements).
+ *
+ * See section 4.8.3.
+ *
+ */
+typedef struct
+{
+ u2 start_pc;
+ u2 end_pc;
+ u2 handler_pc;
+ u2 catch_type;
+
+} exception_table_entry;
+
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 max_stack;
+ u2 max_locals;
+
+ u4 code_length;
+ u1 *code; /**< Spec pseudo-code: @c @b code[code_length]; */
+
+ u2 exception_table_length;
+ exception_table_entry *exception_table; /**< Spec pseudo-code:
+ @c @b exception_table[exception_table_length]; */
+
+ u2 attributes_count;
+ attribute_info_dup **attributes; /**< Spec pseudo-code:
+ @c @b attribute_info attributes[attributes_count]; */
+
+} Code_attribute;
+
+#define CONSTANT_UTF8_CODE_ATTRIBUTE "Code"
+
+#define LOCAL_CODE_ATTRIBUTE_ENUM 2 /**< Not
+ in spec*/
+
+#define CODE_ATTRIBUTE_MAX_LOCALS_BOUNDARY_LONGDOUBLE 2
+
+#define CODE_ATTRIBUTE_MAX_LOCALS_BOUNDARY_OTHERS 1
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.4: The Exceptions Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 number_of_exceptions;
+
+ u2 exception_index_table[1]; /**< Mark space only for one.
+ Spec pseudo-code:
+ @c @b exception_index_table[number_of_exceptions]; */
+
+} Exceptions_attribute;
+
+#define CONSTANT_UTF8_EXCEPTIONS_ATTRIBUTE "Exceptions"
+
+#define LOCAL_EXCEPTIONS_ATTRIBUTE_ENUM 3 /**< Not in spec */
+
+#define CODE_DEFAULT_CATCH_TYPE 0 /**< This handler is
+ for all exceptions */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.5: The InnerClasses Attribute
+ *
+ * For other @link #ACC_PUBLIC ACC_xxx@endlink definitions,
+ * see also table 4.1, 4.4, 4.5.
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+/*!
+ * @brief The class file @b inner_class_table_entry structure
+ * (anonymous in spec).
+ *
+ * See section 4.8.5.
+ *
+ */
+typedef struct
+{
+ u2 inner_class_info_index;
+ u2 outer_class_info_index;
+ u2 inner_name_index;
+ u2 inner_class_access_flags;
+
+} inner_class_table_entry;
+
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 number_of_classes;
+ inner_class_table_entry classes[1]; /**< Mark space only for one.
+ Spec pseudo-code:
+ @c @b classes[number_of_classes]; */
+} InnerClasses_attribute;
+
+#define CONSTANT_UTF8_INNERCLASSES_ATTRIBUTE "InnerClasses"
+
+#define LOCAL_INNERCLASSES_ATTRIBUTE_ENUM 4 /**< Not in spec */
+
+/* Defined first in section 4.8.5 (The @b InnerClasses attribute),
+ possibly later also */
+
+/* Table 4.7: Access Flags for Attributes (New cmts, all defn's above)*/
+
+/* ACC_PUBLIC ** Marked or implicitly @c @b public
+ in source. */
+
+/* ACC_PRIVATE ** Marked @c @b private in source. */
+
+/* ACC_PROTECTED ** Marked @c @b protected in source. */
+
+/* ACC_STATIC ** Marked or implicitly @c @b static
+ in source. */
+
+/* ACC_FINAL ** Marked @c @b final in source. */
+
+/* ACC_INTERFACE ** Was an @c @b interface in source. */
+
+/* ACC_ABSTRACT ** Marked or implicitly @@c b abstract
+ in source. */
+
+/* ACC_SYNTHETIC ** Declared @c @b synthetic ; not present
+ in source. */
+
+/* ACC_ANNOTATION ** Declared as an annotation type */
+
+/* ACC_ENUM ** Declared as an enum type */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.6: The EnclosingMethod Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 class_index;
+ u2 method_index;
+
+} EnclosingMethod_attribute;
+
+#define CONSTANT_UTF8_ENCLOSINGMETHOD_ATTRIBUTE "EnclosingMethod"
+
+#define ENCLOSINGMETHOD_ATTRIBUTE_LENGTH 4
+
+#define LOCAL_ENCLOSINGMETHOD_ATTRIBUTE_ENUM 5 /**< Not
+ in spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.7: The Synthetic Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+
+} Synthetic_attribute;
+
+#define CONSTANT_UTF8_SYNTHETIC_ATTRIBUTE "Synthetic"
+
+#define SYNTHETIC_ATTRIBUTE_LENGTH 0
+
+#define LOCAL_SYNTHETIC_ATTRIBUTE_ENUM 7 /**< Not in spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.8: The Signature Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 signature_index;
+
+} Signature_attribute;
+
+#define CONSTANT_UTF8_SIGNATURE_ATTRIBUTE "Signature"
+
+#define SIGNATURE_ATTRIBUTE_LENGTH 2
+
+#define LOCAL_SIGNATURE_ATTRIBUTE_ENUM 6 /**< Not in spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.9: The SourceFile Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 sourcefile_index;
+
+} SourceFile_attribute;
+
+
+#define CONSTANT_UTF8_SOURCEFILE_ATTRIBUTE "SourceFile"
+
+#define SOURCEFILE_ATTRIBUTE_LENGTH 2
+
+#define LOCAL_SOURCEFILE_ATTRIBUTE_ENUM 8 /**< Not in spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.10: The LineNumberTable Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+/*!
+ * @brief The class file @b line_number_table_entry structure
+ * (anonymous in spec).
+ *
+ * See section 4.8.10.
+ *
+ */
+typedef struct
+{
+ u2 start_pc;
+ u2 line_number;
+
+} line_number_table_entry;
+
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 line_number_table_length;
+ line_number_table_entry line_number_table[1]; /**< Mark space only
+ for one. Spec pseudo-code:
+ @c @b line_number_table[line_number_table_length]; */
+
+} LineNumberTable_attribute;
+
+#define CONSTANT_UTF8_LINENUMBERTABLE_ATTRIBUTE "LineNumberTable"
+
+#define LOCAL_LINENUMBERTABLE_ATTRIBUTE_ENUM 9 /**< Not in
+ spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.11: The LocalVariableTable Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+/*!
+ * @brief The class file @b local_variable_table_entry structure
+ * (anonymous in spec).
+ *
+ * See section 4.8.11.
+ *
+ */
+typedef struct
+{
+ u2 start_pc;
+ u2 length;
+ u2 name_index;
+ u2 descriptor_index;
+ u2 index;
+
+} local_variable_table_entry;
+
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 local_variable_table_length;
+ local_variable_table_entry local_variable_table[1]; /**< Mark space
+ only for one. Spec pseudo-code:
+ @c @b local_variable_table[local_variable_table_length]; */
+
+
+} LocalVariableTable_attribute;
+
+#define CONSTANT_UTF8_LOCALVARIABLETABLE_ATTRIBUTE "LocalVariableTable"
+
+#define LOCAL_LOCALVARIABLETABLE_ATTRIBUTE_ENUM 10 /**< Not in
+ spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.12: The LocalVariableTypeTable Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+/*!
+ * @brief The class file @b local_variable_type_table_entry structure
+ * (anonymous in spec).
+ *
+ * See section 4.8.12.
+ *
+ */
+typedef struct
+{
+ u2 start_pc;
+ u2 length;
+ u2 name_index;
+ u2 signature_index;
+ u2 index;
+
+} local_variable_type_table_entry;
+
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 local_variable_type_table_length;
+ local_variable_type_table_entry local_variable_type_table[1]; /**<
+ Mark space only for one. Spec pseudo-code:
+ @c @b local_variable_table[local_variable_type_table_length]; */
+
+} LocalVariableTypeTable_attribute;
+
+#define CONSTANT_UTF8_LOCALVARIABLETYPETABLE_ATTRIBUTE \
+ "LocalVariableTypeTable"
+
+#define LOCAL_LOCALVARIABLETYPETABLE_ATTRIBUTE_ENUM 11 /**< Not
+ in spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.13: The Deprecated Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+
+} Deprecated_attribute;
+
+#define CONSTANT_UTF8_DEPRECATED_ATTRIBUTE "Deprecated"
+
+#define DEPRECATED_ATTRIBUTE_LENGTH 0
+
+#define LOCAL_DEPRECATED_ATTRIBUTE_ENUM 12 /**< Not in spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.8.14: The RuntimeVisibleAnnotations Attribute
+ *
+ * Xtodo When implementing @b RuntimeXxxAnnotations attributes,
+ * MAKE SURE to understand the implications of
+ * @link #ARCH_ODD2_ADDRESS_SIGSEGV ARCH_ODD2_ADDRESS_SIGSEGV@endlink
+ * and
+ * @link #ARCH_ODD4_ADDRESS_SIGSEGV ARCH_ODD4_ADDRESS_SIGSEGV@endlink
+ * upon 2- and 4-byte integer storage accesses, respectively.
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+/*!
+ * @brief The class file @b enum_const_value structure
+ *
+ * See section 4.8.14.1.
+ *
+ */
+typedef struct
+{
+ u2 type_name_index;
+ u2 const_name_index;
+
+} enum_const_value;
+
+
+/*!
+ * @brief The class file @b element_value structure
+ *
+ * Section 4.8.14.1: The @b element_value structure
+ *
+ */
+typedef struct
+{
+ u1 tag;
+
+ /*!
+ * @internal BREAKS COMPILER if declared,
+ *
+
+ values_union _value;
+
+ *
+ * due to circular member type references, so access
+ * it this way:
+ *
+ * values_union *pv = (values_union *) &variablename.value;
+ *
+ * pv->member ...
+ *
+ * To access both members of this structure, use the following
+ * approach:
+ *
+ * element_value var, *ptr;
+ *
+ * var.tag;
+ * ELEMENT_VALUE(var).value._const_value_index;
+ * ELEMENT_VALUE(var).value._enum_const_value;
+ *
+ * ptr->tag;
+ * PTR_ELEMENT_VALUE(ptr)->value._const_value_index;
+ * PTR_ELEMENT_VALUE(ptr)->value._enum_const_value;
+ */
+
+ u1 value;
+
+} element_value;
+
+/* Facilitate access to @c @b element_value.value member */
+#define ELEMENT_VALUE(var) (*(values_union *) &(&var)->_value)
+#define PTR_ELEMENT_VALUE(ptr) ( (values_union *) &(ptr)->_value)
+
+
+/*!
+ * @brief The class file @b element_value_pair structure
+ *
+ * See section 4.8.14.
+ *
+ */
+typedef struct
+{
+ u2 element_value_index;
+ element_value value;
+
+} element_value_pair;
+
+
+/*!
+ * @brief The class file @b annotation structure definition.
+ *
+ * See spec section 4.8.14.
+ *
+ */
+typedef struct
+{
+ u2 type_index;
+ u2 num_element_value_pairs;
+
+ element_value_pair element_value_pairs[1]; /**< Mark space only
+ for one. Spec pseudo-code:
+ @c @b element_value_pairs[num_element_value_pairs] */
+
+} annotation;
+
+
+/*!
+ * @brief The class file @b array_value structure definition.
+ *
+ * See spec section 4.8.14.1.
+ *
+ */
+typedef struct
+{
+ u2 num_values;
+
+ element_value values[1]; /**< Mark space only for one. Spec
+ pseudo-code: @c @b element_value values[num_values]; */
+
+} array_values;
+
+
+/*!
+ * @brief The class file @b values_union structure
+ * (anonymous in spec).
+ *
+ * See section 4.8.14.1.
+ *
+ */
+typedef union
+{
+ u2 _const_value_index;
+ enum_const_value _enum_const_value;
+ u2 _class_info_index;
+ annotation _annotation_value;
+ array_values _array_value;
+
+} values_union;
+
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 num_annotations;
+ annotation **annotations; /**< Spec pseudo-code:
+ @c @b annotation annotations[num_annotations]; */
+
+} RuntimeVisibleAnnotations_attribute;
+
+#define CONSTANT_UTF8_RUNTIMEVISIBLEANNOTATIONS_ATTRIBUTE \
+ "RuntimeVisibleAnnotations"
+
+#define LOCAL_RUNTIMEVISIBLEANNOTATIONS_ATTRIBUTE_ENUM 13 /**<
+ Not in spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @brief The @b RuntimeInvisibleAnnotations Attribute
+ *
+ * See spec section 4.8.15: The @b RuntimeInvisibleAnnotations Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 num_annotations;
+ annotation **annotations; /**< Spec pseudo-code:
+ @c @b annotations[num_annotations]; */
+
+} RuntimeInvisibleAnnotations_attribute;
+
+#define CONSTANT_UTF8_RUNTIMEINVISIBLEANNOTATIONS_ATTRIBUTE \
+ "RuntimeInvisibleAnnotations"
+
+#define LOCAL_RUNTIMEINVISIBLEANNOTATIONS_ATTRIBUTE_ENUM 14 /**<
+ Not in spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @brief The @b RuntimeVisibleParameterAnnotations Attribute
+ *
+ * See spec section 4.8.16: The @b RuntimeVisibleParameterAnnotations
+ * Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u2 num_annotations;
+ annotation **annotations; /**< Spec pseudo-code:
+ @c @b annotations[num_annotations]; */
+
+} parameter_annotation;
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 num_parameters;
+ parameter_annotation **parameter_annotations; /**< Spec pseudo-code:
+ @c @b parameter_annotations[num_parameters]; */
+
+} RuntimeVisibleParameterAnnotations_attribute;
+
+#define CONSTANT_UTF8_RUNTIMEVISIBLEPARAMETERANNOTATIONS_ATTRIBUTE \
+ "RuntimeVisibleParameterAnnotations"
+
+#define LOCAL_RUNTIMEVISIBLEPARAMETERANNOTATIONS_ATTRIBUTE_ENUM 15
+ /**< Not in spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @brief The @b RuntimeInvisibleParameterAnnotations Attribute
+ *
+ * See spec section 4.8.17: The @b RuntimeInvisibleParameterAnnotations
+ * Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 num_parameters;
+ parameter_annotation **parameter_annotations; /**< Spec pseudo-code:
+ @c @b parameter_annotations[num_parameters]; */
+
+} RuntimeInvisibleParameterAnnotations_attribute;
+
+#define CONSTANT_UTF8_RUNTIMEINVISIBLEPARAMETERANNOTATIONS_ATTRIBUTE \
+ "RuntimeInvisibleParameterAnnotations"
+
+#define LOCAL_RUNTIMEINVISIBLEPARAMETERANNOTATIONS_ATTRIBUTE_ENUM 16
+ /**< Not in spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @brief The @b AnnotationDefault Attribute
+ *
+ * See spec section 4.8.18: The @b AnnotationDefault Attribute
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+typedef struct
+{
+ u2 attribute_name_index;
+ u4 attribute_length;
+ u2 num_parameters;
+ element_value default_value;
+
+} AnnotationDefault_attribute;
+
+#define CONSTANT_UTF8_ANNOTATIONDEFAULT_ATTRIBUTE "AnnotationDefault"
+
+#define LOCAL_ANNOTATIONDEFAULT_ATTRIBUTE_ENUM 17 /**< Not in
+ spec */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Table 4.8: Additional tag values for annotation attributes
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define BASETYPE_CHAR_s 's' /**< String */
+#define BASETYPE_CHAR_e 'e' /**< enum constant */
+#define BASETYPE_CHAR_c 'c' /**< Class */
+#define BASETYPE_CHAR_AT '@' /**< Annotation type */
+/* BASETYPE_CHAR_ARRAY Array (see also table 4.2) */
+
+#define BASETYPE_STRING_CHAR_ARRAY "[C" /**< @c @b java.lang.String
+ (jchar)[] @p @b value field */
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @name Section 4.9: Format Checking
+ *
+ */
+
+/*!
+ * @name Section 4.10: Constraints on Java Virtual Machine Code
+ *
+ */
+
+/*!
+ * @name Section 4.10.1: Static Constraints
+ *
+ */
+
+/*@{ */ /* Begin grouped definitions */
+
+#define CODE_CONSTRAINT_CODE_LENGTH_MIN 1 /**< Array size bounds,bytes*/
+#define CODE_CONSTRAINT_CODE_LENGTH_MAX 65535
+
+#define CODE_CONSTRAINT_START_PC 0 /**< Start PC location */
+
+#define LOCAL_CONSTANT_UTF8_CLASS_CONSTRUCTOR "<clinit>"
+ /**< Not in spec,but implied*/
+#define LOCAL_CONSTANT_UTF8_CLASS_CONSTRUCTOR_PARMS "()V"
+
+#define CODE_CONSTRAINT_OP_INVOKEINTERFACE_PARM4 0
+#define CODE_CONSTRAINT_OP_ANEWARRAY_MAX_DIMS CONSTANT_MAX_ARRAY_DIMS
+
+#define CODE_CONSTRAINT_OP_NEWARRAY_TYPE_T_BOOLEAN 4
+#define CODE_CONSTRAINT_OP_NEWARRAY_TYPE_T_CHAR 5
+#define CODE_CONSTRAINT_OP_NEWARRAY_TYPE_T_FLOAT 6
+#define CODE_CONSTRAINT_OP_NEWARRAY_TYPE_T_DOUBLE 7
+#define CODE_CONSTRAINT_OP_NEWARRAY_TYPE_T_BYTE 8
+#define CODE_CONSTRAINT_OP_NEWARRAY_TYPE_T_SHORT 9
+#define CODE_CONSTRAINT_OP_NEWARRAY_TYPE_T_INT 10
+#define CODE_CONSTRAINT_OP_NEWARRAY_TYPE_T_LONG 11
+
+/*@} */ /* End of grouped definitions */
+
+
+/*!
+ * @brief Section 4.10.2: Structural Constraints
+ */
+
+
+/*!
+ * @brief Section 4.11: Verification of @b class Files
+ */
+
+/*!
+ * @brief Section 4.11.1: Verification by Type Inference
+ */
+
+
+/*!
+ * @brief Section 4.11.1.1: The Process of Verification by Type
+ * Inference
+ *
+ */
+
+/*!
+ * @brief Section 4.11.1.2: The Bytecode Verifier
+ *
+ */
+
+/*!
+ * @brief Section 4.11.1.3: Values of Types @c @b long and @c @b double
+ *
+ */
+
+/*!
+ * @brief Section 4.11.1.4: Instance Initialization Methods and Newly
+ * Created Objects
+ *
+ */
+
+/*!
+ * @brief Section 4.11.1.5: Exception Handlers
+ *
+ */
+
+/*!
+ * @brief Section 4.9.6: Exceptions and @c @b finally -- Removed from
+ * this JVM 1.5 edition, possibly from 1.4.
+ *
+ */
+
+/*!
+ * @brief Section 4.12: Limitations of the Java Virtual Machine
+ *
+ */
+
+
+/****************************************************************/
+
+/*!
+ * @brief Attribute enumeration
+ *
+ * Enumeration of all ClassFile attribute types. Gather the
+ * @link #LOCAL_CONSTANTVALUE_ATTRIBUTE_ENUM
+ LOCAL_xxx_ATTRIBUTE_ENUM@endlink values from all over the
+ * file into one place for use in compiling a single enumeration
+ * type. These @link #LOCAL_CONSTANTVALUE_ATTRIBUTE_ENUM
+ LOCAL_xxx_ATTRIBUTE_ENUM@endlink values were defined in the
+ * immediate proximity to the attribute they help describe, but
+ * this is difficult for creating an enumeration type. Here near
+ * the end of the file, each one is defined, so the enumeration
+ * type can be created. Once created, the @b xxx_ENUM version is
+ * undefined. Thus the @b xxx_ENUM is known only locally in this
+ * file, while the @b xxx version is known as part of the enumeration
+ * type.
+ *
+ */
+typedef enum
+{
+ LOCAL_UNKNOWN_ATTRIBUTE =
+ LOCAL_UNKNOWN_ATTRIBUTE_ENUM,
+
+ LOCAL_CONSTANTVALUE_ATTRIBUTE =
+ LOCAL_CONSTANTVALUE_ATTRIBUTE_ENUM,
+
+ LOCAL_CODE_ATTRIBUTE =
+ LOCAL_CODE_ATTRIBUTE_ENUM,
+
+ LOCAL_EXCEPTIONS_ATTRIBUTE =
+ LOCAL_EXCEPTIONS_ATTRIBUTE_ENUM,
+
+ LOCAL_INNERCLASSES_ATTRIBUTE =
+ LOCAL_INNERCLASSES_ATTRIBUTE_ENUM,
+
+ LOCAL_ENCLOSINGMETHOD_ATTRIBUTE =
+ LOCAL_ENCLOSINGMETHOD_ATTRIBUTE_ENUM,
+
+ LOCAL_SYNTHETIC_ATTRIBUTE =
+ LOCAL_SYNTHETIC_ATTRIBUTE_ENUM,
+
+ LOCAL_SIGNATURE_ATTRIBUTE =
+ LOCAL_SIGNATURE_ATTRIBUTE_ENUM,
+
+ LOCAL_SOURCEFILE_ATTRIBUTE =
+ LOCAL_SOURCEFILE_ATTRIBUTE_ENUM,
+
+ LOCAL_LINENUMBERTABLE_ATTRIBUTE =
+ LOCAL_LINENUMBERTABLE_ATTRIBUTE_ENUM,
+
+ LOCAL_LOCALVARIABLETABLE_ATTRIBUTE =
+ LOCAL_LOCALVARIABLETABLE_ATTRIBUTE_ENUM,
+
+ LOCAL_LOCALVARIABLETYPETABLE_ATTRIBUTE =
+ LOCAL_LOCALVARIABLETYPETABLE_ATTRIBUTE_ENUM,
+
+ LOCAL_DEPRECATED_ATTRIBUTE =
+ LOCAL_DEPRECATED_ATTRIBUTE_ENUM,
+
+ LOCAL_RUNTIMEVISIBLEANNOTATIONS_ATTRIBUTE =
+ LOCAL_RUNTIMEVISIBLEANNOTATIONS_ATTRIBUTE_ENUM,
+
+ LOCAL_RUNTIMEINVISIBLEANNOTATIONS_ATTRIBUTE =
+ LOCAL_RUNTIMEINVISIBLEANNOTATIONS_ATTRIBUTE_ENUM,
+
+ LOCAL_RUNTIMEVISIBLEPARAMETERANNOTATIONS_ATTRIBUTE =
+ LOCAL_RUNTIMEVISIBLEPARAMETERANNOTATIONS_ATTRIBUTE_ENUM,
+
+ LOCAL_RUNTIMEINVISIBLEPARAMETERANNOTATIONS_ATTRIBUTE =
+ LOCAL_RUNTIMEINVISIBLEPARAMETERANNOTATIONS_ATTRIBUTE_ENUM,
+
+ LOCAL_ANNOTATIONDEFAULT_ATTRIBUTE =
+ LOCAL_ANNOTATIONDEFAULT_ATTRIBUTE_ENUM
+
+} classfile_attribute_enum;
+
+/* Finally remove temporary definitions */
+#undef LOCAL_UNKNOWN_ATTRIBUTE_ENUM
+#undef LOCAL_CONSTANTVALUE_ATTRIBUTE_ENUM
+#undef LOCAL_CODE_ATTRIBUTE_ENUM
+#undef LOCAL_EXCEPTIONS_ATTRIBUTE_ENUM
+#undef LOCAL_INNERCLASSES_ATTRIBUTE_ENUM
+#undef LOCAL_ENCLOSINGMETHOD_ATTRIBUTE_ENUM
+#undef LOCAL_SYNTHETIC_ATTRIBUTE_ENUM
+#undef LOCAL_SIGNATURE_ATTRIBUTE_ENUM
+#undef LOCAL_SOURCEFILE_ATTRIBUTE_ENUM
+#undef LOCAL_LINENUMBERTABLE_ATTRIBUTE_ENUM
+#undef LOCAL_LOCALVARIABLETABLE_ATTRIBUTE_ENUM
+#undef LOCAL_LOCALVARIABLETYPETABLE_ATTRIBUTE_ENUM
+#undef LOCAL_DEPRECATED_ATTRIBUTE_ENUM
+#undef LOCAL_RUNTIMEVISIBLEANNOTATIONS_ATTRIBUTE_ENUM
+#undef LOCAL_RUNTIMEINVISIBLEANNOTATIONS_ATTRIBUTE_ENUM
+#undef LOCAL_RUNTIMEVISIBLEPARAMETERANNOTATIONS_ATTRIBUTE_ENUM
+#undef LOCAL_RUNTIMEINVISIBLEPARAMETERANNOTATIONS_ATTRIBUTE_ENUM
+#undef LOCAL_ANNOTATIONDEFAULT_ATTRIBUTE_ENUM
+
+
+
+/* Prototypes for functions in 'classfile.c' */
+
+extern ClassFile *classfile_allocate_primative(jvm_basetype basetype);
+extern ClassFile *classfile_loadclassdata(u1 *classfile_image);
+extern rvoid classfile_unloadclassdata(ClassFile *pcfs);
+extern u1 *classfile_readclassfile(rchar *filename);
+extern u1 *classfile_readjarfile(rchar *filename);
+
+/* Prototypes for functions in 'cfattrib.c' */
+extern u1 *cfattrib_loadattribute(ClassFile *pcfs,
+ attribute_info_dup **dst,
+ attribute_info *src);
+extern rvoid cfattrib_unloadattribute(ClassFile *pcfs,
+ attribute_info_dup *dst);
+extern classfile_attribute_enum cfattrib_atr2enum(ClassFile *pcfs,
+ u2 attribute_attribute_name_index);
+extern rboolean cfattrib_iscodeattribute(ClassFile *pcfs,
+ u2 attribute_attribute_name_index);
+
+/* Prototypes for functions in 'cfmsgs.c' */
+extern rvoid cfmsgs_typemsg(rchar *fn, ClassFile *pcfs, u2 idx);
+extern rvoid cfmsgs_show_constant_pool(ClassFile *pcfs);
+extern rvoid cfmsgs_atrmsg(rchar *fn,
+ ClassFile *pcfs,
+ attribute_info_dup *atr);
+
+#endif /* _classfile_h_included_ */
+
+/* EOF */