PatchSet 6660 
Date: 2005/06/23 16:43:54
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Splitted callMethods + ClassLoader fix + doxification.

        * kaffe/kaffevm/Makefile.am
        (libkaffevm_la_SOURCES): Added javacall.c

        * kaffe/kaffevm/Makefile.in: Regenerated.

        * kaffe/kaffevm/classMethod.c,
        kaffe/kaffevm/classMethod.h
        (initCollector): Moved to gc.h
        (parsed_signature): Added real_nargs.
        (PSIG_RNARGS): New macro.
        (KaffeVM_countRealNumberOfArgs): New function to retrieve the real
        number of argument slot used.

        Doxified a bit.

        * kaffe/kaffevm/gc.h
        (initCollector): Moved from classMethod.h

        * kaffe/kaffevm/javacall.c
        (KaffeVM_callMethodA, KaffeVM_callMethodV): Moved from support.c
        along with their macros.
        (KaffeVM_countRealNumberOfArgs): New function.

        kaffe/kaffevm/support.c:
        (KaffeVM_callMethodA, KaffeVM_callMethodV): Moved out.

        * libraries/clib/native/ClassLoader.c
        (loadClass): Check whether the class name is well constructed.

Members: 
        ChangeLog:1.4185->1.4186 
        kaffe/kaffevm/Makefile.am:INITIAL->1.76 
        kaffe/kaffevm/Makefile.in:1.201->1.202 
        kaffe/kaffevm/classMethod.c:1.146->1.147 
        kaffe/kaffevm/classMethod.h:1.81->1.82 
        kaffe/kaffevm/gc.h:INITIAL->1.32 
        kaffe/kaffevm/javacall.c:INITIAL->1.1 
        kaffe/kaffevm/support.c:1.86->1.87 
        libraries/clib/native/ClassLoader.c:1.46->1.47 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4185 kaffe/ChangeLog:1.4186
--- kaffe/ChangeLog:1.4185      Wed Jun 22 15:56:38 2005
+++ kaffe/ChangeLog     Thu Jun 23 16:43:54 2005
@@ -1,3 +1,34 @@
+2005-06-23  Guilhem Lavaux  <[EMAIL PROTECTED]>
+
+       * kaffe/kaffevm/Makefile.am
+       (libkaffevm_la_SOURCES): Added javacall.c
+
+       * kaffe/kaffevm/Makefile.in: Regenerated.
+
+       * kaffe/kaffevm/classMethod.c,
+       kaffe/kaffevm/classMethod.h
+       (initCollector): Moved to gc.h
+       (parsed_signature): Added real_nargs.
+       (PSIG_RNARGS): New macro.
+       (KaffeVM_countRealNumberOfArgs): New function to retrieve the real
+       number of argument slot used.
+       
+       Doxified a bit.
+       
+       * kaffe/kaffevm/gc.h
+       (initCollector): Moved from classMethod.h
+
+       * kaffe/kaffevm/javacall.c
+       (KaffeVM_callMethodA, KaffeVM_callMethodV): Moved from support.c
+       along with their macros.
+       (KaffeVM_countRealNumberOfArgs): New function.
+       
+       kaffe/kaffevm/support.c:
+       (KaffeVM_callMethodA, KaffeVM_callMethodV): Moved out.
+
+       * libraries/clib/native/ClassLoader.c
+       (loadClass): Check whether the class name is well constructed.
+
 2005-06-23  Ito Kazumitsu  <[EMAIL PROTECTED]>
 
        * FAQ/FAQ.charsets: New file.
