<!-- ##### SECTION Title ##### -->
Attributes

<!-- ##### SECTION Short_Description ##### -->
Attributes for classes, fields and methods.

<!-- ##### SECTION Long_Description ##### -->
<para>
Attributes are used to store any type of data in class files about
any method, field or class.
</para>
<para> 
All attributes are inside a "container" that provide
the VM with information about the name and length in bytes 
of the attribute. If the VM does not know about an attribute
it can simply skip it but it should understand the official
attributes.
</para>
<para>
	<itemizedlist>
		<title>Official attributes as of the 2nd ed. of the VM Spec</title>
		<listitem>
			<para><emphasis>Synthetic</emphasis>
			Compiler generated field/method/class.
			It did not appear in the source code.
			</para>
		</listitem>
		<listitem>
			<para><emphasis>Deprecated</emphasis>
				Used for informative purposes. (optional).
			</para>
		</listitem>
		<listitem>
			<para><emphasis>SourceFile</emphasis>
			Points to the constant pool for the name of the source file. (optional).
			</para>
		</listitem>
		<listitem>
			<para><emphasis>ConstantValue</emphasis>
			Holds the constant pool index for the value of final variables.
			</para>
		</listitem>
		<listitem>
			<para><emphasis>Code</emphasis>
			Holds the code and other relevant information for methods.
			</para>
		</listitem>
		<listitem>
			<para><emphasis>Exceptions</emphasis>
			A table with references to the exceptions thrown.
			</para>
		</listitem>
		<listitem>
			<para><emphasis>InnerClasses</emphasis>
			References for Inner classes.
			</para>
		</listitem>
		<listitem>
			<para><emphasis>LineNumberTable</emphasis>
			A PC -> linenumber map (optional).
			</para>
		</listitem>
		<listitem>
			<para><emphasis>LocalVariableTable</emphasis>
			Holds the programmer assigned names for variables (optional).
			</para>
		</listitem>
	</itemizedlist>
</para>

<!-- ##### SECTION See_Also ##### -->
<para>

</para>

<!-- ##### STRUCT AttributeContainer ##### -->
<para>
An attribute container contains exactly one attribute.
The actual attribute is stored in the contents array
There is no generic way to interprete
an attribute, so libjclass does not extract attributes automatically.
Use jclass_attribute_container_has_attribute()
to detect the type of attribute contained and then the appropriate 
jclass_X_attribute_new function to extract the attribute.
</para>

@name_index: 
@length: 
@contents: 

<!-- ##### STRUCT InnerClassInfo ##### -->
<para>
Information about an inner class in the innerclass attribute.
</para>

@type_index: 
@outer_class_type_index: 
@name_index: 
@access_flags: 

<!-- ##### STRUCT InnerClassesAttribute ##### -->
<para>
Holds information about inner classes.
</para>

@no_innerclasses: 
@classes: 

<!-- ##### STRUCT ExceptionsAttribute ##### -->
<para>
Exceptions attribute for classes and methods. It contains information
about exceptions thrown only (not for exceptions caught).
</para>

@no_exceptions: 
@exception_index: 

<!-- ##### STRUCT SourceFileAttribute ##### -->
<para>
Attribute for the name of the source file used to compile the class.
</para>

@filename_index: 

<!-- ##### STRUCT ConstantValueAttribute ##### -->
<para>
Attribute for the value of a constant.
</para>

@cp_index: 

<!-- ##### STRUCT ExceptionTableEntry ##### -->
<para>
An entry in the exception table.
</para>

@start_pc: 
@end_pc: 
@handler_pc: 
@catch_type: 

<!-- ##### STRUCT CodeAttribute ##### -->
<para>
Holds the code for each method.
The internal name for this attribute is "Code"
</para>

@max_stack: 
@max_locals: 
@code_length: 
@code: 
@exception_table_length: 
@exception_table: 
@attributes_count: 
@attributes: 

<!-- ##### STRUCT LineNumberInfo ##### -->
<para>
Line number information.
</para>

@start_pc: 
@line_number: 

<!-- ##### STRUCT LineNumberAttribute ##### -->
<para>
Holds line number information for debugging.
The internal name of this attribute is "LineNumberTable"
It can only appear inside the Code attribute.
</para>

@length: 
@line_number: 

<!-- ##### STRUCT LocalVariableInfo ##### -->
<para>
An entry in the local variable table.
</para>

@start_pc: 
@length: 
@name_index: 
@descriptor_index: 
@index: 

<!-- ##### STRUCT LocalVariableAttribute ##### -->
<para>
Holds local variable information for debugging.
The internal name for this attribute is "LocalVariableTable"
It can only appear inside the Code attribute.
</para>

@length: 
@localvariable: 

<!-- ##### FUNCTION jclass_attribute_container_has_attribute ##### -->
<para>

</para>

@container: 
@attribute_name: 
@cpool: 
@Returns: 


<!-- ##### FUNCTION jclass_sourcefile_attribute_new ##### -->
<para>
</para>

@container: 
@Returns: 


<!-- ##### FUNCTION jclass_sourcefile_attribute_free ##### -->
<para>

</para>

@attribute: 


<!-- ##### FUNCTION jclass_constantvalue_attribute_new ##### -->
<para>

</para>

@container: 
@Returns: 


<!-- ##### FUNCTION jclass_constantvalue_attribute_free ##### -->
<para>

</para>

@attribute: 


<!-- ##### FUNCTION jclass_exceptions_attribute_new ##### -->
<para>

</para>

@container: 
@Returns: 


<!-- ##### FUNCTION jclass_exceptions_attribute_free ##### -->
<para>

</para>

@attribute: 


<!-- ##### FUNCTION jclass_innerclasses_attribute_new ##### -->
<para>

</para>

@container: 
@Returns: 


<!-- ##### FUNCTION jclass_innerclasses_attribute_free ##### -->
<para>
</para>

@attribute: 


<!-- ##### FUNCTION jclass_code_attribute_new ##### -->
<para>

</para>

@container: 
@Returns: 


<!-- ##### FUNCTION jclass_code_attribute_free ##### -->
<para>

</para>

@attribute: 


<!-- ##### FUNCTION jclass_linenumber_attribute_new ##### -->
<para>

</para>

@container: 
@Returns: 


<!-- ##### FUNCTION jclass_linenumber_attribute_free ##### -->
<para>

</para>

@attribute: 


<!-- ##### FUNCTION jclass_localvariable_attribute_new ##### -->
<para>

</para>

@container: 
@Returns: 


<!-- ##### FUNCTION jclass_localvariable_attribute_free ##### -->
<para>

</para>

@attribute: 


