/* src/cacaoh/headers.c - functions for header generation
- Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
- R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
- C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
- Institut f. Computersprachen - TU Wien
+ Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+ C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+ E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+ J. Wenninger, Institut f. Computersprachen - TU Wien
This file is part of CACAO.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA.
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
- Contact: cacao@complang.tuwien.ac.at
+ Contact: cacao@cacaojvm.org
Authors: Reinhard Grafl
Philipp Tomsich
Christian Thalinger
- $Id: headers.c 2965 2005-07-09 18:21:01Z twisti $
+ $Id: headers.c 4559 2006-03-05 23:24:50Z twisti $
*/
#include <string.h>
#include "config.h"
+#include "vm/types.h"
#if defined(USE_THREADS) && defined(NATIVE_THREADS)
# if defined(__DARWIN__)
#include "vm/class.h"
#include "vm/global.h"
#include "vm/method.h"
-#include "vm/tables.h"
#include "vm/loader.h"
#include "vm/options.h"
#include "vm/stringlocal.h"
#include "vm/jit/asmpart.h"
-/* for raising exceptions from native methods */
+#if defined(ENABLE_INTRP)
+/* dummy interpreter stack to keep the compiler happy */
+
+u1 intrp_main_stack[1];
+#endif
+
+
+/* for raising exceptions from native methods *********************************/
#if !defined(USE_THREADS) || !defined(NATIVE_THREADS)
-java_objectheader *_exceptionptr = NULL;
+java_objectheader *_no_threads_exceptionptr = NULL;
#endif
java_objectheader *native_new_and_init_throwable(classinfo *c, java_lang_Throwable *t) { return NULL; }
-java_objectheader *asm_calljavafunction(methodinfo *m, void *arg1, void *arg2,
- void *arg3, void *arg4) { return NULL; }
+java_objectheader *vm_call_method(methodinfo *m, java_objectheader *o, ...)
+{ return NULL; }
-void asm_call_jit_compiler(void) {}
/* code patching functions */
-void patcher_builtin_new(u1 *sp) {}
-void patcher_builtin_newarray(u1 *sp) {}
void patcher_builtin_arraycheckcast(u1 *sp) {}
-void patcher_builtin_arrayinstanceof(u1 *sp) {}
-
-s4 asm_builtin_idiv(s4 a, s4 b) { return 0; }
-s4 asm_builtin_irem(s4 a, s4 b) { return 0; }
-s8 asm_builtin_ldiv(s8 a, s8 b) { return 0; }
-s8 asm_builtin_lrem(s8 a, s8 b) { return 0; }
-
-s4 asm_builtin_f2i(float a) { return 0; }
-s8 asm_builtin_f2l(float a) { return 0; }
-s4 asm_builtin_d2i(double a) { return 0; }
-s8 asm_builtin_d2l(double a) { return 0; }
-
-void use_class_as_object(void) {}
-void asm_builtin_monitorenter(java_objectheader *o) {}
-void *asm_builtin_monitorexit(java_objectheader *o) { return NULL; }
-
-s4 asm_builtin_arraycheckcast(java_objectheader *obj, vftbl_t *target)
-{
- return 0;
-}
#if defined(__MIPS__)
long compare_and_swap(long *p, long oldval, long newval)
#endif
-void asm_builtin_aastore(java_objectarray *a, s4 index, java_objectheader *o) {}
+u1 *createcompilerstub(methodinfo *m) { return NULL; }
+#if defined(ENABLE_INTRP)
+u1 *intrp_createcompilerstub(methodinfo *m) { return NULL; }
+#endif
-functionptr createcompilerstub(methodinfo *m) { return NULL; }
-functionptr codegen_createnativestub(functionptr f, methodinfo *m) { return NULL; }
+u1 *codegen_createnativestub(functionptr f, methodinfo *m) { return NULL; }
-void removecompilerstub(functionptr stub) {}
-void removenativestub(functionptr stub) {}
+void removecompilerstub(u1 *stub) {}
+void removenativestub(u1 *stub) {}
void asm_perform_threadswitch(u1 **from, u1 **to, u1 **stackTop) {}
u1* asm_initialize_thread_stack(void *func, u1 *stack) { return NULL; }
void *asm_switchstackandcall(void *stack, void *func, void **stacktopsave, void * p) { return NULL; }
void asm_handle_builtin_exception(classinfo *c) {}
+
+
+#if defined(ENABLE_JIT)
void asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out) {}
+#endif
+
+#if defined(ENABLE_INTRP)
+void intrp_asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out) {}
+#endif
-void setVMClassField(classinfo *c) {}
void *Java_java_lang_VMObject_clone(void *env, void *clazz, void * this)
{
return NULL;
return typecheck_TRUE;
}
-bool typeinfo_init_class(typeinfo *info,classref_or_classinfo c)
+void typeinfo_init_classinfo(typeinfo *info,classinfo *c)
{
- return true;
}
-void typeinfo_print(FILE *file,typeinfo *info,int indent)
+bool typeinfo_init_class(typeinfo *info,classref_or_classinfo c)
{
+ return true;
}
+void typeinfo_print(FILE *file,typeinfo *info,int indent) {}
+
+void exceptions_print_exception(java_objectheader *xptr) {}
+void stacktrace_print_trace(java_objectheader *xptr) {}
+
+
/* exception functions ********************************************************/
/* these should not be called */
+void throw_main_exception_exit(void) { assert(0); }
void throw_exception(void) { assert(0); }
void throw_exception_exit(void) { assert(0); }
}
+void exceptions_throw_outofmemory_exit(void)
+{
+ fprintf(stderr, "java.lang.InternalError: Out of memory\n");
+ exit(1);
+}
+
+
java_objectheader *new_exception(const char *classname)
{
fprintf(stderr, "%s\n", classname);
}
+void exceptions_throw_classformaterror(classinfo *c, const char *message, ...)
+{
+ va_list ap;
+
+ va_start(ap, message);
+ (void) new_classformaterror(c, message, ap);
+ va_end(ap);
+}
+
+
+java_objectheader *new_classnotfoundexception(utf *name)
+{
+ fprintf(stderr, "java.lang.ClassNotFoundException: ");
+ utf_fprint(stderr, name);
+ fputc('\n', stderr);
+
+ exit(1);
+
+ /* keep compiler happy */
+
+ return NULL;
+}
+
+
+java_objectheader *new_noclassdeffounderror(utf *name)
+{
+ fprintf(stderr, "java.lang.NoClassDefFoundError: ");
+ utf_fprint(stderr, name);
+ fputc('\n', stderr);
+
+ exit(1);
+
+ /* keep compiler happy */
+
+ return NULL;
+}
+
+
+java_objectheader *exceptions_new_linkageerror(const char *message,
+ classinfo *c)
+{
+ fprintf(stderr, "java.lang.LinkageError: %s",message);
+ if (c) {
+ utf_fprint_classname(stderr, c->name);
+ }
+ fputc('\n', stderr);
+
+ exit(1);
+
+ /* keep compiler happy */
+
+ return NULL;
+}
+
+java_objectheader *exceptions_new_nosuchmethoderror(classinfo *c,
+ utf *name, utf *desc)
+{
+ fprintf(stderr, "java.lang.NoSuchMethodError: ");
+ utf_fprint(stderr, c->name);
+ fprintf(stderr, ".");
+ utf_fprint(stderr, name);
+ utf_fprint(stderr, desc);
+ fputc('\n', stderr);
+
+ exit(1);
+
+ /* keep compiler happy */
+
+ return NULL;
+}
+
+
java_objectheader *new_internalerror(const char *message, ...)
{
va_list ap;
}
+java_objectheader *new_illegalmonitorstateexception(void)
+{
+ fprintf(stderr, "%s", string_java_lang_IllegalMonitorStateException);
+ exit(1);
+
+ /* keep compiler happy */
+
+ return NULL;
+}
+
+
java_objectheader *new_negativearraysizeexception(void)
{
fprintf(stderr, "%s", string_java_lang_NegativeArraySizeException);
}
+void exceptions_throw_negativearraysizeexception(void)
+{
+ (void) new_negativearraysizeexception();
+}
+
+
java_objectheader *new_nullpointerexception(void)
{
fprintf(stderr, "%s", string_java_lang_NullPointerException);
}
+void exceptions_throw_nullpointerexception(void)
+{
+ (void) new_nullpointerexception();
+}
+
+
+void classnotfoundexception_to_noclassdeffounderror(void)
+{
+}
+
/* machine dependent stuff ****************************************************/
#if defined(USE_THREADS) && defined(NATIVE_THREADS)
void md_param_alloc(methoddesc *md) {}
+#if defined(ENABLE_INTRP)
+void print_dynamic_super_statistics(void) {}
+#endif
+
+
/************************ global variables **********************/
-chain *nativemethod_chain; /* chain with native methods */
-chain *nativeclass_chain; /* chain with processed classes */
chain *ident_chain; /* chain with method and field names in current class */
FILE *file = NULL;
static u4 outputsize;
fprintf(file, "_");
printID(m->name);
- if (m->nativelyoverloaded) printOverloadPart(m->descriptor);
+
+ /* ATTENTION: We use the methodinfo's isleafmethod variable as
+ nativelyoverloaded, so we can save some space during
+ runtime. */
+
+ if (m->isleafmethod)
+ printOverloadPart(m->descriptor);
+
fprintf(file, "(JNIEnv *env");
utf_ptr = m->descriptor->text + 1;
char uclassname[1024];
u2 i;
methodinfo *m;
- u2 i2;
+ u2 j;
methodinfo *m2;
- u2 nativelyoverloaded;
-
- /* store class in chain */
- chain_addlast(nativeclass_chain, c);
-
+ bool nativelyoverloaded;
+
+ /* prevent compiler warnings */
+
+ nativelyoverloaded = false;
+
/* open headerfile for class */
gen_header_filename(classname, c->name);
/* create method-prototypes */
/* find overloaded methods */
- for (i = 0; i < c->methodscount; i++) {
+ for (i = 0; i < c->methodscount; i++) {
m = &(c->methods[i]);
- if (!(m->flags & ACC_NATIVE)) continue;
- if (!m->nativelyoverloaded) {
- nativelyoverloaded=false;
- for (i2=i+1;i2<c->methodscount; i2++) {
- m2 = &(c->methods[i2]);
- if (!(m2->flags & ACC_NATIVE)) continue;
- if (m->name==m2->name) {
- m2->nativelyoverloaded=true;
- nativelyoverloaded=true;
+ if (!(m->flags & ACC_NATIVE))
+ continue;
+
+ /* We use the methodinfo's isleafmethod variable as
+ nativelyoverloaded, so we can save some space during
+ runtime. */
+
+ if (!m->isleafmethod) {
+ nativelyoverloaded = false;
+
+ for (j = i + 1; j < c->methodscount; j++) {
+ m2 = &(c->methods[j]);
+
+ if (!(m2->flags & ACC_NATIVE))
+ continue;
+
+ if (m->name == m2->name) {
+ m2->isleafmethod = true;
+ nativelyoverloaded = true;
}
}
- m->nativelyoverloaded=nativelyoverloaded;
}
+ m->isleafmethod = nativelyoverloaded;
}
for (i = 0; i < c->methodscount; i++) {
-
m = &(c->methods[i]);
- if (m->flags & ACC_NATIVE) {
- chain_addlast(nativemethod_chain, m);
+ if (m->flags & ACC_NATIVE)
printmethod(m);
- }
}
chain_free(ident_chain);