#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
+#include <assert.h>
#if defined(ENABLE_THREADS)
# include <pthread.h>
#include "vm/global.h"
#include "vm/vm.h"
-#include "vm/jit/code.h"
-
#include "vmcore/class.h"
#include "vmcore/method.h"
#include "vmcore/utf8.h"
+#include "vmcore/classcache.h"
+#include "vmcore/loader.h"
/* global variables ***********************************************************/
abort();
}
+void intrp_asm_abstractmethoderror(void)
+{
+ abort();
+}
+
+void asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out)
+{
+ abort();
+}
+
+void intrp_asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out)
+{
+ abort();
+}
+
/* builtin ********************************************************************/
return NULL;
}
+java_objectarray *builtin_anewarray(s4 size, classinfo *componentclass)
+{
+ abort();
+
+ return NULL;
+}
+
/* code ***********************************************************************/
}
+methodinfo *code_get_methodinfo_for_pv(u1 *pv)
+{
+ return NULL;
+}
+
+
/* codegen ********************************************************************/
codeinfo *codegen_createnativestub(functionptr f, methodinfo *m)
abort();
}
+void exceptions_throw_noclassdeffounderror_wrong_name(classinfo *c, utf *name)
+{
+ fprintf(stderr, "java.lang.NoClassDefFoundError: ");
+ utf_fprint_printable_ascii(stderr, c->name);
+ fprintf(stderr, " (wrong name: ");
+ utf_fprint_printable_ascii(stderr, name);
+ fprintf(stderr, ")\n");
+
+ abort();
+}
+
void exceptions_throw_outofmemoryerror(void)
{
fprintf(stderr, "java.lang.OutOfMemoryError\n");
}
+/* gc *************************************************************************/
+
+s8 gc_get_heap_size(void)
+{
+ return 0;
+}
+
+s8 gc_get_free_bytes(void)
+{
+ return 0;
+}
+
+s8 gc_get_total_bytes(void)
+{
+ return 0;
+}
+
+s8 gc_get_max_heap_size(void)
+{
+ return 0;
+}
+
+
/* heap ***********************************************************************/
void *heap_alloc_uncollectable(u4 bytelength)
return calloc(bytelength, 1);
}
+s4 heap_get_hashcode(java_objectheader *o)
+{
+ return 0;
+}
+
/* jit ************************************************************************/
void *mem_alloc(s4 size)
{
- return malloc(size);
+ /* real implementation in src/mm/memory.c clears memory */
+
+ return calloc(size, 1);
}
void *mem_realloc(void *src, s4 len1, s4 len2)
}
-/* stacktrace *****************************************************************/
+/* resolve ********************************************************************/
-java_objectarray *stacktrace_getClassContext()
+bool resolve_class_from_typedesc(typedesc *d, bool checkaccess, bool link, classinfo **result)
{
- return NULL;
+ abort();
+
+ return false;
}
+/* stupid resolving implementation used by resolve_classref_or_classinfo_eager */
+/* This function does eager resolving without any access checks. */
-/* threads ********************************************************************/
+static classinfo * dummy_resolve_class_from_name(classinfo *referer,
+ utf *classname,
+ bool checkaccess)
+{
+ classinfo *cls = NULL;
+ char *utf_ptr;
+ int len;
+
+ assert(referer);
+ assert(classname);
+
+ /* lookup if this class has already been loaded */
-pthread_key_t threads_current_threadobject_key;
+ cls = classcache_lookup(referer->classloader, classname);
-ptrint threads_get_current_tid(void)
-{
- return 0;
-}
+ if (!cls) {
+ /* resolve array types */
+
+ if (classname->text[0] == '[') {
+ utf_ptr = classname->text + 1;
+ len = classname->blength - 1;
+
+ /* classname is an array type name */
+
+ switch (*utf_ptr) {
+ case 'L':
+ utf_ptr++;
+ len -= 2;
+ /* FALLTHROUGH */
+ case '[':
+ /* the component type is a reference type */
+ /* resolve the component type */
+ if ((cls = dummy_resolve_class_from_name(referer,
+ utf_new(utf_ptr,len),
+ checkaccess)) == NULL)
+ return NULL; /* exception */
+
+ /* create the array class */
+ cls = class_array_of(cls,false);
+ if (!cls)
+ return NULL; /* exception */
+ }
+ }
+ /* load the class */
+ if (!cls) {
+ if (!(cls = load_class_from_classloader(classname,
+ referer->classloader)))
+ return false; /* exception */
+ }
+ }
-/* typeinfo *******************************************************************/
+ /* the class is now loaded */
+ assert(cls);
+ assert(cls->state & CLASS_LOADED);
-bool typeinfo_init_class(typeinfo *info, classref_or_classinfo c)
+ return cls;
+}
+
+
+classinfo * resolve_classref_or_classinfo_eager(classref_or_classinfo cls,
+ bool checkaccess)
{
- return true;
+ classinfo *c;
+
+ assert(cls.any);
+
+ if (IS_CLASSREF(cls)) {
+ /* we must resolve this reference */
+
+ if ((c = dummy_resolve_class_from_name(cls.ref->referer, cls.ref->name,
+ checkaccess)) == NULL)
+ return NULL;
+ }
+ else {
+ /* cls has already been resolved */
+ c = cls.cls;
+ }
+
+ assert(c);
+ assert(c->state & CLASS_LOADED);
+
+ /* succeeded */
+ return c;
}
-void typeinfo_init_classinfo(typeinfo *info, classinfo *c)
+
+/* stacktrace *****************************************************************/
+
+java_objectarray *stacktrace_getClassContext()
{
+ return NULL;
}
-typecheck_result typeinfo_is_assignable_to_class(typeinfo *value, classref_or_classinfo dest)
+
+/* threads ********************************************************************/
+
+pthread_key_t threads_current_threadobject_key;
+
+ptrint threads_get_current_tid(void)
{
- return typecheck_TRUE;
+ return 0;
}
}
+void print_dynamic_super_statistics(void)
+{
+}
+
+
/*
* These are local overrides for various environment variables in Emacs.
* Please do not remove this and leave it at the end of the file, where