< prev index next >

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Print this page

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   }
< prev index next >