1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* This source file is part of SableVM. *
* *
* See the file "LICENSE" for the copyright information and for *
* the terms and conditions for copying, distribution and *
* modification of this source file. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
----------------------------------------------------------------------
_svmf_link_array
----------------------------------------------------------------------
*/
svm_static jint
_svmf_link_array (_svmt_JNIEnv *env, _svmt_array_info *array)
{
_svmt_JavaVM *vm = env->vm;
jboolean monitor_acquired = JNI_FALSE;
if (vm->initialization == NULL)
{
if (_svmf_enter_class_loader_monitor (env, array->class_loader_info) !=
JNI_OK)
{
goto error;
}
monitor_acquired = JNI_TRUE;
}
if (_svmf_prepare_array (env, array) != JNI_OK)
{
goto error;
}
if (monitor_acquired)
{
monitor_acquired = JNI_FALSE;
if (_svmf_exit_class_loader_monitor (env, array->class_loader_info) !=
JNI_OK)
{
goto error;
}
}
return JNI_OK;
error:
if (monitor_acquired)
{
monitor_acquired = JNI_FALSE;
if (_svmf_exit_class_loader_monitor (env, array->class_loader_info) !=
JNI_OK)
{
goto error;
}
}
return JNI_ERR;
}
/*
----------------------------------------------------------------------
_svmf_link_class
----------------------------------------------------------------------
*/
svm_static jint
_svmf_link_class (_svmt_JNIEnv *env, _svmt_class_info *class)
{
_svmt_JavaVM *vm = env->vm;
jboolean monitor_acquired = JNI_FALSE;
if (vm->initialization == NULL)
{
if (_svmf_enter_class_loader_monitor (env, class->class_loader_info) !=
JNI_OK)
{
goto error;
}
monitor_acquired = JNI_TRUE;
}
if (_svmf_verify_class (env, class) != JNI_OK)
{
goto error;
}
if (_svmf_prepare_class (env, class) != JNI_OK)
{
goto error;
}
if (monitor_acquired)
{
monitor_acquired = JNI_FALSE;
if (_svmf_exit_class_loader_monitor (env, class->class_loader_info) !=
JNI_OK)
{
goto error;
}
}
return JNI_OK;
error:
if (monitor_acquired)
{
monitor_acquired = JNI_FALSE;
if (_svmf_exit_class_loader_monitor (env, class->class_loader_info) !=
JNI_OK)
{
goto error;
}
}
return JNI_ERR;
}
/*
----------------------------------------------------------------------
_svmf_link_type
----------------------------------------------------------------------
*/
svm_static jint
_svmf_link_type (_svmt_JNIEnv *env, _svmt_type_info *type)
{
if (type->is_array)
{
return _svmf_link_array (env, _svmf_cast_array (type));
}
return _svmf_link_class (env, _svmf_cast_class (type));
}
|