rizin/librz/bin/format/java/class_attribute.h
2023-01-25 22:02:26 +08:00

134 lines
4.5 KiB
C

// SPDX-FileCopyrightText: 2021 deroad <wargio@libero.it>
// SPDX-License-Identifier: LGPL-3.0-only
#ifndef RZ_BIN_JAVA_CLASS_ATTRIBUTE_H
#define RZ_BIN_JAVA_CLASS_ATTRIBUTE_H
#include <rz_types.h>
#include <rz_util.h>
#include <rz_bin.h>
#include "class_exceptions.h"
#include "class_line_number.h"
#include "class_local_variable.h"
#include "class_module.h"
#include "class_const_pool.h"
typedef enum {
ATTRIBUTE_TYPE_INVALID = 0,
ATTRIBUTE_TYPE_UNKNOWN, // will be used only when parsing an unknown attribute
ATTRIBUTE_TYPE_CONSTANTVALUE, /* Java SE 1.0.2 */
ATTRIBUTE_TYPE_CODE, /* Java SE 1.0.2 */
ATTRIBUTE_TYPE_STACKMAPTABLE, /* Java SE 6 */
ATTRIBUTE_TYPE_EXCEPTIONS, /* Java SE 1.0.2 */
ATTRIBUTE_TYPE_INNERCLASSES, /* Java SE 1.1 */
ATTRIBUTE_TYPE_ENCLOSINGMETHOD, /* Java SE 5.0 */
ATTRIBUTE_TYPE_SYNTHETIC, /* Java SE 1.1 */
ATTRIBUTE_TYPE_SIGNATURE, /* Java SE 5.0 */
ATTRIBUTE_TYPE_SOURCEFILE, /* Java SE 1.0.2 */
ATTRIBUTE_TYPE_SOURCEDEBUGEXTENSION, /* Java SE 5.0 */
ATTRIBUTE_TYPE_LINENUMBERTABLE, /* Java SE 1.0.2 */
ATTRIBUTE_TYPE_LOCALVARIABLETABLE, /* Java SE 1.0.2 */
ATTRIBUTE_TYPE_LOCALVARIABLETYPETABLE, /* Java SE 5.0 */
ATTRIBUTE_TYPE_DEPRECATED, /* Java SE 1.1 */
ATTRIBUTE_TYPE_RUNTIMEVISIBLEANNOTATIONS, /* Java SE 5.0 */
ATTRIBUTE_TYPE_RUNTIMEINVISIBLEANNOTATIONS, /* Java SE 5.0 */
ATTRIBUTE_TYPE_RUNTIMEVISIBLEPARAMETERANNOTATIONS, /* Java SE 5.0 */
ATTRIBUTE_TYPE_RUNTIMEINVISIBLEPARAMETERANNOTATIONS, /* Java SE 5.0 */
ATTRIBUTE_TYPE_RUNTIMEVISIBLETYPEANNOTATIONS, /* Java SE 8 */
ATTRIBUTE_TYPE_RUNTIMEINVISIBLETYPEANNOTATIONS, /* Java SE 8 */
ATTRIBUTE_TYPE_ANNOTATIONDEFAULT, /* Java SE 5.0 */
ATTRIBUTE_TYPE_BOOTSTRAPMETHODS, /* Java SE 7 */
ATTRIBUTE_TYPE_METHODPARAMETERS, /* Java SE 8 */
ATTRIBUTE_TYPE_MODULE, /* Java SE 9 */
ATTRIBUTE_TYPE_MODULEPACKAGES, /* Java SE 9 */
ATTRIBUTE_TYPE_MODULEMAINCLASS, /* Java SE 9 */
ATTRIBUTE_TYPE_NESTHOST, /* Java SE 11 */
ATTRIBUTE_TYPE_NESTMEMBERS /* Java SE 11 */
} AttributeType;
typedef struct java_attribute_t {
ut64 offset;
AttributeType type;
ut16 attribute_name_index;
ut32 attribute_length;
void *info;
} Attribute;
typedef struct java_attribute_constant_value_t {
/*
* Must be pointing to one of these types:
* CONSTANT_POOL_INTEGER: int, short, char, byte, boolean
* CONSTANT_POOL_FLOAT: float
* CONSTANT_POOL_LONG: long
* CONSTANT_POOL_DOUBLE: double
* CONSTANT_POOL_STRING: String
*/
ut16 index;
} AttributeConstantValue;
typedef struct java_attribute_code_t {
ut16 max_stack;
ut16 max_locals;
ut32 code_length;
ut32 code_offset;
ut16 exceptions_count;
ExceptionTable *exceptions;
ut16 attributes_count;
Attribute **attributes;
} AttributeCode;
typedef struct java_attribute_source_file_t {
ut16 index;
} AttributeSourceFile;
typedef struct java_attribute_line_number_table_t {
ut16 table_length;
LineNumberTable *table;
} AttributeLineNumberTable;
typedef struct java_attribute_local_variable_table_t {
ut16 table_length;
LocalVariableTable *table;
} AttributeLocalVariableTable;
typedef struct java_attribute_local_variable_type_table_t {
ut16 table_length;
LocalVariableTypeTable *table;
} AttributeLocalVariableTypeTable;
typedef struct java_attribute_module_t {
ut16 module_name_index;
ut16 module_flags;
ut16 module_version_index;
ut16 requires_count;
ModuleRequire *
requires;
ut16 exports_count;
ModuleExport *exports;
ut16 opens_count;
ModuleOpen *opens;
ut16 uses_count;
ut16 *uses_index;
ut16 provides_count;
ModuleProvide *provides;
} AttributeModule;
typedef struct java_attribute_module_packages_t {
ut16 package_count;
ut16 *package_index;
} AttributeModulePackages;
typedef struct java_attribute_module_main_class_t {
ut16 main_class_index;
} AttributeModuleMainClass;
Attribute *java_attribute_new(RzBuffer *buf, ut64 offset);
void java_attribute_free(Attribute *attr);
bool java_attribute_resolve(ConstPool **pool, ut32 poolsize, Attribute *attr, RzBuffer *buf, bool is_oak);
#endif /* RZ_BIN_JAVA_CLASS_ATTRIBUTE_H */