public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Implement throwing of Errno.
@ 2008-05-20 20:36 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2008-05-20 20:36 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  d3ed25cd5bae28acd1df80690836ca874dc0093a (commit)
      from  24a1e128332990b4e3927543f6f314fb568b331c (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit d3ed25cd5bae28acd1df80690836ca874dc0093a
Author: Andrew Cagney <cagney@redhat.com>
Date:   Tue May 20 16:16:29 2008 -0400

    Implement throwing of Errno.
    
    frysk-sys/frysk/sys/ChangeLog
    2008-05-20  Andrew Cagney  <cagney@redhat.com>
    
    	* jni/Signal.cxx-sh: Don't leak JNI string pointers.
    
    frysk-sys/jnixx/ChangeLog
    2008-05-20  Andrew Cagney  <cagney@redhat.com>
    
    	* JniBindings.java: Generate attributes such as no-return.
    	* exceptions.cxx (errnoException): Implement.

-----------------------------------------------------------------------

Summary of changes:
 frysk-sys/frysk/sys/ChangeLog         |    2 +
 frysk-sys/frysk/sys/jni/Signal.cxx-sh |    9 ++---
 frysk-sys/jnixx/ChangeLog             |    3 ++
 frysk-sys/jnixx/JniBindings.java      |   35 ++++++++++++++++--
 frysk-sys/jnixx/exceptions.cxx        |   65 ++++++++++++++++++++++++++++++---
 5 files changed, 100 insertions(+), 14 deletions(-)

First 500 lines of diff:
diff --git a/frysk-sys/frysk/sys/ChangeLog b/frysk-sys/frysk/sys/ChangeLog
index efde63d..22e3cb0 100644
--- a/frysk-sys/frysk/sys/ChangeLog
+++ b/frysk-sys/frysk/sys/ChangeLog
@@ -1,5 +1,7 @@
 2008-05-20  Andrew Cagney  <cagney@redhat.com>
 
+	* jni/Signal.cxx-sh: Don't leak JNI string pointers.
+
 	* jni/DaemonFactory.cxx: Implement.
 
 2008-05-17  Andrew Cagney  <cagney@redhat.com>
diff --git a/frysk-sys/frysk/sys/jni/Signal.cxx-sh b/frysk-sys/frysk/sys/jni/Signal.cxx-sh
index 869b301..feb62e8 100644
--- a/frysk-sys/frysk/sys/jni/Signal.cxx-sh
+++ b/frysk-sys/frysk/sys/jni/Signal.cxx-sh
@@ -50,6 +50,7 @@ cat <<EOF
 #include "jni.hxx"
 
 #include "jnixx/exceptions.hxx"
+#include "jnixx/elements.hxx"
 
 void
 frysk::sys::Signal::kill(::jnixx::env env, jint pid, jint sig,
@@ -70,12 +71,10 @@ frysk::sys::Signal::tkill(::jnixx::env env, jint tid, jint sig,
                           ::java::lang::String name) {
   errno = 0;
   if (::syscall(__NR_tkill, tid, sig) < 0) {
-    const char *sname = name.GetStringUTFChars(env);
-    if (sname == NULL)
-      return; // exception pending
+    StringChars sname = StringChars(env, name);
     errnoException(env, errno, "tkill", "task %d, signal %s (%d)",
-    		   tid, sname, sig);
-    name.ReleaseStringUTFChars(env, sname);
+    		   tid, sname.p, sig);
+    sname.free(); // happens during unwind
   }
 }
 
diff --git a/frysk-sys/jnixx/ChangeLog b/frysk-sys/jnixx/ChangeLog
index fb7e090..1125275 100644
--- a/frysk-sys/jnixx/ChangeLog
+++ b/frysk-sys/jnixx/ChangeLog
@@ -1,5 +1,8 @@
 2008-05-20  Andrew Cagney  <cagney@redhat.com>
 
+	* JniBindings.java: Generate attributes such as no-return.
+	* exceptions.cxx (errnoException): Implement.
+
 	* elements.hxx (class FileBytes): Add pid/tid method.
 	* elements.cxx (FileBytes::FileBytes): Implement.
 	(slurp): Refactor out of FileBytes constructor; include NUL in
diff --git a/frysk-sys/jnixx/JniBindings.java b/frysk-sys/jnixx/JniBindings.java
index 42d6614..8ca37ce 100644
--- a/frysk-sys/jnixx/JniBindings.java
+++ b/frysk-sys/jnixx/JniBindings.java
@@ -80,14 +80,16 @@ class JniBindings {
 	private final String returnType;
 	private final String name;
 	private final String[] params;
+	private final String attributes;
 	private final Object[] code;
 	Method(Class klass, Binding binding, String returnType, String name,
-	       String[] params, Object[] code) {
+	       String[] params, String attributes, Object[] code) {
 	    this.klass = klass;
 	    this.binding = binding;
 	    this.returnType = returnType;
 	    this.name = name;
 	    this.params = params;
+	    this.attributes = attributes;
 	    this.code = code;
 	}
 	public int hashCode() {
@@ -122,7 +124,13 @@ class JniBindings {
 		}
 		p.print(params[i]);
 	    }
-	    p.println(");");
+	    p.print(")");
+	    if (attributes != null) {
+		p.print(" ");
+		p.print(attributes);
+	    }
+	    p.println(";");
+	    
 	}
 	void printDefinition(Class klass, Printer p) {
 	    if (binding == Binding.STATIC && klass != this.klass) {
@@ -167,10 +175,10 @@ class JniBindings {
 	    return methods;
 	}
 	JniMap put(Class klass, Binding binding, String returnType,
-		   String name, String[] params,
+		   String name, String[] params, String attributes,
 		   Object[] code) {
 	    get(klass).add(new Method(klass, binding, returnType, name,
-				      params, code));
+				      params, attributes, code));
 	    return this;
 	}
 	void printDeclarations(Class klass, Printer p) {
@@ -201,6 +209,7 @@ class JniBindings {
 	     "::jnixx::env", "_env_",
 	     new String[] {
 	     },
+	     null,
 	     new Object[] {
 		 "void* _jni;",
 		 "::jnixx::vm->GetEnv(&_jni, JNI_VERSION_1_2);",
@@ -211,6 +220,7 @@ class JniBindings {
 	     new String[] {
 		 "jobject", "_object",
 	     },
+	     null,
 	     new Object[] {
 		 "return this->_object == _object;",
 	     })
@@ -219,6 +229,7 @@ class JniBindings {
 	     new String[] {
 		 "jobject", "_object",
 	     },
+	     null,
 	     new Object[] {
 		 "return this->_object != _object;",
 	     })
@@ -228,6 +239,7 @@ class JniBindings {
 	     new String[] {
 		 "::jnixx::env", "env",
 	     },
+	     null,
 	     new Object[] {
 		 "env.DeleteLocalRef(_object);",
 		 "_object = NULL;"
@@ -239,6 +251,7 @@ class JniBindings {
 		 "::jnixx::env", "env",
 		 "jclass", "klass",
 	     },
+	     null,
 	     new Object[] {
 		 "return env.IsInstanceOf(_object, klass);",
 	     })
@@ -251,6 +264,7 @@ class JniBindings {
 	     new String[] {
 		 "::jnixx::env", "env",
 	     },
+	     "__attribute__((noreturn))",
 	     new Object[] {
 		 "env.Throw((jthrowable)_object);",
 	     })
@@ -260,6 +274,7 @@ class JniBindings {
 		 "::jnixx::env", "env",
 		 "const char*", "message",
 	     },
+	     "__attribute__((noreturn))",
 	     new Object[] {
 		 "env.ThrowNew(_class_(env), message);",
 		 "env.throwPendingException();",
@@ -275,6 +290,7 @@ class JniBindings {
 	     new String[] {
 		 "::jnixx::env", "env",
 	     },
+	     null,
 	     new Object[] {
 		 "return env.GetStringLength((jstring)_object);",
 	     })
@@ -287,6 +303,7 @@ class JniBindings {
 		 "::jnixx::env", "env",
 		 "const char*", "utf",
 	     },
+	     null,
 	     new Object[] {
 		 "return String(env, env.NewStringUTF(utf));",
 	     })
@@ -296,6 +313,7 @@ class JniBindings {
 	     new String[] {
 		 "::jnixx::env", "env",
 	     },
+	     null,
 	     new Object[] {
 		 "return env.GetStringUTFLength((jstring) _object);",
 	     })
@@ -305,6 +323,7 @@ class JniBindings {
 	     new String[] {
 		 "::jnixx::env", "env",
 	     },
+	     null,
 	     new Object[] {
 		 "return env.GetStringUTFChars((jstring)_object, NULL);",
 	     })
@@ -315,6 +334,7 @@ class JniBindings {
 		 "::jnixx::env", "env",
 		 "const char *", "utf",
 	     },
+	     null,
 	     new Object[] {
 		 "env.ReleaseStringUTFChars((jstring)_object, utf);",
 	     })
@@ -328,6 +348,7 @@ class JniBindings {
 		 "jsize", "len", 
 		 "char*", "buf",
 	     },
+	     null,
 	     new Object[] {
 		 "env.GetStringUTFRegion((jstring)_object, start, len, buf);",
 	     })
@@ -356,6 +377,7 @@ class JniBindings {
 		     new String[] {
 			 "::jnixx::env", "env",
 		     },
+		     null,
 		     new Object[] {
 			 "return env.GetArrayLength((j" + type + "Array) _object);"
 		     })
@@ -365,6 +387,7 @@ class JniBindings {
 			 "::jnixx::env", "env",
 			 "jsize", "length",
 		     },
+		     null,
 		     new Object[] {
 			 "return " + type + "Array(env, env.New" + Type + "Array(length));",
 		     })
@@ -374,6 +397,7 @@ class JniBindings {
 			 "::jnixx::env", "env",
 			 "jboolean*", "isCopy",
 		     },
+		     null,
 		     new Object[] {
 			 "return env.Get" + Type + "ArrayElements((j" + type + "Array) _object, isCopy);"
 		     })
@@ -384,6 +408,7 @@ class JniBindings {
 			 "j" + type + "*", "elements",
 			 "jint", "mode"
 		     },
+		     null,
 		     new Object[] {
 			 "env.Release" + Type + "ArrayElements((j" + type + "Array)_object, elements, mode);",
 		     })
