< prev index next >

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Print this page




 235   } else {
 236     JVMCI_ERROR_NULL("VM flag %s has unsupported type %s", flag->_name, flag->_type);
 237   }
 238 #undef RETURN_BOXED_LONG
 239 #undef RETURN_BOXED_DOUBLE
 240 C2V_END
 241 
 242 C2V_VMENTRY_NULL(jobject, getObjectAtAddress, (JNIEnv* env, jobject c2vm, jlong oop_address))
 243   requireInHotSpot("getObjectAtAddress", JVMCI_CHECK_NULL);
 244   if (oop_address == 0) {
 245     JVMCI_THROW_MSG_NULL(InternalError, "Handle must be non-zero");
 246   }
 247   oop obj = *((oopDesc**) oop_address);
 248   if (obj != NULL) {
 249     oopDesc::verify(obj);
 250   }
 251   return JNIHandles::make_local(obj);
 252 C2V_END
 253 
 254 C2V_VMENTRY_NULL(jbyteArray, getBytecode, (JNIEnv* env, jobject, jobject jvmci_method))
 255   methodHandle method = JVMCIENV->asMethod(jvmci_method);
 256 
 257   int code_size = method->code_size();
 258   jbyte* reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size);
 259 
 260   guarantee(method->method_holder()->is_rewritten(), "Method's holder should be rewritten");
 261   // iterate over all bytecodes and replace non-Java bytecodes
 262 
 263   for (BytecodeStream s(method); s.next() != Bytecodes::_illegal; ) {
 264     Bytecodes::Code code = s.code();
 265     Bytecodes::Code raw_code = s.raw_code();
 266     int bci = s.bci();
 267     int len = s.instruction_size();
 268 
 269     // Restore original byte code.
 270     reconstituted_code[bci] =  (jbyte) (s.is_wide()? Bytecodes::_wide : code);
 271     if (len > 1) {
 272       memcpy(reconstituted_code + (bci + 1), s.bcp()+1, len-1);
 273     }
 274 
 275     if (len > 1) {


 313         case Bytecodes::_fast_aldc_w: {
 314           int cpc_index = Bytes::get_native_u2((address) reconstituted_code + (bci + 1));
 315           int cp_index = method->constants()->object_to_cp_index(cpc_index);
 316           assert(cp_index < method->constants()->length(), "sanity check");
 317           Bytes::put_Java_u2((address) reconstituted_code + (bci + 1), (u2) cp_index);
 318           break;
 319         }
 320 
 321         default:
 322           break;
 323       }
 324     }
 325   }
 326 
 327   JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL);
 328   JVMCIENV->copy_bytes_from(reconstituted_code, result, 0, code_size);
 329   return JVMCIENV->get_jbyteArray(result);
 330 C2V_END
 331 
 332 C2V_VMENTRY_0(jint, getExceptionTableLength, (JNIEnv* env, jobject, jobject jvmci_method))
 333   methodHandle method = JVMCIENV->asMethod(jvmci_method);
 334   return method->exception_table_length();
 335 C2V_END
 336 
 337 C2V_VMENTRY_0(jlong, getExceptionTableStart, (JNIEnv* env, jobject, jobject jvmci_method))
 338   methodHandle method = JVMCIENV->asMethod(jvmci_method);
 339   if (method->exception_table_length() == 0) {
 340     return 0L;
 341   }
 342   return (jlong) (address) method->exception_table_start();
 343 C2V_END
 344 
 345 C2V_VMENTRY_NULL(jobject, asResolvedJavaMethod, (JNIEnv* env, jobject, jobject executable_handle))
 346   requireInHotSpot("asResolvedJavaMethod", JVMCI_CHECK_NULL);
 347   oop executable = JNIHandles::resolve(executable_handle);
 348   oop mirror = NULL;
 349   int slot = 0;
 350 
 351   if (executable->klass() == SystemDictionary::reflect_Constructor_klass()) {
 352     mirror = java_lang_reflect_Constructor::clazz(executable);
 353     slot = java_lang_reflect_Constructor::slot(executable);
 354   } else {
 355     assert(executable->klass() == SystemDictionary::reflect_Method_klass(), "wrong type");
 356     mirror = java_lang_reflect_Method::clazz(executable);
 357     slot = java_lang_reflect_Method::slot(executable);
 358   }
 359   Klass* holder = java_lang_Class::as_Klass(mirror);
 360   methodHandle method = InstanceKlass::cast(holder)->method_with_idnum(slot);
 361   JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL);
 362   return JVMCIENV->get_jobject(result);
 363 }
 364 
 365 C2V_VMENTRY_NULL(jobject, getResolvedJavaMethod, (JNIEnv* env, jobject, jobject base, jlong offset))
 366   methodHandle method;
 367   JVMCIObject base_object = JVMCIENV->wrap(base);
 368   if (base_object.is_null()) {
 369     method = *((Method**)(offset));
 370   } else if (JVMCIENV->isa_HotSpotObjectConstantImpl(base_object)) {
 371     Handle obj = JVMCIENV->asConstant(base_object, JVMCI_CHECK_NULL);
 372     if (obj->is_a(SystemDictionary::ResolvedMethodName_klass())) {
 373       method = (Method*) (intptr_t) obj->long_field(offset);
 374     } else {
 375       JVMCI_THROW_MSG_NULL(IllegalArgumentException, err_msg("Unexpected type: %s", obj->klass()->external_name()));
 376     }
 377   } else if (JVMCIENV->isa_HotSpotResolvedJavaMethodImpl(base_object)) {
 378     method = JVMCIENV->asMethod(base_object);
 379   }
 380   if (method.is_null()) {
 381     JVMCI_THROW_MSG_NULL(IllegalArgumentException, err_msg("Unexpected type: %s", JVMCIENV->klass_name(base_object)));
 382   }
 383   assert (method.is_null() || method->is_method(), "invalid read");
 384   JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL);
 385   return JVMCIENV->get_jobject(result);
 386 }
 387 
 388 C2V_VMENTRY_NULL(jobject, getConstantPool, (JNIEnv* env, jobject, jobject object_handle))
 389   constantPoolHandle cp;
 390   JVMCIObject object = JVMCIENV->wrap(object_handle);
 391   if (object.is_null()) {
 392     JVMCI_THROW_NULL(NullPointerException);
 393   }
 394   if (JVMCIENV->isa_HotSpotResolvedJavaMethodImpl(object)) {
 395     cp = JVMCIENV->asMethod(object)->constMethod()->constants();
 396   } else if (JVMCIENV->isa_HotSpotResolvedObjectTypeImpl(object)) {
 397     cp = InstanceKlass::cast(JVMCIENV->asKlass(object))->constants();
 398   } else {
 399     JVMCI_THROW_MSG_NULL(IllegalArgumentException,
 400                 err_msg("Unexpected type: %s", JVMCIENV->klass_name(object)));
 401   }
 402   assert(!cp.is_null(), "npe");
 403 
 404   JVMCIObject result = JVMCIENV->get_jvmci_constant_pool(cp, JVMCI_CHECK_NULL);
 405   return JVMCIENV->get_jobject(result);
 406 }
 407 
 408 C2V_VMENTRY_NULL(jobject, getResolvedJavaType0, (JNIEnv* env, jobject, jobject base, jlong offset, jboolean compressed))
 409   JVMCIKlassHandle klass(THREAD);
 410   JVMCIObject base_object = JVMCIENV->wrap(base);
 411   jlong base_address = 0;
 412   if (base_object.is_non_null() && offset == oopDesc::klass_offset_in_bytes()) {
 413     // klass = JVMCIENV->unhandle(base_object)->klass();
 414     if (JVMCIENV->isa_HotSpotObjectConstantImpl(base_object)) {
 415       Handle base_oop = JVMCIENV->asConstant(base_object, JVMCI_CHECK_NULL);
 416       klass = base_oop->klass();
 417     } else {
 418       assert(false, "What types are we actually expecting here?");
 419     }
 420   } else if (!compressed) {
 421     if (base_object.is_non_null()) {
 422       if (JVMCIENV->isa_HotSpotResolvedJavaMethodImpl(base_object)) {
 423         base_address = (intptr_t) JVMCIENV->asMethod(base_object);
 424       } else if (JVMCIENV->isa_HotSpotConstantPool(base_object)) {


 432         }
 433       }
 434       if (base_address == 0) {
 435         JVMCI_THROW_MSG_NULL(IllegalArgumentException,
 436                     err_msg("Unexpected arguments: %s " JLONG_FORMAT " %s", JVMCIENV->klass_name(base_object), offset, compressed ? "true" : "false"));
 437       }
 438     }
 439     klass = *((Klass**) (intptr_t) (base_address + offset));
 440   } else {
 441     JVMCI_THROW_MSG_NULL(IllegalArgumentException,
 442                 err_msg("Unexpected arguments: %s " JLONG_FORMAT " %s",
 443                         base_object.is_non_null() ? JVMCIENV->klass_name(base_object) : "null",
 444                         offset, compressed ? "true" : "false"));
 445   }
 446   assert (klass == NULL || klass->is_klass(), "invalid read");
 447   JVMCIObject result = JVMCIENV->get_jvmci_type(klass, JVMCI_CHECK_NULL);
 448   return JVMCIENV->get_jobject(result);
 449 }
 450 
 451 C2V_VMENTRY_NULL(jobject, findUniqueConcreteMethod, (JNIEnv* env, jobject, jobject jvmci_type, jobject jvmci_method))
 452   methodHandle method = JVMCIENV->asMethod(jvmci_method);
 453   Klass* holder = JVMCIENV->asKlass(jvmci_type);
 454   if (holder->is_interface()) {
 455     JVMCI_THROW_MSG_NULL(InternalError, err_msg("Interface %s should be handled in Java code", holder->external_name()));
 456   }
 457   if (method->can_be_statically_bound()) {
 458     JVMCI_THROW_MSG_NULL(InternalError, err_msg("Effectively static method %s.%s should be handled in Java code", method->method_holder()->external_name(), method->external_name()));
 459   }
 460 
 461   methodHandle ucm;
 462   {
 463     MutexLocker locker(Compile_lock);
 464     ucm = Dependencies::find_unique_concrete_method(holder, method());
 465   }
 466   JVMCIObject result = JVMCIENV->get_jvmci_method(ucm, JVMCI_CHECK_NULL);
 467   return JVMCIENV->get_jobject(result);
 468 C2V_END
 469 
 470 C2V_VMENTRY_NULL(jobject, getImplementor, (JNIEnv* env, jobject, jobject jvmci_type))
 471   Klass* klass = JVMCIENV->asKlass(jvmci_type);
 472   if (!klass->is_interface()) {
 473     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
 474         err_msg("Expected interface type, got %s", klass->external_name()));
 475   }
 476   InstanceKlass* iklass = InstanceKlass::cast(klass);
 477   JVMCIKlassHandle handle(THREAD);
 478   {
 479     // Need Compile_lock around implementor()
 480     MutexLocker locker(Compile_lock);
 481     handle = iklass->implementor();
 482   }
 483   JVMCIObject implementor = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL);
 484   return JVMCIENV->get_jobject(implementor);
 485 C2V_END
 486 
 487 C2V_VMENTRY_0(jboolean, methodIsIgnoredBySecurityStackWalk,(JNIEnv* env, jobject, jobject jvmci_method))
 488   methodHandle method = JVMCIENV->asMethod(jvmci_method);
 489   return method->is_ignored_by_security_stack_walk();
 490 C2V_END
 491 
 492 C2V_VMENTRY_0(jboolean, isCompilable,(JNIEnv* env, jobject, jobject jvmci_method))
 493   methodHandle method = JVMCIENV->asMethod(jvmci_method);
 494   constantPoolHandle cp = method->constMethod()->constants();
 495   assert(!cp.is_null(), "npe");
 496   // don't inline method when constant pool contains a CONSTANT_Dynamic
 497   return !method->is_not_compilable(CompLevel_full_optimization) && !cp->has_dynamic_constant();
 498 C2V_END
 499 
 500 C2V_VMENTRY_0(jboolean, hasNeverInlineDirective,(JNIEnv* env, jobject, jobject jvmci_method))
 501   methodHandle method = JVMCIENV->asMethod(jvmci_method);
 502   return !Inline || CompilerOracle::should_not_inline(method) || method->dont_inline();
 503 C2V_END
 504 
 505 C2V_VMENTRY_0(jboolean, shouldInlineMethod,(JNIEnv* env, jobject, jobject jvmci_method))
 506   methodHandle method = JVMCIENV->asMethod(jvmci_method);
 507   return CompilerOracle::should_inline(method) || method->force_inline();
 508 C2V_END
 509 
 510 C2V_VMENTRY_NULL(jobject, lookupType, (JNIEnv* env, jobject, jstring jname, jclass accessing_class, jboolean resolve))
 511   JVMCIObject name = JVMCIENV->wrap(jname);
 512   const char* str = JVMCIENV->as_utf8_string(name);
 513   TempNewSymbol class_name = SymbolTable::new_symbol(str);
 514 
 515   if (class_name->utf8_length() <= 1) {
 516     JVMCI_THROW_MSG_0(InternalError, err_msg("Primitive type %s should be handled in Java code", class_name->as_C_string()));
 517   }
 518 
 519   JVMCIKlassHandle resolved_klass(THREAD);
 520   Klass* accessing_klass = NULL;
 521   Handle class_loader;
 522   Handle protection_domain;
 523   if (accessing_class != NULL) {
 524     accessing_klass = JVMCIENV->asKlass(accessing_class);
 525     class_loader = Handle(THREAD, accessing_klass->class_loader());
 526     protection_domain = Handle(THREAD, accessing_klass->protection_domain());


 594   }
 595   JVMCIObject result = JVMCIENV->get_jvmci_type(array_klass, JVMCI_CHECK_NULL);
 596   return JVMCIENV->get_jobject(result);
 597 C2V_END
 598 
 599 C2V_VMENTRY_NULL(jobject, lookupClass, (JNIEnv* env, jobject, jclass mirror))
 600   requireInHotSpot("lookupClass", JVMCI_CHECK_NULL);
 601   if (mirror == NULL) {
 602     return NULL;
 603   }
 604   JVMCIKlassHandle klass(THREAD);
 605   klass = java_lang_Class::as_Klass(JNIHandles::resolve(mirror));
 606   if (klass == NULL) {
 607     JVMCI_THROW_MSG_NULL(IllegalArgumentException, "Primitive classes are unsupported");
 608   }
 609   JVMCIObject result = JVMCIENV->get_jvmci_type(klass, JVMCI_CHECK_NULL);
 610   return JVMCIENV->get_jobject(result);
 611 }
 612 
 613 C2V_VMENTRY_NULL(jobject, resolvePossiblyCachedConstantInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
 614   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
 615   oop result = cp->resolve_possibly_cached_constant_at(index, CHECK_NULL);
 616   return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(result));
 617 C2V_END
 618 
 619 C2V_VMENTRY_0(jint, lookupNameAndTypeRefIndexInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
 620   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
 621   return cp->name_and_type_ref_index_at(index);
 622 C2V_END
 623 
 624 C2V_VMENTRY_NULL(jobject, lookupNameInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint which))
 625   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
 626   JVMCIObject sym = JVMCIENV->create_string(cp->name_ref_at(which), JVMCI_CHECK_NULL);
 627   return JVMCIENV->get_jobject(sym);
 628 C2V_END
 629 
 630 C2V_VMENTRY_NULL(jobject, lookupSignatureInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint which))
 631   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
 632   JVMCIObject sym = JVMCIENV->create_string(cp->signature_ref_at(which), JVMCI_CHECK_NULL);
 633   return JVMCIENV->get_jobject(sym);
 634 C2V_END
 635 
 636 C2V_VMENTRY_0(jint, lookupKlassRefIndexInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
 637   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
 638   return cp->klass_ref_index_at(index);
 639 C2V_END
 640 
 641 C2V_VMENTRY_NULL(jobject, resolveTypeInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
 642   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
 643   Klass* klass = cp->klass_at(index, CHECK_NULL);
 644   JVMCIKlassHandle resolved_klass(THREAD, klass);
 645   if (resolved_klass->is_instance_klass()) {
 646     InstanceKlass::cast(resolved_klass())->link_class(CHECK_NULL);
 647     if (!InstanceKlass::cast(resolved_klass())->is_linked()) {
 648       // link_class() should not return here if there is an issue.
 649       JVMCI_THROW_MSG_NULL(InternalError, err_msg("Class %s must be linked", resolved_klass()->external_name()));
 650     }
 651   }
 652   JVMCIObject klassObject = JVMCIENV->get_jvmci_type(resolved_klass, JVMCI_CHECK_NULL);
 653   return JVMCIENV->get_jobject(klassObject);
 654 C2V_END
 655 
 656 C2V_VMENTRY_NULL(jobject, lookupKlassInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
 657   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
 658   Klass* loading_klass = cp->pool_holder();
 659   bool is_accessible = false;
 660   JVMCIKlassHandle klass(THREAD, JVMCIRuntime::get_klass_by_index(cp, index, is_accessible, loading_klass));
 661   Symbol* symbol = NULL;
 662   if (klass.is_null()) {
 663     constantTag tag = cp->tag_at(index);
 664     if (tag.is_klass()) {
 665       // The klass has been inserted into the constant pool
 666       // very recently.
 667       klass = cp->resolved_klass_at(index);
 668     } else if (tag.is_symbol()) {
 669       symbol = cp->symbol_at(index);
 670     } else {
 671       assert(cp->tag_at(index).is_unresolved_klass(), "wrong tag");
 672       symbol = cp->klass_name_at(index);
 673     }
 674   }
 675   JVMCIObject result;
 676   if (!klass.is_null()) {
 677     result = JVMCIENV->get_jvmci_type(klass, JVMCI_CHECK_NULL);
 678   } else {
 679     result = JVMCIENV->create_string(symbol, JVMCI_CHECK_NULL);
 680   }
 681   return JVMCIENV->get_jobject(result);
 682 C2V_END
 683 
 684 C2V_VMENTRY_NULL(jobject, lookupAppendixInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
 685   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
 686   oop appendix_oop = ConstantPool::appendix_at_if_loaded(cp, index);
 687   return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(appendix_oop));
 688 C2V_END
 689 
 690 C2V_VMENTRY_NULL(jobject, lookupMethodInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
 691   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
 692   InstanceKlass* pool_holder = cp->pool_holder();
 693   Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF);
 694   methodHandle method = JVMCIRuntime::get_method_by_index(cp, index, bc, pool_holder);
 695   JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL);
 696   return JVMCIENV->get_jobject(result);
 697 C2V_END
 698 
 699 C2V_VMENTRY_0(jint, constantPoolRemapInstructionOperandFromCache, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
 700   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
 701   return cp->remap_instruction_operand_from_cache(index);
 702 C2V_END
 703 
 704 C2V_VMENTRY_NULL(jobject, resolveFieldInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jobject jvmci_method, jbyte opcode, jintArray info_handle))
 705   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
 706   Bytecodes::Code code = (Bytecodes::Code)(((int) opcode) & 0xFF);
 707   fieldDescriptor fd;
 708   LinkInfo link_info(cp, index, (jvmci_method != NULL) ? JVMCIENV->asMethod(jvmci_method) : NULL, CHECK_0);

 709   LinkResolver::resolve_field(fd, link_info, Bytecodes::java_code(code), false, CHECK_0);
 710   JVMCIPrimitiveArray info = JVMCIENV->wrap(info_handle);
 711   if (info.is_null() || JVMCIENV->get_length(info) != 3) {
 712     JVMCI_ERROR_NULL("info must not be null and have a length of 3");
 713   }
 714   JVMCIENV->put_int_at(info, 0, fd.access_flags().as_int());
 715   JVMCIENV->put_int_at(info, 1, fd.offset());
 716   JVMCIENV->put_int_at(info, 2, fd.index());
 717   JVMCIKlassHandle handle(THREAD, fd.field_holder());
 718   JVMCIObject field_holder = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL);
 719   return JVMCIENV->get_jobject(field_holder);
 720 C2V_END
 721 
 722 C2V_VMENTRY_0(jint, getVtableIndexForInterfaceMethod, (JNIEnv* env, jobject, jobject jvmci_type, jobject jvmci_method))
 723   Klass* klass = JVMCIENV->asKlass(jvmci_type);
 724   Method* method = JVMCIENV->asMethod(jvmci_method);
 725   if (klass->is_interface()) {
 726     JVMCI_THROW_MSG_0(InternalError, err_msg("Interface %s should be handled in Java code", klass->external_name()));
 727   }
 728   if (!method->method_holder()->is_interface()) {
 729     JVMCI_THROW_MSG_0(InternalError, err_msg("Method %s is not held by an interface, this case should be handled in Java code", method->name_and_sig_as_C_string()));
 730   }
 731   if (!klass->is_instance_klass()) {
 732     JVMCI_THROW_MSG_0(InternalError, err_msg("Class %s must be instance klass", klass->external_name()));
 733   }
 734   if (!InstanceKlass::cast(klass)->is_linked()) {
 735     JVMCI_THROW_MSG_0(InternalError, err_msg("Class %s must be linked", klass->external_name()));
 736   }
 737   return LinkResolver::vtable_index_of_interface_method(klass, method);
 738 C2V_END
 739 
 740 C2V_VMENTRY_NULL(jobject, resolveMethod, (JNIEnv* env, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type))
 741   Klass* recv_klass = JVMCIENV->asKlass(receiver_jvmci_type);
 742   Klass* caller_klass = JVMCIENV->asKlass(caller_jvmci_type);
 743   methodHandle method = JVMCIENV->asMethod(jvmci_method);
 744 
 745   Klass* resolved     = method->method_holder();
 746   Symbol* h_name      = method->name();
 747   Symbol* h_signature = method->signature();
 748 
 749   if (MethodHandles::is_signature_polymorphic_method(method())) {
 750       // Signature polymorphic methods are already resolved, JVMCI just returns NULL in this case.
 751       return NULL;
 752   }
 753 
 754   if (method->name() == vmSymbols::clone_name() &&
 755       resolved == SystemDictionary::Object_klass() &&
 756       recv_klass->is_array_klass()) {
 757     // Resolution of the clone method on arrays always returns Object.clone even though that method
 758     // has protected access.  There's some trickery in the access checking to make this all work out
 759     // so it's necessary to pass in the array class as the resolved class to properly trigger this.
 760     // Otherwise it's impossible to resolve the array clone methods through JVMCI.  See
 761     // LinkResolver::check_method_accessability for the matching logic.
 762     resolved = recv_klass;
 763   }
 764 
 765   LinkInfo link_info(resolved, h_name, h_signature, caller_klass);
 766   methodHandle m;
 767   // Only do exact lookup if receiver klass has been linked.  Otherwise,
 768   // the vtable has not been setup, and the LinkResolver will fail.
 769   if (recv_klass->is_array_klass() ||
 770       (InstanceKlass::cast(recv_klass)->is_linked() && !recv_klass->is_interface())) {
 771     if (resolved->is_interface()) {
 772       m = LinkResolver::resolve_interface_call_or_null(recv_klass, link_info);
 773     } else {
 774       m = LinkResolver::resolve_virtual_call_or_null(recv_klass, link_info);
 775     }
 776   }
 777 
 778   if (m.is_null()) {
 779     // Return NULL if there was a problem with lookup (uninitialized class, etc.)
 780     return NULL;
 781   }
 782 
 783   JVMCIObject result = JVMCIENV->get_jvmci_method(m, JVMCI_CHECK_NULL);
 784   return JVMCIENV->get_jobject(result);
 785 C2V_END
 786 
 787 C2V_VMENTRY_0(jboolean, hasFinalizableSubclass,(JNIEnv* env, jobject, jobject jvmci_type))
 788   Klass* klass = JVMCIENV->asKlass(jvmci_type);
 789   assert(klass != NULL, "method must not be called for primitive types");
 790   return Dependencies::find_finalizable_subclass(klass) != NULL;
 791 C2V_END
 792 
 793 C2V_VMENTRY_NULL(jobject, getClassInitializer, (JNIEnv* env, jobject, jobject jvmci_type))
 794   Klass* klass = JVMCIENV->asKlass(jvmci_type);
 795   if (!klass->is_instance_klass()) {
 796     return NULL;
 797   }
 798   InstanceKlass* iklass = InstanceKlass::cast(klass);
 799   JVMCIObject result = JVMCIENV->get_jvmci_method(iklass->class_initializer(), JVMCI_CHECK_NULL);

 800   return JVMCIENV->get_jobject(result);
 801 C2V_END
 802 
 803 C2V_VMENTRY_0(jlong, getMaxCallTargetOffset, (JNIEnv* env, jobject, jlong addr))
 804   address target_addr = (address) addr;
 805   if (target_addr != 0x0) {
 806     int64_t off_low = (int64_t)target_addr - ((int64_t)CodeCache::low_bound() + sizeof(int));
 807     int64_t off_high = (int64_t)target_addr - ((int64_t)CodeCache::high_bound() + sizeof(int));
 808     return MAX2(ABS(off_low), ABS(off_high));
 809   }
 810   return -1;
 811 C2V_END
 812 
 813 C2V_VMENTRY(void, setNotInlinableOrCompilable,(JNIEnv* env, jobject,  jobject jvmci_method))
 814   methodHandle method = JVMCIENV->asMethod(jvmci_method);
 815   method->set_not_c1_compilable();
 816   method->set_not_c2_compilable();
 817   method->set_dont_inline(true);
 818 C2V_END
 819 
 820 C2V_VMENTRY_0(jint, installCode, (JNIEnv *env, jobject, jobject target, jobject compiled_code,
 821             jobject installed_code, jlong failed_speculations_address, jbyteArray speculations_obj))
 822   HandleMark hm;
 823   JNIHandleMark jni_hm(thread);
 824 
 825   JVMCIObject target_handle = JVMCIENV->wrap(target);
 826   JVMCIObject compiled_code_handle = JVMCIENV->wrap(compiled_code);
 827   CodeBlob* cb = NULL;
 828   JVMCIObject installed_code_handle = JVMCIENV->wrap(installed_code);
 829   JVMCIPrimitiveArray speculations_handle = JVMCIENV->wrap(speculations_obj);
 830 
 831   int speculations_len = JVMCIENV->get_length(speculations_handle);
 832   char* speculations = NEW_RESOURCE_ARRAY(char, speculations_len);
 833   JVMCIENV->copy_bytes_to(speculations_handle, (jbyte*) speculations, 0, speculations_len);
 834 


 990   char* buffer = NEW_RESOURCE_ARRAY(char, bufferSize);
 991   stringStream st(buffer, bufferSize);
 992   if (cb->is_nmethod()) {
 993     nmethod* nm = (nmethod*) cb;
 994     if (!nm->is_alive()) {
 995       return NULL;
 996     }
 997   }
 998   Disassembler::decode(cb, &st);
 999   if (st.size() <= 0) {
1000     return NULL;
1001   }
1002 
1003   JVMCIObject result = JVMCIENV->create_string(st.as_string(), JVMCI_CHECK_NULL);
1004   return JVMCIENV->get_jobject(result);
1005 C2V_END
1006 
1007 C2V_VMENTRY_NULL(jobject, getStackTraceElement, (JNIEnv* env, jobject, jobject jvmci_method, int bci))
1008   HandleMark hm;
1009 
1010   methodHandle method = JVMCIENV->asMethod(jvmci_method);
1011   JVMCIObject element = JVMCIENV->new_StackTraceElement(method, bci, JVMCI_CHECK_NULL);
1012   return JVMCIENV->get_jobject(element);
1013 C2V_END
1014 
1015 C2V_VMENTRY_NULL(jobject, executeHotSpotNmethod, (JNIEnv* env, jobject, jobject args, jobject hs_nmethod))
1016   // The incoming arguments array would have to contain JavaConstants instead of regular objects
1017   // and the return value would have to be wrapped as a JavaConstant.
1018   requireInHotSpot("executeHotSpotNmethod", JVMCI_CHECK_NULL);
1019 
1020   HandleMark hm;
1021 
1022   JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod);
1023   nmethod* nm = JVMCIENV->asNmethod(nmethod_mirror);
1024   if (nm == NULL) {
1025     JVMCI_THROW_NULL(InvalidInstalledCodeException);
1026   }
1027   methodHandle mh = nm->method();
1028   Symbol* signature = mh->signature();
1029   JavaCallArguments jca(mh->size_of_parameters());
1030 
1031   JavaArgumentUnboxer jap(signature, &jca, (arrayOop) JNIHandles::resolve(args), mh->is_static());
1032   JavaValue result(jap.get_ret_type());
1033   jca.set_alternative_target(nm);
1034   JavaCalls::call(&result, mh, &jca, CHECK_NULL);
1035 
1036   if (jap.get_ret_type() == T_VOID) {
1037     return NULL;
1038   } else if (is_reference_type(jap.get_ret_type())) {
1039     return JNIHandles::make_local((oop) result.get_jobject());
1040   } else {
1041     jvalue *value = (jvalue *) result.get_value_addr();
1042     // Narrow the value down if required (Important on big endian machines)
1043     switch (jap.get_ret_type()) {
1044       case T_BOOLEAN:
1045        value->z = (jboolean) value->i;
1046        break;
1047       case T_BYTE:


1085     i += 2;
1086   }
1087 
1088   return (jlongArray) JVMCIENV->get_jobject(result);
1089 C2V_END
1090 
1091 C2V_VMENTRY_0(jlong, getLocalVariableTableStart, (JNIEnv* env, jobject, jobject jvmci_method))
1092   Method* method = JVMCIENV->asMethod(jvmci_method);
1093   if (!method->has_localvariable_table()) {
1094     return 0;
1095   }
1096   return (jlong) (address) method->localvariable_table_start();
1097 C2V_END
1098 
1099 C2V_VMENTRY_0(jint, getLocalVariableTableLength, (JNIEnv* env, jobject, jobject jvmci_method))
1100   Method* method = JVMCIENV->asMethod(jvmci_method);
1101   return method->localvariable_table_length();
1102 C2V_END
1103 
1104 C2V_VMENTRY(void, reprofile, (JNIEnv* env, jobject, jobject jvmci_method))
1105   Method* method = JVMCIENV->asMethod(jvmci_method);
1106   MethodCounters* mcs = method->method_counters();
1107   if (mcs != NULL) {
1108     mcs->clear_counters();
1109   }
1110   NOT_PRODUCT(method->set_compiled_invocation_count(0));
1111 
1112   CompiledMethod* code = method->code();
1113   if (code != NULL) {
1114     code->make_not_entrant();
1115   }
1116 
1117   MethodData* method_data = method->method_data();
1118   if (method_data == NULL) {
1119     ClassLoaderData* loader_data = method->method_holder()->class_loader_data();
1120     method_data = MethodData::allocate(loader_data, method, CHECK);
1121     method->set_method_data(method_data);
1122   } else {
1123     method_data->initialize();
1124   }
1125 C2V_END


1142     jlong* temp_array = NEW_RESOURCE_ARRAY(jlong, JVMCICounterSize);
1143     JavaThread::collect_counters(temp_array, JVMCICounterSize);
1144     JVMCIENV->copy_longs_from(temp_array, array, 0, JVMCICounterSize);
1145   }
1146   return (jlongArray) JVMCIENV->get_jobject(array);
1147 C2V_END
1148 
1149 C2V_VMENTRY_0(jint, getCountersSize, (JNIEnv* env, jobject))
1150   return (jint) JVMCICounterSize;
1151 C2V_END
1152 
1153 C2V_VMENTRY(void, setCountersSize, (JNIEnv* env, jobject, jint new_size))
1154   JavaThread::resize_all_jvmci_counters(new_size);
1155 C2V_END
1156 
1157 C2V_VMENTRY_0(jint, allocateCompileId, (JNIEnv* env, jobject, jobject jvmci_method, int entry_bci))
1158   HandleMark hm;
1159   if (jvmci_method == NULL) {
1160     JVMCI_THROW_0(NullPointerException);
1161   }
1162   Method* method = JVMCIENV->asMethod(jvmci_method);
1163   if (entry_bci >= method->code_size() || entry_bci < -1) {
1164     JVMCI_THROW_MSG_0(IllegalArgumentException, err_msg("Unexpected bci %d", entry_bci));
1165   }
1166   return CompileBroker::assign_compile_id_unlocked(THREAD, method, entry_bci);
1167 C2V_END
1168 
1169 
1170 C2V_VMENTRY_0(jboolean, isMature, (JNIEnv* env, jobject, jlong metaspace_method_data))
1171   MethodData* mdo = JVMCIENV->asMethodData(metaspace_method_data);
1172   return mdo != NULL && mdo->is_mature();
1173 C2V_END
1174 
1175 C2V_VMENTRY_0(jboolean, hasCompiledCodeForOSR, (JNIEnv* env, jobject, jobject jvmci_method, int entry_bci, int comp_level))
1176   Method* method = JVMCIENV->asMethod(jvmci_method);
1177   return method->lookup_osr_nmethod_for(entry_bci, comp_level, true) != NULL;
1178 C2V_END
1179 
1180 C2V_VMENTRY_NULL(jobject, getSymbol, (JNIEnv* env, jobject, jlong symbol))
1181   JVMCIObject sym = JVMCIENV->create_string((Symbol*)(address)symbol, JVMCI_CHECK_NULL);
1182   return JVMCIENV->get_jobject(sym);


