1 /* src/cacaoh/dummy.c - dummy functions for cacaoh
3 Copyright (C) 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
36 #include "mm/memory.h"
38 #include "native/llni.h"
40 #include "toolbox/logging.h"
42 #include "vm/global.h"
43 #include "vm/primitive.h"
46 #include "vmcore/class.h"
47 #include "vmcore/method.h"
48 #include "vmcore/utf8.h"
49 #include "vmcore/classcache.h"
50 #include "vmcore/loader.h"
53 /* global variables ***********************************************************/
55 char *_Jv_bootclasspath;
58 java_handle_t *javastring_new_slash_to_dot(utf *u)
60 vm_abort("javastring_new_slash_to_dot");
66 /* access *********************************************************************/
68 bool access_is_accessible_class(classinfo *referer, classinfo *cls)
73 bool access_is_accessible_member(classinfo *referer, classinfo *declarer,
76 vm_abort("access_is_accessible_member");
82 /* array **********************************************************************/
84 java_handle_t *array_objectarray_element_get(java_handle_objectarray_t *a, int32_t index)
90 log_println("array_objectarray_element_get(a=%p, index=%d): NullPointerException", a, index);
94 size = LLNI_array_size(a);
96 if ((index < 0) || (index > size)) {
97 log_println("array_objectarray_element_get(a=%p, index=%d): ArrayIndexOutOfBoundsException", a, index);
101 LLNI_objectarray_element_get(a, index, value);
106 void array_objectarray_element_set(java_handle_objectarray_t *a, int32_t index, java_handle_t *value)
111 log_println("array_objectarray_element_set(a=%p, index=%d): NullPointerException", a, index);
115 size = LLNI_array_size(a);
117 if ((index < 0) || (index > size)) {
118 log_println("array_objectarray_element_set(a=%p, index=%d): ArrayIndexOutOfBoundsException", a, index);
122 LLNI_objectarray_element_set(a, index, value);
125 int32_t array_length_get(java_handle_t *a)
128 log_println("array_length_get(a=%p): NullPointerException", a);
132 return LLNI_array_size(a);
136 /* asm ************************************************************************/
138 void asm_abstractmethoderror(void)
143 void intrp_asm_abstractmethoderror(void)
148 void asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out)
153 void intrp_asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out)
159 /* builtin ********************************************************************/
161 java_handle_t *builtin_clone(void *env, java_handle_t *o)
168 int32_t builtin_isanysubclass(classinfo *sub, classinfo *super)
175 java_handle_t *builtin_new(classinfo *c)
182 java_handle_objectarray_t *builtin_anewarray(int32_t size, classinfo *componentclass)
184 java_objectarray_t *oa = (java_objectarray_t*) mem_alloc(
185 sizeof(java_array_t) + size * sizeof(java_object_t*));
186 java_handle_objectarray_t *h = (java_handle_objectarray_t*) LLNI_WRAP(
187 (java_object_t*) oa);
190 LLNI_array_size(h) = size;
196 java_handle_bytearray_t *builtin_newarray_byte(int32_t size)
198 java_bytearray_t *ba = (java_bytearray_t*) mem_alloc(
199 sizeof(java_array_t) + size * sizeof(int8_t));
200 java_handle_bytearray_t *h = (java_handle_bytearray_t*) LLNI_WRAP(
201 (java_object_t*) ba);
204 LLNI_array_size(h) = size;
211 /* code ***********************************************************************/
213 void code_free_code_of_method(methodinfo *m)
218 methodinfo *code_get_methodinfo_for_pv(u1 *pv)
224 /* codegen ********************************************************************/
226 u1 *codegen_generate_stub_compiler(methodinfo *m)
231 codeinfo *codegen_generate_stub_native(methodinfo *m, functionptr f)
236 #if defined(ENABLE_INTRP)
237 u1 *intrp_createcompilerstub(methodinfo *m)
243 void removecompilerstub(u1 *stub)
247 void removenativestub(u1 *stub)
252 /* exceptions *****************************************************************/
254 void exceptions_clear_exception(void)
258 void exceptions_print_current_exception(void)
263 void exceptions_throw_abstractmethoderror(void)
265 fprintf(stderr, "java.lang.AbstractMethodError\n");
270 void exceptions_throw_classcircularityerror(classinfo *c)
272 fprintf(stderr, "java.lang.ClassCircularityError: ");
274 utf_display_printable_ascii(c->name);
280 void exceptions_throw_classformaterror(classinfo *c, const char *message, ...)
284 fprintf(stderr, "java.lang.ClassFormatError: ");
286 utf_display_printable_ascii(c->name);
287 fprintf(stderr, ": ");
289 va_start(ap, message);
290 vfprintf(stderr, message, ap);
298 void exceptions_throw_incompatibleclasschangeerror(classinfo *c)
300 fprintf(stderr, "java.lang.IncompatibleClassChangeError: ");
303 utf_fprint_printable_ascii_classname(stderr, c->name);
310 void exceptions_throw_internalerror(const char *message, ...)
314 fprintf(stderr, "java.lang.InternalError: ");
316 va_start(ap, message);
317 vfprintf(stderr, message, ap);
323 void exceptions_throw_linkageerror(const char *message, classinfo *c)
325 fprintf(stderr, "java.lang.LinkageError: %s", message);
328 utf_fprint_printable_ascii_classname(stderr, c->name);
335 void exceptions_throw_noclassdeffounderror(utf *name)
337 fprintf(stderr, "java.lang.NoClassDefFoundError: ");
338 utf_fprint_printable_ascii(stderr, name);
344 void exceptions_throw_noclassdeffounderror_wrong_name(classinfo *c, utf *name)
346 fprintf(stderr, "java.lang.NoClassDefFoundError: ");
347 utf_fprint_printable_ascii(stderr, c->name);
348 fprintf(stderr, " (wrong name: ");
349 utf_fprint_printable_ascii(stderr, name);
350 fprintf(stderr, ")\n");
355 void exceptions_throw_verifyerror(methodinfo *m, const char *message)
357 fprintf(stderr, "java.lang.VerifyError: ");
358 utf_fprint_printable_ascii(stderr, m->name);
359 fprintf(stderr, ": %s", message);
364 void exceptions_throw_nosuchfielderror(classinfo *c, utf *name)
366 fprintf(stderr, "java.lang.NoSuchFieldError: ");
367 utf_fprint_printable_ascii(stderr, c->name);
368 fprintf(stderr, ".");
369 utf_fprint_printable_ascii(stderr, name);
375 void exceptions_throw_nosuchmethoderror(classinfo *c, utf *name, utf *desc)
377 fprintf(stderr, "java.lang.NoSuchMethodError: ");
378 utf_fprint_printable_ascii(stderr, c->name);
379 fprintf(stderr, ".");
380 utf_fprint_printable_ascii(stderr, name);
381 utf_fprint_printable_ascii(stderr, desc);
387 void exceptions_throw_unsupportedclassversionerror(classinfo *c,
388 const char *message, ...)
392 fprintf(stderr, "java.lang.UnsupportedClassVersionError: " );
394 utf_display_printable_ascii(c->name);
395 fprintf(stderr, ": ");
397 va_start(ap, message);
398 vfprintf(stderr, message, ap);
406 void exceptions_throw_classnotfoundexception(utf *name)
408 fprintf(stderr, "java.lang.ClassNotFoundException: ");
409 utf_fprint_printable_ascii(stderr, name);
415 void exceptions_throw_nullpointerexception(void)
417 fprintf(stderr, "java.lang.NullPointerException\n");
423 /* finalizer ******************************************************************/
425 void finalizer_notify(void)
427 vm_abort("finalizer_notify");
430 void finalizer_run(void *o, void *p)
432 vm_abort("finalizer_run");
436 /* gc *************************************************************************/
438 void gc_reference_register(java_object_t **ref, int32_t reftype)
440 vm_abort("gc_reference_register");
443 int64_t gc_get_heap_size(void)
448 int64_t gc_get_free_bytes(void)
453 int64_t gc_get_total_bytes(void)
458 int64_t gc_get_max_heap_size(void)
464 /* heap ***********************************************************************/
466 void *heap_alloc_uncollectable(uint32_t bytelength)
468 return calloc(bytelength, 1);
471 s4 heap_get_hashcode(java_object_t *o)
477 /* jit ************************************************************************/
479 void jit_invalidate_code(methodinfo *m)
481 vm_abort("jit_invalidate_code");
485 /* llni ***********************************************************************/
487 void llni_critical_start()
489 vm_abort("llni_critical_start");
492 void llni_critical_end()
494 vm_abort("llni_critical_end");
498 /* localref *******************************************************************/
500 java_handle_t *localref_add(java_object_t *o)
502 #if defined(ENABLE_HANDLES)
503 java_handle_t *h = (java_handle_t*) mem_alloc(sizeof(java_handle_t));
509 return (java_handle_t*) o;
514 /* lock ***********************************************************************/
516 void lock_init_object_lock(java_object_t *o)
520 bool lock_monitor_enter(java_object_t *o)
525 bool lock_monitor_exit(java_object_t *o)
531 /* md *************************************************************************/
533 void md_param_alloc(methoddesc *md)
537 void md_param_alloc_native(methoddesc *md)
542 /* memory *********************************************************************/
544 void *mem_alloc(int32_t size)
546 /* real implementation in src/mm/memory.c clears memory */
548 return calloc(size, 1);
551 void *mem_realloc(void *src, int32_t len1, int32_t len2)
553 return realloc(src, len2);
556 void mem_free(void *m, int32_t size)
561 void *dump_alloc(int32_t size)
566 void dump_release(int32_t size)
570 int32_t dump_size(void)
576 /* package ********************************************************************/
578 /* void package_add(java_handle_t *packagename) */
579 void package_add(utf *packagename)
585 /* primitive ******************************************************************/
587 classinfo *primitive_arrayclass_get_by_type(int type)
592 classinfo *primitive_class_get_by_type(int type)
598 classinfo *primitive_class_get_by_char(char ch)
605 /* properties *****************************************************************/
607 void properties_add(char *key, char *value)
611 char *properties_get(char *key)
617 /* resolve ********************************************************************/
619 bool resolve_class_from_typedesc(typedesc *d, bool checkaccess, bool link, classinfo **result)
626 /* stupid resolving implementation used by resolve_classref_or_classinfo_eager */
627 /* This function does eager resolving without any access checks. */
629 static classinfo * dummy_resolve_class_from_name(classinfo *referer,
633 classinfo *cls = NULL;
640 /* lookup if this class has already been loaded */
642 cls = classcache_lookup(referer->classloader, classname);
645 /* resolve array types */
647 if (classname->text[0] == '[') {
648 utf_ptr = classname->text + 1;
649 len = classname->blength - 1;
651 /* classname is an array type name */
659 /* the component type is a reference type */
660 /* resolve the component type */
661 if ((cls = dummy_resolve_class_from_name(referer,
662 utf_new(utf_ptr,len),
663 checkaccess)) == NULL)
664 return NULL; /* exception */
666 /* create the array class */
667 cls = class_array_of(cls,false);
669 return NULL; /* exception */
675 if (!(cls = load_class_from_classloader(classname,
676 referer->classloader)))
677 return false; /* exception */
681 /* the class is now loaded */
683 assert(cls->state & CLASS_LOADED);
689 classinfo * resolve_classref_or_classinfo_eager(classref_or_classinfo cls,
696 if (IS_CLASSREF(cls)) {
697 /* we must resolve this reference */
699 if ((c = dummy_resolve_class_from_name(cls.ref->referer, cls.ref->name,
700 checkaccess)) == NULL)
704 /* cls has already been resolved */
709 assert(c->state & CLASS_LOADED);
716 /* stacktrace *****************************************************************/
718 java_handle_objectarray_t *stacktrace_getClassContext()
724 /* threads ********************************************************************/
726 intptr_t threads_get_current_tid(void)
731 void threads_cast_stopworld(void)
735 void threads_cast_startworld(void)
740 /* vm *************************************************************************/
742 void vm_printconfig(void)
746 void vm_abort(const char *text, ...)
750 /* print the log message */
753 vfprintf(stderr, text, ap);
756 /* now abort the VM */
761 java_handle_t *vm_call_method(methodinfo *m, java_handle_t *o, ...)
769 void stringtable_update(void)
771 log_println("stringtable_update: REMOVE ME!");
774 java_object_t *literalstring_new(utf *u)
776 log_println("literalstring_new: REMOVE ME!");
782 void print_dynamic_super_statistics(void)
788 * These are local overrides for various environment variables in Emacs.
789 * Please do not remove this and leave it at the end of the file, where
790 * Emacs will automagically detect them.
791 * ---------------------------------------------------------------------
794 * indent-tabs-mode: t
798 * vim:noexpandtab:sw=4:ts=4: