vm/vmcore/include/exceptions.h (70 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.
*/
/**
* @author Intel, Pavel Afremov
*/
#ifndef _EXCEPTIONS_H_
#define _EXCEPTIONS_H_
#include "open/types.h"
#include "exceptions_type.h"
#include "jni.h"
/**
@file
\ref exceptions
*/
/**
@page exceptions Exceptions subsystem
\section exn_introduction Introduction
The functions to work with exceptions are described in exceptions.h.
\section exn_issues Issues
\li Interaction with JIT and runtime helpers? -salikh
\li Interaction with JIT is implemented via rth_wrap_exn_throw stubs. -pavel.n.afremov
\li Existing interface is currently included.
*/
/**
* Returns the thread-local exception object
* or NULL if no exception occured.
*/
VMEXPORT jthrowable exn_get();
VMEXPORT Class* exn_get_class();
VMEXPORT const char* exn_get_name();
/**
* Returns true if the thread-local exception object is set.
*/
VMEXPORT bool exn_raised();
/**
* Clears the thread-local exception object.
*
* @note rename of clear_current_thread_exception(). It may be eliminated if
* exn_catch() will be used and will clean thread exception.
*/
VMEXPORT void exn_clear();
/**
* Creates exception object.
*/
//FIXME LAZY EXCEPTION (2006.05.06)
// Maybe change to exn_object_create (whole 7)
jthrowable exn_create(Exception* exception);
jthrowable exn_create(Class* exc_class);
jthrowable exn_create(Class* exc_class, jthrowable cause);
jthrowable exn_create(Class* exc_class, const char* message);
jthrowable exn_create(Class* exc_class, const char* message, jthrowable cause);
/**
* Creates exception object.
*/
VMEXPORT jthrowable exn_create(const char* exc_name);
/**
* Creates exception object.
*/
VMEXPORT jthrowable exn_create(const char* exc_name, jthrowable cause);
/**
* Creates exception object.
*/
VMEXPORT jthrowable exn_create(const char* exc_name, const char* message);
/**
* Creates exception object.
*/
VMEXPORT jthrowable exn_create(const char* exc_name, const char* message, jthrowable cause);
/**
* Returns true if frame is unwindable and false if isn't.
*/
VMEXPORT bool is_unwindable();
/**
* Sets unwindable property of frame. If frame is unwindable property
* should be true and should be false if frame isn't unwindable.
* Returns previous value of unwindable property.
*/
bool set_unwindable(bool unwindable);
/**
* Throws an exception object
*
* @note internal convenience function, may not be exposed to VMI interface.
*/
void exn_throw_object(jthrowable exc_object);
/**
* Throws an exceptionas lazy.
* Does not return in case of destructive exception propagation.
*
* @note internal convenience function, may not be exposed to VMI interface.
*/
void exn_throw_by_class(Class* exc_class);
void exn_throw_by_class(Class* exc_class, jthrowable exc_cause);
void exn_throw_by_class(Class* exc_class, const char* exc_message);
void exn_throw_by_class(Class* exc_class, const char* exc_message,
jthrowable exc_cause);
/**
* Throws an exceptionas lazy.
* Does not return in case of destructive exception propagation.
*/
VMEXPORT void exn_throw_by_name(const char* exception_name);
/**
* Throws an exceptionas lazy.
* Does not return in case of destructive exception propagation.
*/
VMEXPORT void exn_throw_by_name(const char* exception_name, jthrowable cause);
/**
* Throws an exceptionas lazy.
* Does not return in case of destructive exception propagation.
*/
VMEXPORT void exn_throw_by_name(const char* exception_name, const char* message);
/**
* Throws an exceptionas lazy.
* Does not return in case of destructive exception propagation.
*/
VMEXPORT void exn_throw_by_name(const char* exception_name, const char* message, jthrowable cause);
/**
* Sets exceptions as a thread local exception.
*
* @note explicit non-destructive semantics should be deduced from context.
*/
VMEXPORT void exn_raise_object(jthrowable exc_object);
/**
* Sets exception lazy as a thread local exception.
*
* @note internal convenience function, may not be exposed to VMI interface.
* @note explicit non-destructive semantics should be deduced from context.
*/
void exn_raise_by_class(Class* exc_class);
void exn_raise_by_class(Class* exc_class, jthrowable exc_cause);
void exn_raise_by_class(Class* exc_class, const char* exc_message);
void exn_raise_by_class(Class* exc_class, const char* exc_message,
jthrowable exc_cause);
/**
* Sets exception lazy as a thread local exception.
*
* @note explicit non-destructive semantics should be deduced from context.
*/
VMEXPORT void exn_raise_by_name(const char* exception_name);
/**
* Sets exception lazy as a thread local exception.
*
* @note explicit non-destructive semantics should be deduced from context.
*/
VMEXPORT void exn_raise_by_name(const char* exception_name, jthrowable exc_cause);
/**
* Sets exception lazy as a thread local exception.
*
* @note explicit non-destructive semantics should be deduced from context.
*/
VMEXPORT void exn_raise_by_name(const char* exception_name, const char* message);
/**
* Sets exception lazy as a thread local exception.
*
* @note explicit non-destructive semantics should be deduced from context.
*/
VMEXPORT void exn_raise_by_name(const char* exception_name, const char* message,
jthrowable exc_cause);
/**
* Pushes dummy non-unwindable stack frame in order to prevent stack unwinding.
* After this returns true. If unwinding is happnened control coming back into
* this function, and after this it returns false.
*
* @note experimental
*/
bool exn_function_try();
/**
* pops dummy non-unwindable stack frame
*
* returns the current thread exception object
* or NULL if no exception occured.
*
* @note experimental
*/
jthrowable exn_function_catch();
/**
* Wrapper for exn_function_try.
*/
#define exn_try (if (exn_function_try()))
/**
* Wrapper for exn_function_catch.
*/
#define exn_catch (th) (if ( th = exn_function_catch()))
#define ASSERT_THROW_AREA \
assert(is_unwindable());
#define ASSERT_RAISE_AREA \
assert(!is_unwindable());
#define BEGIN_RAISE_AREA \
{ \
bool unwindable = set_unwindable(false);\
if (unwindable) exn_rethrow_if_pending();
#define END_RAISE_AREA \
if (unwindable) exn_rethrow_if_pending();\
set_unwindable(unwindable);\
}
////////////////////////////////////////////////////////////////////////
// FUNCTIONS below are from old VM implementation //////////////////////
////////////////////////////////////////////////////////////////////////
#include "open/vm_util.h"
struct ManagedObject;
//**** Stack Trace support
// Print the stack trace stored in the exception object to the given file.
void exn_print_stack_trace(FILE* f, jthrowable exc);
void print_uncaught_exception_message(FILE *f, const char* context_message, jthrowable exc);
//**** Native code exception support
void exn_rethrow();
void exn_rethrow_if_pending();
typedef struct VM_thread * vm_thread_t;
void* get_exception_catch_stack_addr(void* curr_ip);
VMEXPORT size_t get_available_stack_size();
VMEXPORT bool check_available_stack_size(size_t required_size);
bool check_stack_size_enough_for_exception_catch(void* sp);
#endif // _EXCEPTIONS_H_