1184 
1185 bool matches(jobjectArray methods, Method* method, JVMCIEnv* JVMCIENV) {
1186   objArrayOop methods_oop = (objArrayOop) JNIHandles::resolve(methods);
1187 
1188   for (int i = 0; i < methods_oop->length(); i++) {
1189     oop resolved = methods_oop->obj_at(i);
1190     if ((resolved->klass() == HotSpotJVMCI::HotSpotResolvedJavaMethodImpl::klass()) && HotSpotJVMCI::asMethod(JVMCIENV, resolved) == method) {
1191       return true;
1192     }
1193   }
1194   return false;
1195 }
1196 
1197 void call_interface(JavaValue* result, Klass* spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
1198   CallInfo callinfo;
1199   Handle receiver = args->receiver();
1200   Klass* recvrKlass = receiver.is_null() ? (Klass*)NULL : receiver->klass();
1201   LinkInfo link_info(spec_klass, name, signature);
1202   LinkResolver::resolve_interface_call(
1203           callinfo, receiver, recvrKlass, link_info, true, CHECK);
1204   methodHandle method = callinfo.selected_method();
1205   assert(method.not_null(), "should have thrown exception");
1206 
1207   // Invoke the method
1208   JavaCalls::call(result, method, args, CHECK);
1209 }
1210 
1211 C2V_VMENTRY_NULL(jobject, iterateFrames, (JNIEnv* env, jobject compilerToVM, jobjectArray initial_methods, jobjectArray match_methods, jint initialSkip, jobject visitor_handle))
1212 
1213   if (!thread->has_last_Java_frame()) {
1214     return NULL;
1215   }
1216   Handle visitor(THREAD, JNIHandles::resolve_non_null(visitor_handle));
1217 
1218   requireInHotSpot("iterateFrames", JVMCI_CHECK_NULL);
1219 
1220   HotSpotJVMCI::HotSpotStackFrameReference::klass()->initialize(CHECK_NULL);
1221   Handle frame_reference = HotSpotJVMCI::HotSpotStackFrameReference::klass()->allocate_instance_handle(CHECK_NULL);
1222 
1223   StackFrameStream fst(thread);
1224   jobjectArray methods = initial_methods;


