1 /* src/cacaoh/dummy.c - dummy functions for cacaoh
3 Copyright (C) 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
35 #include "mm/memory.h"
37 #include "native/llni.h"
39 #include "toolbox/logging.h"
41 #include "vm/exceptions.h"
42 #include "vm/global.h"
43 #include "vm/primitive.h"
46 #include "vm/jit/code.h"
48 #include "vmcore/class.h"
49 #include "vmcore/classcache.h"
50 #include "vmcore/loader.h"
51 #include "vmcore/method.h"
52 #include "vmcore/utf8.h"
53 #include "vmcore/system.h"
56 /* global variables ***********************************************************/
58 bool vm_initializing = true;
59 char *_Jv_bootclasspath;
62 java_handle_t *javastring_new_slash_to_dot(utf *u)
64 vm_abort("javastring_new_slash_to_dot");
70 /* access *********************************************************************/
72 bool access_is_accessible_class(classinfo *referer, classinfo *cls)
77 bool access_is_accessible_member(classinfo *referer, classinfo *declarer,
80 vm_abort("access_is_accessible_member");
86 /* array **********************************************************************/
88 java_handle_t *array_objectarray_element_get(java_handle_objectarray_t *a, int32_t index)
94 log_println("array_objectarray_element_get(a=%p, index=%d): NullPointerException", a, index);
98 size = LLNI_array_size(a);
100 if ((index < 0) || (index > size)) {
101 log_println("array_objectarray_element_get(a=%p, index=%d): ArrayIndexOutOfBoundsException", a, index);
105 value = LLNI_WRAP(LLNI_array_direct(a, index));
110 void array_objectarray_element_set(java_handle_objectarray_t *a, int32_t index, java_handle_t *value)
115 log_println("array_objectarray_element_set(a=%p, index=%d): NullPointerException", a, index);
119 size = LLNI_array_size(a);
121 if ((index < 0) || (index > size)) {
122 log_println("array_objectarray_element_set(a=%p, index=%d): ArrayIndexOutOfBoundsException", a, index);
126 LLNI_array_direct(a, index) = LLNI_UNWRAP(value);
129 int32_t array_length_get(java_handle_t *a)
132 log_println("array_length_get(a=%p): NullPointerException", a);
136 return LLNI_array_size(a);
140 /* asm ************************************************************************/
142 void asm_abstractmethoderror(void)
147 void intrp_asm_abstractmethoderror(void)
152 void asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out)
157 void intrp_asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out)
163 /* builtin ********************************************************************/
165 java_handle_t *builtin_clone(void *env, java_handle_t *o)
172 int32_t builtin_isanysubclass(classinfo *sub, classinfo *super)
179 java_handle_t *builtin_new(classinfo *c)
186 java_handle_objectarray_t *builtin_anewarray(int32_t size, classinfo *componentclass)
188 java_objectarray_t *oa = (java_objectarray_t*) mem_alloc(
189 sizeof(java_array_t) + size * sizeof(java_object_t*));
190 java_handle_objectarray_t *h = (java_handle_objectarray_t*) LLNI_WRAP(
191 (java_object_t*) oa);
194 LLNI_array_size(h) = size;
200 java_handle_bytearray_t *builtin_newarray_byte(int32_t size)
202 java_bytearray_t *ba = (java_bytearray_t*) mem_alloc(
203 sizeof(java_array_t) + size * sizeof(int8_t));
204 java_handle_bytearray_t *h = (java_handle_bytearray_t*) LLNI_WRAP(
205 (java_object_t*) ba);
208 LLNI_array_size(h) = size;
215 /* code ***********************************************************************/
217 void code_free_code_of_method(methodinfo *m)
222 methodinfo *code_get_methodinfo_for_pv(void *pv)
228 /* codegen ********************************************************************/
230 u1 *codegen_generate_stub_compiler(methodinfo *m)
235 codeinfo *codegen_generate_stub_native(methodinfo *m, functionptr f)
240 #if defined(ENABLE_INTRP)
241 u1 *intrp_createcompilerstub(methodinfo *m)
247 void removecompilerstub(u1 *stub)
251 void removenativestub(u1 *stub)
256 /* exceptions *****************************************************************/
258 void exceptions_clear_exception(void)
262 void exceptions_print_current_exception(void)
267 void exceptions_throw_abstractmethoderror(void)
269 fprintf(stderr, "java.lang.AbstractMethodError\n");
274 void exceptions_throw_classcircularityerror(classinfo *c)
276 fprintf(stderr, "java.lang.ClassCircularityError: ");
278 utf_display_printable_ascii(c->name);
284 void exceptions_throw_classformaterror(classinfo *c, const char *message, ...)
288 fprintf(stderr, "java.lang.ClassFormatError: ");
290 utf_display_printable_ascii(c->name);
291 fprintf(stderr, ": ");
293 va_start(ap, message);
294 vfprintf(stderr, message, ap);
302 void exceptions_throw_incompatibleclasschangeerror(classinfo *c, const char *message)
304 fprintf(stderr, "java.lang.IncompatibleClassChangeError: ");
307 utf_fprint_printable_ascii_classname(stderr, c->name);
314 void exceptions_throw_internalerror(const char *message, ...)
318 fprintf(stderr, "java.lang.InternalError: ");
320 va_start(ap, message);
321 vfprintf(stderr, message, ap);
327 void exceptions_throw_linkageerror(const char *message, classinfo *c)
329 fprintf(stderr, "java.lang.LinkageError: %s", message);
332 utf_fprint_printable_ascii_classname(stderr, c->name);
339 void exceptions_throw_noclassdeffounderror(utf *name)
341 fprintf(stderr, "java.lang.NoClassDefFoundError: ");
342 utf_fprint_printable_ascii(stderr, name);
348 void exceptions_throw_noclassdeffounderror_wrong_name(classinfo *c, utf *name)
350 fprintf(stderr, "java.lang.NoClassDefFoundError: ");
351 utf_fprint_printable_ascii(stderr, c->name);
352 fprintf(stderr, " (wrong name: ");
353 utf_fprint_printable_ascii(stderr, name);
354 fprintf(stderr, ")\n");
359 void exceptions_throw_verifyerror(methodinfo *m, const char *message, ...)
361 fprintf(stderr, "java.lang.VerifyError: ");
362 utf_fprint_printable_ascii(stderr, m->name);
363 fprintf(stderr, ": %s", message);
368 void exceptions_throw_nosuchfielderror(classinfo *c, utf *name)
370 fprintf(stderr, "java.lang.NoSuchFieldError: ");
371 utf_fprint_printable_ascii(stderr, c->name);
372 fprintf(stderr, ".");
373 utf_fprint_printable_ascii(stderr, name);
379 void exceptions_throw_nosuchmethoderror(classinfo *c, utf *name, utf *desc)
381 fprintf(stderr, "java.lang.NoSuchMethodError: ");
382 utf_fprint_printable_ascii(stderr, c->name);
383 fprintf(stderr, ".");
384 utf_fprint_printable_ascii(stderr, name);
385 utf_fprint_printable_ascii(stderr, desc);
391 void exceptions_throw_unsupportedclassversionerror(classinfo *c, u4 ma, u4 mi)
393 fprintf(stderr, "java.lang.UnsupportedClassVersionError: " );
394 utf_display_printable_ascii(c->name);
395 fprintf(stderr, " (Unsupported major.minor version %d.%d)\n", ma, mi);
400 void exceptions_throw_classnotfoundexception(utf *name)
402 fprintf(stderr, "java.lang.ClassNotFoundException: ");
403 utf_fprint_printable_ascii(stderr, name);
409 void exceptions_throw_nullpointerexception(void)
411 fprintf(stderr, "java.lang.NullPointerException\n");
417 /* finalizer ******************************************************************/
419 void finalizer_notify(void)
421 vm_abort("finalizer_notify");
424 void finalizer_run(void *o, void *p)
426 vm_abort("finalizer_run");
430 /* gc *************************************************************************/
432 void gc_reference_register(java_object_t **ref, int32_t reftype)
434 vm_abort("gc_reference_register");
437 int64_t gc_get_heap_size(void)
442 int64_t gc_get_free_bytes(void)
447 int64_t gc_get_total_bytes(void)
452 int64_t gc_get_max_heap_size(void)
458 /* heap ***********************************************************************/
460 void *heap_alloc_uncollectable(uint32_t bytelength)
462 return calloc(bytelength, 1);
465 s4 heap_get_hashcode(java_object_t *o)
471 /* jit ************************************************************************/
473 void jit_invalidate_code(methodinfo *m)
475 vm_abort("jit_invalidate_code");
479 /* llni ***********************************************************************/
481 void llni_critical_start()
485 void llni_critical_end()
490 /* localref *******************************************************************/
492 java_handle_t *localref_add(java_object_t *o)
494 #if defined(ENABLE_HANDLES)
495 java_handle_t *h = (java_handle_t*) mem_alloc(sizeof(java_handle_t));
501 return (java_handle_t*) o;
506 /* lock ***********************************************************************/
508 void lock_init_object_lock(java_object_t *o)
512 bool lock_monitor_enter(java_handle_t *o)
517 bool lock_monitor_exit(java_handle_t *o)
523 /* md *************************************************************************/
525 void md_param_alloc(methoddesc *md)
529 void md_param_alloc_native(methoddesc *md)
534 /* memory *********************************************************************/
536 void *mem_alloc(int32_t size)
538 /* real implementation in src/mm/memory.c clears memory */
540 return calloc(size, 1);
543 void *mem_realloc(void *src, int32_t len1, int32_t len2)
545 return realloc(src, len2);
548 void mem_free(void *m, int32_t size)
553 void *dumpmemory_get(size_t size)
558 int32_t dumpmemory_marker(void)
563 void dumpmemory_release(int32_t size)
568 /* package ********************************************************************/
570 /* void package_add(java_handle_t *packagename) */
571 void package_add(utf *packagename)
577 /* primitive ******************************************************************/
579 classinfo *primitive_arrayclass_get_by_type(int type)
584 classinfo *primitive_class_get_by_type(int type)
590 classinfo *primitive_class_get_by_char(char ch)
597 /* properties *****************************************************************/
599 void properties_add(char *key, char *value)
603 char *properties_get(char *key)
609 /* resolve ********************************************************************/
611 bool resolve_class_from_typedesc(typedesc *d, bool checkaccess, bool link, classinfo **result)
618 /* stupid resolving implementation used by resolve_classref_or_classinfo_eager */
619 /* This function does eager resolving without any access checks. */
621 static classinfo * dummy_resolve_class_from_name(classinfo *referer,
625 classinfo *cls = NULL;
632 /* lookup if this class has already been loaded */
634 cls = classcache_lookup(referer->classloader, classname);
637 /* resolve array types */
639 if (classname->text[0] == '[') {
640 utf_ptr = classname->text + 1;
641 len = classname->blength - 1;
643 /* classname is an array type name */
651 /* the component type is a reference type */
652 /* resolve the component type */
653 if ((cls = dummy_resolve_class_from_name(referer,
654 utf_new(utf_ptr,len),
655 checkaccess)) == NULL)
656 return NULL; /* exception */
658 /* create the array class */
659 cls = class_array_of(cls,false);
661 return NULL; /* exception */
667 if (!(cls = load_class_from_classloader(classname,
668 referer->classloader)))
669 return false; /* exception */
673 /* the class is now loaded */
675 assert(cls->state & CLASS_LOADED);
681 classinfo * resolve_classref_or_classinfo_eager(classref_or_classinfo cls,
688 if (IS_CLASSREF(cls)) {
689 /* we must resolve this reference */
691 if ((c = dummy_resolve_class_from_name(cls.ref->referer, cls.ref->name,
692 checkaccess)) == NULL)
696 /* cls has already been resolved */
701 assert(c->state & CLASS_LOADED);
708 /* stacktrace *****************************************************************/
710 java_handle_objectarray_t *stacktrace_getClassContext()
716 /* threads ********************************************************************/
718 intptr_t threads_get_current_tid(void)
723 void threads_cast_stopworld(void)
727 void threads_cast_startworld(void)
732 /* vm *************************************************************************/
734 void vm_printconfig(void)
738 void vm_abort(const char *text, ...)
743 vfprintf(stderr, text, ap);
749 void vm_abort_errno(const char *text, ...)
754 vm_abort_errnum(errno, text, ap);
758 void vm_abort_errnum(int errnum, const char *text, ...)
765 log_vprint(text, ap);
768 log_print(": %s", system_strerror(errnum));
774 java_handle_t *vm_call_method(methodinfo *m, java_handle_t *o, ...)
782 void stringtable_update(void)
784 log_println("stringtable_update: REMOVE ME!");
787 java_object_t *literalstring_new(utf *u)
789 log_println("literalstring_new: REMOVE ME!");
795 void print_dynamic_super_statistics(void)
800 #if defined(ENABLE_VMLOG)
801 void vmlog_cacao_set_prefix(const char *arg)
805 void vmlog_cacao_set_stringprefix(const char *arg)
809 void vmlog_cacao_set_ignoreprefix(const char *arg)
816 * These are local overrides for various environment variables in Emacs.
817 * Please do not remove this and leave it at the end of the file, where
818 * Emacs will automagically detect them.
819 * ---------------------------------------------------------------------
822 * indent-tabs-mode: t
826 * vim:noexpandtab:sw=4:ts=4: