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_