1258               Deoptimization::reassign_fields(fst.current(), fst.register_map(), objects, realloc_failures, false);
1259               realloc_called = true;
1260 
1261               GrowableArray<ScopeValue*>* local_values = scope->locals();
1262               assert(local_values != NULL, "NULL locals");
1263               typeArrayOop array_oop = oopFactory::new_boolArray(local_values->length(), CHECK_NULL);
1264               typeArrayHandle array(THREAD, array_oop);
1265               for (int i = 0; i < local_values->length(); i++) {
1266                 ScopeValue* value = local_values->at(i);
1267                 if (value->is_object()) {
1268                   array->bool_at_put(i, true);
1269                 }
1270               }
1271               HotSpotJVMCI::HotSpotStackFrameReference::set_localIsVirtual(JVMCIENV, frame_reference(), array());
1272             } else {
1273               HotSpotJVMCI::HotSpotStackFrameReference::set_localIsVirtual(JVMCIENV, frame_reference(), NULL);
1274             }
1275 
1276             locals = cvf->locals();
1277             HotSpotJVMCI::HotSpotStackFrameReference::set_bci(JVMCIENV, frame_reference(), cvf->bci());
1278             JVMCIObject method = JVMCIENV->get_jvmci_method(cvf->method(), JVMCI_CHECK_NULL);

