diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-11-24 21:02:36 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-11-24 21:02:36 +0000 |
commit | d461d0f677cd6c460e73de7e5112e2002f8fc42f (patch) | |
tree | d4054b9ccee889a0365a1284dd577cf7e13c7d0c | |
parent | dc49b4973ad9fc04b71abeb6b5996ed00d52f0d0 (diff) | |
download | gcc-d461d0f677cd6c460e73de7e5112e2002f8fc42f.tar.gz |
* prims.cc (_Jv_NewObjectArray): Use palcement new to create
array.
(_Jv_NewPrimArray): Likewise.
Include <new>.
* gcj/array.h (__JArray): `length' field now const. Added
constructor.
(class JArray): Added constructor.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37718 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | libjava/ChangeLog | 10 | ||||
-rw-r--r-- | libjava/gcj/array.h | 18 | ||||
-rw-r--r-- | libjava/prims.cc | 11 |
3 files changed, 32 insertions, 7 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index d9ea6b5492a..1d7f1791907 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,13 @@ +2000-11-24 Tom Tromey <tromey@cygnus.com> + + * prims.cc (_Jv_NewObjectArray): Use palcement new to create + array. + (_Jv_NewPrimArray): Likewise. + Include <new>. + * gcj/array.h (__JArray): `length' field now const. Added + constructor. + (class JArray): Added constructor. + 2000-11-23 Mark Wielaard <mark@klomp.org> * name-finder.cc (lookup): Check for a NULL _Jv_argv before attempting diff --git a/libjava/gcj/array.h b/libjava/gcj/array.h index 8b0a416d758..7c659241681 100644 --- a/libjava/gcj/array.h +++ b/libjava/gcj/array.h @@ -1,6 +1,6 @@ // array.h - Header file for CNI arrays. -*- c++ -*- -/* Copyright (C) 1998, 1999 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. @@ -17,11 +17,21 @@ extern "Java" { class __JArray : public java::lang::Object { +protected: + // FIXME: this is a hack to work around a bug in the g++ Java + // support. If we add a constructor with a jsize argument to + // JArray<T>, then g++ complains. + __JArray () : length (0) + { + } public: - // FIXME: we'd like this to be `const' but that causes problems with - // the C++ compiler. - jsize length; + const jsize length; friend jsize JvGetArrayLength (__JArray*); + + // This probably shouldn't be public. + __JArray (jsize l) : length (l) + { + } }; template<class T> diff --git a/libjava/prims.cc b/libjava/prims.cc index 8ca05da3905..22fa4b64070 100644 --- a/libjava/prims.cc +++ b/libjava/prims.cc @@ -67,6 +67,9 @@ details. */ #include <ltdl.h> #endif +// We use placement new. +#include <new> + // We allocate a single OutOfMemoryError exception which we keep // around for use if we run out of memory. static java::lang::OutOfMemoryError *no_memory; @@ -411,8 +414,9 @@ _Jv_NewObjectArray (jsize count, jclass elementClass, jobject init) obj = (jobjectArray) _Jv_AllocArray (size, klass); if (__builtin_expect (! obj, false)) JvThrow (no_memory); - obj->length = count; - jobject* ptr = elements(obj); + // Use placement new to initialize length field. + new (obj) __JArray (count); + jobject *ptr = elements(obj); // We know the allocator returns zeroed memory. So don't bother // zeroing it again. if (init) @@ -446,7 +450,8 @@ _Jv_NewPrimArray (jclass eltype, jint count) __JArray *arr = (__JArray*) _Jv_AllocObj (size + elsize * count, klass); if (__builtin_expect (! arr, false)) JvThrow (no_memory); - arr->length = count; + // Use placement new to initialize length field. + new (arr) __JArray (count); // Note that we assume we are given zeroed memory by the allocator. return arr; |