blob: b1c18a4c73c1770104619702fa97e5f9104ca0ff [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
#ifndef __VTABLE_H__
#define __VTABLE_H__
/**
* @file
* virtual method table of a class
*/
#include <open/types.h>
struct Class;
extern "C" {
typedef struct {
unsigned char** table; // pointer into methods array of Intfc_Table below
Class* intfc_class; // id of interface
} Intfc_Table_Entry;
typedef struct Intfc_Table {
#ifdef POINTER64
// see INTFC_TABLE_OVERHEAD
U_32 dummy; // padding
#endif
U_32 n_entries;
Intfc_Table_Entry entry[1];
} Intfc_Table;
#define INTFC_TABLE_OVERHEAD (sizeof(void*))
#ifdef POINTER64
#define OBJECT_HEADER_SIZE 0
// The size of an object reference. Used by arrays of object to determine
// the size of an element.
#define OBJECT_REF_SIZE 8
#else // POINTER64
#define OBJECT_HEADER_SIZE 0
#define OBJECT_REF_SIZE 4
#endif // POINTER64
#define GC_BYTES_IN_VTABLE (sizeof(void*))
#define MAX_FAST_INSTOF_DEPTH 5
/**
* @return The number of superclass hierarchy elements that are
* stored within the vtable. This is for use with fast type checking.
*/
inline unsigned vm_max_fast_instanceof_depth()
{
return MAX_FAST_INSTOF_DEPTH;
}
typedef struct VTable {
U_8 _gc_private_information[GC_BYTES_IN_VTABLE];
ManagedObject* jlC;
unsigned int vtmark;
Class* clss;
// See the masks in vm_for_gc.h.
U_32 class_properties;
// Offset from the top by CLASS_ALLOCATED_SIZE_OFFSET
// The number of bytes allocated for this object. It is the same as
// instance_data_size with the constraint bit cleared. This includes
// the OBJECT_HEADER_SIZE as well as the OBJECT_VTABLE_POINTER_SIZE
unsigned int allocated_size;
unsigned short array_element_size;
unsigned short array_element_shift;
// cached values, used for helper inlining to avoid extra memory access
unsigned char** intfc_table_0;
Class* intfc_class_0;
unsigned char** intfc_table_1;
Class* intfc_class_1;
unsigned char** intfc_table_2;
Class* intfc_class_2;
Intfc_Table* intfc_table; // interface table; NULL if no intfc table
Class *superclasses[MAX_FAST_INSTOF_DEPTH];
unsigned char* methods[1]; // code for methods
} VTable;
#define VTABLE_OVERHEAD (sizeof(VTable) - sizeof(void *))
// The "- sizeof(void *)" part subtracts out the "unsigned char *methods[1]" contribution.
VTable *create_vtable(Class *p_class, unsigned n_vtable_entries);
} // extern "C"
#endif