1279             HotSpotJVMCI::HotSpotStackFrameReference::set_method(JVMCIENV, frame_reference(), JNIHandles::resolve(method.as_jobject()));
1280           }
1281         }
1282       } else if (vf->is_interpreted_frame()) {
1283         // interpreted method frame
1284         interpretedVFrame* ivf = interpretedVFrame::cast(vf);
1285         if (methods == NULL || matches(methods, ivf->method(), JVMCIENV)) {
1286           if (initialSkip > 0) {
1287             initialSkip--;
1288           } else {
1289             locals = ivf->locals();
1290             HotSpotJVMCI::HotSpotStackFrameReference::set_bci(JVMCIENV, frame_reference(), ivf->bci());
1291             JVMCIObject method = JVMCIENV->get_jvmci_method(ivf->method(), JVMCI_CHECK_NULL);

1292             HotSpotJVMCI::HotSpotStackFrameReference::set_method(JVMCIENV, frame_reference(), JNIHandles::resolve(method.as_jobject()));
1293             HotSpotJVMCI::HotSpotStackFrameReference::set_localIsVirtual(JVMCIENV, frame_reference(), NULL);
1294           }
1295         }
1296       }
1297 
1298       // locals != NULL means that we found a matching frame and result is already partially initialized
1299       if (locals != NULL) {
1300         methods = match_methods;
1301         HotSpotJVMCI::HotSpotStackFrameReference::set_compilerToVM(JVMCIENV, frame_reference(), JNIHandles::resolve(compilerToVM));
1302         HotSpotJVMCI::HotSpotStackFrameReference::set_stackPointer(JVMCIENV, frame_reference(), (jlong) fst.current()->sp());
1303         HotSpotJVMCI::HotSpotStackFrameReference::set_frameNumber(JVMCIENV, frame_reference(), frame_number);
1304 
1305         // initialize the locals array
1306         objArrayOop array_oop = oopFactory::new_objectArray(locals->size(), CHECK_NULL);
1307         objArrayHandle array(THREAD, array_oop);
1308         for (int i = 0; i < locals->size(); i++) {
1309           StackValue* var = locals->at(i);
1310           if (var->type() == T_OBJECT) {
1311             array->obj_at_put(i, locals->at(i)->get_obj()());


1351       if (vf->is_top()) {
1352         break;
1353       }
1354       frame_number++;
1355       vf = vf->sender();
1356     } // end of vframe loop
1357 
1358     if (fst.is_done()) {
1359       break;
1360     }
1361     fst.next();
1362     vf = vframe::new_vframe(fst.current(), fst.register_map(), thread);
1363     frame_number = 0;
1364   } // end of frame loop
1365 
1366   // the end was reached without finding a matching method
1367   return NULL;
1368 C2V_END
1369 
1370 C2V_VMENTRY(void, resolveInvokeDynamicInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
1371   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
1372   CallInfo callInfo;
1373   LinkResolver::resolve_invoke(callInfo, Handle(), cp, index, Bytecodes::_invokedynamic, CHECK);
1374   ConstantPoolCacheEntry* cp_cache_entry = cp->invokedynamic_cp_cache_entry_at(index);
1375   cp_cache_entry->set_dynamic_call(cp, callInfo);
1376 C2V_END
1377 
1378 C2V_VMENTRY(void, resolveInvokeHandleInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
1379   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
1380   Klass* holder = cp->klass_ref_at(index, CHECK);
1381   Symbol* name = cp->name_ref_at(index);
1382   if (MethodHandles::is_signature_polymorphic_name(holder, name)) {
1383     CallInfo callInfo;
1384     LinkResolver::resolve_invoke(callInfo, Handle(), cp, index, Bytecodes::_invokehandle, CHECK);
1385     ConstantPoolCacheEntry* cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
1386     cp_cache_entry->set_method_handle(cp, callInfo);
1387   }
1388 C2V_END
1389 
1390 C2V_VMENTRY_0(jint, isResolvedInvokeHandleInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
1391   constantPoolHandle cp = JVMCIENV->asConstantPool(jvmci_constant_pool);
1392   ConstantPoolCacheEntry* cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
1393   if (cp_cache_entry->is_resolved(Bytecodes::_invokehandle)) {
1394     // MethodHandle.invoke* --> LambdaForm?
1395     ResourceMark rm;
1396 
1397     LinkInfo link_info(cp, index, CATCH);
1398 
1399     Klass* resolved_klass = link_info.resolved_klass();
1400 
1401     Symbol* name_sym = cp->name_ref_at(index);
1402 
1403     vmassert(MethodHandles::is_method_handle_invoke_name(resolved_klass, name_sym), "!");
1404     vmassert(MethodHandles::is_signature_polymorphic_name(resolved_klass, name_sym), "!");
1405 
1406     methodHandle adapter_method(cp_cache_entry->f1_as_method());
1407 
1408     methodHandle resolved_method(adapter_method);
1409 
1410     // Can we treat it as a regular invokevirtual?
1411     if (resolved_method->method_holder() == resolved_klass && resolved_method->name() == name_sym) {
1412       vmassert(!resolved_method->is_static(),"!");
1413       vmassert(MethodHandles::is_signature_polymorphic_method(resolved_method()),"!");
1414       vmassert(!MethodHandles::is_signature_polymorphic_static(resolved_method->intrinsic_id()), "!");
1415       vmassert(cp_cache_entry->appendix_if_resolved(cp) == NULL, "!");
1416 
1417       methodHandle m(LinkResolver::linktime_resolve_virtual_method_or_null(link_info));
1418       vmassert(m == resolved_method, "!!");
1419       return -1;
1420     }
1421 
1422     return Bytecodes::_invokevirtual;
1423   }
1424   if (cp_cache_entry->is_resolved(Bytecodes::_invokedynamic)) {
1425     return Bytecodes::_invokedynamic;
1426   }
1427   return -1;
1428 C2V_END
1429 
1430 
1431 C2V_VMENTRY_NULL(jobject, getSignaturePolymorphicHolders, (JNIEnv* env, jobject))
1432   JVMCIObjectArray holders = JVMCIENV->new_String_array(2, JVMCI_CHECK_NULL);
1433   JVMCIObject mh = JVMCIENV->create_string("Ljava/lang/invoke/MethodHandle;", JVMCI_CHECK_NULL);
1434   JVMCIObject vh = JVMCIENV->create_string("Ljava/lang/invoke/VarHandle;", JVMCI_CHECK_NULL);
1435   JVMCIENV->put_object_at(holders, 0, mh);
1436   JVMCIENV->put_object_at(holders, 1, vh);
1437   return JVMCIENV->get_jobject(holders);


1890   }
1891   Klass* klass = JVMCIENV->asKlass(holder);
1892   if (!klass->is_instance_klass()) {
1893     JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(0, JVMCI_CHECK_NULL);
1894     return JVMCIENV->get_jobjectArray(methods);
1895   }
1896 
1897   InstanceKlass* iklass = InstanceKlass::cast(klass);
1898   // Ensure class is linked
1899   iklass->link_class(CHECK_NULL);
1900 
1901   GrowableArray<Method*> constructors_array;
1902   for (int i = 0; i < iklass->methods()->length(); i++) {
1903     Method* m = iklass->methods()->at(i);
1904     if (m->is_initializer() && !m->is_static()) {
1905       constructors_array.append(m);
1906     }
1907   }
1908   JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(constructors_array.length(), JVMCI_CHECK_NULL);
1909   for (int i = 0; i < constructors_array.length(); i++) {
1910     JVMCIObject method = JVMCIENV->get_jvmci_method(constructors_array.at(i), JVMCI_CHECK_NULL);

1911     JVMCIENV->put_object_at(methods, i, method);
1912   }
1913   return JVMCIENV->get_jobjectArray(methods);
1914 C2V_END
1915 
1916 C2V_VMENTRY_NULL(jobjectArray, getDeclaredMethods, (JNIEnv* env, jobject, jobject holder))
1917   if (holder == NULL) {
1918     JVMCI_THROW_0(NullPointerException);
1919   }
1920   Klass* klass = JVMCIENV->asKlass(holder);
1921   if (!klass->is_instance_klass()) {
1922     JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(0, JVMCI_CHECK_NULL);
1923     return JVMCIENV->get_jobjectArray(methods);
1924   }
1925 
1926   InstanceKlass* iklass = InstanceKlass::cast(klass);
1927   // Ensure class is linked
1928   iklass->link_class(CHECK_NULL);
1929 
1930   GrowableArray<Method*> methods_array;
1931   for (int i = 0; i < iklass->methods()->length(); i++) {
1932     Method* m = iklass->methods()->at(i);
1933     if (!m->is_initializer() && !m->is_overpass()) {
1934       methods_array.append(m);
1935     }
1936   }
1937   JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(methods_array.length(), JVMCI_CHECK_NULL);
1938   for (int i = 0; i < methods_array.length(); i++) {
1939     JVMCIObject method = JVMCIENV->get_jvmci_method(methods_array.at(i), JVMCI_CHECK_NULL);

1940     JVMCIENV->put_object_at(methods, i, method);
1941   }
1942   return JVMCIENV->get_jobjectArray(methods);
1943 C2V_END
1944 
1945 C2V_VMENTRY_NULL(jobject, readFieldValue, (JNIEnv* env, jobject, jobject object, jobject field, jboolean is_volatile))
1946   if (object == NULL || field == NULL) {
1947     JVMCI_THROW_0(NullPointerException);
1948   }
1949   JVMCIObject field_object = JVMCIENV->wrap(field);
1950   JVMCIObject java_type = JVMCIENV->get_HotSpotResolvedJavaFieldImpl_type(field_object);
1951   int modifiers = JVMCIENV->get_HotSpotResolvedJavaFieldImpl_modifiers(field_object);
1952   Klass* holder = JVMCIENV->asKlass(JVMCIENV->get_HotSpotResolvedJavaFieldImpl_holder(field_object));
1953   if (!holder->is_instance_klass()) {
1954     JVMCI_THROW_MSG_0(InternalError, err_msg("Holder %s must be instance klass", holder->external_name()));
1955   }
1956   InstanceKlass* ik = InstanceKlass::cast(holder);
1957   BasicType constant_type;
1958   if (JVMCIENV->isa_HotSpotResolvedPrimitiveType(java_type)) {
1959     constant_type = JVMCIENV->kindToBasicType(JVMCIENV->get_HotSpotResolvedPrimitiveType_kind(java_type), JVMCI_CHECK_NULL);


2240     JVMCIObject receiver = runtime->get_HotSpotJVMCIRuntime(peerEnv);
2241     if (peerEnv->has_pending_exception()) {
2242       peerEnv->describe_pending_exception(true);
2243     }
2244     shared_library = JVMCIEnv::get_shared_library_handle();
2245     if (shared_library == NULL) {
2246       JVMCI_THROW_MSG_0(InternalError, "Error initializing JVMCI runtime");
2247     }
2248   }
2249 
2250   if (mirror == NULL) {
2251     JVMCI_THROW_0(NullPointerException);
2252   }
2253   Klass* klass = java_lang_Class::as_Klass(JNIHandles::resolve(mirror));
2254   if (klass == NULL || !klass->is_instance_klass()) {
2255     JVMCI_THROW_MSG_0(IllegalArgumentException, "clazz is for primitive type");
2256   }
2257 
2258   InstanceKlass* iklass = InstanceKlass::cast(klass);
2259   for (int i = 0; i < iklass->methods()->length(); i++) {
2260     Method* method = iklass->methods()->at(i);
2261     if (method->is_native()) {
2262 
2263       // Compute argument size
2264       int args_size = 1                             // JNIEnv
2265                     + (method->is_static() ? 1 : 0) // class for static methods
2266                     + method->size_of_parameters(); // actual parameters
2267 
2268       // 1) Try JNI short style
2269       stringStream st;
2270       char* pure_name = NativeLookup::pure_jni_name(method);
2271       os::print_jni_name_prefix_on(&st, args_size);
2272       st.print_raw(pure_name);
2273       os::print_jni_name_suffix_on(&st, args_size);
2274       char* jni_name = st.as_string();
2275 
2276       address entry = (address) os::dll_lookup(shared_library, jni_name);
2277       if (entry == NULL) {
2278         // 2) Try JNI long style
2279         st.reset();
2280         char* long_name = NativeLookup::long_jni_name(method);


2408     extern struct JavaVM_ main_vm;
2409     jint res = main_vm.DetachCurrentThread();
2410     if (res != JNI_OK) {
2411       JNI_THROW("detachCurrentThread", InternalError, err_msg("Cannot detach non-attached thread"));
2412     }
2413   }
2414 C2V_END
2415 
2416 C2V_VMENTRY_0(jlong, translate, (JNIEnv* env, jobject, jobject obj_handle))
2417   requireJVMCINativeLibrary(JVMCI_CHECK_0);
2418   if (obj_handle == NULL) {
2419     return 0L;
2420   }
2421   JVMCIEnv __peer_jvmci_env__(thread, !JVMCIENV->is_hotspot(), __FILE__, __LINE__);
2422   JVMCIEnv* peerEnv = &__peer_jvmci_env__;
2423   JVMCIEnv* thisEnv = JVMCIENV;
2424 
2425   JVMCIObject obj = thisEnv->wrap(obj_handle);
2426   JVMCIObject result;
2427   if (thisEnv->isa_HotSpotResolvedJavaMethodImpl(obj)) {
2428     Method* method = thisEnv->asMethod(obj);
2429     result = peerEnv->get_jvmci_method(method, JVMCI_CHECK_0);
2430   } else if (thisEnv->isa_HotSpotResolvedObjectTypeImpl(obj)) {
2431     Klass* klass = thisEnv->asKlass(obj);
2432     JVMCIKlassHandle klass_handle(THREAD);
2433     klass_handle = klass;
2434     result = peerEnv->get_jvmci_type(klass_handle, JVMCI_CHECK_0);
2435   } else if (thisEnv->isa_HotSpotResolvedPrimitiveType(obj)) {
2436     BasicType type = JVMCIENV->kindToBasicType(JVMCIENV->get_HotSpotResolvedPrimitiveType_kind(obj), JVMCI_CHECK_0);
2437     result = peerEnv->get_jvmci_primitive_type(type);
2438   } else if (thisEnv->isa_IndirectHotSpotObjectConstantImpl(obj) ||
2439              thisEnv->isa_DirectHotSpotObjectConstantImpl(obj)) {
2440     Handle constant = thisEnv->asConstant(obj, JVMCI_CHECK_0);
2441     result = peerEnv->get_object_constant(constant());
2442   } else if (thisEnv->isa_HotSpotNmethod(obj)) {
2443     nmethod* nm = thisEnv->asNmethod(obj);
2444     if (nm != NULL) {
2445       JVMCINMethodData* data = nm->jvmci_nmethod_data();
2446       if (data != NULL) {
2447         if (peerEnv->is_hotspot()) {
2448           // Only the mirror in the HotSpot heap is accessible
2449           // through JVMCINMethodData
2450           oop nmethod_mirror = data->get_nmethod_mirror(nm, /* phantom_ref */ true);
2451           if (nmethod_mirror != NULL) {
2452             result = HotSpotJVMCI::wrap(nmethod_mirror);
2453           }
2454         }
2455       }
2456     }
2457     if (result.is_null()) {
2458       JVMCIObject methodObject = thisEnv->get_HotSpotNmethod_method(obj);
2459       methodHandle mh = thisEnv->asMethod(methodObject);
2460       jboolean isDefault = thisEnv->get_HotSpotNmethod_isDefault(obj);
2461       jlong compileIdSnapshot = thisEnv->get_HotSpotNmethod_compileIdSnapshot(obj);
2462       JVMCIObject name_string = thisEnv->get_InstalledCode_name(obj);
2463       const char* cstring = name_string.is_null() ? NULL : thisEnv->as_utf8_string(name_string);
2464       // Create a new HotSpotNmethod instance in the peer runtime
2465       result = peerEnv->new_HotSpotNmethod(mh(), cstring, isDefault, compileIdSnapshot, JVMCI_CHECK_0);
2466       if (nm == NULL) {
2467         // nmethod must have been unloaded
2468       } else {
2469         // Link the new HotSpotNmethod to the nmethod
2470         peerEnv->initialize_installed_code(result, nm, JVMCI_CHECK_0);
2471         // Only HotSpotNmethod instances in the HotSpot heap are tracked directly by the runtime.
2472         if (peerEnv->is_hotspot()) {
2473           JVMCINMethodData* data = nm->jvmci_nmethod_data();
2474           if (data == NULL) {
2475             JVMCI_THROW_MSG_0(IllegalArgumentException, "Cannot set HotSpotNmethod mirror for default nmethod");
2476           }
2477           if (data->get_nmethod_mirror(nm, /* phantom_ref */ false) != NULL) {
2478             JVMCI_THROW_MSG_0(IllegalArgumentException, "Cannot overwrite existing HotSpotNmethod mirror for nmethod");
2479           }
2480           oop nmethod_mirror = HotSpotJVMCI::resolve(result);
2481           data->set_nmethod_mirror(nm, nmethod_mirror);
2482         }
2483       }
2484     }
2485   } else {


2505 C2V_VMENTRY(void, updateHotSpotNmethod, (JNIEnv* env, jobject, jobject code_handle))
2506   JVMCIObject code = JVMCIENV->wrap(code_handle);
2507   // Execute this operation for the side effect of updating the InstalledCode state
2508   JVMCIENV->asNmethod(code);
2509 }
2510 
2511 C2V_VMENTRY_NULL(jbyteArray, getCode, (JNIEnv* env, jobject, jobject code_handle))
2512   JVMCIObject code = JVMCIENV->wrap(code_handle);
2513   CodeBlob* cb = JVMCIENV->asCodeBlob(code);
2514   if (cb == NULL) {
2515     return NULL;
2516   }
2517   int code_size = cb->code_size();
2518   JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL);
2519   JVMCIENV->copy_bytes_from((jbyte*) cb->code_begin(), result, 0, code_size);
2520   return JVMCIENV->get_jbyteArray(result);
2521 }
2522 
2523 C2V_VMENTRY_NULL(jobject, asReflectionExecutable, (JNIEnv* env, jobject, jobject jvmci_method))
2524   requireInHotSpot("asReflectionExecutable", JVMCI_CHECK_NULL);
2525   methodHandle m = JVMCIENV->asMethod(jvmci_method);
2526   oop executable;
2527   if (m->is_initializer()) {
2528     if (m->is_static_initializer()) {
2529       JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2530           "Cannot create java.lang.reflect.Method for class initializer");
2531     }
2532     executable = Reflection::new_constructor(m, CHECK_NULL);
2533   } else {
2534     executable = Reflection::new_method(m, false, CHECK_NULL);
2535   }
2536   return JNIHandles::make_local(THREAD, executable);
2537 }
2538 
2539 C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index))
2540   requireInHotSpot("asReflectionField", JVMCI_CHECK_NULL);
2541   Klass* klass = JVMCIENV->asKlass(jvmci_type);
2542   if (!klass->is_instance_klass()) {
2543     JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2544         err_msg("Expected non-primitive type, got %s", klass->external_name()));
2545   }


