diff options
-rw-r--r-- | libjava/ChangeLog | 8 | ||||
-rw-r--r-- | libjava/boehm.cc | 36 | ||||
-rw-r--r-- | libjava/include/java-interp.h | 4 | ||||
-rw-r--r-- | libjava/interpret.cc | 2 |
4 files changed, 34 insertions, 16 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 34125a36ab8..3e3ba7842d2 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,11 @@ +2002-12-06 Tom Tromey <tromey@redhat.com> + + * include/java-interp.h (class _Jv_InterpMethod): Added + JV_MARKOBJ_DECL. + * boehm.cc (_Jv_MarkObj): Consolidated interpreter code. Also + mark `prepared' field of interpreted method. + * interpret.cc (compile): Use _Jv_AllocBytes. + 2002-12-05 Andrew Haley <aph@redhat.com> * gnu/gcj/runtime/natStackTrace.cc (fillInStackTrace): Throw diff --git a/libjava/boehm.cc b/libjava/boehm.cc index 466c9223ac8..90796f2ddf0 100644 --- a/libjava/boehm.cc +++ b/libjava/boehm.cc @@ -39,7 +39,6 @@ extern "C" ptr_t GC_debug_generic_malloc (size_t size, int k, GC_EXTRA_PARAMS); }; -// We must check for plausibility ourselves. #define MAYBE_MARK(Obj, Top, Limit, Source, Exit) \ Top=GC_MARK_AND_PUSH((GC_PTR)Obj, Top, Limit, (GC_PTR *)Source) @@ -153,19 +152,6 @@ _Jv_MarkObj (void *addr, void *msp, void *msl, void * /* env */) p = (ptr_t) c->methods[i].signature; MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, c, cm2label); - - // FIXME: `ncode' entry? - -#ifdef INTERPRETER - // The interpreter installs a heap-allocated - // trampoline here, so we'll mark it. - if (_Jv_IsInterpretedClass (c)) - { - p = (ptr_t) c->methods[i].ncode; - MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, c, - cm3label); - } -#endif } } @@ -221,7 +207,7 @@ _Jv_MarkObj (void *addr, void *msp, void *msl, void * /* env */) #ifdef INTERPRETER if (_Jv_IsInterpretedClass (c)) { - _Jv_InterpClass* ic = (_Jv_InterpClass*)c; + _Jv_InterpClass* ic = (_Jv_InterpClass*) c; p = (ptr_t) ic->interpreted_methods; MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, ic, cElabel); @@ -231,6 +217,26 @@ _Jv_MarkObj (void *addr, void *msp, void *msl, void * /* env */) p = (ptr_t) ic->interpreted_methods[i]; MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, ic, \ cFlabel); + + // Mark the direct-threaded code. + if ((c->methods[i].accflags + & java::lang::reflect::Modifier::NATIVE) == 0) + { + _Jv_InterpMethod *im + = (_Jv_InterpMethod *) ic->interpreted_methods[i]; + if (im) + { + p = (ptr_t) im->prepared; + MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, ic, \ + cFlabel); + } + } + + // The interpreter installs a heap-allocated trampoline + // here, so we'll mark it. + p = (ptr_t) c->methods[i].ncode; + MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, c, + cm3label); } p = (ptr_t) ic->field_initializers; diff --git a/libjava/include/java-interp.h b/libjava/include/java-interp.h index ef2b5206cdb..a44db38ca85 100644 --- a/libjava/include/java-interp.h +++ b/libjava/include/java-interp.h @@ -144,6 +144,10 @@ class _Jv_InterpMethod : public _Jv_MethodBase friend class gnu::gcj::runtime::StackTrace; friend void _Jv_PrepareClass(jclass); + +#ifdef JV_MARKOBJ_DECL + friend JV_MARKOBJ_DECL; +#endif }; class _Jv_InterpClass : public java::lang::Class diff --git a/libjava/interpret.cc b/libjava/interpret.cc index bc324b13ba9..9791b4a5cd8 100644 --- a/libjava/interpret.cc +++ b/libjava/interpret.cc @@ -312,7 +312,7 @@ _Jv_InterpMethod::compile (const void * const *insn_targets) if (! first_pass) { - insns = (insn_slot *) _Jv_Malloc (sizeof (insn_slot) * next); + insns = (insn_slot *) _Jv_AllocBytes (sizeof (insn_slot) * next); next = 0; } |