summaryrefslogtreecommitdiff
path: root/libjava/gnu
diff options
context:
space:
mode:
authorbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>2001-08-26 11:30:09 +0000
committerbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>2001-08-26 11:30:09 +0000
commit2ab8f986fa5d0b5da175b8767f4017d5b9135618 (patch)
tree70a829a7aec07076169c6eefbc98e07abb6aa926 /libjava/gnu
parent2f3ed0b75a408d2506f6a71df1a52162a05621e3 (diff)
downloadgcc-2ab8f986fa5d0b5da175b8767f4017d5b9135618.tar.gz
* Makefile.am: New friends for java/lang/Thread.h.
* prims.cc (runFirst): Removed. (JvRunMain): Merged into _Jv_RunMain. Now just calls that. (_Jv_RunMain): Now takes either a klass or class name parameter. Create a gnu.gcj.runtime.FirstThread and attach the native thread to that, then run it using _Jv_ThreadRun. Remove special handling of jar files, instead pass is_jar parameter through to FirstThread. * gcj/javaprims.h: Add prototypes for _Jv_ThreadRun and new variant of _Jv_AttachCurrentThread. * gnu/gcj/runtime/FirstThread.java (FirstThread): Now extends Thread. (run): New method. Take care of looking up main class manifest attribute and calling forName if neccessary. Then call call_main. (call_main): New native method. * gnu/gcj/runtime/natFirstThread.cc (call_main): New function, code relocated from prims.cc. Look up and call main method. * java/lang/Thread.java (run_): Removed. * java/lang/natThread.cc (run_): Renamed to... (_Jv_ThreadRun): this. JVMPI notification code moved to ... (_Jv_NotifyThreadStart): here. New function. (countStackFrames, destroy, resume, suspend, stop): Throw UnsupportedOperationExceptions rather than JvFail'ing. (_Jv_AttachCurrentThread): New variant takes a Thread argument. Existing version wraps new variant. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45182 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/gnu')
-rw-r--r--libjava/gnu/gcj/runtime/FirstThread.java51
-rw-r--r--libjava/gnu/gcj/runtime/natFirstThread.cc47
2 files changed, 92 insertions, 6 deletions
diff --git a/libjava/gnu/gcj/runtime/FirstThread.java b/libjava/gnu/gcj/runtime/FirstThread.java
index fd59261c8c8..c52ab42c0ef 100644
--- a/libjava/gnu/gcj/runtime/FirstThread.java
+++ b/libjava/gnu/gcj/runtime/FirstThread.java
@@ -17,11 +17,44 @@ import java.util.jar.*;
* @date August 24, 1998
*/
-// This is entirely internal to our implementation.
-
-final class FirstThread
+final class FirstThread extends Thread
{
- public static String getMain (String name)
+ public FirstThread (Class k, String[] args)
+ {
+ super (null, null, "main");
+ klass = k;
+ this.args = args;
+ }
+
+ public FirstThread (String class_name, String[] args, boolean is_jar)
+ {
+ super (null, null, "main");
+ klass_name = class_name;
+ this.args = args;
+ this.is_jar = is_jar;
+ }
+
+ public void run()
+ {
+ if (is_jar)
+ klass_name = getMain(klass_name);
+
+ if (klass == null)
+ {
+ try
+ {
+ klass = Class.forName(klass_name);
+ }
+ catch (ClassNotFoundException x)
+ {
+ throw new NoClassDefFoundError(klass_name);
+ }
+ }
+
+ call_main();
+ }
+
+ private String getMain (String name)
{
String mainName = null;
try {
@@ -37,15 +70,21 @@ final class FirstThread
}
if (mainName == null)
- System.err.println ("Failed to load Main-Class manifest attribute from\n"
- + name);
+ {
+ System.err.println ("Failed to load Main-Class manifest attribute from\n"
+ + name);
+ System.exit(1);
+ }
return mainName;
}
+ private native void call_main ();
+
// Private data.
private Class klass;
private String klass_name;
private Object args;
+ private boolean is_jar;
// If the user links statically then we need to ensure that these
// classes are linked in. Otherwise bootstrapping fails. These
diff --git a/libjava/gnu/gcj/runtime/natFirstThread.cc b/libjava/gnu/gcj/runtime/natFirstThread.cc
new file mode 100644
index 00000000000..1d62471df7e
--- /dev/null
+++ b/libjava/gnu/gcj/runtime/natFirstThread.cc
@@ -0,0 +1,47 @@
+// natFirstThread.cc - Implementation of FirstThread native methods.
+
+/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation
+
+ This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
+details. */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <gcj/cni.h>
+#include <jvm.h>
+
+#include <gnu/gcj/runtime/FirstThread.h>
+
+typedef void main_func (jobject);
+
+void
+gnu::gcj::runtime::FirstThread::call_main (void)
+{
+ Utf8Const* main_signature = _Jv_makeUtf8Const ("([Ljava.lang.String;)V", 22);
+ Utf8Const* main_name = _Jv_makeUtf8Const ("main", 4);
+
+ _Jv_Method *meth = _Jv_GetMethodLocal (klass, main_name, main_signature);
+
+ // Some checks from Java Spec section 12.1.4.
+ const char *msg = NULL;
+ if (meth == NULL)
+ msg = "no suitable method `main' in class";
+ else if (! java::lang::reflect::Modifier::isStatic(meth->accflags))
+ msg = "`main' must be static";
+ else if (! java::lang::reflect::Modifier::isPublic(meth->accflags))
+ msg = "`main' must be public";
+ if (msg != NULL)
+ {
+ fprintf (stderr, "%s\n", msg);
+ ::exit(1);
+ }
+
+ main_func *real_main = (main_func *) meth->ncode;
+ (*real_main) (args);
+}