===================================================================
Checking out kaffe/kaffe/kaffevm/Makefile.am
RCS:  /home/cvs/kaffe/kaffe/kaffe/kaffevm/Makefile.am,v
VERS: 1.76
***************
--- /dev/null   Sun Aug  4 19:57:58 2002
+++ kaffe/kaffe/kaffevm/Makefile.am     Thu Jun 23 16:51:53 2005
@@ -0,0 +1,183 @@
+# Makefile.am for kaffevm - a Java(tm) compatible virtual machine.
+#
+# Copyright (c) 1996, 1997, 1998, 1999
+#      Transvirtual Technologies, Inc.  All rights reserved.
+#
+# Copyright (c) 2004
+#      Kaffe.org contributors, see ChangeLogs for details.  All rights 
reserved.
+#
+# See the file "license.terms" for information on usage and redistribution 
+# of this file. 
+
+SUBDIRS = $(ENGINE_NAME) systems $(GC_NAME) gcj verifier jni
+DIST_SUBDIRS = boehm-gc kaffe-gc intrp jit jit3 systems gcj verifier jni
+
+EXTRA_DIST = \
+       kaffe.def \
+       systems/win32/winio.c \
+       systems/win32/winthread.c \
+       systems/win32/winthread.h
+
[EMAIL PROTECTED]@
+AM_CPPFLAGS = \
+       -I$(top_srcdir)/kaffe/kaffevm/$(THREAD_DIR) \
+       -I$(top_srcdir)/kaffe/kaffevm/jni \
+       $(ENGINE_INCLUDES) \
+       -I$(top_srcdir)/libltdl \
+       $(ENGINE_DEFS) \
+       -I$(top_srcdir)/kaffe/jvmpi \
+       -I$(top_srcdir)/kaffe/xprof \
+       -I$(top_builddir)/include \
+       -I$(top_srcdir)/kaffe/kaffevm/verifier \
+       -I$(top_srcdir)/kaffe/kaffevm/jni
+
+native_LTLIBRARIES = libkaffevm.la
+
[EMAIL PROTECTED]@
[EMAIL PROTECTED]@
[EMAIL PROTECTED]@
[EMAIL PROTECTED]@
+
+if HAVE_GCJ_SUPPORT
+libgcj = gcj/libgcj.la
+else
+libgcj = #
+endif
+
+libkaffevm_la_CFLAGS = \
+       $(CFLAGS_PG) \
+       $(PTHREAD_CFLAGS)
+
+libkaffevm_la_LDFLAGS = \
+       $(PTHREAD_CFLAGS) \
+        $(PTHREAD_LIBS) \
+        $(SEMAPHORE_LIB) \
+       $(KVMLIBFLAGS) \
+       -no-undefined \
+       -export-dynamic \
+       -release $(PACKAGE_VERSION)
+
+libkaffevm_la_DEPENDENCIES = \
+       $(LIBLTDL) \
+       $(ENGINE_NAME)/libengine.la \
+       $(libgcj) \
+       systems/$(THREAD_SYSTEM)/libkthread.la \
+       verifier/libkaffeverifier.la \
+       $(GC_NAME)/libkaffegc.la \
+       jni/libkaffejni.la \
+        $(top_builddir)/replace/libreplace.la 
+
+libkaffevm_la_LIBADD = \
+       $(libkaffevm_la_DEPENDENCIES) \
+       $(VM_LIBS) \
+       $(M_LIBS)
+
+libkaffevm_la_GEN_SRCS = \
+       md.c
+
+nodist_libkaffevm_la_SOURCES = \
+       $(libkaffevm_la_GEN_SRCS)
+
+if ENABLE_BINRELOC
+BINRELOC_SOURCES=\
+       ../../binreloc/prefix.c
+endif
+
+libkaffevm_la_SOURCES = \
+       access.c \
+       baseClasses.c \
+       classMethod.c \
+       classPool.c \
+       methodCache.c \
+       code-analyse.c \
+       code.c \
+       constants.c \
+       debug.c \
+       exception.c \
+       external.c \
+       file.c \
+       findInJar.c \
+       fp.c \
+       gc.c \
+       hashtab.c \
+       inflate.c \
+       itypes.c \
+       jar.c \
+       ksem.c \
+       locks.c \
+       lookup.c \
+       object.c \
+       readClass.c \
+       soft.c \
+       stackTrace.c \
+       stats.c \
+       string.c \
+       stringParsing.c \
+       support.c \
+       javacall.c \
+       thread.c \
+       utf8const.c \
+       gcFuncs.c \
+       reflect.c \
+       reference.c \
+       $(BINRELOC_SOURCES)
+
+noinst_HEADERS = \
+       access.h \
+       baseClasses.h \
+       bytecode.h \
+       classMethod.h \
+       methodCache.h \
+       classpath.h \
+       code-analyse.h \
+       code.h \
+       constants.h \
+       debug.h \
+       exception.h \
+       external.h \
+       file.h \
+       fp.h \
+       gc.h \
+       gtypes.h \
+       hashtab.h \
+       inflate.h \
+       itypes.h \
+       jar.h \
+       ksem.h \
+       lerrno.h \
+       locks.h \
+       lookup.h \
+       object.h \
+       readClass.h \
+       slib.h \
+       soft.h \
+       stackTrace.h \
+       stats.h \
+       stringParsing.h \
+       stringSupport.h \
+       support.h \
+       thread.h \
+       threadData.h \
+       utf8const.h \
+       reflect.h \
+       reference.h \
+       ../../binreloc/prefix.h
+
+md.c: stamp-h01
+       @if test ! -f $@; then rm -f stamp-h01; $(MAKE) stamp-h01; \
+       else :; fi
+stamp-h01: $(top_builddir)/config.status
+       $(SHELL) $(REGEN_FORWARD) $(KAFFEVM_MD_C) md.c $@
+
+CLEANFILES = so_locations
+
+DISTCLEANFILES = md.c stamp-h01
+
+dist-hook:
+       @for file in $(DISTCLEANFILES); do \
+         rm -f $(distdir)/$$file; \
+       done
+
+## This avoids that dependencies produced by `make dist' in a jit
+## configuration prevents intrp builds.
+jit/icode.h:
Index: kaffe/kaffe/kaffevm/Makefile.in
diff -u kaffe/kaffe/kaffevm/Makefile.in:1.201 
kaffe/kaffe/kaffevm/Makefile.in:1.202
--- kaffe/kaffe/kaffevm/Makefile.in:1.201       Sat May 14 21:46:30 2005
+++ kaffe/kaffe/kaffevm/Makefile.in     Thu Jun 23 16:43:58 2005
@@ -100,8 +100,8 @@
        debug.c exception.c external.c file.c findInJar.c fp.c gc.c \
        hashtab.c inflate.c itypes.c jar.c ksem.c locks.c lookup.c \
        object.c readClass.c soft.c stackTrace.c stats.c string.c \
