blob: defe01bf38fd5ed20369034c6d510cfb36c39c48 [file] [log] [blame]
#ifndef __VM_FIELD_H
#define __VM_FIELD_H
#include <stdbool.h>
#include "cafebabe/constant_pool.h"
#include "cafebabe/constant_value_attribute.h"
#include "cafebabe/field_info.h"
#include "vm/vm.h"
#include "vm/types.h"
struct vm_class;
struct vm_field {
struct vm_class *class;
unsigned int field_index;
const struct cafebabe_field_info *field;
char *name;
char *type;
struct vm_type_info type_info;
unsigned int offset;
unsigned int nr_annotations;
struct vm_annotation **annotations;
bool annotation_initialized;
};
int vm_field_init(struct vm_field *vmf,
struct vm_class *vmc, unsigned int field_index);
void vm_field_init_nonstatic(struct vm_field *vmf);
int vm_field_init_static(struct vm_field *vmf);
int vm_field_init_annotation(struct vm_field *vmf);
static inline bool vm_field_is_static(const struct vm_field *vmf)
{
return vmf->field->access_flags & CAFEBABE_FIELD_ACC_STATIC;
}
static inline bool vm_field_is_final(const struct vm_field *vmf)
{
return vmf->field->access_flags & CAFEBABE_FIELD_ACC_FINAL;
}
static inline bool vm_field_is_public(const struct vm_field *vmf)
{
return vmf->field->access_flags & CAFEBABE_FIELD_ACC_PUBLIC;
}
static inline enum vm_type vm_field_type(const struct vm_field *vmf)
{
return vmf->type_info.vm_type;
}
static inline bool
vm_field_equals(const struct vm_field *f1, const struct vm_field *f2)
{
return f1->class == f2->class && f1->field_index == f2->field_index;
}
#endif