Add rudimentary attribute parsing support
This commit is contained in:
parent
002917d91c
commit
0d3abe0988
109
include/Attributes.h
Normal file
109
include/Attributes.h
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
#ifndef __CAVM_ATTRIBUTES_H
|
||||||
|
#define __CAVM_ATTRIBUTES_H
|
||||||
|
|
||||||
|
#include <ClassFormat.h>
|
||||||
|
#include <SpecTypes.h>
|
||||||
|
#include <Utils/CRC32_CompileTime.hpp>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace Attributes
|
||||||
|
{
|
||||||
|
enum class ClassAttributes : uint32_t
|
||||||
|
{
|
||||||
|
SOURCE_FILE = "SourceFile"_crc32,
|
||||||
|
INNER_CLASSES = "InnerClasses"_crc32,
|
||||||
|
ENCLOSING_METHOD = "EnclosingMethod"_crc32,
|
||||||
|
SOURCE_DEBUG_EXTENSION = "SourceDebugExtension"_crc32,
|
||||||
|
BOOTSTRAP_METHODS = "BootstrapMethods"_crc32,
|
||||||
|
MODULE = "Module"_crc32,
|
||||||
|
MODULE_PACKAGES = "ModulePackages"_crc32,
|
||||||
|
MODULE_MAIN_CLASS = "ModuleMainClass"_crc32,
|
||||||
|
NEST_HOST = "NestHost"_crc32,
|
||||||
|
NEST_MEMBERS = "NestMembers"_crc32,
|
||||||
|
RECORD = "Record"_crc32,
|
||||||
|
PERMITTED_SUBCLASSES = "PermittedSubclasses"_crc32,
|
||||||
|
SYNTHETIC = "Synthetic"_crc32,
|
||||||
|
DEPRECATED = "Deprecated"_crc32,
|
||||||
|
SIGNATURE = "Signature"_crc32,
|
||||||
|
RUNTIME_VISIBLE_ANNOTATIONS = "RuntimeVisibleAnnotations"_crc32,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class FieldAttributes : uint32_t
|
||||||
|
{
|
||||||
|
CONSTANT_VALUE = "ConstantValue"_crc32,
|
||||||
|
SYNTHETIC = "Synthetic"_crc32,
|
||||||
|
DEPRECATED = "Deprecated"_crc32,
|
||||||
|
SIGNATURE = "Signature"_crc32,
|
||||||
|
RUNTIME_VISIBLE_ANNOTATIONS = "RuntimeVisibleAnnotations"_crc32,
|
||||||
|
RUNTIME_INVISIBLE_ANNOTATIONS = "RuntimeInvisibleAnnotations"_crc32,
|
||||||
|
RUNTIME_VISIBLE_TYPE_ANNOTATIONS = "RuntimeVisibleTypeAnnotations"_crc32,
|
||||||
|
RUNTIME_INVISIBLE_TYPE_ANNOTATIONS = "RuntimeInvisibleTypeAnnotations"_crc32,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class MethodAttributes : uint32_t
|
||||||
|
{
|
||||||
|
CODE = "Code"_crc32,
|
||||||
|
EXCEPTIONS = "Exceptions"_crc32,
|
||||||
|
RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS = "RuntimeVisibleParameterAnnotations"_crc32,
|
||||||
|
RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS = "RuntimeInvisibleParameterAnnotations"_crc32,
|
||||||
|
ANNOTATION_DEFAULT = "AnnotationDefault"_crc32,
|
||||||
|
METHOD_PARAMETERS = "MethodParameters"_crc32,
|
||||||
|
SYNTHETIC = "Synthetic"_crc32,
|
||||||
|
DEPRECATED = "Deprecated"_crc32,
|
||||||
|
SIGNATURE = "Signature"_crc32,
|
||||||
|
RUNTIME_VISIBLE_ANNOTATIONS = "RuntimeVisibleAnnotations"_crc32,
|
||||||
|
RUNTIME_INVISIBLE_ANNOTATIONS = "RuntimeInvisibleAnnotations"_crc32,
|
||||||
|
RUNTIME_VISIBLE_TYPE_ANNOTATIONS = "RuntimeVisibleTypeAnnotations"_crc32,
|
||||||
|
RUNTIME_INVISIBLE_TYPE_ANNOTATIONS = "RuntimeInvisibleTypeAnnotations"_crc32,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class RecordComponentAttributes : uint32_t
|
||||||
|
{
|
||||||
|
RUNTIME_VISIBLE_ANNOTATIONS = "RuntimeVisibleAnnotations"_crc32,
|
||||||
|
RUNTIME_INVISIBLE_ANNOTATIONS = "RuntimeInvisibleAnnotations"_crc32,
|
||||||
|
RUNTIME_VISIBLE_TYPE_ANNOTATIONS = "RuntimeVisibleTypeAnnotations"_crc32,
|
||||||
|
RUNTIME_INVISIBLE_TYPE_ANNOTATIONS = "RuntimeInvisibleTypeAnnotations"_crc32,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class CodeAttributes : uint32_t
|
||||||
|
{
|
||||||
|
LINE_NUMBER_TABLE = "LineNumberTable"_crc32,
|
||||||
|
LOCAL_VARIABLE_TABLE = "LocalVariableTable"_crc32,
|
||||||
|
LOCAL_VARIABLE_TYPE_TABLE = "LocalVariableTypeTable"_crc32,
|
||||||
|
STACK_MAP_TABLE = "StackMapTable"_crc32,
|
||||||
|
RUNTIME_VISIBLE_TYPE_ANNOTATIONS = "RuntimeVisibleTypeAnnotations"_crc32,
|
||||||
|
RUNTIME_INVISIBLE_TYPE_ANNOTATIONS = "RuntimeInvisibleTypeAnnotations"_crc32,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CODE_Attribute : BaseAttribute
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u2 start_pc;
|
||||||
|
u2 end_pc;
|
||||||
|
u2 handler_pc;
|
||||||
|
u2 catch_type;
|
||||||
|
} exception_table;
|
||||||
|
|
||||||
|
public:
|
||||||
|
u2 max_stack;
|
||||||
|
u2 max_locals;
|
||||||
|
u4 code_length;
|
||||||
|
std::vector<uint8_t> code;
|
||||||
|
u2 exception_table_length;
|
||||||
|
std::vector<exception_table> exceptions;
|
||||||
|
u2 attributes_count;
|
||||||
|
std::vector<attribute_info> attributes;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct SOURCE_FILE_Attribute : BaseAttribute
|
||||||
|
{
|
||||||
|
u2 sourcefile_index;
|
||||||
|
};
|
||||||
|
|
||||||
|
attribute_info AttributesParser(JavaClassFormat &jc);
|
||||||
|
} // namespace Attributes
|
||||||
|
|
||||||
|
#endif
|
52
src/AttributeParser.cpp
Normal file
52
src/AttributeParser.cpp
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#include "ConstantPoolTags/Tags.h"
|
||||||
|
#include <Globals.h>
|
||||||
|
#include <Utils/Utils.h>
|
||||||
|
#include <Attributes.h>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <iostream>
|
||||||
|
#include <cassert>
|
||||||
|
#include <string>
|
||||||
|
#include <Utils/CRC32_CompileTime.hpp>
|
||||||
|
|
||||||
|
attribute_info Attributes::AttributesParser(JavaClassFormat& jc)
|
||||||
|
{
|
||||||
|
attribute_info ret;
|
||||||
|
|
||||||
|
ret.attribute_name_index = Utils::ReadFromStartIntoVal<uint16_t>(Globals::buffer());
|
||||||
|
ret.attribute_length = Utils::ReadFromStartIntoVal<uint32_t>(Globals::buffer());
|
||||||
|
|
||||||
|
ASSERT(ret.attribute_length.ToHostFormat() > 0);
|
||||||
|
|
||||||
|
for (int i = 0; i < ret.attribute_length.ToHostFormat(); i++)
|
||||||
|
{
|
||||||
|
ret.info.push_back(Utils::ReadFromStartIntoVal<uint8_t>(Globals::buffer(), 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::reverse(ret.info.begin(), ret.info.end());
|
||||||
|
|
||||||
|
int idx = ret.info.data()->ToHostFormat();
|
||||||
|
|
||||||
|
ASSERT(VEC_ELEM_TYPE(jc.constant_pool[ret.attribute_name_index.ToHostFormat() - 1]) == TYPE(ConstantPoolTags::ConstantUtf8Info));
|
||||||
|
std::string str = reinterpret_cast<const char*>(std::any_cast<ConstantPoolTags::ConstantUtf8Info>(jc.constant_pool[ret.attribute_name_index.ToHostFormat() - 1]).bytes);
|
||||||
|
|
||||||
|
switch ((ClassAttributes)crc32_rec(CRC32, str.c_str()))
|
||||||
|
{
|
||||||
|
case ClassAttributes::SOURCE_FILE:
|
||||||
|
{
|
||||||
|
ASSERT(VEC_ELEM_TYPE(jc.constant_pool[idx - 1]) == TYPE(ConstantPoolTags::ConstantUtf8Info));
|
||||||
|
std::cout << "Source File: "
|
||||||
|
<< std::any_cast<ConstantPoolTags::ConstantUtf8Info>(jc.constant_pool[idx - 1]).bytes
|
||||||
|
<< std::endl;
|
||||||
|
SOURCE_FILE_Attribute attr;
|
||||||
|
// attr.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
std::cerr << "Unknown attribute: \"" << str << "\"" << std::endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
// switch ()
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user