1240 if (initialSkip > 0) {
1241 initialSkip--;
1242 } else {
1243 ScopeDesc* scope = cvf->scope();
1244 // native wrappers do not have a scope
1245 if (scope != NULL && scope->objects() != NULL) {
1246 GrowableArray<ScopeValue*>* objects;
1247 if (!realloc_called) {
1248 objects = scope->objects();
1249 } else {
1250 // some object might already have been re-allocated, only reallocate the non-allocated ones
1251 objects = new GrowableArray<ScopeValue*>(scope->objects()->length());
1252 for (int i = 0; i < scope->objects()->length(); i++) {
1253 ObjectValue* sv = (ObjectValue*) scope->objects()->at(i);
1254 if (sv->value().is_null()) {
1255 objects->append(sv);
1256 }
1257 }
1258 }
1259 bool realloc_failures = Deoptimization::realloc_objects(thread, fst.current(), fst.register_map(), objects, CHECK_NULL);
1260 Deoptimization::reassign_fields(fst.current(), fst.register_map(), objects, realloc_failures, false);
1261 realloc_called = true;
1262
1263 GrowableArray<ScopeValue*>* local_values = scope->locals();
1264 assert(local_values != NULL, "NULL locals");
1265 typeArrayOop array_oop = oopFactory::new_boolArray(local_values->length(), CHECK_NULL);
1266 typeArrayHandle array(THREAD, array_oop);
1267 for (int i = 0; i < local_values->length(); i++) {
1268 ScopeValue* value = local_values->at(i);
1269 if (value->is_object()) {
1270 array->bool_at_put(i, true);
1271 }
1272 }
1273 HotSpotJVMCI::HotSpotStackFrameReference::set_localIsVirtual(JVMCIENV, frame_reference(), array());
1274 } else {
1275 HotSpotJVMCI::HotSpotStackFrameReference::set_localIsVirtual(JVMCIENV, frame_reference(), NULL);
1276 }
1277
1278 locals = cvf->locals();
1279 HotSpotJVMCI::HotSpotStackFrameReference::set_bci(JVMCIENV, frame_reference(), cvf->bci());
1280 methodHandle mh(THREAD, cvf->method());
1500 break;
1501 }
1502 vf = vf->sender();
1503 }
1504
1505 int last_frame_number = JVMCIENV->get_HotSpotStackFrameReference_frameNumber(hs_frame);
1506 if (last_frame_number >= virtualFrames->length()) {
1507 JVMCI_THROW_MSG(IllegalStateException, "invalid frame number");
1508 }
1509
1510 // Reallocate the non-escaping objects and restore their fields.
1511 assert (virtualFrames->at(last_frame_number)->scope() != NULL,"invalid scope");
1512 GrowableArray<ScopeValue*>* objects = virtualFrames->at(last_frame_number)->scope()->objects();
1513
1514 if (objects == NULL) {
1515 // no objects to materialize
1516 return;
1517 }
1518
1519 bool realloc_failures = Deoptimization::realloc_objects(thread, fstAfterDeopt.current(), fstAfterDeopt.register_map(), objects, CHECK);
1520 Deoptimization::reassign_fields(fstAfterDeopt.current(), fstAfterDeopt.register_map(), objects, realloc_failures, false);
1521
1522 for (int frame_index = 0; frame_index < virtualFrames->length(); frame_index++) {
1523 compiledVFrame* cvf = virtualFrames->at(frame_index);
1524
1525 GrowableArray<ScopeValue*>* scopeLocals = cvf->scope()->locals();
1526 StackValueCollection* locals = cvf->locals();
1527 if (locals != NULL) {
1528 for (int i2 = 0; i2 < locals->size(); i2++) {
1529 StackValue* var = locals->at(i2);
1530 if (var->type() == T_OBJECT && scopeLocals->at(i2)->is_object()) {
1531 jvalue val;
1532 val.l = cast_from_oop<jobject>(locals->at(i2)->get_obj()());
1533 cvf->update_local(T_OBJECT, i2, val);
1534 }
1535 }
1536 }
1537
1538 GrowableArray<ScopeValue*>* scopeExpressions = cvf->scope()->expressions();
1539 StackValueCollection* expressions = cvf->expressions();
1540 if (expressions != NULL) {
1899 return JVMCIENV->get_jobject(result);
1900 C2V_END
1901
1902 C2V_VMENTRY_NULL(jobjectArray, getDeclaredConstructors, (JNIEnv* env, jobject, jobject holder))
1903 if (holder == NULL) {
1904 JVMCI_THROW_0(NullPointerException);
1905 }
1906 Klass* klass = JVMCIENV->asKlass(holder);
1907 if (!klass->is_instance_klass()) {
1908 JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(0, JVMCI_CHECK_NULL);
1909 return JVMCIENV->get_jobjectArray(methods);
1910 }
1911
1912 InstanceKlass* iklass = InstanceKlass::cast(klass);
1913 // Ensure class is linked
1914 iklass->link_class(CHECK_NULL);
1915
1916 GrowableArray<Method*> constructors_array;
1917 for (int i = 0; i < iklass->methods()->length(); i++) {
1918 Method* m = iklass->methods()->at(i);
1919 if (m->is_initializer() && !m->is_static()) {
1920 constructors_array.append(m);
1921 }
1922 }
1923 JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(constructors_array.length(), JVMCI_CHECK_NULL);
1924 for (int i = 0; i < constructors_array.length(); i++) {
1925 methodHandle ctor(THREAD, constructors_array.at(i));
1926 JVMCIObject method = JVMCIENV->get_jvmci_method(ctor, JVMCI_CHECK_NULL);
1927 JVMCIENV->put_object_at(methods, i, method);
1928 }
1929 return JVMCIENV->get_jobjectArray(methods);
1930 C2V_END
1931
1932 C2V_VMENTRY_NULL(jobjectArray, getDeclaredMethods, (JNIEnv* env, jobject, jobject holder))
1933 if (holder == NULL) {
1934 JVMCI_THROW_0(NullPointerException);
1935 }
1936 Klass* klass = JVMCIENV->asKlass(holder);
1937 if (!klass->is_instance_klass()) {
1938 JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(0, JVMCI_CHECK_NULL);
1939 return JVMCIENV->get_jobjectArray(methods);
1940 }
1941
1942 InstanceKlass* iklass = InstanceKlass::cast(klass);
1943 // Ensure class is linked
1944 iklass->link_class(CHECK_NULL);
1945
1946 GrowableArray<Method*> methods_array;
1947 for (int i = 0; i < iklass->methods()->length(); i++) {
1948 Method* m = iklass->methods()->at(i);
1949 if (!m->is_initializer() && !m->is_overpass()) {
1950 methods_array.append(m);
1951 }
1952 }
1953 JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(methods_array.length(), JVMCI_CHECK_NULL);
1954 for (int i = 0; i < methods_array.length(); i++) {
1955 methodHandle mh(THREAD, methods_array.at(i));
1956 JVMCIObject method = JVMCIENV->get_jvmci_method(mh, JVMCI_CHECK_NULL);
1957 JVMCIENV->put_object_at(methods, i, method);
1958 }
1959 return JVMCIENV->get_jobjectArray(methods);
1960 C2V_END
1961
1962 C2V_VMENTRY_NULL(jobject, readFieldValue, (JNIEnv* env, jobject, jobject object, jobject field, jboolean is_volatile))
1963 if (object == NULL || field == NULL) {
1964 JVMCI_THROW_0(NullPointerException);
1965 }
1966 JVMCIObject field_object = JVMCIENV->wrap(field);
1967 JVMCIObject java_type = JVMCIENV->get_HotSpotResolvedJavaFieldImpl_type(field_object);
1968 int modifiers = JVMCIENV->get_HotSpotResolvedJavaFieldImpl_modifiers(field_object);
1969 Klass* holder = JVMCIENV->asKlass(JVMCIENV->get_HotSpotResolvedJavaFieldImpl_holder(field_object));
2521 JVMCIENV->get_nmethod(code, locker);
2522 }
2523
2524 C2V_VMENTRY_NULL(jbyteArray, getCode, (JNIEnv* env, jobject, jobject code_handle))
2525 JVMCIObject code = JVMCIENV->wrap(code_handle);
2526 nmethodLocker locker;
2527 CodeBlob* cb = JVMCIENV->get_code_blob(code, locker);
2528 if (cb == NULL) {
2529 return NULL;
2530 }
2531 int code_size = cb->code_size();
2532 JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL);
2533 JVMCIENV->copy_bytes_from((jbyte*) cb->code_begin(), result, 0, code_size);
2534 return JVMCIENV->get_jbyteArray(result);
2535 }
2536
2537 C2V_VMENTRY_NULL(jobject, asReflectionExecutable, (JNIEnv* env, jobject, jobject jvmci_method))
2538 requireInHotSpot("asReflectionExecutable", JVMCI_CHECK_NULL);
2539 methodHandle m(THREAD, JVMCIENV->asMethod(jvmci_method));
2540 oop executable;
2541 if (m->is_initializer()) {
2542 if (m->is_static_initializer()) {
2543 JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2544 "Cannot create java.lang.reflect.Method for class initializer");
2545 }
2546 executable = Reflection::new_constructor(m, CHECK_NULL);
2547 } else {
2548 executable = Reflection::new_method(m, false, CHECK_NULL);
2549 }
2550 return JNIHandles::make_local(THREAD, executable);
2551 }
2552
2553 C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index))
2554 requireInHotSpot("asReflectionField", JVMCI_CHECK_NULL);
2555 Klass* klass = JVMCIENV->asKlass(jvmci_type);
2556 if (!klass->is_instance_klass()) {
2557 JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2558 err_msg("Expected non-primitive type, got %s", klass->external_name()));
2559 }
2560 InstanceKlass* iklass = InstanceKlass::cast(klass);
2561 Array<u2>* fields = iklass->fields();
2562 if (index < 0 ||index > fields->length()) {
2563 JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2564 err_msg("Field index %d out of bounds for %s", index, klass->external_name()));
2565 }
|
1240 if (initialSkip > 0) {
1241 initialSkip--;
1242 } else {
1243 ScopeDesc* scope = cvf->scope();
1244 // native wrappers do not have a scope
1245 if (scope != NULL && scope->objects() != NULL) {
1246 GrowableArray<ScopeValue*>* objects;
1247 if (!realloc_called) {
1248 objects = scope->objects();
1249 } else {
1250 // some object might already have been re-allocated, only reallocate the non-allocated ones
1251 objects = new GrowableArray<ScopeValue*>(scope->objects()->length());
1252 for (int i = 0; i < scope->objects()->length(); i++) {
1253 ObjectValue* sv = (ObjectValue*) scope->objects()->at(i);
1254 if (sv->value().is_null()) {
1255 objects->append(sv);
1256 }
1257 }
1258 }
1259 bool realloc_failures = Deoptimization::realloc_objects(thread, fst.current(), fst.register_map(), objects, CHECK_NULL);
1260 Deoptimization::reassign_fields(fst.current(), fst.register_map(), objects, realloc_failures, false, CHECK_NULL);
1261 realloc_called = true;
1262
1263 GrowableArray<ScopeValue*>* local_values = scope->locals();
1264 assert(local_values != NULL, "NULL locals");
1265 typeArrayOop array_oop = oopFactory::new_boolArray(local_values->length(), CHECK_NULL);
1266 typeArrayHandle array(THREAD, array_oop);
1267 for (int i = 0; i < local_values->length(); i++) {
1268 ScopeValue* value = local_values->at(i);
1269 if (value->is_object()) {
1270 array->bool_at_put(i, true);
1271 }
1272 }
1273 HotSpotJVMCI::HotSpotStackFrameReference::set_localIsVirtual(JVMCIENV, frame_reference(), array());
1274 } else {
1275 HotSpotJVMCI::HotSpotStackFrameReference::set_localIsVirtual(JVMCIENV, frame_reference(), NULL);
1276 }
1277
1278 locals = cvf->locals();
1279 HotSpotJVMCI::HotSpotStackFrameReference::set_bci(JVMCIENV, frame_reference(), cvf->bci());
1280 methodHandle mh(THREAD, cvf->method());
1500 break;
1501 }
1502 vf = vf->sender();
1503 }
1504
1505 int last_frame_number = JVMCIENV->get_HotSpotStackFrameReference_frameNumber(hs_frame);
1506 if (last_frame_number >= virtualFrames->length()) {
1507 JVMCI_THROW_MSG(IllegalStateException, "invalid frame number");
1508 }
1509
1510 // Reallocate the non-escaping objects and restore their fields.
1511 assert (virtualFrames->at(last_frame_number)->scope() != NULL,"invalid scope");
1512 GrowableArray<ScopeValue*>* objects = virtualFrames->at(last_frame_number)->scope()->objects();
1513
1514 if (objects == NULL) {
1515 // no objects to materialize
1516 return;
1517 }
1518
1519 bool realloc_failures = Deoptimization::realloc_objects(thread, fstAfterDeopt.current(), fstAfterDeopt.register_map(), objects, CHECK);
1520 Deoptimization::reassign_fields(fstAfterDeopt.current(), fstAfterDeopt.register_map(), objects, realloc_failures, false, THREAD);
1521
1522 for (int frame_index = 0; frame_index < virtualFrames->length(); frame_index++) {
1523 compiledVFrame* cvf = virtualFrames->at(frame_index);
1524
1525 GrowableArray<ScopeValue*>* scopeLocals = cvf->scope()->locals();
1526 StackValueCollection* locals = cvf->locals();
1527 if (locals != NULL) {
1528 for (int i2 = 0; i2 < locals->size(); i2++) {
1529 StackValue* var = locals->at(i2);
1530 if (var->type() == T_OBJECT && scopeLocals->at(i2)->is_object()) {
1531 jvalue val;
1532 val.l = cast_from_oop<jobject>(locals->at(i2)->get_obj()());
1533 cvf->update_local(T_OBJECT, i2, val);
1534 }
1535 }
1536 }
1537
1538 GrowableArray<ScopeValue*>* scopeExpressions = cvf->scope()->expressions();
1539 StackValueCollection* expressions = cvf->expressions();
1540 if (expressions != NULL) {
1899 return JVMCIENV->get_jobject(result);
1900 C2V_END
1901
1902 C2V_VMENTRY_NULL(jobjectArray, getDeclaredConstructors, (JNIEnv* env, jobject, jobject holder))
1903 if (holder == NULL) {
1904 JVMCI_THROW_0(NullPointerException);
1905 }
1906 Klass* klass = JVMCIENV->asKlass(holder);
1907 if (!klass->is_instance_klass()) {
1908 JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(0, JVMCI_CHECK_NULL);
1909 return JVMCIENV->get_jobjectArray(methods);
1910 }
1911
1912 InstanceKlass* iklass = InstanceKlass::cast(klass);
1913 // Ensure class is linked
1914 iklass->link_class(CHECK_NULL);
1915
1916 GrowableArray<Method*> constructors_array;
1917 for (int i = 0; i < iklass->methods()->length(); i++) {
1918 Method* m = iklass->methods()->at(i);
1919 if (m->is_object_constructor()) {
1920 constructors_array.append(m);
1921 }
1922 }
1923 JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(constructors_array.length(), JVMCI_CHECK_NULL);
1924 for (int i = 0; i < constructors_array.length(); i++) {
1925 methodHandle ctor(THREAD, constructors_array.at(i));
1926 JVMCIObject method = JVMCIENV->get_jvmci_method(ctor, JVMCI_CHECK_NULL);
1927 JVMCIENV->put_object_at(methods, i, method);
1928 }
1929 return JVMCIENV->get_jobjectArray(methods);
1930 C2V_END
1931
1932 C2V_VMENTRY_NULL(jobjectArray, getDeclaredMethods, (JNIEnv* env, jobject, jobject holder))
1933 if (holder == NULL) {
1934 JVMCI_THROW_0(NullPointerException);
1935 }
1936 Klass* klass = JVMCIENV->asKlass(holder);
1937 if (!klass->is_instance_klass()) {
1938 JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(0, JVMCI_CHECK_NULL);
1939 return JVMCIENV->get_jobjectArray(methods);
1940 }
1941
1942 InstanceKlass* iklass = InstanceKlass::cast(klass);
1943 // Ensure class is linked
1944 iklass->link_class(CHECK_NULL);
1945
1946 GrowableArray<Method*> methods_array;
1947 for (int i = 0; i < iklass->methods()->length(); i++) {
1948 Method* m = iklass->methods()->at(i);
1949 if (!(m->is_object_constructor() || m->is_class_initializer()) && !m->is_overpass()) {
1950 methods_array.append(m);
1951 }
1952 }
1953 JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(methods_array.length(), JVMCI_CHECK_NULL);
1954 for (int i = 0; i < methods_array.length(); i++) {
1955 methodHandle mh(THREAD, methods_array.at(i));
1956 JVMCIObject method = JVMCIENV->get_jvmci_method(mh, JVMCI_CHECK_NULL);
1957 JVMCIENV->put_object_at(methods, i, method);
1958 }
1959 return JVMCIENV->get_jobjectArray(methods);
1960 C2V_END
1961
1962 C2V_VMENTRY_NULL(jobject, readFieldValue, (JNIEnv* env, jobject, jobject object, jobject field, jboolean is_volatile))
1963 if (object == NULL || field == NULL) {
1964 JVMCI_THROW_0(NullPointerException);
1965 }
1966 JVMCIObject field_object = JVMCIENV->wrap(field);
1967 JVMCIObject java_type = JVMCIENV->get_HotSpotResolvedJavaFieldImpl_type(field_object);
1968 int modifiers = JVMCIENV->get_HotSpotResolvedJavaFieldImpl_modifiers(field_object);
1969 Klass* holder = JVMCIENV->asKlass(JVMCIENV->get_HotSpotResolvedJavaFieldImpl_holder(field_object));
2521 JVMCIENV->get_nmethod(code, locker);
2522 }
2523
2524 C2V_VMENTRY_NULL(jbyteArray, getCode, (JNIEnv* env, jobject, jobject code_handle))
2525 JVMCIObject code = JVMCIENV->wrap(code_handle);
2526 nmethodLocker locker;
2527 CodeBlob* cb = JVMCIENV->get_code_blob(code, locker);
2528 if (cb == NULL) {
2529 return NULL;
2530 }
2531 int code_size = cb->code_size();
2532 JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL);
2533 JVMCIENV->copy_bytes_from((jbyte*) cb->code_begin(), result, 0, code_size);
2534 return JVMCIENV->get_jbyteArray(result);
2535 }
2536
2537 C2V_VMENTRY_NULL(jobject, asReflectionExecutable, (JNIEnv* env, jobject, jobject jvmci_method))
2538 requireInHotSpot("asReflectionExecutable", JVMCI_CHECK_NULL);
2539 methodHandle m(THREAD, JVMCIENV->asMethod(jvmci_method));
2540 oop executable;
2541 if (m->is_class_initializer()) {
2542 JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2543 "Cannot create java.lang.reflect.Method for class initializer");
2544 }
2545 else if (m->is_object_constructor() || m->is_static_init_factory()) {
2546 executable = Reflection::new_constructor(m, CHECK_NULL);
2547 } else {
2548 executable = Reflection::new_method(m, false, CHECK_NULL);
2549 }
2550 return JNIHandles::make_local(THREAD, executable);
2551 }
2552
2553 C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index))
2554 requireInHotSpot("asReflectionField", JVMCI_CHECK_NULL);
2555 Klass* klass = JVMCIENV->asKlass(jvmci_type);
2556 if (!klass->is_instance_klass()) {
2557 JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2558 err_msg("Expected non-primitive type, got %s", klass->external_name()));
2559 }
2560 InstanceKlass* iklass = InstanceKlass::cast(klass);
2561 Array<u2>* fields = iklass->fields();
2562 if (index < 0 ||index > fields->length()) {
2563 JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2564 err_msg("Field index %d out of bounds for %s", index, klass->external_name()));
2565 }
|