/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This file is part of SableVM. * * See the file "LICENSE" for Copyright information and the * * terms and conditions for copying, distribution and * * modification of SableVM. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* m4svm_file_name */ /* ---------------------------------------------------------------------- m4svm_create_link_and_initialize_class ---------------------------------------------------------------------- */ void m4_dnl () { m4svm_define_begin v = ":], [:m4svm_create_link_and_initialize_class:])"; /* Create[:,:] link[:,:] and initialize class: $1 */ if (_svmm_create_class (env, vm->class_loading.boot_loader.class_loader_info, "$1", vm->class_loading.boot_loader.classes.$2) != JNI_OK) { return JNI_ERR; } if (_svmf_link_class (env, vm->class_loading.boot_loader.classes.$2) != JNI_OK) { return JNI_ERR; } if (_svmf_special_initialization (env, vm->class_loading.boot_loader.classes.$2) != JNI_OK) { return JNI_ERR; } m4svm_define_end v = ":])"; } /* ---------------------------------------------------------------------- m4svm_create_and_link_array ---------------------------------------------------------------------- */ void m4_dnl () { m4svm_define_begin v = ":], [:m4svm_create_and_link_array:])"; /* Create and link array: $1 */ if (_svmm_create_array (env, vm->class_loading.boot_loader.class_loader_info, "$1", vm->class_loading.boot_loader.classes.$2) != JNI_OK) { return JNI_ERR; } if (_svmf_link_array (env, vm->class_loading.boot_loader.classes.$2) != JNI_OK) { return JNI_ERR; } m4svm_define_end v = ":])"; } /* ---------------------------------------------------------------------- m4svm_find_method ---------------------------------------------------------------------- */ void m4_dnl () { m4svm_define_begin v = ":], [:m4svm_find_method:])"; /* Find method: $3.$1$2 */ vm->class_loading.boot_loader.methods.$3_$4 = _svmf_resolve_method (vm->class_loading.boot_loader.classes.$3, "$1", "$2"); if (vm->class_loading.boot_loader.methods.$3_$4 == NULL) { _svmf_error_NoSuchMethodError (env); return JNI_ERR; } m4svm_define_end v = ":])"; } /* ---------------------------------------------------------------------- m4svm_find_field ---------------------------------------------------------------------- */ void m4_dnl () { m4svm_define_begin v = ":], [:m4svm_find_field:])"; /* Find field: $3.($2)$1 */ vm->class_loading.boot_loader.fields.$3_$4 = _svmf_resolve_field (vm->class_loading.boot_loader.classes.$3, "$1", "$2"); if (vm->class_loading.boot_loader.fields.$3_$4 == NULL) { _svmf_error_NoSuchFieldError (env); return JNI_ERR; } m4svm_define_end v = ":])"; } /* ---------------------------------------------------------------------- m4svm_instantiate_and_init_primitive_type ---------------------------------------------------------------------- */ void m4_dnl () { m4svm_define_begin v = ":], [:m4svm_instantiate_and_init_primitive_type:])"; /* instantiate and init the $2 class instance */ { jobject obj; if (_svmm_new_native_global (env, obj) != JNI_OK) { return JNI_ERR; } if (_svmm_new_object_instance (env, vm->class_loading.boot_loader.classes.jlclass, *obj) != JNI_OK) { _svmm_free_native_global (env, obj); return JNI_ERR; } if (_svmm_invoke_nonvirtual_jlclass_init_primitive (env, obj, '$1') != JNI_OK) { _svmm_free_native_global (env, obj); return JNI_ERR; } vm->class_loading.boot_loader.instances.$2_type = obj; } m4svm_define_end v = ":])"; } /* ---------------------------------------------------------------------- m4svm_instantiate_and_init_error ---------------------------------------------------------------------- */ void m4_dnl () { m4svm_define_begin v = ":], [:m4svm_instantiate_and_init_error:])"; /* instantiate and init the default $1 instance */ { jobject error; if (_svmm_new_native_global (env, error) != JNI_OK) { return JNI_ERR; } if (_svmm_new_object_instance (env, vm->class_loading.boot_loader.classes.$1, *error) != JNI_OK) { _svmm_free_native_global (env, error); return JNI_ERR; } if (_svmm_invoke_nonvirtual_$1_init (env, error, NULL) != JNI_OK) { _svmm_free_native_global (env, error); return JNI_ERR; } vm->class_loading.boot_loader.instances.default_$1 = error; } m4svm_define_end v = ":])"; } /* m4svm_on(0)m4_dnl */ /* ---------------------------------------------------------------------- _svmf_bootstrap ---------------------------------------------------------------------- */ static jint _svmf_bootstrap (_svmt_JNIEnv *env) { _svmt_JavaVM *vm = env->vm; /* We must create the following classes and array first. This will allow us to create java/lang/Class instances. Initialization is done in a special way. Initialization checks that there is no method. This is a requirement SableVM imposes on classes internally created. Rationale: Initialization can possibly cause the execution of an arbitrary amount of bytecode in an unrestricted number of classes. At bootstrapping time, though, SableVM is not yet ready to run arbitrary code. If you really need to use static initializers in such classes, simply put your static initializers in static inner classes; you'll achieve equivalent semantics while also complying with SableVM's "no " requirement. *[::]/ m4svm_off() m4svm_create_link_and_initialize_class(java/lang/Object, jlobject) m4svm_create_link_and_initialize_class(java/io/Serializable, jiserializable) m4svm_create_link_and_initialize_class(java/lang/Cloneable, jlcloneable) m4svm_create_and_link_array([B, byte_array) m4svm_create_link_and_initialize_class(java/lang/Class, jlclass) m4svm_on(0)m4_dnl */ /* find java/lang/Class constructor */ vm->class_loading.boot_loader.methods.jlclass_init = _svmf_resolve_method (vm->class_loading.boot_loader.classes.jlclass, "", "([B)V"); if (vm->class_loading.boot_loader.methods.jlclass_init == NULL) { _svmf_error_NoSuchMethodError (env); return JNI_ERR; } /* Now, we're ready to create "java/lang/Class" instances. IMPORTANT: Usually, this is automatically done by _svmf_create_class and _svmf_create_array, so you should not call _svmf_new_class. In this particular case, though, "java/lang/Class" was't yet created, so _svmf_create_class and _svmf_create_array were not able to invoke _svmf_new_class; so we do it now. */ /* The constructor of java.lang.Class should look like this: private Class(byte[] vmData) { this.vmData = vmData; } In bytecode: 0 aload_0 1 invokespecial 4 aload_0 5 aload_1 6 putfield 9 return */ if (_svmf_new_class (env, _svmf_cast_type_class (vm->class_loading.boot_loader.classes.jlobject)) != JNI_OK) { return JNI_ERR; } if (_svmf_new_class (env, _svmf_cast_type_class (vm->class_loading.boot_loader.classes.jiserializable)) != JNI_OK) { return JNI_ERR; } if (_svmf_new_class (env, _svmf_cast_type_class (vm->class_loading.boot_loader.classes.jlcloneable)) != JNI_OK) { return JNI_ERR; } if (_svmf_new_class (env, _svmf_cast_type_array (vm->class_loading.boot_loader.classes.byte_array)) != JNI_OK) { return JNI_ERR; } if (_svmf_new_class (env, _svmf_cast_type_class (vm->class_loading.boot_loader.classes.jlclass)) != JNI_OK) { return JNI_ERR; } /* create, link, and intialize various classes and arrays *[::]/ m4svm_off() m4svm_create_link_and_initialize_class(java/lang/StackTraceElement, jlstacktraceelement) m4svm_create_link_and_initialize_class(java/lang/reflect/Constructor, jlrconstructor) m4svm_create_link_and_initialize_class(java/lang/reflect/Field, jlrfield) m4svm_create_link_and_initialize_class(java/lang/reflect/Method, jlrmethod) m4svm_create_link_and_initialize_class(java/lang/StringCreator, stringcreator) m4svm_create_link_and_initialize_class(java/lang/VirtualMachine, virtualmachine) m4svm_create_and_link_array([Z, boolean_array) m4svm_create_and_link_array([S, short_array) m4svm_create_and_link_array([C, char_array) m4svm_create_and_link_array([I, int_array) m4svm_create_and_link_array([J, long_array) m4svm_create_and_link_array([F, float_array) m4svm_create_and_link_array([D, double_array) m4svm_create_link_and_initialize_class(java/lang/ArithmeticException, ArithmeticException) m4svm_create_link_and_initialize_class(java/lang/ArrayIndexOutOfBoundsException, ArrayIndexOutOfBoundsException) m4svm_create_link_and_initialize_class(java/lang/ArrayStoreException, ArrayStoreException) m4svm_create_link_and_initialize_class(java/lang/ClassCastException, ClassCastException) m4svm_create_link_and_initialize_class(java/lang/IllegalMonitorStateException, IllegalMonitorStateException) m4svm_create_link_and_initialize_class(java/lang/NegativeArraySizeException, NegativeArraySizeException) m4svm_create_link_and_initialize_class(java/lang/NoSuchFieldException, NoSuchFieldException) m4svm_create_link_and_initialize_class(java/lang/NoSuchMethodException, NoSuchMethodException) m4svm_create_link_and_initialize_class(java/lang/NullPointerException, NullPointerException) m4svm_create_link_and_initialize_class(java/lang/AbstractMethodError, AbstractMethodError) m4svm_create_link_and_initialize_class(java/lang/ClassCircularityError, ClassCircularityError) m4svm_create_link_and_initialize_class(java/lang/ClassFormatError, ClassFormatError) m4svm_create_link_and_initialize_class(java/lang/ExceptionInInitializerError, ExceptionInInitializerError) m4svm_create_link_and_initialize_class(java/lang/IncompatibleClassChangeError, IncompatibleClassChangeError) m4svm_create_link_and_initialize_class(java/lang/InternalError, InternalError) m4svm_create_link_and_initialize_class(java/lang/LinkageError, LinkageError) m4svm_create_link_and_initialize_class(java/lang/NoClassDefFoundError, NoClassDefFoundError) m4svm_create_link_and_initialize_class(java/lang/NoSuchFieldError, NoSuchFieldError) m4svm_create_link_and_initialize_class(java/lang/NoSuchMethodError, NoSuchMethodError) m4svm_create_link_and_initialize_class(java/lang/OutOfMemoryError, OutOfMemoryError) m4svm_create_link_and_initialize_class(java/lang/UnsatisfiedLinkError, UnsatisfiedLinkError) m4svm_create_link_and_initialize_class(java/lang/UnsupportedClassVersionError, UnsupportedClassVersionError) m4svm_create_link_and_initialize_class(java/lang/VerifyError, VerifyError) m4svm_on(0)m4_dnl */ /* find some methods *[::]/ m4svm_off() m4svm_find_method(, (C)V, jlclass, init_primitive) m4svm_find_method(, (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Z)V, jlstacktraceelement, init) m4svm_find_method(, ([B)V, jlrconstructor, init) m4svm_find_method(, ([B)V, jlrfield, init) m4svm_find_method(, ([B)V, jlrmethod, init) m4svm_find_method(createInternedString, ([B)Ljava/lang/String;, stringcreator, createinternedstring) m4svm_find_method(createString, ([B)Ljava/lang/String;, stringcreator, createstring) m4svm_find_method(getUTFChars, (Ljava/lang/String;)[B, stringcreator, getutfchars) m4svm_find_method(getUTFLength, (Ljava/lang/String;)I, stringcreator, getutflength) m4svm_find_method(initialize, (I)V, jlclass, initialize) m4svm_find_method(exceptionDescribe, (Ljava/lang/Throwable;)V, virtualmachine, exceptiondescribe) m4svm_find_method(createClass, (Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;, virtualmachine, createclass) m4svm_find_method(createArray, (Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;, virtualmachine, createarray) m4svm_find_method(createRootThread, ([B)Ljava/lang/Thread;, virtualmachine, createrootthread) m4svm_find_method(runThread, ()V, virtualmachine, runthread) m4svm_find_method(, (Ljava/lang/String;)V, ArithmeticException, init) m4svm_find_method(, (Ljava/lang/String;)V, ArrayIndexOutOfBoundsException, init) m4svm_find_method(, (Ljava/lang/String;)V, ArrayStoreException, init) m4svm_find_method(, (Ljava/lang/String;)V, ClassCastException, init) m4svm_find_method(, (Ljava/lang/String;)V, IllegalMonitorStateException, init) m4svm_find_method(, (Ljava/lang/String;)V, NegativeArraySizeException, init) m4svm_find_method(, (Ljava/lang/String;)V, NoSuchFieldException, init) m4svm_find_method(, (Ljava/lang/String;)V, NoSuchMethodException, init) m4svm_find_method(, (Ljava/lang/String;)V, NullPointerException, init) m4svm_find_method(, (Ljava/lang/String;)V, AbstractMethodError, init) m4svm_find_method(, (Ljava/lang/String;)V, ClassCircularityError, init) m4svm_find_method(, (Ljava/lang/String;)V, ClassFormatError, init) m4svm_find_method(, (Ljava/lang/String;)V, ExceptionInInitializerError, init) m4svm_find_method(, (Ljava/lang/String;)V, IncompatibleClassChangeError, init) m4svm_find_method(, (Ljava/lang/String;)V, InternalError, init) m4svm_find_method(, (Ljava/lang/String;)V, LinkageError, init) m4svm_find_method(, (Ljava/lang/String;)V, NoClassDefFoundError, init) m4svm_find_method(, (Ljava/lang/String;)V, NoSuchFieldError, init) m4svm_find_method(, (Ljava/lang/String;)V, NoSuchMethodError, init) m4svm_find_method(, (Ljava/lang/String;)V, OutOfMemoryError, init) m4svm_find_method(, (Ljava/lang/String;)V, UnsatisfiedLinkError, init) m4svm_find_method(, (Ljava/lang/String;)V, UnsupportedClassVersionError, init) m4svm_find_method(, (Ljava/lang/String;)V, VerifyError, init) m4svm_on(0)m4_dnl */ /* find some fields *[::]/ m4svm_off() m4svm_find_field(vmData, [B, jlclass, vmdata) m4svm_find_field(next, Ljava/lang/StackTraceElement;, jlstacktraceelement, next) m4svm_find_field(length, I, jlstacktraceelement, length) m4svm_on(0)m4_dnl */ /* create default error and exception instances *[::]/ m4svm_off() m4svm_instantiate_and_init_primitive_type(Z, boolean) m4svm_instantiate_and_init_primitive_type(B, byte) m4svm_instantiate_and_init_primitive_type(S, short) m4svm_instantiate_and_init_primitive_type(C, char) m4svm_instantiate_and_init_primitive_type(I, int) m4svm_instantiate_and_init_primitive_type(L, long) m4svm_instantiate_and_init_primitive_type(F, float) m4svm_instantiate_and_init_primitive_type(D, double) m4svm_instantiate_and_init_primitive_type(V, void) m4svm_instantiate_and_init_error(ArithmeticException) m4svm_instantiate_and_init_error(ArrayIndexOutOfBoundsException) m4svm_instantiate_and_init_error(ArrayStoreException) m4svm_instantiate_and_init_error(ClassCastException) m4svm_instantiate_and_init_error(IllegalMonitorStateException) m4svm_instantiate_and_init_error(NegativeArraySizeException) m4svm_instantiate_and_init_error(NoSuchFieldException) m4svm_instantiate_and_init_error(NoSuchMethodException) m4svm_instantiate_and_init_error(NullPointerException) m4svm_instantiate_and_init_error(ExceptionInInitializerError) m4svm_instantiate_and_init_error(AbstractMethodError) m4svm_instantiate_and_init_error(ClassCircularityError) m4svm_instantiate_and_init_error(ClassFormatError) m4svm_instantiate_and_init_error(IncompatibleClassChangeError) m4svm_instantiate_and_init_error(InternalError) m4svm_instantiate_and_init_error(LinkageError) m4svm_instantiate_and_init_error(NoClassDefFoundError) m4svm_instantiate_and_init_error(NoSuchFieldError) m4svm_instantiate_and_init_error(NoSuchMethodError) m4svm_instantiate_and_init_error(OutOfMemoryError) m4svm_instantiate_and_init_error(UnsatisfiedLinkError) m4svm_instantiate_and_init_error(UnsupportedClassVersionError) m4svm_instantiate_and_init_error(VerifyError) m4svm_on(0)m4_dnl */ return JNI_OK; }