2570       return current;
2571     }
2572   }
2573   JVMCIObjectArray result = JVMCIENV->new_byte_array_array(result_length, JVMCI_CHECK_NULL);
2574   int result_index = 0;
2575   for (FailedSpeculation* fs = head; result_index < result_length; fs = fs->next()) {
2576     assert(fs != NULL, "npe");
2577     JVMCIPrimitiveArray entry;
2578     if (result_index < current_length) {
2579       entry = (JVMCIPrimitiveArray) JVMCIENV->get_object_at(current_array, result_index);
2580     } else {
2581       entry = JVMCIENV->new_byteArray(fs->data_len(), JVMCI_CHECK_NULL);
2582       JVMCIENV->copy_bytes_from((jbyte*) fs->data(), entry, 0, fs->data_len());
2583     }
2584     JVMCIENV->put_object_at(result, result_index++, entry);
2585   }
2586   return JVMCIENV->get_jobjectArray(result);
2587 }
2588 
2589 C2V_VMENTRY_0(jlong, getFailedSpeculationsAddress, (JNIEnv* env, jobject, jobject jvmci_method))
2590   methodHandle method = JVMCIENV->asMethod(jvmci_method);
2591   MethodData* method_data = method->method_data();
2592   if (method_data == NULL) {
2593     ClassLoaderData* loader_data = method->method_holder()->class_loader_data();
2594     method_data = MethodData::allocate(loader_data, method, CHECK_0);
2595     method->set_method_data(method_data);
2596   }
2597   return (jlong) method_data->get_failed_speculations_address();
2598 }
2599 
2600 C2V_VMENTRY(void, releaseFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address))
2601   FailedSpeculation::free_failed_speculations((FailedSpeculation**)(address) failed_speculations_address);
2602 }
2603 
2604 C2V_VMENTRY_0(jboolean, addFailedSpeculation, (JNIEnv* env, jobject, jlong failed_speculations_address, jbyteArray speculation_obj))
2605   JVMCIPrimitiveArray speculation_handle = JVMCIENV->wrap(speculation_obj);
2606   int speculation_len = JVMCIENV->get_length(speculation_handle);
2607   char* speculation = NEW_RESOURCE_ARRAY(char, speculation_len);
2608   JVMCIENV->copy_bytes_to(speculation_handle, (jbyte*) speculation, 0, speculation_len);
2609   return FailedSpeculation::add_failed_speculation(NULL, (FailedSpeculation**)(address) failed_speculations_address, (address) speculation, speculation_len);
2610 }




 235   } else {
 236     JVMCI_ERROR_NULL("VM flag %s has unsupported type %s", flag->_name, flag->_type);
 237   }
 238 #undef RETURN_BOXED_LONG
 239 #undef RETURN_BOXED_DOUBLE
 240 C2V_END
 241 
 242 C2V_VMENTRY_NULL(jobject, getObjectAtAddress, (JNIEnv* env, jobject c2vm, jlong oop_address))
 243   requireInHotSpot("getObjectAtAddress", JVMCI_CHECK_NULL);
 244   if (oop_address == 0) {
 245     JVMCI_THROW_MSG_NULL(InternalError, "Handle must be non-zero");
 246   }
 247   oop obj = *((oopDesc**) oop_address);
 248   if (obj != NULL) {
 249     oopDesc::verify(obj);
 250   }
 251   return JNIHandles::make_local(obj);
 252 C2V_END
 253 
 254 C2V_VMENTRY_NULL(jbyteArray, getBytecode, (JNIEnv* env, jobject, jobject jvmci_method))
 255   methodHandle method(THREAD, JVMCIENV->asMethod(jvmci_method));
 256 
 257   int code_size = method->code_size();
 258   jbyte* reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size);
 259 
 260   guarantee(method->method_holder()->is_rewritten(), "Method's holder should be rewritten");
 261   // iterate over all bytecodes and replace non-Java bytecodes
 262 
 263   for (BytecodeStream s(method); s.next() != Bytecodes::_illegal; ) {
 264     Bytecodes::Code code = s.code();
 265     Bytecodes::Code raw_code = s.raw_code();
 266     int bci = s.bci();
 267     int len = s.instruction_size();
 268 
 269     // Restore original byte code.
 270     reconstituted_code[bci] =  (jbyte) (s.is_wide()? Bytecodes::_wide : code);
 271     if (len > 1) {
 272       memcpy(reconstituted_code + (bci + 1), s.bcp()+1, len-1);
 273     }
 274 
 275     if (len > 1) {


 313         case Bytecodes::_fast_aldc_w: {
 314           int cpc_index = Bytes::get_native_u2((address) reconstituted_code + (bci + 1));
 315           int cp_index = method->constants()->object_to_cp_index(cpc_index);
 316           assert(cp_index < method->constants()->length(), "sanity check");
 317           Bytes::put_Java_u2((address) reconstituted_code + (bci + 1), (u2) cp_index);
 318           break;
 319         }
 320 
 321         default:
 322           break;
 323       }
 324     }
 325   }
 326 
 327   JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL);
 328   JVMCIENV->copy_bytes_from(reconstituted_code, result, 0, code_size);
 329   return JVMCIENV->get_jbyteArray(result);
 330 C2V_END
 331 
 332 C2V_VMENTRY_0(jint, getExceptionTableLength, (JNIEnv* env, jobject, jobject jvmci_method))
 333   Method* method = JVMCIENV->asMethod(jvmci_method);
 334   return method->exception_table_length();
 335 C2V_END
 336 
 337 C2V_VMENTRY_0(jlong, getExceptionTableStart, (JNIEnv* env, jobject, jobject jvmci_method))
 338   Method* method = JVMCIENV->asMethod(jvmci_method);
 339   if (method->exception_table_length() == 0) {
 340     return 0L;
 341   }
 342   return (jlong) (address) method->exception_table_start();
 343 C2V_END
 344 
 345 C2V_VMENTRY_NULL(jobject, asResolvedJavaMethod, (JNIEnv* env, jobject, jobject executable_handle))
 346   requireInHotSpot("asResolvedJavaMethod", JVMCI_CHECK_NULL);
 347   oop executable = JNIHandles::resolve(executable_handle);
 348   oop mirror = NULL;
 349   int slot = 0;
 350 
 351   if (executable->klass() == SystemDictionary::reflect_Constructor_klass()) {
 352     mirror = java_lang_reflect_Constructor::clazz(executable);
 353     slot = java_lang_reflect_Constructor::slot(executable);
 354   } else {
 355     assert(executable->klass() == SystemDictionary::reflect_Method_klass(), "wrong type");
 356     mirror = java_lang_reflect_Method::clazz(executable);
 357     slot = java_lang_reflect_Method::slot(executable);
 358   }
 359   Klass* holder = java_lang_Class::as_Klass(mirror);
 360   methodHandle method (THREAD, InstanceKlass::cast(holder)->method_with_idnum(slot));
 361   JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL);
 362   return JVMCIENV->get_jobject(result);
 363 }
 364 
 365 C2V_VMENTRY_NULL(jobject, getResolvedJavaMethod, (JNIEnv* env, jobject, jobject base, jlong offset))
 366   Method* method;
 367   JVMCIObject base_object = JVMCIENV->wrap(base);
 368   if (base_object.is_null()) {
 369     method = *((Method**)(offset));
 370   } else if (JVMCIENV->isa_HotSpotObjectConstantImpl(base_object)) {
 371     Handle obj = JVMCIENV->asConstant(base_object, JVMCI_CHECK_NULL);
 372     if (obj->is_a(SystemDictionary::ResolvedMethodName_klass())) {
 373       method = (Method*) (intptr_t) obj->long_field(offset);
 374     } else {
 375       JVMCI_THROW_MSG_NULL(IllegalArgumentException, err_msg("Unexpected type: %s", obj->klass()->external_name()));
 376     }
 377   } else if (JVMCIENV->isa_HotSpotResolvedJavaMethodImpl(base_object)) {
 378     method = JVMCIENV->asMethod(base_object);
 379   }
 380   if (method == NULL) {
 381     JVMCI_THROW_MSG_NULL(IllegalArgumentException, err_msg("Unexpected type: %s", JVMCIENV->klass_name(base_object)));
 382   }
 383   assert (method->is_method(), "invalid read");
 384   JVMCIObject result = JVMCIENV->get_jvmci_method(methodHandle(THREAD, method), JVMCI_CHECK_NULL);
 385   return JVMCIENV->get_jobject(result);
 386 }
 387 
 388 C2V_VMENTRY_NULL(jobject, getConstantPool, (JNIEnv* env, jobject, jobject object_handle))
 389   ConstantPool* cp = NULL;
 390   JVMCIObject object = JVMCIENV->wrap(object_handle);
 391   if (object.is_null()) {
 392     JVMCI_THROW_NULL(NullPointerException);
 393   }
 394   if (JVMCIENV->isa_HotSpotResolvedJavaMethodImpl(object)) {
 395     cp = JVMCIENV->asMethod(object)->constMethod()->constants();
 396   } else if (JVMCIENV->isa_HotSpotResolvedObjectTypeImpl(object)) {
 397     cp = InstanceKlass::cast(JVMCIENV->asKlass(object))->constants();
 398   } else {
 399     JVMCI_THROW_MSG_NULL(IllegalArgumentException,
 400                 err_msg("Unexpected type: %s", JVMCIENV->klass_name(object)));
 401   }
 402   assert(cp != NULL, "npe");
 403 
 404   JVMCIObject result = JVMCIENV->get_jvmci_constant_pool(constantPoolHandle(THREAD, cp), JVMCI_CHECK_NULL);
 405   return JVMCIENV->get_jobject(result);
 406 }
 407 
 408 C2V_VMENTRY_NULL(jobject, getResolvedJavaType0, (JNIEnv* env, jobject, jobject base, jlong offset, jboolean compressed))
 409   JVMCIKlassHandle klass(THREAD);
 410   JVMCIObject base_object = JVMCIENV->wrap(base);
 411   jlong base_address = 0;
 412   if (base_object.is_non_null() && offset == oopDesc::klass_offset_in_bytes()) {
 413     // klass = JVMCIENV->unhandle(base_object)->klass();
 414     if (JVMCIENV->isa_HotSpotObjectConstantImpl(base_object)) {
 415       Handle base_oop = JVMCIENV->asConstant(base_object, JVMCI_CHECK_NULL);
 416       klass = base_oop->klass();
 417     } else {
 418       assert(false, "What types are we actually expecting here?");
 419     }
 420   } else if (!compressed) {
 421     if (base_object.is_non_null()) {
 422       if (JVMCIENV->isa_HotSpotResolvedJavaMethodImpl(base_object)) {
 423         base_address = (intptr_t) JVMCIENV->asMethod(base_object);
 424       } else if (JVMCIENV->isa_HotSpotConstantPool(base_object)) {


 432         }
 433       }
 434       if (base_address == 0) {
 435         JVMCI_THROW_MSG_NULL(IllegalArgumentException,
 436                     err_msg("Unexpected arguments: %s " JLONG_FORMAT " %s", JVMCIENV->klass_name(base_object), offset, compressed ? "true" : "false"));
 437       }
 438     }
 439     klass = *((Klass**) (intptr_t) (base_address + offset));
 440   } else {
 441     JVMCI_THROW_MSG_NULL(IllegalArgumentException,
 442                 err_msg("Unexpected arguments: %s " JLONG_FORMAT " %s",
 443                         base_object.is_non_null() ? JVMCIENV->klass_name(base_object) : "null",
 444                         offset, compressed ? "true" : "false"));
 445   }
 446   assert (klass == NULL || klass->is_klass(), "invalid read");
 447   JVMCIObject result = JVMCIENV->get_jvmci_type(klass, JVMCI_CHECK_NULL);
 448   return JVMCIENV->get_jobject(result);
 449 }
 450 
 451 C2V_VMENTRY_NULL(jobject, findUniqueConcreteMethod, (JNIEnv* env, jobject, jobject jvmci_type, jobject jvmci_method))
 452   methodHandle method (THREAD, JVMCIENV->asMethod(jvmci_method));
 453   Klass* holder = JVMCIENV->asKlass(jvmci_type);
 454   if (holder->is_interface()) {
 455     JVMCI_THROW_MSG_NULL(InternalError, err_msg("Interface %s should be handled in Java code", holder->external_name()));
 456   }
 457   if (method->can_be_statically_bound()) {
 458     JVMCI_THROW_MSG_NULL(InternalError, err_msg("Effectively static method %s.%s should be handled in Java code", method->method_holder()->external_name(), method->external_name()));
 459   }
 460 
 461   methodHandle ucm;
 462   {
 463     MutexLocker locker(Compile_lock);
 464     ucm = methodHandle(THREAD, Dependencies::find_unique_concrete_method(holder, method()));
 465   }
 466   JVMCIObject result = JVMCIENV->get_jvmci_method(ucm, JVMCI_CHECK_NULL);
 467   return JVMCIENV->get_jobject(result);
 468 C2V_END
 469 
 470 C2V_VMENTRY_NULL(jobject, getImplementor, (JNIEnv* env, jobject, jobject jvmci_type))
 471   Klass* klass = JVMCIENV->asKlass(jvmci_type);
 472   if (!klass->is_interface()) {
 473     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
 474         err_msg("Expected interface type, got %s", klass->external_name()));
 475   }
 476   InstanceKlass* iklass = InstanceKlass::cast(klass);
 477   JVMCIKlassHandle handle(THREAD);
 478   {
 479     // Need Compile_lock around implementor()
 480     MutexLocker locker(Compile_lock);
 481     handle = iklass->implementor();
 482   }
 483   JVMCIObject implementor = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL);
 484   return JVMCIENV->get_jobject(implementor);
 485 C2V_END
 486 
 487 C2V_VMENTRY_0(jboolean, methodIsIgnoredBySecurityStackWalk,(JNIEnv* env, jobject, jobject jvmci_method))
 488   Method* method = JVMCIENV->asMethod(jvmci_method);
 489   return method->is_ignored_by_security_stack_walk();
 490 C2V_END
 491 
 492 C2V_VMENTRY_0(jboolean, isCompilable,(JNIEnv* env, jobject, jobject jvmci_method))
 493   Method* method = JVMCIENV->asMethod(jvmci_method);
 494   ConstantPool* cp = method->constMethod()->constants();
 495   assert(cp != NULL, "npe");
 496   // don't inline method when constant pool contains a CONSTANT_Dynamic
 497   return !method->is_not_compilable(CompLevel_full_optimization) && !cp->has_dynamic_constant();
 498 C2V_END
 499 
 500 C2V_VMENTRY_0(jboolean, hasNeverInlineDirective,(JNIEnv* env, jobject, jobject jvmci_method))
 501   methodHandle method (THREAD, JVMCIENV->asMethod(jvmci_method));
 502   return !Inline || CompilerOracle::should_not_inline(method) || method->dont_inline();
 503 C2V_END
 504 
 505 C2V_VMENTRY_0(jboolean, shouldInlineMethod,(JNIEnv* env, jobject, jobject jvmci_method))
 506   methodHandle method (THREAD, JVMCIENV->asMethod(jvmci_method));
 507   return CompilerOracle::should_inline(method) || method->force_inline();
 508 C2V_END
 509 
 510 C2V_VMENTRY_NULL(jobject, lookupType, (JNIEnv* env, jobject, jstring jname, jclass accessing_class, jboolean resolve))
 511   JVMCIObject name = JVMCIENV->wrap(jname);
 512   const char* str = JVMCIENV->as_utf8_string(name);
 513   TempNewSymbol class_name = SymbolTable::new_symbol(str);
 514 
 515   if (class_name->utf8_length() <= 1) {
 516     JVMCI_THROW_MSG_0(InternalError, err_msg("Primitive type %s should be handled in Java code", class_name->as_C_string()));
 517   }
 518 
 519   JVMCIKlassHandle resolved_klass(THREAD);
 520   Klass* accessing_klass = NULL;
 521   Handle class_loader;
 522   Handle protection_domain;
 523   if (accessing_class != NULL) {
 524     accessing_klass = JVMCIENV->asKlass(accessing_class);
 525     class_loader = Handle(THREAD, accessing_klass->class_loader());
 526     protection_domain = Handle(THREAD, accessing_klass->protection_domain());


 594   }
 595   JVMCIObject result = JVMCIENV->get_jvmci_type(array_klass, JVMCI_CHECK_NULL);
 596   return JVMCIENV->get_jobject(result);
 597 C2V_END
 598 
 599 C2V_VMENTRY_NULL(jobject, lookupClass, (JNIEnv* env, jobject, jclass mirror))
 600   requireInHotSpot("lookupClass", JVMCI_CHECK_NULL);
 601   if (mirror == NULL) {
 602     return NULL;
 603   }
 604   JVMCIKlassHandle klass(THREAD);
 605   klass = java_lang_Class::as_Klass(JNIHandles::resolve(mirror));
 606   if (klass == NULL) {
 607     JVMCI_THROW_MSG_NULL(IllegalArgumentException, "Primitive classes are unsupported");
 608   }
 609   JVMCIObject result = JVMCIENV->get_jvmci_type(klass, JVMCI_CHECK_NULL);
 610   return JVMCIENV->get_jobject(result);
 611 }
 612 
 613 C2V_VMENTRY_NULL(jobject, resolvePossiblyCachedConstantInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
 614   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
 615   oop result = cp->resolve_possibly_cached_constant_at(index, CHECK_NULL);
 616   return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(result));
 617 C2V_END
 618 
 619 C2V_VMENTRY_0(jint, lookupNameAndTypeRefIndexInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
 620   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
 621   return cp->name_and_type_ref_index_at(index);
 622 C2V_END
 623 
 624 C2V_VMENTRY_NULL(jobject, lookupNameInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint which))
 625   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
 626   JVMCIObject sym = JVMCIENV->create_string(cp->name_ref_at(which), JVMCI_CHECK_NULL);
 627   return JVMCIENV->get_jobject(sym);
 628 C2V_END
 629 
 630 C2V_VMENTRY_NULL(jobject, lookupSignatureInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint which))
 631   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
 632   JVMCIObject sym = JVMCIENV->create_string(cp->signature_ref_at(which), JVMCI_CHECK_NULL);
 633   return JVMCIENV->get_jobject(sym);
 634 C2V_END
 635 
 636 C2V_VMENTRY_0(jint, lookupKlassRefIndexInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
 637   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
 638   return cp->klass_ref_index_at(index);
 639 C2V_END
 640 
 641 C2V_VMENTRY_NULL(jobject, resolveTypeInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
 642   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
 643   Klass* klass = cp->klass_at(index, CHECK_NULL);
 644   JVMCIKlassHandle resolved_klass(THREAD, klass);
 645   if (resolved_klass->is_instance_klass()) {
 646     InstanceKlass::cast(resolved_klass())->link_class(CHECK_NULL);
 647     if (!InstanceKlass::cast(resolved_klass())->is_linked()) {
 648       // link_class() should not return here if there is an issue.
 649       JVMCI_THROW_MSG_NULL(InternalError, err_msg("Class %s must be linked", resolved_klass()->external_name()));
 650     }
 651   }
 652   JVMCIObject klassObject = JVMCIENV->get_jvmci_type(resolved_klass, JVMCI_CHECK_NULL);
 653   return JVMCIENV->get_jobject(klassObject);
 654 C2V_END
 655 
 656 C2V_VMENTRY_NULL(jobject, lookupKlassInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
 657   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
 658   Klass* loading_klass = cp->pool_holder();
 659   bool is_accessible = false;
 660   JVMCIKlassHandle klass(THREAD, JVMCIRuntime::get_klass_by_index(cp, index, is_accessible, loading_klass));
 661   Symbol* symbol = NULL;
 662   if (klass.is_null()) {
 663     constantTag tag = cp->tag_at(index);
 664     if (tag.is_klass()) {
 665       // The klass has been inserted into the constant pool
 666       // very recently.
 667       klass = cp->resolved_klass_at(index);
 668     } else if (tag.is_symbol()) {
 669       symbol = cp->symbol_at(index);
 670     } else {
 671       assert(cp->tag_at(index).is_unresolved_klass(), "wrong tag");
 672       symbol = cp->klass_name_at(index);
 673     }
 674   }
 675   JVMCIObject result;
 676   if (!klass.is_null()) {
 677     result = JVMCIENV->get_jvmci_type(klass, JVMCI_CHECK_NULL);
 678   } else {
 679     result = JVMCIENV->create_string(symbol, JVMCI_CHECK_NULL);
 680   }
 681   return JVMCIENV->get_jobject(result);
 682 C2V_END
 683 
 684 C2V_VMENTRY_NULL(jobject, lookupAppendixInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
 685   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
 686   oop appendix_oop = ConstantPool::appendix_at_if_loaded(cp, index);
 687   return JVMCIENV->get_jobject(JVMCIENV->get_object_constant(appendix_oop));
 688 C2V_END
 689 
 690 C2V_VMENTRY_NULL(jobject, lookupMethodInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jbyte opcode))
 691   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
 692   InstanceKlass* pool_holder = cp->pool_holder();
 693   Bytecodes::Code bc = (Bytecodes::Code) (((int) opcode) & 0xFF);
 694   methodHandle method(THREAD, JVMCIRuntime::get_method_by_index(cp, index, bc, pool_holder));
 695   JVMCIObject result = JVMCIENV->get_jvmci_method(method, JVMCI_CHECK_NULL);
 696   return JVMCIENV->get_jobject(result);
 697 C2V_END
 698 
 699 C2V_VMENTRY_0(jint, constantPoolRemapInstructionOperandFromCache, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
 700   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
 701   return cp->remap_instruction_operand_from_cache(index);
 702 C2V_END
 703 
 704 C2V_VMENTRY_NULL(jobject, resolveFieldInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index, jobject jvmci_method, jbyte opcode, jintArray info_handle))
 705   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
 706   Bytecodes::Code code = (Bytecodes::Code)(((int) opcode) & 0xFF);
 707   fieldDescriptor fd;
 708   methodHandle mh(THREAD, (jvmci_method != NULL) ? JVMCIENV->asMethod(jvmci_method) : NULL);
 709   LinkInfo link_info(cp, index, mh, CHECK_0);
 710   LinkResolver::resolve_field(fd, link_info, Bytecodes::java_code(code), false, CHECK_0);
 711   JVMCIPrimitiveArray info = JVMCIENV->wrap(info_handle);
 712   if (info.is_null() || JVMCIENV->get_length(info) != 3) {
 713     JVMCI_ERROR_NULL("info must not be null and have a length of 3");
 714   }
 715   JVMCIENV->put_int_at(info, 0, fd.access_flags().as_int());
 716   JVMCIENV->put_int_at(info, 1, fd.offset());
 717   JVMCIENV->put_int_at(info, 2, fd.index());
 718   JVMCIKlassHandle handle(THREAD, fd.field_holder());
 719   JVMCIObject field_holder = JVMCIENV->get_jvmci_type(handle, JVMCI_CHECK_NULL);
 720   return JVMCIENV->get_jobject(field_holder);
 721 C2V_END
 722 
 723 C2V_VMENTRY_0(jint, getVtableIndexForInterfaceMethod, (JNIEnv* env, jobject, jobject jvmci_type, jobject jvmci_method))
 724   Klass* klass = JVMCIENV->asKlass(jvmci_type);
 725   methodHandle method(THREAD, JVMCIENV->asMethod(jvmci_method));
 726   if (klass->is_interface()) {
 727     JVMCI_THROW_MSG_0(InternalError, err_msg("Interface %s should be handled in Java code", klass->external_name()));
 728   }
 729   if (!method->method_holder()->is_interface()) {
 730     JVMCI_THROW_MSG_0(InternalError, err_msg("Method %s is not held by an interface, this case should be handled in Java code", method->name_and_sig_as_C_string()));
 731   }
 732   if (!klass->is_instance_klass()) {
 733     JVMCI_THROW_MSG_0(InternalError, err_msg("Class %s must be instance klass", klass->external_name()));
 734   }
 735   if (!InstanceKlass::cast(klass)->is_linked()) {
 736     JVMCI_THROW_MSG_0(InternalError, err_msg("Class %s must be linked", klass->external_name()));
 737   }
 738   return LinkResolver::vtable_index_of_interface_method(klass, method);
 739 C2V_END
 740 
 741 C2V_VMENTRY_NULL(jobject, resolveMethod, (JNIEnv* env, jobject, jobject receiver_jvmci_type, jobject jvmci_method, jobject caller_jvmci_type))
 742   Klass* recv_klass = JVMCIENV->asKlass(receiver_jvmci_type);
 743   Klass* caller_klass = JVMCIENV->asKlass(caller_jvmci_type);
 744   methodHandle method(THREAD, JVMCIENV->asMethod(jvmci_method));
 745 
 746   Klass* resolved     = method->method_holder();
 747   Symbol* h_name      = method->name();
 748   Symbol* h_signature = method->signature();
 749 
 750   if (MethodHandles::is_signature_polymorphic_method(method())) {
 751       // Signature polymorphic methods are already resolved, JVMCI just returns NULL in this case.
 752       return NULL;
 753   }
 754 
 755   if (method->name() == vmSymbols::clone_name() &&
 756       resolved == SystemDictionary::Object_klass() &&
 757       recv_klass->is_array_klass()) {
 758     // Resolution of the clone method on arrays always returns Object.clone even though that method
 759     // has protected access.  There's some trickery in the access checking to make this all work out
 760     // so it's necessary to pass in the array class as the resolved class to properly trigger this.
 761     // Otherwise it's impossible to resolve the array clone methods through JVMCI.  See
 762     // LinkResolver::check_method_accessability for the matching logic.
 763     resolved = recv_klass;
 764   }
 765 
 766   LinkInfo link_info(resolved, h_name, h_signature, caller_klass);
 767   Method* m = NULL;
 768   // Only do exact lookup if receiver klass has been linked.  Otherwise,
 769   // the vtable has not been setup, and the LinkResolver will fail.
 770   if (recv_klass->is_array_klass() ||
 771       (InstanceKlass::cast(recv_klass)->is_linked() && !recv_klass->is_interface())) {
 772     if (resolved->is_interface()) {
 773       m = LinkResolver::resolve_interface_call_or_null(recv_klass, link_info);
 774     } else {
 775       m = LinkResolver::resolve_virtual_call_or_null(recv_klass, link_info);
 776     }
 777   }
 778 
 779   if (m == NULL) {
 780     // Return NULL if there was a problem with lookup (uninitialized class, etc.)
 781     return NULL;
 782   }
 783 
 784   JVMCIObject result = JVMCIENV->get_jvmci_method(methodHandle(THREAD, m), JVMCI_CHECK_NULL);
 785   return JVMCIENV->get_jobject(result);
 786 C2V_END
 787 
 788 C2V_VMENTRY_0(jboolean, hasFinalizableSubclass,(JNIEnv* env, jobject, jobject jvmci_type))
 789   Klass* klass = JVMCIENV->asKlass(jvmci_type);
 790   assert(klass != NULL, "method must not be called for primitive types");
 791   return Dependencies::find_finalizable_subclass(klass) != NULL;
 792 C2V_END
 793 
 794 C2V_VMENTRY_NULL(jobject, getClassInitializer, (JNIEnv* env, jobject, jobject jvmci_type))
 795   Klass* klass = JVMCIENV->asKlass(jvmci_type);
 796   if (!klass->is_instance_klass()) {
 797     return NULL;
 798   }
 799   InstanceKlass* iklass = InstanceKlass::cast(klass);
 800   methodHandle clinit(THREAD, iklass->class_initializer());
 801   JVMCIObject result = JVMCIENV->get_jvmci_method(clinit, JVMCI_CHECK_NULL);
 802   return JVMCIENV->get_jobject(result);
 803 C2V_END
 804 
 805 C2V_VMENTRY_0(jlong, getMaxCallTargetOffset, (JNIEnv* env, jobject, jlong addr))
 806   address target_addr = (address) addr;
 807   if (target_addr != 0x0) {
 808     int64_t off_low = (int64_t)target_addr - ((int64_t)CodeCache::low_bound() + sizeof(int));
 809     int64_t off_high = (int64_t)target_addr - ((int64_t)CodeCache::high_bound() + sizeof(int));
 810     return MAX2(ABS(off_low), ABS(off_high));
 811   }
 812   return -1;
 813 C2V_END
 814 
 815 C2V_VMENTRY(void, setNotInlinableOrCompilable,(JNIEnv* env, jobject,  jobject jvmci_method))
 816   methodHandle method(THREAD, JVMCIENV->asMethod(jvmci_method));
 817   method->set_not_c1_compilable();
 818   method->set_not_c2_compilable();
 819   method->set_dont_inline(true);
 820 C2V_END
 821 
 822 C2V_VMENTRY_0(jint, installCode, (JNIEnv *env, jobject, jobject target, jobject compiled_code,
 823             jobject installed_code, jlong failed_speculations_address, jbyteArray speculations_obj))
 824   HandleMark hm;
 825   JNIHandleMark jni_hm(thread);
 826 
 827   JVMCIObject target_handle = JVMCIENV->wrap(target);
 828   JVMCIObject compiled_code_handle = JVMCIENV->wrap(compiled_code);
 829   CodeBlob* cb = NULL;
 830   JVMCIObject installed_code_handle = JVMCIENV->wrap(installed_code);
 831   JVMCIPrimitiveArray speculations_handle = JVMCIENV->wrap(speculations_obj);
 832 
 833   int speculations_len = JVMCIENV->get_length(speculations_handle);
 834   char* speculations = NEW_RESOURCE_ARRAY(char, speculations_len);
 835   JVMCIENV->copy_bytes_to(speculations_handle, (jbyte*) speculations, 0, speculations_len);
 836 


 992   char* buffer = NEW_RESOURCE_ARRAY(char, bufferSize);
 993   stringStream st(buffer, bufferSize);
 994   if (cb->is_nmethod()) {
 995     nmethod* nm = (nmethod*) cb;
 996     if (!nm->is_alive()) {
 997       return NULL;
 998     }
 999   }
1000   Disassembler::decode(cb, &st);
1001   if (st.size() <= 0) {
1002     return NULL;
1003   }
1004 
1005   JVMCIObject result = JVMCIENV->create_string(st.as_string(), JVMCI_CHECK_NULL);
1006   return JVMCIENV->get_jobject(result);
1007 C2V_END
1008 
1009 C2V_VMENTRY_NULL(jobject, getStackTraceElement, (JNIEnv* env, jobject, jobject jvmci_method, int bci))
1010   HandleMark hm;
1011 
1012   methodHandle method(THREAD, JVMCIENV->asMethod(jvmci_method));
1013   JVMCIObject element = JVMCIENV->new_StackTraceElement(method, bci, JVMCI_CHECK_NULL);
1014   return JVMCIENV->get_jobject(element);
1015 C2V_END
1016 
1017 C2V_VMENTRY_NULL(jobject, executeHotSpotNmethod, (JNIEnv* env, jobject, jobject args, jobject hs_nmethod))
1018   // The incoming arguments array would have to contain JavaConstants instead of regular objects
1019   // and the return value would have to be wrapped as a JavaConstant.
1020   requireInHotSpot("executeHotSpotNmethod", JVMCI_CHECK_NULL);
1021 
1022   HandleMark hm;
1023 
1024   JVMCIObject nmethod_mirror = JVMCIENV->wrap(hs_nmethod);
1025   nmethod* nm = JVMCIENV->asNmethod(nmethod_mirror);
1026   if (nm == NULL) {
1027     JVMCI_THROW_NULL(InvalidInstalledCodeException);
1028   }
1029   methodHandle mh(THREAD, nm->method());
1030   Symbol* signature = mh->signature();
1031   JavaCallArguments jca(mh->size_of_parameters());
1032 
1033   JavaArgumentUnboxer jap(signature, &jca, (arrayOop) JNIHandles::resolve(args), mh->is_static());
1034   JavaValue result(jap.get_ret_type());
1035   jca.set_alternative_target(nm);
1036   JavaCalls::call(&result, mh, &jca, CHECK_NULL);
1037 
1038   if (jap.get_ret_type() == T_VOID) {
1039     return NULL;
1040   } else if (is_reference_type(jap.get_ret_type())) {
1041     return JNIHandles::make_local((oop) result.get_jobject());
1042   } else {
1043     jvalue *value = (jvalue *) result.get_value_addr();
1044     // Narrow the value down if required (Important on big endian machines)
1045     switch (jap.get_ret_type()) {
1046       case T_BOOLEAN:
1047        value->z = (jboolean) value->i;
1048        break;
1049       case T_BYTE:


1087     i += 2;
1088   }
1089 
1090   return (jlongArray) JVMCIENV->get_jobject(result);
1091 C2V_END
1092 
1093 C2V_VMENTRY_0(jlong, getLocalVariableTableStart, (JNIEnv* env, jobject, jobject jvmci_method))
1094   Method* method = JVMCIENV->asMethod(jvmci_method);
1095   if (!method->has_localvariable_table()) {
1096     return 0;
1097   }
1098   return (jlong) (address) method->localvariable_table_start();
1099 C2V_END
1100 
1101 C2V_VMENTRY_0(jint, getLocalVariableTableLength, (JNIEnv* env, jobject, jobject jvmci_method))
1102   Method* method = JVMCIENV->asMethod(jvmci_method);
1103   return method->localvariable_table_length();
1104 C2V_END
1105 
1106 C2V_VMENTRY(void, reprofile, (JNIEnv* env, jobject, jobject jvmci_method))
1107   methodHandle method(THREAD, JVMCIENV->asMethod(jvmci_method));
1108   MethodCounters* mcs = method->method_counters();
1109   if (mcs != NULL) {
1110     mcs->clear_counters();
1111   }
1112   NOT_PRODUCT(method->set_compiled_invocation_count(0));
1113 
1114   CompiledMethod* code = method->code();
1115   if (code != NULL) {
1116     code->make_not_entrant();
1117   }
1118 
1119   MethodData* method_data = method->method_data();
1120   if (method_data == NULL) {
1121     ClassLoaderData* loader_data = method->method_holder()->class_loader_data();
1122     method_data = MethodData::allocate(loader_data, method, CHECK);
1123     method->set_method_data(method_data);
1124   } else {
1125     method_data->initialize();
1126   }
1127 C2V_END


1144     jlong* temp_array = NEW_RESOURCE_ARRAY(jlong, JVMCICounterSize);
1145     JavaThread::collect_counters(temp_array, JVMCICounterSize);
1146     JVMCIENV->copy_longs_from(temp_array, array, 0, JVMCICounterSize);
1147   }
1148   return (jlongArray) JVMCIENV->get_jobject(array);
1149 C2V_END
1150 
1151 C2V_VMENTRY_0(jint, getCountersSize, (JNIEnv* env, jobject))
1152   return (jint) JVMCICounterSize;
1153 C2V_END
1154 
1155 C2V_VMENTRY(void, setCountersSize, (JNIEnv* env, jobject, jint new_size))
1156   JavaThread::resize_all_jvmci_counters(new_size);
1157 C2V_END
1158 
1159 C2V_VMENTRY_0(jint, allocateCompileId, (JNIEnv* env, jobject, jobject jvmci_method, int entry_bci))
1160   HandleMark hm;
1161   if (jvmci_method == NULL) {
1162     JVMCI_THROW_0(NullPointerException);
1163   }
1164   methodHandle method(THREAD, JVMCIENV->asMethod(jvmci_method));
1165   if (entry_bci >= method->code_size() || entry_bci < -1) {
1166     JVMCI_THROW_MSG_0(IllegalArgumentException, err_msg("Unexpected bci %d", entry_bci));
1167   }
1168   return CompileBroker::assign_compile_id_unlocked(THREAD, method, entry_bci);
1169 C2V_END
1170 
1171 
1172 C2V_VMENTRY_0(jboolean, isMature, (JNIEnv* env, jobject, jlong metaspace_method_data))
1173   MethodData* mdo = JVMCIENV->asMethodData(metaspace_method_data);
1174   return mdo != NULL && mdo->is_mature();
1175 C2V_END
1176 
1177 C2V_VMENTRY_0(jboolean, hasCompiledCodeForOSR, (JNIEnv* env, jobject, jobject jvmci_method, int entry_bci, int comp_level))
1178   Method* method = JVMCIENV->asMethod(jvmci_method);
1179   return method->lookup_osr_nmethod_for(entry_bci, comp_level, true) != NULL;
1180 C2V_END
1181 
1182 C2V_VMENTRY_NULL(jobject, getSymbol, (JNIEnv* env, jobject, jlong symbol))
1183   JVMCIObject sym = JVMCIENV->create_string((Symbol*)(address)symbol, JVMCI_CHECK_NULL);
1184   return JVMCIENV->get_jobject(sym);


1186 
1187 bool matches(jobjectArray methods, Method* method, JVMCIEnv* JVMCIENV) {
1188   objArrayOop methods_oop = (objArrayOop) JNIHandles::resolve(methods);
1189 
1190   for (int i = 0; i < methods_oop->length(); i++) {
1191     oop resolved = methods_oop->obj_at(i);
1192     if ((resolved->klass() == HotSpotJVMCI::HotSpotResolvedJavaMethodImpl::klass()) && HotSpotJVMCI::asMethod(JVMCIENV, resolved) == method) {
1193       return true;
1194     }
1195   }
1196   return false;
1197 }
1198 
1199 void call_interface(JavaValue* result, Klass* spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
1200   CallInfo callinfo;
1201   Handle receiver = args->receiver();
1202   Klass* recvrKlass = receiver.is_null() ? (Klass*)NULL : receiver->klass();
1203   LinkInfo link_info(spec_klass, name, signature);
1204   LinkResolver::resolve_interface_call(
1205           callinfo, receiver, recvrKlass, link_info, true, CHECK);
1206   methodHandle method(THREAD, callinfo.selected_method());
1207   assert(method.not_null(), "should have thrown exception");
1208 
1209   // Invoke the method
1210   JavaCalls::call(result, method, args, CHECK);
1211 }
1212 
1213 C2V_VMENTRY_NULL(jobject, iterateFrames, (JNIEnv* env, jobject compilerToVM, jobjectArray initial_methods, jobjectArray match_methods, jint initialSkip, jobject visitor_handle))
1214 
1215   if (!thread->has_last_Java_frame()) {
1216     return NULL;
1217   }
1218   Handle visitor(THREAD, JNIHandles::resolve_non_null(visitor_handle));
1219 
1220   requireInHotSpot("iterateFrames", JVMCI_CHECK_NULL);
1221 
1222   HotSpotJVMCI::HotSpotStackFrameReference::klass()->initialize(CHECK_NULL);
1223   Handle frame_reference = HotSpotJVMCI::HotSpotStackFrameReference::klass()->allocate_instance_handle(CHECK_NULL);
1224 
1225   StackFrameStream fst(thread);
1226   jobjectArray methods = initial_methods;


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());
1281             JVMCIObject method = JVMCIENV->get_jvmci_method(mh, JVMCI_CHECK_NULL);
1282             HotSpotJVMCI::HotSpotStackFrameReference::set_method(JVMCIENV, frame_reference(), JNIHandles::resolve(method.as_jobject()));
1283           }
1284         }
1285       } else if (vf->is_interpreted_frame()) {
1286         // interpreted method frame
1287         interpretedVFrame* ivf = interpretedVFrame::cast(vf);
1288         if (methods == NULL || matches(methods, ivf->method(), JVMCIENV)) {
1289           if (initialSkip > 0) {
1290             initialSkip--;
1291           } else {
1292             locals = ivf->locals();
1293             HotSpotJVMCI::HotSpotStackFrameReference::set_bci(JVMCIENV, frame_reference(), ivf->bci());
1294             methodHandle mh(THREAD, ivf->method());
1295             JVMCIObject method = JVMCIENV->get_jvmci_method(mh, JVMCI_CHECK_NULL);
1296             HotSpotJVMCI::HotSpotStackFrameReference::set_method(JVMCIENV, frame_reference(), JNIHandles::resolve(method.as_jobject()));
1297             HotSpotJVMCI::HotSpotStackFrameReference::set_localIsVirtual(JVMCIENV, frame_reference(), NULL);
1298           }
1299         }
1300       }
1301 
1302       // locals != NULL means that we found a matching frame and result is already partially initialized
1303       if (locals != NULL) {
1304         methods = match_methods;
1305         HotSpotJVMCI::HotSpotStackFrameReference::set_compilerToVM(JVMCIENV, frame_reference(), JNIHandles::resolve(compilerToVM));
1306         HotSpotJVMCI::HotSpotStackFrameReference::set_stackPointer(JVMCIENV, frame_reference(), (jlong) fst.current()->sp());
1307         HotSpotJVMCI::HotSpotStackFrameReference::set_frameNumber(JVMCIENV, frame_reference(), frame_number);
1308 
1309         // initialize the locals array
1310         objArrayOop array_oop = oopFactory::new_objectArray(locals->size(), CHECK_NULL);
1311         objArrayHandle array(THREAD, array_oop);
1312         for (int i = 0; i < locals->size(); i++) {
1313           StackValue* var = locals->at(i);
1314           if (var->type() == T_OBJECT) {
1315             array->obj_at_put(i, locals->at(i)->get_obj()());


1355       if (vf->is_top()) {
1356         break;
1357       }
1358       frame_number++;
1359       vf = vf->sender();
1360     } // end of vframe loop
1361 
1362     if (fst.is_done()) {
1363       break;
1364     }
1365     fst.next();
1366     vf = vframe::new_vframe(fst.current(), fst.register_map(), thread);
1367     frame_number = 0;
1368   } // end of frame loop
1369 
1370   // the end was reached without finding a matching method
1371   return NULL;
1372 C2V_END
1373 
1374 C2V_VMENTRY(void, resolveInvokeDynamicInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
1375   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
1376   CallInfo callInfo;
1377   LinkResolver::resolve_invoke(callInfo, Handle(), cp, index, Bytecodes::_invokedynamic, CHECK);
1378   ConstantPoolCacheEntry* cp_cache_entry = cp->invokedynamic_cp_cache_entry_at(index);
1379   cp_cache_entry->set_dynamic_call(cp, callInfo);
1380 C2V_END
1381 
1382 C2V_VMENTRY(void, resolveInvokeHandleInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
1383   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
1384   Klass* holder = cp->klass_ref_at(index, CHECK);
1385   Symbol* name = cp->name_ref_at(index);
1386   if (MethodHandles::is_signature_polymorphic_name(holder, name)) {
1387     CallInfo callInfo;
1388     LinkResolver::resolve_invoke(callInfo, Handle(), cp, index, Bytecodes::_invokehandle, CHECK);
1389     ConstantPoolCacheEntry* cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
1390     cp_cache_entry->set_method_handle(cp, callInfo);
1391   }
1392 C2V_END
1393 
1394 C2V_VMENTRY_0(jint, isResolvedInvokeHandleInPool, (JNIEnv* env, jobject, jobject jvmci_constant_pool, jint index))
1395   constantPoolHandle cp(THREAD, JVMCIENV->asConstantPool(jvmci_constant_pool));
1396   ConstantPoolCacheEntry* cp_cache_entry = cp->cache()->entry_at(cp->decode_cpcache_index(index));
1397   if (cp_cache_entry->is_resolved(Bytecodes::_invokehandle)) {
1398     // MethodHandle.invoke* --> LambdaForm?
1399     ResourceMark rm;
1400 
1401     LinkInfo link_info(cp, index, CATCH);
1402 
1403     Klass* resolved_klass = link_info.resolved_klass();
1404 
1405     Symbol* name_sym = cp->name_ref_at(index);
1406 
1407     vmassert(MethodHandles::is_method_handle_invoke_name(resolved_klass, name_sym), "!");
1408     vmassert(MethodHandles::is_signature_polymorphic_name(resolved_klass, name_sym), "!");
1409 
1410     methodHandle adapter_method(THREAD, cp_cache_entry->f1_as_method());
1411 
1412     methodHandle resolved_method(adapter_method);
1413 
1414     // Can we treat it as a regular invokevirtual?
1415     if (resolved_method->method_holder() == resolved_klass && resolved_method->name() == name_sym) {
1416       vmassert(!resolved_method->is_static(),"!");
1417       vmassert(MethodHandles::is_signature_polymorphic_method(resolved_method()),"!");
1418       vmassert(!MethodHandles::is_signature_polymorphic_static(resolved_method->intrinsic_id()), "!");
1419       vmassert(cp_cache_entry->appendix_if_resolved(cp) == NULL, "!");
1420 
1421       methodHandle m(THREAD, LinkResolver::linktime_resolve_virtual_method_or_null(link_info));
1422       vmassert(m == resolved_method, "!!");
1423       return -1;
1424     }
1425 
1426     return Bytecodes::_invokevirtual;
1427   }
1428   if (cp_cache_entry->is_resolved(Bytecodes::_invokedynamic)) {
1429     return Bytecodes::_invokedynamic;
1430   }
1431   return -1;
1432 C2V_END
1433 
1434 
1435 C2V_VMENTRY_NULL(jobject, getSignaturePolymorphicHolders, (JNIEnv* env, jobject))
1436   JVMCIObjectArray holders = JVMCIENV->new_String_array(2, JVMCI_CHECK_NULL);
1437   JVMCIObject mh = JVMCIENV->create_string("Ljava/lang/invoke/MethodHandle;", JVMCI_CHECK_NULL);
1438   JVMCIObject vh = JVMCIENV->create_string("Ljava/lang/invoke/VarHandle;", JVMCI_CHECK_NULL);
1439   JVMCIENV->put_object_at(holders, 0, mh);
1440   JVMCIENV->put_object_at(holders, 1, vh);
1441   return JVMCIENV->get_jobject(holders);


1894   }
1895   Klass* klass = JVMCIENV->asKlass(holder);
1896   if (!klass->is_instance_klass()) {
1897     JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(0, JVMCI_CHECK_NULL);
1898     return JVMCIENV->get_jobjectArray(methods);
1899   }
1900 
1901   InstanceKlass* iklass = InstanceKlass::cast(klass);
1902   // Ensure class is linked
1903   iklass->link_class(CHECK_NULL);
1904 
1905   GrowableArray<Method*> constructors_array;
1906   for (int i = 0; i < iklass->methods()->length(); i++) {
1907     Method* m = iklass->methods()->at(i);
1908     if (m->is_initializer() && !m->is_static()) {
1909       constructors_array.append(m);
1910     }
1911   }
1912   JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(constructors_array.length(), JVMCI_CHECK_NULL);
1913   for (int i = 0; i < constructors_array.length(); i++) {
1914     methodHandle ctor(THREAD, constructors_array.at(i));
1915     JVMCIObject method = JVMCIENV->get_jvmci_method(ctor, JVMCI_CHECK_NULL);
1916     JVMCIENV->put_object_at(methods, i, method);
1917   }
1918   return JVMCIENV->get_jobjectArray(methods);
1919 C2V_END
1920 
1921 C2V_VMENTRY_NULL(jobjectArray, getDeclaredMethods, (JNIEnv* env, jobject, jobject holder))
1922   if (holder == NULL) {
1923     JVMCI_THROW_0(NullPointerException);
1924   }
1925   Klass* klass = JVMCIENV->asKlass(holder);
1926   if (!klass->is_instance_klass()) {
1927     JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(0, JVMCI_CHECK_NULL);
1928     return JVMCIENV->get_jobjectArray(methods);
1929   }
1930 
1931   InstanceKlass* iklass = InstanceKlass::cast(klass);
1932   // Ensure class is linked
1933   iklass->link_class(CHECK_NULL);
1934 
1935   GrowableArray<Method*> methods_array;
1936   for (int i = 0; i < iklass->methods()->length(); i++) {
1937     Method* m = iklass->methods()->at(i);
1938     if (!m->is_initializer() && !m->is_overpass()) {
1939       methods_array.append(m);
1940     }
1941   }
1942   JVMCIObjectArray methods = JVMCIENV->new_ResolvedJavaMethod_array(methods_array.length(), JVMCI_CHECK_NULL);
1943   for (int i = 0; i < methods_array.length(); i++) {
1944     methodHandle mh(THREAD, methods_array.at(i));
1945     JVMCIObject method = JVMCIENV->get_jvmci_method(mh, JVMCI_CHECK_NULL);
1946     JVMCIENV->put_object_at(methods, i, method);
1947   }
1948   return JVMCIENV->get_jobjectArray(methods);
1949 C2V_END
1950 
1951 C2V_VMENTRY_NULL(jobject, readFieldValue, (JNIEnv* env, jobject, jobject object, jobject field, jboolean is_volatile))
1952   if (object == NULL || field == NULL) {
1953     JVMCI_THROW_0(NullPointerException);
1954   }
1955   JVMCIObject field_object = JVMCIENV->wrap(field);
1956   JVMCIObject java_type = JVMCIENV->get_HotSpotResolvedJavaFieldImpl_type(field_object);
1957   int modifiers = JVMCIENV->get_HotSpotResolvedJavaFieldImpl_modifiers(field_object);
1958   Klass* holder = JVMCIENV->asKlass(JVMCIENV->get_HotSpotResolvedJavaFieldImpl_holder(field_object));
1959   if (!holder->is_instance_klass()) {
1960     JVMCI_THROW_MSG_0(InternalError, err_msg("Holder %s must be instance klass", holder->external_name()));
1961   }
1962   InstanceKlass* ik = InstanceKlass::cast(holder);
1963   BasicType constant_type;
1964   if (JVMCIENV->isa_HotSpotResolvedPrimitiveType(java_type)) {
1965     constant_type = JVMCIENV->kindToBasicType(JVMCIENV->get_HotSpotResolvedPrimitiveType_kind(java_type), JVMCI_CHECK_NULL);


2246     JVMCIObject receiver = runtime->get_HotSpotJVMCIRuntime(peerEnv);
2247     if (peerEnv->has_pending_exception()) {
2248       peerEnv->describe_pending_exception(true);
2249     }
2250     shared_library = JVMCIEnv::get_shared_library_handle();
2251     if (shared_library == NULL) {
2252       JVMCI_THROW_MSG_0(InternalError, "Error initializing JVMCI runtime");
2253     }
2254   }
2255 
2256   if (mirror == NULL) {
2257     JVMCI_THROW_0(NullPointerException);
2258   }
2259   Klass* klass = java_lang_Class::as_Klass(JNIHandles::resolve(mirror));
2260   if (klass == NULL || !klass->is_instance_klass()) {
2261     JVMCI_THROW_MSG_0(IllegalArgumentException, "clazz is for primitive type");
2262   }
2263 
2264   InstanceKlass* iklass = InstanceKlass::cast(klass);
2265   for (int i = 0; i < iklass->methods()->length(); i++) {
2266     methodHandle method(THREAD, iklass->methods()->at(i));
2267     if (method->is_native()) {
2268 
2269       // Compute argument size
2270       int args_size = 1                             // JNIEnv
2271                     + (method->is_static() ? 1 : 0) // class for static methods
2272                     + method->size_of_parameters(); // actual parameters
2273 
2274       // 1) Try JNI short style
2275       stringStream st;
2276       char* pure_name = NativeLookup::pure_jni_name(method);
2277       os::print_jni_name_prefix_on(&st, args_size);
2278       st.print_raw(pure_name);
2279       os::print_jni_name_suffix_on(&st, args_size);
2280       char* jni_name = st.as_string();
2281 
2282       address entry = (address) os::dll_lookup(shared_library, jni_name);
2283       if (entry == NULL) {
2284         // 2) Try JNI long style
2285         st.reset();
2286         char* long_name = NativeLookup::long_jni_name(method);


2414     extern struct JavaVM_ main_vm;
2415     jint res = main_vm.DetachCurrentThread();
2416     if (res != JNI_OK) {
2417       JNI_THROW("detachCurrentThread", InternalError, err_msg("Cannot detach non-attached thread"));
2418     }
2419   }
2420 C2V_END
2421 
2422 C2V_VMENTRY_0(jlong, translate, (JNIEnv* env, jobject, jobject obj_handle))
2423   requireJVMCINativeLibrary(JVMCI_CHECK_0);
2424   if (obj_handle == NULL) {
2425     return 0L;
2426   }
2427   JVMCIEnv __peer_jvmci_env__(thread, !JVMCIENV->is_hotspot(), __FILE__, __LINE__);
2428   JVMCIEnv* peerEnv = &__peer_jvmci_env__;
2429   JVMCIEnv* thisEnv = JVMCIENV;
2430 
2431   JVMCIObject obj = thisEnv->wrap(obj_handle);
2432   JVMCIObject result;
2433   if (thisEnv->isa_HotSpotResolvedJavaMethodImpl(obj)) {
2434     methodHandle method(THREAD, thisEnv->asMethod(obj));
2435     result = peerEnv->get_jvmci_method(method, JVMCI_CHECK_0);
2436   } else if (thisEnv->isa_HotSpotResolvedObjectTypeImpl(obj)) {
2437     Klass* klass = thisEnv->asKlass(obj);
2438     JVMCIKlassHandle klass_handle(THREAD);
2439     klass_handle = klass;
2440     result = peerEnv->get_jvmci_type(klass_handle, JVMCI_CHECK_0);
2441   } else if (thisEnv->isa_HotSpotResolvedPrimitiveType(obj)) {
2442     BasicType type = JVMCIENV->kindToBasicType(JVMCIENV->get_HotSpotResolvedPrimitiveType_kind(obj), JVMCI_CHECK_0);
2443     result = peerEnv->get_jvmci_primitive_type(type);
2444   } else if (thisEnv->isa_IndirectHotSpotObjectConstantImpl(obj) ||
2445              thisEnv->isa_DirectHotSpotObjectConstantImpl(obj)) {
2446     Handle constant = thisEnv->asConstant(obj, JVMCI_CHECK_0);
2447     result = peerEnv->get_object_constant(constant());
2448   } else if (thisEnv->isa_HotSpotNmethod(obj)) {
2449     nmethod* nm = thisEnv->asNmethod(obj);
2450     if (nm != NULL) {
2451       JVMCINMethodData* data = nm->jvmci_nmethod_data();
2452       if (data != NULL) {
2453         if (peerEnv->is_hotspot()) {
2454           // Only the mirror in the HotSpot heap is accessible
2455           // through JVMCINMethodData
2456           oop nmethod_mirror = data->get_nmethod_mirror(nm, /* phantom_ref */ true);
2457           if (nmethod_mirror != NULL) {
2458             result = HotSpotJVMCI::wrap(nmethod_mirror);
2459           }
2460         }
2461       }
2462     }
2463     if (result.is_null()) {
2464       JVMCIObject methodObject = thisEnv->get_HotSpotNmethod_method(obj);
2465       methodHandle mh(THREAD, thisEnv->asMethod(methodObject));
2466       jboolean isDefault = thisEnv->get_HotSpotNmethod_isDefault(obj);
2467       jlong compileIdSnapshot = thisEnv->get_HotSpotNmethod_compileIdSnapshot(obj);
2468       JVMCIObject name_string = thisEnv->get_InstalledCode_name(obj);
2469       const char* cstring = name_string.is_null() ? NULL : thisEnv->as_utf8_string(name_string);
2470       // Create a new HotSpotNmethod instance in the peer runtime
2471       result = peerEnv->new_HotSpotNmethod(mh, cstring, isDefault, compileIdSnapshot, JVMCI_CHECK_0);
2472       if (nm == NULL) {
2473         // nmethod must have been unloaded
2474       } else {
2475         // Link the new HotSpotNmethod to the nmethod
2476         peerEnv->initialize_installed_code(result, nm, JVMCI_CHECK_0);
2477         // Only HotSpotNmethod instances in the HotSpot heap are tracked directly by the runtime.
2478         if (peerEnv->is_hotspot()) {
2479           JVMCINMethodData* data = nm->jvmci_nmethod_data();
2480           if (data == NULL) {
2481             JVMCI_THROW_MSG_0(IllegalArgumentException, "Cannot set HotSpotNmethod mirror for default nmethod");
2482           }
2483           if (data->get_nmethod_mirror(nm, /* phantom_ref */ false) != NULL) {
2484             JVMCI_THROW_MSG_0(IllegalArgumentException, "Cannot overwrite existing HotSpotNmethod mirror for nmethod");
2485           }
2486           oop nmethod_mirror = HotSpotJVMCI::resolve(result);
2487           data->set_nmethod_mirror(nm, nmethod_mirror);
2488         }
2489       }
2490     }
2491   } else {


2511 C2V_VMENTRY(void, updateHotSpotNmethod, (JNIEnv* env, jobject, jobject code_handle))
2512   JVMCIObject code = JVMCIENV->wrap(code_handle);
2513   // Execute this operation for the side effect of updating the InstalledCode state
2514   JVMCIENV->asNmethod(code);
2515 }
2516 
2517 C2V_VMENTRY_NULL(jbyteArray, getCode, (JNIEnv* env, jobject, jobject code_handle))
2518   JVMCIObject code = JVMCIENV->wrap(code_handle);
2519   CodeBlob* cb = JVMCIENV->asCodeBlob(code);
2520   if (cb == NULL) {
2521     return NULL;
2522   }
2523   int code_size = cb->code_size();
2524   JVMCIPrimitiveArray result = JVMCIENV->new_byteArray(code_size, JVMCI_CHECK_NULL);
2525   JVMCIENV->copy_bytes_from((jbyte*) cb->code_begin(), result, 0, code_size);
2526   return JVMCIENV->get_jbyteArray(result);
2527 }
2528 
2529 C2V_VMENTRY_NULL(jobject, asReflectionExecutable, (JNIEnv* env, jobject, jobject jvmci_method))
2530   requireInHotSpot("asReflectionExecutable", JVMCI_CHECK_NULL);
2531   methodHandle m(THREAD, JVMCIENV->asMethod(jvmci_method));
2532   oop executable;
2533   if (m->is_initializer()) {
2534     if (m->is_static_initializer()) {
2535       JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2536           "Cannot create java.lang.reflect.Method for class initializer");
2537     }
2538     executable = Reflection::new_constructor(m, CHECK_NULL);
2539   } else {
2540     executable = Reflection::new_method(m, false, CHECK_NULL);
2541   }
2542   return JNIHandles::make_local(THREAD, executable);
2543 }
2544 
2545 C2V_VMENTRY_NULL(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index))
2546   requireInHotSpot("asReflectionField", JVMCI_CHECK_NULL);
2547   Klass* klass = JVMCIENV->asKlass(jvmci_type);
2548   if (!klass->is_instance_klass()) {
2549     JVMCI_THROW_MSG_NULL(IllegalArgumentException,
2550         err_msg("Expected non-primitive type, got %s", klass->external_name()));
2551   }


