Makefile.am: New friends for java/lang/Thread.h.
* 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. From-SVN: r45182
This commit is contained in:
committed by
Bryce McKinlay
parent
387edc7625
commit
2dc55bc99f
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user