vm/include/open/vm.h (48 lines of code) (raw):
/*
* 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.
*/
/**
* These are the functions that a VM built as a DLL must export.
* Some functions may be optional and are marked as such.
*/
#ifndef _VM_EXPORT_H
#define _VM_EXPORT_H
#define OPEN_VM "vm"
#define OPEN_VM_VERSION "1.0"
#define OPEN_INTF_VM "open.interface.vm." OPEN_VM_VERSION
#define O_A_H_VM_VMDIR "org.apache.harmony.vm.vmdir"
#ifdef WIN32
#include <stddef.h>
#else
#include <unistd.h>
#endif
#include "open/types.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Dynamic interface adapter, returns specific API by its name.
*/
DECLARE_OPEN(void *, vm_get_interface, (const char*));
/**
* Number of instance fields defined in a class. That doesn't include
* inherited fields.
*/
VMEXPORT unsigned class_num_instance_fields(Class_Handle ch);
/**
* Get the handle for a field. If <code>idx</code> is greater than or equal to
* <code>class_num_instance_fields</code>.
*
* @return <code>NULL</code>
*
* The value of idx indexes into the fields defined in this class and
* doesn't include inherited fields.
*/
VMEXPORT Field_Handle class_get_instance_field(Class_Handle ch, unsigned idx);
/**
* Number of instance fields defined in a class. This number includes
* inherited fields.
*/
VMEXPORT unsigned class_num_instance_fields_recursive(Class_Handle ch);
/**
* Get the handle for a field.
*
* @return <code>NULL</code> if idx is greater than or equal to
* <code>class_num_instance_fields_recursive</code>.
*
* The value of idx indexes into the set of fields that includes both fields
* defined in this class and inherited fields.
*/
VMEXPORT Field_Handle class_get_instance_field_recursive(Class_Handle ch, unsigned idx);
/**
* Number of methods declared in the class.
*/
VMEXPORT unsigned class_get_number_methods(Class_Handle ch);
/**
* @return <code>TRUE</code> if all instances of this class are pinned.
*/
VMEXPORT void* class_alloc_via_classloader(Class_Handle ch, I_32 size);
/**
* This exactly what I want.
* Get the alignment of the class.
*/
VMEXPORT unsigned class_get_alignment(Class_Handle ch);
/**
* Returns the size of an instance in the heap, in bytes.
*
* @param klass - the class handle
*
* @return The size of an instance in the heap.
*/
DECLARE_OPEN(size_t, class_get_object_size, (Class_Handle ch));
/**
* @return The offset to the start of user data form the start of a boxed
* instance.
*/
VMEXPORT unsigned class_get_unboxed_data_offset(Class_Handle ch);
/**
* @return Class handle given object's <code>VTable_Handle</code>.
*/
DECLARE_OPEN(Class_Handle, vtable_get_class, (VTable_Handle vh));
////
// begin inner-class related functions.
///
/**
* @return <code>TRUE</code> the number of inner classes.
*/
VMEXPORT unsigned class_number_inner_classes(Class_Handle ch);
/**
* @return <code>TRUE</code> if an inner class is public.
*/
VMEXPORT Boolean class_is_inner_class_public(Class_Handle ch, unsigned idx);
/**
* @return an inner class
*/
VMEXPORT Class_Handle class_get_inner_class(Class_Handle ch, unsigned idx);
/**
* @return the class that declared this one, or <code>NULL</code> if top-level class
*/
VMEXPORT Class_Handle class_get_declaring_class(Class_Handle ch);
///
// end class-related functions.
///
////
// begin field-related functions.
////
/**
* @return <code>TRUE</code> if the field must be enumerated by GC
*
* This function doesn't cause resolution of the class of the field.
*
* FIXME: move to internal headers
*/
VMEXPORT Boolean field_is_enumerable_reference(Field_Handle fh);
////
// end field-related functions.
////
////
// begin vector layout functions.
////
/**
* Vectors are one-dimensional, zero-based arrays. All Java
* <code>arrays</code> are vectors.
* Functions provided in this section do not work on multidimensional or
* non-zero based arrays (i.e. arrays with a lower bound that is non-zero
* for at least one of the dimensions.
*/
/**
* Return the offset to the length field of the array. That field has
* the same offset for vectors of all types.
*/
VMEXPORT int vector_length_offset();
/**
* Return the offset to the first element of the vector of the given type.
* This function is provided for the cases when the class handle of the
* element is not available.
*/
VMEXPORT int vector_first_element_offset(VM_Data_Type element_type);
/**
* Return the offset to the first element of the vector of the given type.
* Assume that the elements are boxed. Byte offset.
*/
VMEXPORT int vector_first_element_offset_class_handle(Class_Handle element_type);
/**
* Return the offset to the first element of the vector of the given type.
* If the class is a value type, assume that elements are unboxed.
* If the class is not a value type, assume that elements are references.
*/
VMEXPORT int vector_first_element_offset_unboxed(Class_Handle element_type);
/**
* Return the length of a vector. The caller must ensure that GC will not
* move or deallocate the vector while vector_get_length() is active.
*/
VMEXPORT I_32 vector_get_length(Vector_Handle vector);
/**
* Return the address to an element of a vector of references.
* The caller must ensure that GC will not move or deallocate the vector
* while vector_get_element_address_ref() is active.
*/
VMEXPORT Managed_Object_Handle *
vector_get_element_address_ref(Vector_Handle vector, I_32 idx);
/**
* Return the size of a vector of a given number of elements.
* The size is rounded up to take alignment into account.
*/
VMEXPORT unsigned vm_vector_size(Class_Handle vector_class, int length);
////
// end vector layout functions.
////
/**
* @return <code>TRUE</code> if references within objects and vector elements are
* to be treated as offsets rather than raw pointers.
*/
DECLARE_OPEN(BOOLEAN, vm_is_heap_compressed, ());
/**
* @return The starting address of the GC heap.
*/
DECLARE_OPEN(void *, vm_get_heap_base_address, ());
/**
* @return The ending address of the GC heap.
*/
DECLARE_OPEN(void *, vm_get_heap_ceiling_address, ());
/**
* @return <code>TRUE</code> if vtable pointers within objects are to be treated
* as offsets rather than raw pointers.
*/
DECLARE_OPEN(BOOLEAN, vm_is_vtable_compressed, ());
/**
* @return The base address of the vtable memory area. This value will
* never change and can be cached at startup.
*/
DECLARE_OPEN(void *, vm_get_vtable_base_address, ());
#ifdef __cplusplus
}
#endif
#endif // _VM_EXPORT_H