-       stringParsing.c support.c thread.c utf8const.c gcFuncs.c \
-       reflect.c reference.c ../../binreloc/prefix.c
+       stringParsing.c support.c javacall.c thread.c utf8const.c \
+       gcFuncs.c reflect.c reference.c ../../binreloc/prefix.c
 @[EMAIL PROTECTED] = libkaffevm_la-prefix.lo
 am_libkaffevm_la_OBJECTS = libkaffevm_la-access.lo \
        libkaffevm_la-baseClasses.lo libkaffevm_la-classMethod.lo \
@@ -118,10 +118,10 @@
        libkaffevm_la-readClass.lo libkaffevm_la-soft.lo \
        libkaffevm_la-stackTrace.lo libkaffevm_la-stats.lo \
        libkaffevm_la-string.lo libkaffevm_la-stringParsing.lo \
-       libkaffevm_la-support.lo libkaffevm_la-thread.lo \
-       libkaffevm_la-utf8const.lo libkaffevm_la-gcFuncs.lo \
-       libkaffevm_la-reflect.lo libkaffevm_la-reference.lo \
-       $(am__objects_1)
+       libkaffevm_la-support.lo libkaffevm_la-javacall.lo \
+       libkaffevm_la-thread.lo libkaffevm_la-utf8const.lo \
+       libkaffevm_la-gcFuncs.lo libkaffevm_la-reflect.lo \
+       libkaffevm_la-reference.lo $(am__objects_1)
 am__objects_2 = libkaffevm_la-md.lo
 nodist_libkaffevm_la_OBJECTS = $(am__objects_2)
 libkaffevm_la_OBJECTS = $(am_libkaffevm_la_OBJECTS) \
@@ -515,6 +515,7 @@
        string.c \
        stringParsing.c \
        support.c \
+       javacall.c \
        thread.c \
        utf8const.c \
        gcFuncs.c \
@@ -653,6 +654,7 @@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
[EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@@ -902,6 +904,13 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      source='support.c' 
object='libkaffevm_la-support.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libkaffevm_la_CFLAGS) $(CFLAGS) -c -o libkaffevm_la-support.lo `test -f 
'support.c' || echo '$(srcdir)/'`support.c
+
+libkaffevm_la-javacall.lo: javacall.c
[EMAIL PROTECTED]@      if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libkaffevm_la_CFLAGS) $(CFLAGS) -MT libkaffevm_la-javacall.lo -MD -MP -MF 
"$(DEPDIR)/libkaffevm_la-javacall.Tpo" -c -o libkaffevm_la-javacall.lo `test -f 
'javacall.c' || echo '$(srcdir)/'`javacall.c; \
[EMAIL PROTECTED]@      then mv -f "$(DEPDIR)/libkaffevm_la-javacall.Tpo" 
"$(DEPDIR)/libkaffevm_la-javacall.Plo"; else rm -f 
"$(DEPDIR)/libkaffevm_la-javacall.Tpo"; exit 1; fi
[EMAIL PROTECTED]@@am__fastdepCC_FALSE@ source='javacall.c' 
object='libkaffevm_la-javacall.lo' libtool=yes @AMDEPBACKSLASH@
[EMAIL PROTECTED]@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
[EMAIL PROTECTED]@      $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libkaffevm_la_CFLAGS) $(CFLAGS) -c -o libkaffevm_la-javacall.lo `test -f 
'javacall.c' || echo '$(srcdir)/'`javacall.c
 
 libkaffevm_la-thread.lo: thread.c
 @am__fastdepCC_TRUE@   if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libkaffevm_la_CFLAGS) $(CFLAGS) -MT libkaffevm_la-thread.lo -MD -MP -MF 
"$(DEPDIR)/libkaffevm_la-thread.Tpo" -c -o libkaffevm_la-thread.lo `test -f 
'thread.c' || echo '$(srcdir)/'`thread.c; \
Index: kaffe/kaffe/kaffevm/classMethod.c
diff -u kaffe/kaffe/kaffevm/classMethod.c:1.146 
kaffe/kaffe/kaffevm/classMethod.c:1.147
--- kaffe/kaffe/kaffevm/classMethod.c:1.146     Thu Jun  9 10:52:25 2005
+++ kaffe/kaffe/kaffevm/classMethod.c   Thu Jun 23 16:43:58 2005
@@ -2785,7 +2785,7 @@
        return (size);
 }
 
-/*
+/**
  * Count the number of arguments in a signature.
  */
 int
@@ -2800,7 +2800,7 @@
        return (nargs);
 }
 
-/*
+/**
  * Duplicates a parsed signature.
  */
 static parsed_signature_t*
@@ -2853,6 +2853,8 @@
        }
        ++sig_iter; /* skip `)' */
        PSIG_RET(sig) = sig_iter - signature->data;
+
+       PSIG_RNARGS(sig) = KaffeVM_countRealNumberOfArgs(sig); 
 
        return sig;
 }