2576       return current;
2577     }
2578   }
2579   JVMCIObjectArray result = JVMCIENV->new_byte_array_array(result_length, JVMCI_CHECK_NULL);
2580   int result_index = 0;
2581   for (FailedSpeculation* fs = head; result_index < result_length; fs = fs->next()) {
2582     assert(fs != NULL, "npe");
2583     JVMCIPrimitiveArray entry;
2584     if (result_index < current_length) {
2585       entry = (JVMCIPrimitiveArray) JVMCIENV->get_object_at(current_array, result_index);
2586     } else {
2587       entry = JVMCIENV->new_byteArray(fs->data_len(), JVMCI_CHECK_NULL);
2588       JVMCIENV->copy_bytes_from((jbyte*) fs->data(), entry, 0, fs->data_len());
2589     }
2590     JVMCIENV->put_object_at(result, result_index++, entry);
2591   }
2592   return JVMCIENV->get_jobjectArray(result);
2593 }
2594 
2595 C2V_VMENTRY_0(jlong, getFailedSpeculationsAddress, (JNIEnv* env, jobject, jobject jvmci_method))
2596   methodHandle method(THREAD, JVMCIENV->asMethod(jvmci_method));
2597   MethodData* method_data = method->method_data();
2598   if (method_data == NULL) {
2599     ClassLoaderData* loader_data = method->method_holder()->class_loader_data();
2600     method_data = MethodData::allocate(loader_data, method, CHECK_0);
2601     method->set_method_data(method_data);
2602   }
2603   return (jlong) method_data->get_failed_speculations_address();
2604 }
2605 
2606 C2V_VMENTRY(void, releaseFailedSpeculations, (JNIEnv* env, jobject, jlong failed_speculations_address))
2607   FailedSpeculation::free_failed_speculations((FailedSpeculation**)(address) failed_speculations_address);
2608 }
2609 
2610 C2V_VMENTRY_0(jboolean, addFailedSpeculation, (JNIEnv* env, jobject, jlong failed_speculations_address, jbyteArray speculation_obj))
2611   JVMCIPrimitiveArray speculation_handle = JVMCIENV->wrap(speculation_obj);
2612   int speculation_len = JVMCIENV->get_length(speculation_handle);
2613   char* speculation = NEW_RESOURCE_ARRAY(char, speculation_len);
2614   JVMCIENV->copy_bytes_to(speculation_handle, (jbyte*) speculation, 0, speculation_len);
2615   return FailedSpeculation::add_failed_speculation(NULL, (FailedSpeculation**)(address) failed_speculations_address, (address) speculation, speculation_len);
2616 }


< prev index next >