@@ -395,6 +420,7 @@ class JniBindings {
 			 "jsize", "length",
 			 "j" + type + "*", "buf",
 		     },
+		     null,
 		     new Object[] {
 			 "env.Get" + Type + "ArrayRegion((j" + type + "Array) _object, start, length, buf);"
 		     })
@@ -406,6 +432,7 @@ class JniBindings {
 			 "jsize", "length",
 			 "j" + type + "*", "buf",
 		     },
+		     null,
 		     new Object[] {
 			 "env.Set" + Type + "ArrayRegion((j" + type + "Array) _object, start, length, buf);"
 		     })
diff --git a/frysk-sys/jnixx/exceptions.cxx b/frysk-sys/jnixx/exceptions.cxx
index a190266..2531868 100644
--- a/frysk-sys/jnixx/exceptions.cxx
+++ b/frysk-sys/jnixx/exceptions.cxx
@@ -46,20 +46,75 @@
 #include "jni.hxx"
 
 #include "jnixx/exceptions.hxx"
+#include "jnixx/print.hxx"
+
+static void throwErrno(::jnixx::env& env, int error, const char *fmt, ...)
+  __attribute__((noreturn));
+void
+throwErrno(::jnixx::env& env, int error, const char *fmt, ...) {
+  va_list ap;
+  va_start(ap, fmt);
+  java::lang::String message = vajprintf(env, fmt, ap);
+  switch (error) {
+#ifdef EBADF
+  case EBADF:
+    frysk::sys::Errno$Ebadf::New(env, message).Throw(env);
+#endif
+#ifdef ENOMEM
+  case ENOMEM:
+    frysk::sys::Errno$Enomem::New(env, message).Throw(env);
+#endif
+#ifdef EFAULT
+  case EFAULT:
+    frysk::sys::Errno$Efault::New(env, message).Throw(env);
+#endif
+#ifdef EINVAL
+  case EINVAL:
+    frysk::sys::Errno$Einval::New(env, message).Throw(env);
+#endif
+#ifdef ESRCH
+  case ESRCH:
+    frysk::sys::Errno$Esrch::New(env, message).Throw(env);
+#endif
+#ifdef ECHILD
+  case ECHILD:
+    frysk::sys::Errno$Echild::New(env, message).Throw(env);
+#endif
+#ifdef EPERM
+  case EPERM:
+    frysk::sys::Errno$Eperm::New(env, message).Throw(env);
+#endif
+#ifdef EIO
+  case EIO:
+    frysk::sys::Errno$Eio::New(env, message).Throw(env);
+#endif
+#ifdef ENOENT
+  case ENOENT:
+    frysk::sys::Errno$Enoent::New(env, message).Throw(env);
+#endif
+  default:
+    frysk::sys::Errno::New(env, error, message).Throw(env);
+  }
+  va_end(ap);
+}
 
 void
 errnoException(::jnixx::env& env, int error, const char *prefix) {
   // Hack; for moment just throw something.
-  runtimeException(env, "not implemented: %s#%d#%s",
-		   __FILE__, __LINE__, __func__);
+  throwErrno(env, errno, "%s: %s", prefix, strerror(error));
 }
 
 void
 errnoException(::jnixx::env& env, int error, const char *prefix,
 	       const char *fmt, ...) {
-  // Hack; for moment just throw something.
-  runtimeException(env, "not implemented: %s#%d#%s",
-		   __FILE__, __LINE__, __func__);
+  va_list ap;
+  va_start(ap, fmt);
+  char message[256];
+  if (::snprintf(message, sizeof(message), fmt, ap) < 0) {
+    errnoException(env, errno, "malloc");
+  }
+  throwErrno(env, errno, "%s: %s (%s)", prefix, strerror(error), message);
+  va_end(ap);
 }
 
 void


hooks/post-receive
--
frysk system monitor/debugger


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-05-20 20:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-05-20 20:36 [SCM] master: Implement throwing of Errno cagney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).