blob: 7b84a24eeacb3da9472739353247d77adf58d0e0 [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 _HEAP_H
#define _HEAP_H
/**
* @file
*
* This include file specifies the precise interface to heap
* to be used by all VM components. This is needed in order
* to provide interface more convenient than raw GC interface.
*
* Using these methods instead of direct GC interface will
* improve readability, make code more concise, and automatically
* ensure that all needed checks (like out of memory) are done
* properly.
*
* @note VM Component internal interface
* @see \link interface_classification VM interfaces classification \endlink
*/
#include "open/types.h"
#include "object_layout.h"
#include "Class.h"
/**
* calls gc_alloc and checks for OutOfMemoryError
* by comparing allocation result with NULL and throwing exception
* as appropriate.
*
* @note Implemented in jit_runtime_support.cpp
*/
void *vm_malloc_with_thread_pointer(unsigned size, Allocation_Handle ah, void *tp);
/**
* allocate new vector.
*
* @param array_class Class structure of array to be allocated.
* @param length length of array to be allocated.
* @return pointer to the allocated array,
* NULL if exception occured, and context is not unwindable,
* no-return if exception occured in unwindable context.
*
* @throws OutOfMemoryError
* @note in case that this method is called from jitted code,
* unwinding is performed, and this method never returns.
* In all other cases, current thread exception is set,
* and control is returned.
* @note implemented in vm_arrays.cpp
*/
VMEXPORT // temporary solution for interpreter unplug
Vector_Handle vm_new_vector(Class *array_class, int length);
/**
* allocate new primitive vector.
*
* @copydoc vm_new_vector()
*
* @note attempt to pass non-primitive array class to this function
* will cause undefined results.
*/
VMEXPORT // temporary solution for interpreter unplug
Vector_Handle vm_new_vector_primitive(Class *array_class, int length);
/**
* allocates new vector.
* @copydoc vm_new_vector()
*
* @note XXX The purpose of this function is not clear. -salikh
*/
Vector_Handle vm_new_vector_or_null(Class *array_class, int length);
/**
* allocates new vector.
*
* @param vector_handle VTable structure of array.
* @param length length of array to be allocated.
* NULL if exception occured, and context is not unwindable,
* no-return if exception occured in unwindable context.
* @param tp pointer to thread-local data.
*
* @return pointer to the allocated array,
*
* @throws OutOfMemoryError
*
* @note implemented in vm_arrays.cpp
*
* @note in case that this method is called from jitted code,
* unwinding is performed, and this method never returns.
* In all other cases, current thread exception is set,
* and control is returned.
*/
Vector_Handle vm_new_vector_using_vtable_and_thread_pointer(
int length, Allocation_Handle vector_handle, void *tp);
/**
* allocates new vector.
* @param vector_handle pointer to array vtable.
* @copydoc vm_new_vector_using_vtable_and_thread_pointer()
* @param tp pointer to thread-local data.
*
* @note XXX The purpose of this function is not clear. -salikh
*/
Vector_Handle vm_new_vector_or_null_using_vtable_and_thread_pointer(
int length, Allocation_Handle vector_handle, void *tp);
/**
* alocates new multidimensional array recursively.
*
* Recursive allocation means that all subarray are also
* allocated, and references are stored to top-level multidimensional array,
* downto simple reference arrays (arrays of dimension 1).
*
* @param clss Class structure of the multidimensional array.
* @param length_array dimensions of the array specified as int array
* @param dimensions a number of array dimensions
*/
Vector_Handle vm_multianewarray_recursive(
Class* clss, int* length_array, unsigned dimensions);
/**
* allocates new multidimensional array.
*
* @param clss Class structure of the multidimensional array.
* @param dimensions a number of array dimensions
* @note XXX The full specification of this function is not clear. -salikh
*/
Vector_Handle vm_multianewarray_resolved(
Class *clss, unsigned dimensions, ...);
/**
* updates statistics of vertor allocation.
*
* @note XXX is it used in debug version only? -salikh
*/
void vm_new_vector_update_stats(
int length, Allocation_Handle vector_handle, void *tp);
/**
* allocate new object using its Class structure.
*
* @param clss Class structure of the object.
* @note XXX exception and out of memory semantics are not specified -salikh
*/
VMEXPORT ManagedObject *class_alloc_new_object(Class *clss);
/**
* allocates new object using its VTable structure.
*
* @param vtable VTable structure of the object.
* @note XXX exception and out of memory semantics are not specified -salikh
*/
VMEXPORT ManagedObject *class_alloc_new_object_using_vtable(
VTable *vtable);
/**
* allocates new object and runs its default () constructor.
*
* @copydoc class_alloc_new_object()
* @note XXX exception and out of memory semantics are not specified -salikh
*/
ManagedObject *class_alloc_new_object_and_run_default_constructor(
Class *clss);
/**
* allocates new object and runs specified constructor.
*
* @copydoc class_alloc_new_object()
* @param constructor Method structure of constructor
* @param constructor_args arguments to be passed to constructor
* @note XXX exception and out of memory semantics are not specified -salikh
*/
ManagedObject *class_alloc_new_object_and_run_constructor(
Class * clss, Method * constructor, U_8 * constructor_args);
#endif /* #ifndef _HEAP_H */