aboutsummaryrefslogtreecommitdiff
path: root/libjava/interpret.cc
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2006-03-03 18:32:22 +0000
committerTom Tromey <tromey@gcc.gnu.org>2006-03-03 18:32:22 +0000
commitd07548f9cab534c99961c42222c92fa1201fc368 (patch)
tree52487c80f51b4a4bece252841cdfab7adad1fd42 /libjava/interpret.cc
parent65ad7c6394a21ac825bda9f71ff75b8a4a9e759e (diff)
downloadgcc-d07548f9cab534c99961c42222c92fa1201fc368.zip
gcc-d07548f9cab534c99961c42222c92fa1201fc368.tar.gz
gcc-d07548f9cab534c99961c42222c92fa1201fc368.tar.bz2
* interpret.cc (do_allocate_static_fields): Added comment.
From-SVN: r111683
Diffstat (limited to 'libjava/interpret.cc')
-rw-r--r--libjava/interpret.cc12
1 files changed, 11 insertions, 1 deletions
diff --git a/libjava/interpret.cc b/libjava/interpret.cc
index ddb4697..0e6fbc8 100644
--- a/libjava/interpret.cc
+++ b/libjava/interpret.cc
@@ -3882,7 +3882,17 @@ _Jv_InterpreterEngine::do_allocate_static_fields (jclass klass,
_Jv_InterpClass *iclass = (_Jv_InterpClass *) klass->aux_info;
// Splitting the allocations here lets us scan reference fields and
- // avoid scanning non-reference fields.
+ // avoid scanning non-reference fields. How reference fields are
+ // scanned is a bit tricky: we allocate using _Jv_AllocRawObj, which
+ // means that this memory will be scanned conservatively (same
+ // difference, since we know all the contents here are pointers).
+ // Then we put pointers into this memory into the 'fields'
+ // structure. Most of these are interior pointers, which is ok (but
+ // even so the pointer to the first reference field will be used and
+ // that is not an interior pointer). The 'fields' array is also
+ // allocated with _Jv_AllocRawObj (see defineclass.cc), so it will
+ // be scanned. A pointer to this array is held by Class and thus
+ // seen by the collector.
char *reference_fields = (char *) _Jv_AllocRawObj (pointer_size);
char *non_reference_fields = (char *) _Jv_AllocBytes (other_size);