Patch: const length in arrays

Tom Tromey tromey@cygnus.com
Fri Nov 24 13:02:00 GMT 2000


This patch changes the `length' parameter of CNI arrays to be const.
I'm checking this in.

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.

Tom

Index: prims.cc
===================================================================
RCS file: /cvs/java/libgcj/libjava/prims.cc,v
retrieving revision 1.39
diff -u -r1.39 prims.cc
--- prims.cc	2000/10/06 01:49:31	1.39
+++ prims.cc	2000/11/24 21:01:29
@@ -67,6 +67,9 @@
 #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 @@
   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 @@
   __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;
Index: gcj/array.h
===================================================================
RCS file: /cvs/java/libgcj/libjava/gcj/array.h,v
retrieving revision 1.8
diff -u -r1.8 array.h
--- array.h	2000/04/09 01:26:20	1.8
+++ array.h	2000/11/24 21:01:29
@@ -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 @@
 
 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>


More information about the Java-patches mailing list