// execution.h - Execution engines. -*- c++ -*- /* Copyright (C) 2004 Free Software Foundation This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ #ifndef __JAVA_EXECUTION_H__ #define __JAVA_EXECUTION_H__ // This represents one execution engine. Note that we use function // pointers and not virtual methods to avoid calls to // __cxa_call_unexpected and the like. struct _Jv_ExecutionEngine { public: void (*unregister) (jclass); // FIXME: probably should handle this elsewhere, see how // interpreter does it. bool (*need_resolve_string_fields) (); void (*verify) (jclass); void (*allocate_static_fields) (jclass, int); void (*create_ncode) (jclass); _Jv_ResolvedMethod *(*resolve_method) (_Jv_Method *, jclass, jboolean, jint); void (*post_miranda_hook) (jclass); }; // This handles all gcj-compiled code, including BC ABI. struct _Jv_CompiledEngine : public _Jv_ExecutionEngine { public: static void do_unregister (jclass) { } static bool do_need_resolve_string_fields () { return true; } static void do_verify (jclass klass) { _Jv_Linker::verify_type_assertions (klass); } static _Jv_ResolvedMethod *do_resolve_method (_Jv_Method *, jclass, jboolean, jint) { return NULL; } static void do_allocate_static_fields (jclass, int) { // Compiled classes don't need this. } static void do_create_ncode (jclass) { // Not needed. } static void do_post_miranda_hook (jclass) { // Not needed. } _Jv_CompiledEngine () { unregister = do_unregister; need_resolve_string_fields = do_need_resolve_string_fields; verify = do_verify; allocate_static_fields = do_allocate_static_fields; create_ncode = do_create_ncode; resolve_method = do_resolve_method; post_miranda_hook = do_post_miranda_hook; } // These operators make it so we don't have to link in libstdc++. void *operator new (size_t bytes) { return _Jv_Malloc(bytes); } void operator delete (void *mem) { _Jv_Free(mem); } }; // This handles interpreted code. class _Jv_InterpreterEngine : public _Jv_ExecutionEngine { public: static void do_verify (jclass); static void do_allocate_static_fields (jclass, int); static void do_create_ncode (jclass); static _Jv_ResolvedMethod *do_resolve_method (_Jv_Method *, jclass, jboolean, jint); static bool do_need_resolve_string_fields () { return false; } static void do_unregister(jclass klass) { _Jv_UnregisterClass(klass); } static void do_post_miranda_hook (jclass); _Jv_InterpreterEngine () { unregister = do_unregister; need_resolve_string_fields = do_need_resolve_string_fields; verify = do_verify; allocate_static_fields = do_allocate_static_fields; create_ncode = do_create_ncode; resolve_method = do_resolve_method; post_miranda_hook = do_post_miranda_hook; } // These operators make it so we don't have to link in libstdc++. void *operator new (size_t bytes) { return _Jv_Malloc(bytes); } void operator delete (void *mem) { _Jv_Free(mem); } }; extern _Jv_InterpreterEngine _Jv_soleInterpreterEngine; extern _Jv_CompiledEngine _Jv_soleCompiledEngine; #endif // __JAVA_EXECUTION_H__