Index: kaffe/kaffe/kaffevm/classMethod.h
diff -u kaffe/kaffe/kaffevm/classMethod.h:1.81 
kaffe/kaffe/kaffevm/classMethod.h:1.82
--- kaffe/kaffe/kaffevm/classMethod.h:1.81      Mon May 30 21:16:02 2005
+++ kaffe/kaffe/kaffevm/classMethod.h   Thu Jun 23 16:43:58 2005
@@ -296,6 +296,7 @@
 typedef struct _parsed_signature {
        Utf8Const*              signature;
        u2                      nargs;
+       u2                      real_nargs;
        u2                      ret_and_args[1]; /* index into signature */
        /* ret_and_args[0]: return value
           ret_and_args[1]: first argument
@@ -347,8 +348,9 @@
 #define PSIG_UTF8(sig)         ((sig)->signature)
 #define PSIG_DATA(sig)         (PSIG_UTF8((sig))->data)
 #define PSIG_RET(sig)          ((sig)->ret_and_args[0])
-#define PSIG_NARGS(sig)                (sig->nargs)
+#define PSIG_NARGS(sig)                ((sig)->nargs)
 #define PSIG_ARG(sig,n)                ((sig)->ret_and_args[1+n])
+#define PSIG_RNARGS(sig)       ((sig)->real_nargs)
 
 #define METHOD_PSIG(M)         ((M)->parsed_sig)
 #define METHOD_SIG(M)          (PSIG_UTF8(METHOD_PSIG((M))))
@@ -509,17 +511,61 @@
 #define CLASS_CONST_USHORT2(CL, INDEX) \
   ((uint16)((CL)->constants.data[INDEX] >> 16))
 
-/*
+/**
  * 'processClass' is the core of the class initialiser and can prepare a
  * class from the cradle to the grave.
+ *
+ * @param clazz The class to process.
+ * @param state The state to achieve during this process.
+ * @param einfo An error which may have occured.
+ *
+ * @returns false if an error has occured, true if everything is ok.
+ */
+bool                   processClass(Hjava_lang_Class* clazz, int state, 
errorInfo *einfo);
+
+/**
+ * This function loads a class using the given class loader if non-NULL else 
it uses the 
+ * internal bootstrap class loader to fetch classes. The classes are processed 
to the linked state.
+ * This function must not be used to "load" a class representing array. For 
that use loadArray.
+ * 
+ * @param name The name of the class to load.
+ * @param loader The loader to use. It may be NULL if you want to use the 
internal VM class loader.
+ * @param einfo The error structure to fill if something bad happens.
+ *
+ * @returns A valid class object if the load is successful, NULL otherwise.
+ */
+Hjava_lang_Class*      loadClass(Utf8Const* name, Hjava_lang_ClassLoader* 
loader, errorInfo *einfo);
+
+/**
+ * This function loads an array with the given name and using the given class 
loader. The array is usable directly
+ * after that call.
+ *
+ * @param name The name of the array to load.
+ * @param loader The loader to use. It may be NULL If you want to use the 
internal VM class loader.
+ * @param einfo The error structure to fill if something bad happens.
+ *
+ * @returns A valid class object if the load is successful, NULL otherwise.
  */
-bool                   processClass(Hjava_lang_Class*, int, errorInfo *einfo);
+Hjava_lang_Class*      loadArray(Utf8Const* name, Hjava_lang_ClassLoader* 
loader, errorInfo *einfo);
 
-Hjava_lang_Class*      loadClass(Utf8Const*, Hjava_lang_ClassLoader*, 
errorInfo *einfo);
-Hjava_lang_Class*      loadArray(Utf8Const*, Hjava_lang_ClassLoader*, 
errorInfo *einfo);
+/**
+ * This function finds a class in a directory or in a jar file. It implements 
the internal VM class loader.
+ *
+ * @param centry The class entry representing the class to be loaded.
+ * @param einfo The error structure to fill if something bad happens.
+ *
+ * @returns A valid class object if the load is successful, NULL otherwise.
+ */
 Hjava_lang_Class*      findClass(struct _classEntry* centry, errorInfo *einfo);
 
-void                   loadStaticClass(Hjava_lang_Class**, const char*);
+/**
+ * This function is used at the VM boot to preload some classes. The classes 
are loaded and put in the linked state.
+ * It cannot return an error. If an error happened the VM is aborted.
+ *
+ * @param clazz A pointer to the place where the class object should be put.
+ * @param name The name of the class to load.
+ */
+void                   loadStaticClass(Hjava_lang_Class** clazz, const char* 
name);
 
 Hjava_lang_Class*      setupClass(Hjava_lang_Class*, constIndex,
                                   constIndex, u2, Hjava_lang_ClassLoader*, 
errorInfo*);
@@ -544,8 +590,6 @@
 int                    removeClassEntries(Hjava_lang_ClassLoader*);
 void                   walkClassEntries(Collector *collector, void *gc_info, 
Hjava_lang_ClassLoader*);
 
-Collector*             initCollector(void);
-
 Hjava_lang_Class*      lookupClass(const char*, Hjava_lang_ClassLoader*,
                                errorInfo*);
 Hjava_lang_Class*      lookupArray(Hjava_lang_Class*, errorInfo*);
@@ -562,6 +606,7 @@
 Hjava_lang_Class*      getClassFromSignature(const char*, 
Hjava_lang_ClassLoader*, errorInfo*);
 Hjava_lang_Class*      getClassFromSignaturePart(const char*, 
Hjava_lang_ClassLoader*, errorInfo*);
 int                    countArgsInSignature(const char *);
+int                    KaffeVM_countRealNumberOfArgs(parsed_signature_t *);
 parsed_signature_t*    parseSignature(Utf8Const *, errorInfo*);
 
 int                    startFields(Hjava_lang_Class*, u2 fieldct, errorInfo*);
@@ -571,34 +616,38 @@
 struct Hjava_lang_String* resolveString(Hjava_lang_Class* clazz, int idx,
                                        errorInfo *einfo);
 int                    findPackageLength(const char *name);
-/*
+
+/**
  * Start a search for a class.  If no other thread is searching for this
  * mapping then the responsibility falls on the current thread.
  *
- * ce - The mapping to start searching for.
- * out_cl - A placeholder for the class if it has already been bound.
- * einfo - An uninitialized errorInfo object.
- * returns - True, if the class is already bound or if this thread should be
+ * @param ce The mapping to start searching for.
+ * @param out_cl A placeholder for the class if it has already been bound.
+ * @param einfo An uninitialized errorInfo object.
+ *
+ * @returns True, if the class is already bound or if this thread should be
  *   responsible for searching/loading the class.  False, if searching for this
  *   class would result in a class circularity.
  */
 int classMappingSearch(classEntry *ce,
                       Hjava_lang_Class **out_cl,
                       errorInfo *einfo);
-/*
+/**
  * Start loading a class.
  *
- * ce - The mapping to start searching for.
- * out_cl - A placeholder for the class if it has already been bound.
- * einfo - An uninitialized errorInfo object.
- * returns - True, if the class is already bound or if this thread should be
+ * @param ce The mapping to start searching for.
+ * @param out_cl A placeholder for the class if it has already been bound.
+ * @param einfo An uninitialized errorInfo object.
+ *
+ * @returns True, if the class is already bound or if this thread should be
  *   responsible for searching/loading the class.  False, if searching for this
  *   class would result in a class circularity.
  */
 int classMappingLoad(classEntry *ce,
                     Hjava_lang_Class **out_cl,
                     errorInfo *einfo);
-/*
+
+/**
  * Transition a mapping to the loaded state.
  *
  * ce - The name mapping whose state should be updated.
@@ -607,7 +656,8 @@
  *   it will be the value previously stored in the mapping.
  */
 Hjava_lang_Class *classMappingLoaded(classEntry *ce, Hjava_lang_Class *cl);
-/*
+
+/**
  * Force a mapping to a particular state.
  *
  * ce - The name mapping whose state should be updated.
@@ -615,8 +665,19 @@
  */
 void setClassMappingState(classEntry *ce, name_mapping_state_t nms);
 
+/**
+ * This function walks through the class pool and execute the given function
+ * for each class of the pool.
+ *
+ * @param walker A class walker.
+ * @param param A user parameter.
+ */
 void walkClassPool(int (*walker)(Hjava_lang_Class *clazz, void *), void 
*param);
 
+
+/**
+ * Initialize internal global variables of the class pool.
+ */
 void KaffeVM_initClassPool(void);
 
 extern Utf8Const* init_name;           /* "<clinit>" */
===================================================================
Checking out kaffe/kaffe/kaffevm/gc.h
RCS:  /home/cvs/kaffe/kaffe/kaffe/kaffevm/gc.h,v
VERS: 1.32
***************
--- /dev/null   Sun Aug  4 19:57:58 2002
+++ kaffe/kaffe/kaffevm/gc.h    Thu Jun 23 16:51:53 2005
@@ -0,0 +1,240 @@
+/*
+ * gc.h
+ * The garbage collector.
+ *
+ * Copyright (c) 1996, 1997
+ *     Transvirtual Technologies, Inc.  All rights reserved.
+ *
+ * See the file "license.terms" for information on usage and redistribution 
+ * of this file. 
+ */
+
+#ifndef __gc_h
+#define __gc_h
+
+#include "gtypes.h"
+
+/*
+ * Default values for initial and maximum heap size and heap increment.
+ */
+#define        MIN_HEAPSIZE    (5*1024*1024)
+#define        MAX_HEAPSIZE    (64*1024*1024)
+#define        ALLOC_HEAPSIZE  (1024*1024)
+
+/* 
+ * We do not support incremental collection as this time.
+ */
+#undef KGC_INCREMENTAL
+
+typedef struct _Collector Collector;
+typedef void (*walk_func_t)(struct _Collector* collector, void* gc_info, void* 
obj, uint32 size);
+typedef void (*final_func_t)(struct _Collector* collector, void* obj);
+typedef void (*destroy_func_t)(struct _Collector* collector, void* obj);
+
+#define        KGC_OBJECT_NORMAL         ((final_func_t)0)
+#define        KGC_OBJECT_FIXED          ((final_func_t)1)
+
+/*
+ * Garbage collector interface.
+ */
+typedef enum {
+       /* allocation types for different kinds of java objects */
+       KGC_ALLOC_JAVASTRING,
+       KGC_ALLOC_NOWALK,
+       KGC_ALLOC_NORMALOBJECT,
+       KGC_ALLOC_PRIMARRAY,
+       KGC_ALLOC_REFARRAY,
+       KGC_ALLOC_FINALIZEOBJECT,
+       KGC_ALLOC_JAVALOADER,
+
+       /* allocation types related to the translator engines */
+       KGC_ALLOC_JITCODE,
+       KGC_ALLOC_JITTEMP,
+       KGC_ALLOC_JIT_SEQ,
+       KGC_ALLOC_JIT_CONST,
+       KGC_ALLOC_JIT_ARGS,
+       KGC_ALLOC_JIT_FAKE_CALL,
+       KGC_ALLOC_JIT_SLOTS,
+       KGC_ALLOC_JIT_CODEBLOCK,
+       KGC_ALLOC_JIT_LABELS,
+       KGC_ALLOC_TRAMPOLINE,
+       
+       /* allocation types used for java.lang.Class and its parts */
+       KGC_ALLOC_CLASSOBJECT,
+       KGC_ALLOC_BYTECODE,
+       KGC_ALLOC_EXCEPTIONTABLE,
+       KGC_ALLOC_STATICDATA,
+       KGC_ALLOC_CONSTANT,
+       KGC_ALLOC_DISPATCHTABLE,
+       KGC_ALLOC_METHOD,
+       KGC_ALLOC_FIELD,
+       KGC_ALLOC_INTERFACE,
+       KGC_ALLOC_LINENRTABLE,
+       KGC_ALLOC_LOCALVARTABLE,
+       KGC_ALLOC_DECLAREDEXC,
+       KGC_ALLOC_INTERFACE_TABLE,
+       KGC_ALLOC_CLASSMISC,
+
+       /* miscelanious allocation types */
+       KGC_ALLOC_FIXED,
+       KGC_ALLOC_UTF8CONST,
+       KGC_ALLOC_LOCK,
+       KGC_ALLOC_THREADCTX,
+       KGC_ALLOC_STATIC_THREADDATA,
+       KGC_ALLOC_REF,
+       KGC_ALLOC_JAR,
+       KGC_ALLOC_CODEANALYSE,
+       KGC_ALLOC_CLASSPOOL,
+       KGC_ALLOC_VERIFIER,
+       KGC_ALLOC_NATIVELIB,
+       KGC_ALLOC_MAX_INDEX
+} gc_alloc_type_t;
+
+/*
+ * Define a COM-like GC interface.
+ */
+struct GarbageCollectorInterface_Ops;
+
+struct _Collector {
+       struct GarbageCollectorInterface_Ops *ops;
+};
+
+struct GarbageCollectorInterface_Ops {
+
+        const char * (*getCollectorName)(Collector *);
+       void*   reserved2;
+       void*   reserved3;
+       void*   (*malloc)(Collector *, size_t size, gc_alloc_type_t type);
+       void*   (*realloc)(Collector *, void* addr, size_t size, 
gc_alloc_type_t type);
+       void    (*free)(Collector *, void* addr);
+
+       void    (*invoke)(Collector *, int mustgc);
+       void    (*invokeFinalizer)(Collector *);
+       void    (*init)(Collector *);
+       void    (*enable)(Collector *);
+
+       void    (*markAddress)(Collector *, void *gc_info, const void* addr);
+       void    (*markObject)(Collector *, void *gc_info, const void* obj);
+       uint32  (*getObjectSize)(Collector *, const void* obj);
+       const char* (*getObjectDescription)(Collector *, const void* obj);
+       int     (*getObjectIndex)(Collector *, const void* obj);
+       void*   (*getObjectBase)(Collector *, void* obj);
+
+       void    (*registerFixedTypeByIndex)(Collector *, 
+                       gc_alloc_type_t gc_index, const char *description);
+
+       void    (*registerGcTypeByIndex)(Collector *, 
+                       gc_alloc_type_t gc_index,
+                       walk_func_t walk, final_func_t final, 
+                       destroy_func_t destroy, const char
+                                        *description);
+       struct Hjava_lang_Throwable *(*throwOOM)(Collector *);
+
+       void    (*enableGC)(Collector *);
+       void    (*disableGC)(Collector *);
+
+        uintp   (*getHeapFree)(Collector *); 
+        uintp   (*getHeapLimit)(Collector *);
+        uintp   (*getHeapTotal)(Collector *);
+
+        bool    (*addRef)(Collector *, const void *mem);
+        bool    (*rmRef)(Collector *, void *ref);
+        bool    (*addWeakRef)(Collector *, void *mem, void **ref);
+        bool    (*rmWeakRef)(Collector *, void *mem, void **ref);
+};
+
+Collector* createGC(void);
+
+/*
+ * Convenience macros
+ */
+#define KGC_malloc(G, size, type)      \
+    ((G)->ops->malloc)((Collector*)(G), (size), (type))
+#define KGC_realloc(G, addr, size, type)       \
+    ((G)->ops->realloc)((Collector*)(G), (addr), (size), (type))
+#define KGC_free(G, addr)              \
+    ((G)->ops->free)((Collector*)(G), (addr))
+#define KGC_invoke(G, mustgc)          \
+    ((G)->ops->invoke)((Collector*)(G), (mustgc))
+#define KGC_invokeFinalizer(G)         \
+    ((G)->ops->invokeFinalizer)((Collector*)(G))
+#define KGC_init(G)            \
+    ((G)->ops->init)((Collector*)(G))
+#define KGC_enable(G)          \
+    ((G)->ops->enable)((Collector*)(G))
+#define KGC_throwOOM(G)                \
+    ((G)->ops->throwOOM)((Collector*)(G))
+#define KGC_markAddress(G, gc_info, addr)              \
+    ((G)->ops->markAddress)((Collector*)(G), (gc_info), (addr))
+#define KGC_addRef(G, addr) \
+    ((G)->ops->addRef)((Collector*)(G), (addr))
+#define KGC_rmRef(G, addr) \
+    ((G)->ops->rmRef)((Collector*)(G), (addr))
+#define KGC_addWeakRef(G, addr, ref) \
+    ((G)->ops->addWeakRef((Collector *)(G), (addr), (ref)))
+#define KGC_rmWeakRef(G, addr, ref) \
+    ((G)->ops->rmWeakRef((Collector *)(G), (addr), (ref)))
+
+#if !defined(KAFFEH)
+static inline void KGC_markObject(void *g, void *gc_info, const void *addr)
+{
+       if (addr)
+               ((Collector*) g)->ops->markObject((Collector*) g, gc_info, 
addr);
+}
+#endif
+
+#define KGC_getObjectSize(G, obj)      \
+    ((G)->ops->getObjectSize)((Collector*)(G), (obj))
+#define KGC_getObjectDescription(G, obj)       \
+    ((G)->ops->getObjectDescription)((Collector*)(G), (obj))
+#define KGC_getObjectIndex(G, obj)     \
+    ((G)->ops->getObjectIndex)((Collector*)(G), (obj))
+#define KGC_getObjectBase(G, obj)      \
+    ((G)->ops->getObjectBase)((Collector*)(G), (obj))
+#define KGC_registerFixedTypeByIndex(G, idx, desc)     \
+    ((G)->ops->registerFixedTypeByIndex)((Collector*)(G),   \
+                               (idx), (desc))
+#define KGC_registerGcTypeByIndex(G, idx, walk, final, destroy, desc)  \
+    ((G)->ops->registerGcTypeByIndex)((Collector*)(G),              \
+                               (idx), (walk), (final), (destroy), (desc))
+#define KGC_enableGC(G)                \
+    ((G)->ops->enableGC)((Collector*)(G));
+#define KGC_disableGC(G)               \
+    ((G)->ops->disableGC)((Collector*)(G));
+
+#define KGC_getHeapFree(G) \
+    ((G)->ops->getHeapFree)((Collector *)(G));
+#define KGC_getHeapLimit(G) \
+    ((G)->ops->getHeapLimit)((Collector *)(G));
+#define KGC_getHeapTotal(G) \
+    ((G)->ops->getHeapTotal)((Collector *)(G));
+#define KGC_getCollectorName(G) \
+    ((G)->ops->getCollectorName)((Collector *)(G));
+#define KGC_WRITE(a, b)
+
+/*
+ * Compatibility macros to access GC functions
+ */
+extern Collector* main_collector;
+
+#define        gc_malloc(A,B)      KGC_malloc(main_collector,A,B)
+#define        gc_calloc(A,B,C)    KGC_malloc(main_collector,(A)*(B),C)
+#define        gc_realloc(A,B,C)   KGC_realloc(main_collector,(A),(B),C)
+#define        gc_free(A)          KGC_free(main_collector,(A))
+#define gc_add_ref(A)       KGC_addRef(main_collector, (A))
+#define gc_rm_ref(A)        KGC_rmRef(main_collector, (A))
+
+#define        invokeGC()          KGC_invoke(main_collector,1)
+#define        adviseGC()          KGC_invoke(main_collector,0)
+#define        invokeFinalizer()   KGC_invokeFinalizer(main_collector)
+
+#define gc_throwOOM()      KGC_throwOOM(main_collector)
+
+#define gc_enableGC()      KGC_enableGC(main_collector)
+#define gc_disableGC()     KGC_disableGC(main_collector)
+
+extern const char* describeObject(const void* mem);
+
+Collector*             initCollector(void);
+
+#endif
===================================================================
Checking out kaffe/kaffe/kaffevm/javacall.c
RCS:  /home/cvs/kaffe/kaffe/kaffe/kaffevm/javacall.c,v
VERS: 1.1
***************
--- /dev/null   Sun Aug  4 19:57:58 2002
+++ kaffe/kaffe/kaffevm/javacall.c      Thu Jun 23 16:51:53 2005
@@ -0,0 +1,459 @@
+/*
+ * javacall.c
+ * Building call for java/native methods.
+ *
+ * Copyright (c) 1996, 1997
+ *     Transvirtual Technologies, Inc.  All rights reserved.
+ *
+ * Copyright (c) 2002-2005 
+ *      Kaffe.org contributors. See ChangeLog for details. All rights reserved.
+ *
+ * See the file "license.terms" for information on usage and redistribution 
+ * of this file. 
+ */
+
+#include "debug.h"
+#include "config.h"
+
+#if !defined(HAVE_LIBFFI)
+#define NEED_sysdepCallMethod 1
+#endif
+
+#include "config-std.h"
+#include "config-mem.h"
+#include <stdarg.h>
+#include "errors.h"
+#include "jni_md.h"
+#include "kaffe/jmalloc.h"
+#include "gtypes.h"
+#include "object.h"
+#include "constants.h"
+#include "baseClasses.h"
+#include "slots.h"
+#include "support.h"
+#include "classMethod.h"
+#include "machine.h"
+#include "md.h"
+#include "itypes.h"
+#include "external.h"
+#include "thread.h"
+#include "jthread.h"
+#include "methodcalls.h"
+#include "native.h"
+
+/* This is defined in the alpha port.  It causes all integer arguments
+   to be promoted to jlong, and all jfloats to be promoted to jdouble,
+   unless explicitly overridden.  It implies NO_HOLES, unless
+   explicitly defined otherwise.  */
+#if defined(PROMOTE_TO_64bits)
+# if !defined(PROMOTE_jint2jlong)
+#  define PROMOTE_jint2jlong 1
+# endif
+# if !defined(PROMOTE_jfloat2jdouble)
+#  define PROMOTE_jfloat2jdouble 1
+# endif
+/* NO_HOLES causes all types to occupy only one slot in callargs, but
+   not affecting their callsizes, that can still be used to
+   distinguish among types.  */
+# if !defined(NO_HOLES)
+#  define NO_HOLES 1
+# endif
+#endif
+
+/* Make sure that undefined macros are defined as 0 */
+#if !defined(PROMOTE_jfloat2jdouble)
+#define PROMOTE_jfloat2jdouble 0
+#endif
+
+#if !defined(PROMOTE_jint2jlong)
+#define PROMOTE_jint2jlong 0
+#endif
+
+#if !defined(NO_HOLES)
+#define NO_HOLES 0
+#endif
+
+/* If PROMOTE_jint2jlong is enabled, all integer values are to be
+   passed as jlongs.  It is only set by PROMOTE_TO_64bits.  */
+#if PROMOTE_jint2jlong
+# define PROM_i j
+#else
+# define PROM_i i
+#endif
+
+/* If PROMOTE_jfloat2jdouble is enabled, jfloats are to be passed as
+   jdoubles.  Note that, when a jfloat is promoted, its calltype will
+   be marked as 'D'.  No known port uses this.  In fact, alpha must
+   explicitly set it to 0, to prevent PROMOTE_TO_64bits from enabling
+   it.  */
+#if PROMOTE_jfloat2jdouble
+# define PROM_f d
+#else
+# define PROM_f f
+#endif
+
+/* This is currently defined in the MIPS O32 port.  It causes jlongs
+   and jdoubles to be forced into even arguments, by introducing a
+   padding integer argument. The argument DO is used to adjust the
+   input argument list.  */
+#if defined(ALIGN_AT_64bits)
+# if NO_HOLES
+#  error "ALIGN_AT_64bits is incompatible with NO_HOLES"
+# endif
+# define ENSURE_ALIGN64(DO) do { \
+               if (call.callsize[i] == 2 && (i & 1)) { \
+                       char tmptype = call.calltype[i]; \
+                       call.callsize[i] = 0; \
+                       call.calltype[i] = 'I'; \
+                       DO; \
+                       ++i; ++s; \
+                       call.calltype[i] = tmptype; \
+                       call.callsize[i] = 2; \
+               } \
+       } while (0)
+#else
+# define ENSURE_ALIGN64(DO) do {} while (0)
+#endif
+
+/**
+ * Generic routine to call a native or Java method (array style).
+ *
+ * @param meth the struct _methods of the method to be executed
+ * @param func the code that's to be executed
+ * @param obj  the object whose method is to be called (my be 0 iff method is 
static)
+ * @param args the arguments to be passed to the method
+ * @param ret  buffer for the return value of the method (may be 0 iff return 
type is void)
+ * @param promoted true iff 64 bit values occupy two entries in args, 
otherwise false
+ */
+void
+KaffeVM_callMethodA(Method* meth, void* func, void* obj, jvalue* args, jvalue* 
ret,
+                   int promoted)
+{
+       int i;
+       int j;
+       int s;
+       int numArgs;
+       callMethodInfo call;    
+       jvalue tmp;
+
+       if (ret == 0) {
+               ret = &tmp;
+       }
+       if (!NO_HOLES)
+               numArgs = sizeofSigMethod(meth, false);
+       else
+               numArgs = METHOD_NARGS(meth);
+
+       i = engine_reservedArgs(meth);
+       s = 0;
+       
+       call.args = (jvalue 
*)alloca((numArgs+engine_reservedArgs(meth)+2)*(sizeof(jvalue)+2));
+       call.callsize = (char *)&call.args[numArgs+engine_reservedArgs(meth)+2];
+       call.calltype = (char 
*)&call.callsize[numArgs+engine_reservedArgs(meth)+2];
+
+       /* If this method isn't static, we must insert the object as
+        * an argument.
+        */
+       if ((meth->accflags & ACC_STATIC) == 0) {
+               call.callsize[i] = PTR_TYPE_SIZE / SIZEOF_INT;
+               s += call.callsize[i];
+               call.calltype[i] = 'L';
+               call.args[i].l = obj;
+               i++;
+       }
+
+       for (j = 0; j < METHOD_NARGS(meth); i++, j++) {
+               call.calltype[i] = *METHOD_ARG_TYPE(meth, j);
+               switch (call.calltype[i]) {
+               case 'Z':
+                       if (promoted) goto use_int;
+                       call.callsize[i] = 1;
+                       call.args[i].PROM_i = args[j].z;
+                       break;
+
+               case 'S':
+                       if (promoted) goto use_int;
+                       call.callsize[i] = 1;
+                       call.args[i].PROM_i = args[j].s;
+                       break;
+
+               case 'B':
+                       if (promoted) goto use_int;
+                       call.callsize[i] = 1;
+                       call.args[i].PROM_i = args[j].b;
+                       break;
+
+               case 'C':
+                       if (promoted) goto use_int;
+                       call.callsize[i] = 1;

*** Patch too long, truncated ***

_______________________________________________
kaffe mailing list
[email protected]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to