Patch: FYI: natFile -vs- stack

Tom Tromey tromey@redhat.com
Thu Feb 7 11:11:00 GMT 2002


I'm checking this in.

This changes natFile.cc so that it doesn't stack allocate any buffers,
and so that the buffers it allocates are the right size.  It also
removes a global which I think isn't really needed.

I've kept the encoding of file names as UTF-8 for now.  I suspect this
is incorrect but I haven't found the time to find out.

Tom

Index: ChangeLog
from  Tom Tromey  <tromey@redhat.com>
	* java/io/natFile.cc (_access): Don't stack-allocate buffer.
	Size buffer based on real size of string.
	(_stat): Likewise.
	(attr): Likewise.
	(getCanonicalPath): Likewise.
	(performList): Likewise.
	(performMkdir): Likewise.
	(performSetReadOnly): Likewise.
	(unixroot): Removed.
	(performRenameTo): Likewise.
	(performSetLastModified): Likewise.
	(performCreate): Likewise.
	(performDelete): Likewise.
	(performListRoots): Always return new array.

Index: java/io/natFile.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/natFile.cc,v
retrieving revision 1.15
diff -u -r1.15 natFile.cc
--- java/io/natFile.cc 2002/02/07 03:24:12 1.15
+++ java/io/natFile.cc 2002/02/07 19:09:49
@@ -39,7 +39,7 @@
 jboolean
 java::io::File::_access (jint query)
 {
-  char buf[MAXPATHLEN];
+  char *buf = (char *) _Jv_AllocBytes (JvGetStringUTFLength (path) + 1);
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
   buf[total] = '\0';
   JvAssert (query == READ || query == WRITE || query == EXISTS);
@@ -60,7 +60,7 @@
 jboolean
 java::io::File::_stat (jint query)
 {
-  char buf[MAXPATHLEN];
+  char *buf = (char *) _Jv_AllocBytes (JvGetStringUTFLength (path) + 1);
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
   buf[total] = '\0';
 
@@ -83,7 +83,7 @@
 jlong
 java::io::File::attr (jint query)
 {
-  char buf[MAXPATHLEN];
+  char *buf = (char *) _Jv_AllocBytes (JvGetStringUTFLength (path) + 1);
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
   buf[total] = '\0';
 
@@ -104,7 +104,8 @@
 jstring
 java::io::File::getCanonicalPath (void)
 {
-  char buf[MAXPATHLEN], buf2[MAXPATHLEN];
+  char *buf = (char *) _Jv_AllocBytes (JvGetStringUTFLength (path) + 1);
+  char buf2[MAXPATHLEN];
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
   buf[total] = '\0';
 
@@ -134,7 +135,7 @@
   /* Some systems have dirent.h, but no directory reading functions like
      opendir.  */
 #if defined(HAVE_DIRENT_H) && defined(HAVE_OPENDIR)
-  char buf[MAXPATHLEN];
+  char *buf = (char *) _Jv_AllocBytes (JvGetStringUTFLength (path) + 1);
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
   buf[total] = '\0';
 
@@ -142,7 +143,6 @@
   if (! dir)
     return NULL;
 
-
   java::util::ArrayList *list = new java::util::ArrayList ();
   struct dirent *d;
 #ifdef HAVE_READDIR_R
@@ -162,7 +162,7 @@
       jstring name = JvNewStringUTF (d->d_name);
       if (filter && ! filter->accept(this, name))
 	continue;
-      
+
       if (result_type == &java::io::File::class$)
         {
 	  java::io::File *file = new java::io::File (this, name);
@@ -188,7 +188,7 @@
 jboolean
 java::io::File::performMkdir (void)
 {
-  char buf[MAXPATHLEN];
+  char *buf = (char *) _Jv_AllocBytes (JvGetStringUTFLength (path) + 1);
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
   buf[total] = '\0';
 
@@ -202,7 +202,7 @@
 jboolean
 java::io::File::performSetReadOnly (void)
 {
-  char buf[MAXPATHLEN];
+  char *buf = (char *) _Jv_AllocBytes (JvGetStringUTFLength (path) + 1);
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
   buf[total] = '\0';
 
@@ -219,28 +219,24 @@
 #endif
 }
 
-static JArray<java::io::File *> *unixroot;
-
 JArray< ::java::io::File *>*
 java::io::File::performListRoots ()
 {
-  if (unixroot == NULL)
-    {
-      ::java::io::File *f = new ::java::io::File (JvNewStringLatin1 ("/"));
-      unixroot = reinterpret_cast <JArray<java::io::File *>*> 
-		   (JvNewObjectArray (1, &java::io::File::class$, f));
-      elements (unixroot) [0] = f;
-    }
+  ::java::io::File *f = new ::java::io::File (JvNewStringLatin1 ("/"));
+  JArray<java::io::File *> *unixroot
+    = reinterpret_cast <JArray<java::io::File *>*> 
+          (JvNewObjectArray (1, &java::io::File::class$, f));
+  elements (unixroot) [0] = f;
   return unixroot;
 }
 
 jboolean
 java::io::File::performRenameTo (File *dest)
 {
-  char buf[MAXPATHLEN];
+  char *buf = (char *) _Jv_AllocBytes (JvGetStringUTFLength (path) + 1);
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
   buf[total] = '\0';
-  char buf2[MAXPATHLEN];
+  char *buf2 = (char *) _Jv_AllocBytes (JvGetStringUTFLength (dest->path) + 1);
   total = JvGetStringUTFRegion (dest->path, 0, dest->path->length(), buf2);
   buf2[total] = '\0';
 
@@ -257,7 +253,7 @@
 #ifdef HAVE_UTIME
   utimbuf tb;
 
-  char buf[MAXPATHLEN];
+  char *buf = (char *) _Jv_AllocBytes (JvGetStringUTFLength (path) + 1);
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
   buf[total] = '\0';
   
@@ -272,7 +268,7 @@
 jboolean
 java::io::File::performCreate (void)
 {
-  char buf[MAXPATHLEN];
+  char *buf = (char *) _Jv_AllocBytes (JvGetStringUTFLength (path) + 1);
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
   buf[total] = '\0';
 
@@ -294,7 +290,7 @@
 jboolean
 java::io::File::performDelete (void)
 {
-  char buf[MAXPATHLEN];
+  char *buf = (char *) _Jv_AllocBytes (JvGetStringUTFLength (path) + 1);
   jsize total = JvGetStringUTFRegion (path, 0, path->length(), buf);
   buf[total] = '\0';
 



More information about the Java-patches mailing list