mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			66 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
// natMainThread.cc - Implementation of MainThread native methods.
 | 
						|
 | 
						|
/* Copyright (C) 1998, 1999, 2000, 2001, 2003, 2006  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 <java-threads.h>
 | 
						|
 | 
						|
#include <gnu/java/lang/MainThread.h>
 | 
						|
#include <java/lang/Runtime.h>
 | 
						|
#include <java/lang/ThreadGroup.h>
 | 
						|
 | 
						|
typedef void main_func (jobject);
 | 
						|
 | 
						|
void
 | 
						|
gnu::java::lang::MainThread::call_main (void)
 | 
						|
{
 | 
						|
  Utf8Const* main_signature = _Jv_makeUtf8Const ("([Ljava.lang.String;)V", 22);
 | 
						|
  Utf8Const* main_name = _Jv_makeUtf8Const ("main", 4);
 | 
						|
 | 
						|
  // This is one of the few places where we might have access to an
 | 
						|
  // unlinked class.
 | 
						|
  _Jv_Linker::wait_for_state (klass, JV_STATE_LOADING);
 | 
						|
 | 
						|
  _Jv_Method *meth = _Jv_LookupDeclaredMethod (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);
 | 
						|
 | 
						|
  // Note that we do thread cleanup here.  We have to do this here and
 | 
						|
  // not in _Jv_RunMain; if we do if after the main thread has exited,
 | 
						|
  // our ThreadGroup will be null, and if Runtime.exit tries to create
 | 
						|
  // a new Thread (which it does when running shutdown hooks), it will
 | 
						|
  // eventually NPE due to this.
 | 
						|
  _Jv_ThreadWait ();
 | 
						|
 | 
						|
  int status = (int) ::java::lang::ThreadGroup::had_uncaught_exception;
 | 
						|
  ::java::lang::Runtime::exitNoChecksAccessor (status);
 | 
						|
}
 |