summaryrefslogtreecommitdiffstats
path: root/libjava/include
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/include')
-rw-r--r--libjava/include/execution.h49
-rw-r--r--libjava/include/java-interp.h5
-rw-r--r--libjava/include/jvm.h6
3 files changed, 52 insertions, 8 deletions
diff --git a/libjava/include/execution.h b/libjava/include/execution.h
index 279e9c1b872..eac6133c5b7 100644
--- a/libjava/include/execution.h
+++ b/libjava/include/execution.h
@@ -1,6 +1,6 @@
// execution.h - Execution engines. -*- c++ -*-
-/* Copyright (C) 2004, 2006 Free Software Foundation
+/* Copyright (C) 2004, 2006, 2007 Free Software Foundation
This file is part of libgcj.
@@ -29,6 +29,7 @@ struct _Jv_ExecutionEngine
_Jv_ResolvedMethod *(*resolve_method) (_Jv_Method *, jclass,
jboolean);
void (*post_miranda_hook) (jclass);
+ _Jv_ClosureList **(*get_closure_list) (jclass);
};
// This handles gcj-compiled code except that compiled with
@@ -77,6 +78,11 @@ struct _Jv_CompiledEngine : public _Jv_ExecutionEngine
// Not needed.
}
+ static _Jv_ClosureList **do_get_closure_list (jclass)
+ {
+ return NULL;
+ }
+
_Jv_CompiledEngine ()
{
unregister = do_unregister;
@@ -87,6 +93,7 @@ struct _Jv_CompiledEngine : public _Jv_ExecutionEngine
create_ncode = do_create_ncode;
resolve_method = do_resolve_method;
post_miranda_hook = do_post_miranda_hook;
+ get_closure_list = do_get_closure_list;
}
// These operators make it so we don't have to link in libstdc++.
@@ -105,6 +112,7 @@ class _Jv_IndirectCompiledClass
{
public:
void **field_initializers;
+ _Jv_ClosureList **closures;
};
// This handles gcj-compiled code compiled with -findirect-classes.
@@ -114,14 +122,32 @@ struct _Jv_IndirectCompiledEngine : public _Jv_CompiledEngine
{
allocate_static_fields = do_allocate_static_fields;
allocate_field_initializers = do_allocate_field_initializers;
+ get_closure_list = do_get_closure_list;
}
+ static _Jv_IndirectCompiledClass *get_aux_info (jclass klass)
+ {
+ _Jv_IndirectCompiledClass *aux =
+ (_Jv_IndirectCompiledClass*)klass->aux_info;
+ if (!aux)
+ {
+ aux = (_Jv_IndirectCompiledClass*)
+ _Jv_AllocRawObj (sizeof (_Jv_IndirectCompiledClass));
+ klass->aux_info = aux;
+ }
+
+ return aux;
+ }
+
static void do_allocate_field_initializers (jclass klass)
{
- _Jv_IndirectCompiledClass *aux
- = (_Jv_IndirectCompiledClass*)
- _Jv_AllocRawObj (sizeof (_Jv_IndirectCompiledClass));
- klass->aux_info = aux;
+ _Jv_IndirectCompiledClass *aux = get_aux_info (klass);
+ if (!aux)
+ {
+ aux = (_Jv_IndirectCompiledClass*)
+ _Jv_AllocRawObj (sizeof (_Jv_IndirectCompiledClass));
+ klass->aux_info = aux;
+ }
aux->field_initializers = (void **)_Jv_Malloc (klass->field_count
* sizeof (void*));
@@ -172,6 +198,16 @@ struct _Jv_IndirectCompiledEngine : public _Jv_CompiledEngine
}
_Jv_Free (aux->field_initializers);
}
+
+ static _Jv_ClosureList **do_get_closure_list (jclass klass)
+ {
+ _Jv_IndirectCompiledClass *aux = get_aux_info (klass);
+
+ if (!aux->closures)
+ aux->closures = _Jv_ClosureListFinalizer ();
+
+ return aux->closures;
+ }
};
@@ -203,6 +239,8 @@ class _Jv_InterpreterEngine : public _Jv_ExecutionEngine
static void do_post_miranda_hook (jclass);
+ static _Jv_ClosureList **do_get_closure_list (jclass klass);
+
_Jv_InterpreterEngine ()
{
unregister = do_unregister;
@@ -213,6 +251,7 @@ class _Jv_InterpreterEngine : public _Jv_ExecutionEngine
create_ncode = do_create_ncode;
resolve_method = do_resolve_method;
post_miranda_hook = do_post_miranda_hook;
+ get_closure_list = do_get_closure_list;
}
// These operators make it so we don't have to link in libstdc++.
diff --git a/libjava/include/java-interp.h b/libjava/include/java-interp.h
index e23baab9bb2..c294cc81896 100644
--- a/libjava/include/java-interp.h
+++ b/libjava/include/java-interp.h
@@ -202,7 +202,7 @@ class _Jv_InterpMethod : public _Jv_MethodBase
}
// return the method's invocation pointer (a stub).
- void *ncode ();
+ void *ncode (jclass);
void compile (const void * const *);
static void run_normal (ffi_cif*, void*, ffi_raw*, void*);
@@ -293,6 +293,7 @@ class _Jv_InterpClass
_Jv_MethodBase **interpreted_methods;
_Jv_ushort *field_initializers;
jstring source_file_name;
+ _Jv_ClosureList **closures;
friend class _Jv_ClassReader;
friend class _Jv_InterpMethod;
@@ -341,7 +342,7 @@ class _Jv_JNIMethod : public _Jv_MethodBase
// This function is used when making a JNI call from the interpreter.
static void call (ffi_cif *, void *, ffi_raw *, void *);
- void *ncode ();
+ void *ncode (jclass);
friend class _Jv_ClassReader;
friend class _Jv_InterpreterEngine;
diff --git a/libjava/include/jvm.h b/libjava/include/jvm.h
index 9a99a954b28..02974e8c7ea 100644
--- a/libjava/include/jvm.h
+++ b/libjava/include/jvm.h
@@ -288,7 +288,7 @@ private:
_Jv_Utf8Const *method_signature,
jclass *found_class,
bool check_perms = true);
- static void *create_error_method(_Jv_Utf8Const *);
+ static void *create_error_method(_Jv_Utf8Const *, jclass);
/* The least significant bit of the signature pointer in a symbol
table is set to 1 by the compiler if the reference is "special",
@@ -341,6 +341,10 @@ void *_Jv_AllocBytes (jsize size) __attribute__((__malloc__));
/* Allocate space for a new non-Java object, which does not have the usual
Java object header but may contain pointers to other GC'ed objects. */
void *_Jv_AllocRawObj (jsize size) __attribute__((__malloc__));
+/* Allocate a double-indirect pointer to a _Jv_ClosureList such that
+ the _Jv_ClosureList gets automatically finalized when it is no
+ longer reachable, not even by other finalizable objects. */
+_Jv_ClosureList **_Jv_ClosureListFinalizer (void) __attribute__((__malloc__));
/* Explicitly throw an out-of-memory exception. */
void _Jv_ThrowNoMemory() __attribute__((__noreturn__));
/* Allocate an object with a single pointer. The first word is reserved
OpenPOWER on IntegriCloud