1 /*
   2  * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/classLoader.hpp"
  27 #include "classfile/javaAssertions.hpp"
  28 #include "classfile/javaClasses.hpp"
  29 #include "classfile/symbolTable.hpp"
  30 #include "classfile/systemDictionary.hpp"
  31 #include "classfile/vmSymbols.hpp"
  32 #include "gc_interface/collectedHeap.inline.hpp"
  33 #include "memory/oopFactory.hpp"
  34 #include "memory/universe.inline.hpp"
  35 #include "oops/fieldStreams.hpp"
  36 #include "oops/instanceKlass.hpp"
  37 #include "oops/objArrayKlass.hpp"
  38 #include "oops/methodOop.hpp"
  39 #include "prims/jvm.h"
  40 #include "prims/jvm_misc.hpp"
  41 #include "prims/jvmtiExport.hpp"
  42 #include "prims/jvmtiThreadState.hpp"
  43 #include "prims/nativeLookup.hpp"
  44 #include "prims/privilegedStack.hpp"
  45 #include "runtime/arguments.hpp"
  46 #include "runtime/dtraceJSDT.hpp"
  47 #include "runtime/handles.inline.hpp"
  48 #include "runtime/init.hpp"
  49 #include "runtime/interfaceSupport.hpp"
  50 #include "runtime/java.hpp"
  51 #include "runtime/javaCalls.hpp"
  52 #include "runtime/jfieldIDWorkaround.hpp"
  53 #include "runtime/os.hpp"
  54 #include "runtime/perfData.hpp"
  55 #include "runtime/reflection.hpp"
  56 #include "runtime/vframe.hpp"
  57 #include "runtime/vm_operations.hpp"
  58 #include "services/attachListener.hpp"
  59 #include "services/management.hpp"
  60 #include "services/threadService.hpp"
  61 #include "utilities/copy.hpp"
  62 #include "utilities/defaultStream.hpp"
  63 #include "utilities/dtrace.hpp"
  64 #include "utilities/events.hpp"
  65 #include "utilities/histogram.hpp"
  66 #include "utilities/top.hpp"
  67 #include "utilities/utf8.hpp"
  68 #ifdef TARGET_OS_FAMILY_linux
  69 # include "jvm_linux.h"
  70 #endif
  71 #ifdef TARGET_OS_FAMILY_solaris
  72 # include "jvm_solaris.h"
  73 #endif
  74 #ifdef TARGET_OS_FAMILY_windows
  75 # include "jvm_windows.h"
  76 #endif
  77 #ifdef TARGET_OS_FAMILY_bsd
  78 # include "jvm_bsd.h"
  79 #endif
  80 
  81 #include <errno.h>
  82 
  83 #ifndef USDT2
  84 HS_DTRACE_PROBE_DECL1(hotspot, thread__sleep__begin, long long);
  85 HS_DTRACE_PROBE_DECL1(hotspot, thread__sleep__end, int);
  86 HS_DTRACE_PROBE_DECL0(hotspot, thread__yield);
  87 #endif /* !USDT2 */
  88 
  89 /*
  90   NOTE about use of any ctor or function call that can trigger a safepoint/GC:
  91   such ctors and calls MUST NOT come between an oop declaration/init and its
  92   usage because if objects are move this may cause various memory stomps, bus
  93   errors and segfaults. Here is a cookbook for causing so called "naked oop
  94   failures":
  95 
  96       JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields<etc> {
  97           JVMWrapper("JVM_GetClassDeclaredFields");
  98 
  99           // Object address to be held directly in mirror & not visible to GC
 100           oop mirror = JNIHandles::resolve_non_null(ofClass);
 101 
 102           // If this ctor can hit a safepoint, moving objects around, then
 103           ComplexConstructor foo;
 104 
 105           // Boom! mirror may point to JUNK instead of the intended object
 106           (some dereference of mirror)
 107 
 108           // Here's another call that may block for GC, making mirror stale
 109           MutexLocker ml(some_lock);
 110 
 111           // And here's an initializer that can result in a stale oop
 112           // all in one step.
 113           oop o = call_that_can_throw_exception(TRAPS);
 114 
 115 
 116   The solution is to keep the oop declaration BELOW the ctor or function
 117   call that might cause a GC, do another resolve to reassign the oop, or
 118   consider use of a Handle instead of an oop so there is immunity from object
 119   motion. But note that the "QUICK" entries below do not have a handlemark
 120   and thus can only support use of handles passed in.
 121 */
 122 
 123 static void trace_class_resolution_impl(klassOop to_class, TRAPS) {
 124   ResourceMark rm;
 125   int line_number = -1;
 126   const char * source_file = NULL;
 127   const char * trace = "explicit";
 128   klassOop caller = NULL;
 129   JavaThread* jthread = JavaThread::current();
 130   if (jthread->has_last_Java_frame()) {
 131     vframeStream vfst(jthread);
 132 
 133     // scan up the stack skipping ClassLoader, AccessController and PrivilegedAction frames
 134     TempNewSymbol access_controller = SymbolTable::new_symbol("java/security/AccessController", CHECK);
 135     klassOop access_controller_klass = SystemDictionary::resolve_or_fail(access_controller, false, CHECK);
 136     TempNewSymbol privileged_action = SymbolTable::new_symbol("java/security/PrivilegedAction", CHECK);
 137     klassOop privileged_action_klass = SystemDictionary::resolve_or_fail(privileged_action, false, CHECK);
 138 
 139     methodOop last_caller = NULL;
 140 
 141     while (!vfst.at_end()) {
 142       methodOop m = vfst.method();
 143       if (!vfst.method()->method_holder()->klass_part()->is_subclass_of(SystemDictionary::ClassLoader_klass())&&
 144           !vfst.method()->method_holder()->klass_part()->is_subclass_of(access_controller_klass) &&
 145           !vfst.method()->method_holder()->klass_part()->is_subclass_of(privileged_action_klass)) {
 146         break;
 147       }
 148       last_caller = m;
 149       vfst.next();
 150     }
 151     // if this is called from Class.forName0 and that is called from Class.forName,
 152     // then print the caller of Class.forName.  If this is Class.loadClass, then print
 153     // that caller, otherwise keep quiet since this should be picked up elsewhere.
 154     bool found_it = false;
 155     if (!vfst.at_end() &&
 156         instanceKlass::cast(vfst.method()->method_holder())->name() == vmSymbols::java_lang_Class() &&
 157         vfst.method()->name() == vmSymbols::forName0_name()) {
 158       vfst.next();
 159       if (!vfst.at_end() &&
 160           instanceKlass::cast(vfst.method()->method_holder())->name() == vmSymbols::java_lang_Class() &&
 161           vfst.method()->name() == vmSymbols::forName_name()) {
 162         vfst.next();
 163         found_it = true;
 164       }
 165     } else if (last_caller != NULL &&
 166                instanceKlass::cast(last_caller->method_holder())->name() ==
 167                vmSymbols::java_lang_ClassLoader() &&
 168                (last_caller->name() == vmSymbols::loadClassInternal_name() ||
 169                 last_caller->name() == vmSymbols::loadClass_name())) {
 170       found_it = true;
 171     } else if (!vfst.at_end()) {
 172       if (vfst.method()->is_native()) {
 173         // JNI call
 174         found_it = true;
 175       }
 176     }
 177     if (found_it && !vfst.at_end()) {
 178       // found the caller
 179       caller = vfst.method()->method_holder();
 180       line_number = vfst.method()->line_number_from_bci(vfst.bci());
 181       if (line_number == -1) {
 182         // show method name if it's a native method
 183         trace = vfst.method()->name_and_sig_as_C_string();
 184       }
 185       Symbol* s = instanceKlass::cast(caller)->source_file_name();
 186       if (s != NULL) {
 187         source_file = s->as_C_string();
 188       }
 189     }
 190   }
 191   if (caller != NULL) {
 192     if (to_class != caller) {
 193       const char * from = Klass::cast(caller)->external_name();
 194       const char * to = Klass::cast(to_class)->external_name();
 195       // print in a single call to reduce interleaving between threads
 196       if (source_file != NULL) {
 197         tty->print("RESOLVE %s %s %s:%d (%s)\n", from, to, source_file, line_number, trace);
 198       } else {
 199         tty->print("RESOLVE %s %s (%s)\n", from, to, trace);
 200       }
 201     }
 202   }
 203 }
 204 
 205 void trace_class_resolution(klassOop to_class) {
 206   EXCEPTION_MARK;
 207   trace_class_resolution_impl(to_class, THREAD);
 208   if (HAS_PENDING_EXCEPTION) {
 209     CLEAR_PENDING_EXCEPTION;
 210   }
 211 }
 212 
 213 // Wrapper to trace JVM functions
 214 
 215 #ifdef ASSERT
 216   class JVMTraceWrapper : public StackObj {
 217    public:
 218     JVMTraceWrapper(const char* format, ...) {
 219       if (TraceJVMCalls) {
 220         va_list ap;
 221         va_start(ap, format);
 222         tty->print("JVM ");
 223         tty->vprint_cr(format, ap);
 224         va_end(ap);
 225       }
 226     }
 227   };
 228 
 229   Histogram* JVMHistogram;
 230   volatile jint JVMHistogram_lock = 0;
 231 
 232   class JVMHistogramElement : public HistogramElement {
 233     public:
 234      JVMHistogramElement(const char* name);
 235   };
 236 
 237   JVMHistogramElement::JVMHistogramElement(const char* elementName) {
 238     _name = elementName;
 239     uintx count = 0;
 240 
 241     while (Atomic::cmpxchg(1, &JVMHistogram_lock, 0) != 0) {
 242       while (OrderAccess::load_acquire(&JVMHistogram_lock) != 0) {
 243         count +=1;
 244         if ( (WarnOnStalledSpinLock > 0)
 245           && (count % WarnOnStalledSpinLock == 0)) {
 246           warning("JVMHistogram_lock seems to be stalled");
 247         }
 248       }
 249      }
 250 
 251     if(JVMHistogram == NULL)
 252       JVMHistogram = new Histogram("JVM Call Counts",100);
 253 
 254     JVMHistogram->add_element(this);
 255     Atomic::dec(&JVMHistogram_lock);
 256   }
 257 
 258   #define JVMCountWrapper(arg) \
 259       static JVMHistogramElement* e = new JVMHistogramElement(arg); \
 260       if (e != NULL) e->increment_count();  // Due to bug in VC++, we need a NULL check here eventhough it should never happen!
 261 
 262   #define JVMWrapper(arg1)                    JVMCountWrapper(arg1); JVMTraceWrapper(arg1)
 263   #define JVMWrapper2(arg1, arg2)             JVMCountWrapper(arg1); JVMTraceWrapper(arg1, arg2)
 264   #define JVMWrapper3(arg1, arg2, arg3)       JVMCountWrapper(arg1); JVMTraceWrapper(arg1, arg2, arg3)
 265   #define JVMWrapper4(arg1, arg2, arg3, arg4) JVMCountWrapper(arg1); JVMTraceWrapper(arg1, arg2, arg3, arg4)
 266 #else
 267   #define JVMWrapper(arg1)
 268   #define JVMWrapper2(arg1, arg2)
 269   #define JVMWrapper3(arg1, arg2, arg3)
 270   #define JVMWrapper4(arg1, arg2, arg3, arg4)
 271 #endif
 272 
 273 
 274 // Interface version /////////////////////////////////////////////////////////////////////
 275 
 276 
 277 JVM_LEAF(jint, JVM_GetInterfaceVersion())
 278   return JVM_INTERFACE_VERSION;
 279 JVM_END
 280 
 281 
 282 // java.lang.System //////////////////////////////////////////////////////////////////////
 283 
 284 
 285 JVM_LEAF(jlong, JVM_CurrentTimeMillis(JNIEnv *env, jclass ignored))
 286   JVMWrapper("JVM_CurrentTimeMillis");
 287   return os::javaTimeMillis();
 288 JVM_END
 289 
 290 JVM_LEAF(jlong, JVM_NanoTime(JNIEnv *env, jclass ignored))
 291   JVMWrapper("JVM_NanoTime");
 292   return os::javaTimeNanos();
 293 JVM_END
 294 
 295 
 296 JVM_ENTRY(void, JVM_ArrayCopy(JNIEnv *env, jclass ignored, jobject src, jint src_pos,
 297                                jobject dst, jint dst_pos, jint length))
 298   JVMWrapper("JVM_ArrayCopy");
 299   // Check if we have null pointers
 300   if (src == NULL || dst == NULL) {
 301     THROW(vmSymbols::java_lang_NullPointerException());
 302   }
 303   arrayOop s = arrayOop(JNIHandles::resolve_non_null(src));
 304   arrayOop d = arrayOop(JNIHandles::resolve_non_null(dst));
 305   assert(s->is_oop(), "JVM_ArrayCopy: src not an oop");
 306   assert(d->is_oop(), "JVM_ArrayCopy: dst not an oop");
 307   // Do copy
 308   Klass::cast(s->klass())->copy_array(s, src_pos, d, dst_pos, length, thread);
 309 JVM_END
 310 
 311 
 312 static void set_property(Handle props, const char* key, const char* value, TRAPS) {
 313   JavaValue r(T_OBJECT);
 314   // public synchronized Object put(Object key, Object value);
 315   HandleMark hm(THREAD);
 316   Handle key_str    = java_lang_String::create_from_platform_dependent_str(key, CHECK);
 317   Handle value_str  = java_lang_String::create_from_platform_dependent_str((value != NULL ? value : ""), CHECK);
 318   JavaCalls::call_virtual(&r,
 319                           props,
 320                           KlassHandle(THREAD, SystemDictionary::Properties_klass()),
 321                           vmSymbols::put_name(),
 322                           vmSymbols::object_object_object_signature(),
 323                           key_str,
 324                           value_str,
 325                           THREAD);
 326 }
 327 
 328 
 329 #define PUTPROP(props, name, value) set_property((props), (name), (value), CHECK_(properties));
 330 
 331 
 332 JVM_ENTRY(jobject, JVM_InitProperties(JNIEnv *env, jobject properties))
 333   JVMWrapper("JVM_InitProperties");
 334   ResourceMark rm;
 335 
 336   Handle props(THREAD, JNIHandles::resolve_non_null(properties));
 337 
 338   // System property list includes both user set via -D option and
 339   // jvm system specific properties.
 340   for (SystemProperty* p = Arguments::system_properties(); p != NULL; p = p->next()) {
 341     PUTPROP(props, p->key(), p->value());
 342   }
 343 
 344   // Convert the -XX:MaxDirectMemorySize= command line flag
 345   // to the sun.nio.MaxDirectMemorySize property.
 346   // Do this after setting user properties to prevent people
 347   // from setting the value with a -D option, as requested.
 348   {
 349     char as_chars[256];
 350     jio_snprintf(as_chars, sizeof(as_chars), INTX_FORMAT, MaxDirectMemorySize);
 351     PUTPROP(props, "sun.nio.MaxDirectMemorySize", as_chars);
 352   }
 353 
 354   // JVM monitoring and management support
 355   // Add the sun.management.compiler property for the compiler's name
 356   {
 357 #undef CSIZE
 358 #if defined(_LP64) || defined(_WIN64)
 359   #define CSIZE "64-Bit "
 360 #else
 361   #define CSIZE
 362 #endif // 64bit
 363 
 364 #ifdef TIERED
 365     const char* compiler_name = "HotSpot " CSIZE "Tiered Compilers";
 366 #else
 367 #if defined(COMPILER1)
 368     const char* compiler_name = "HotSpot " CSIZE "Client Compiler";
 369 #elif defined(COMPILER2)
 370     const char* compiler_name = "HotSpot " CSIZE "Server Compiler";
 371 #else
 372     const char* compiler_name = "";
 373 #endif // compilers
 374 #endif // TIERED
 375 
 376     if (*compiler_name != '\0' &&
 377         (Arguments::mode() != Arguments::_int)) {
 378       PUTPROP(props, "sun.management.compiler", compiler_name);
 379     }
 380   }
 381 
 382   return properties;
 383 JVM_END
 384 
 385 
 386 // java.lang.Runtime /////////////////////////////////////////////////////////////////////////
 387 
 388 extern volatile jint vm_created;
 389 
 390 JVM_ENTRY_NO_ENV(void, JVM_Exit(jint code))
 391   if (vm_created != 0 && (code == 0)) {
 392     // The VM is about to exit. We call back into Java to check whether finalizers should be run
 393     Universe::run_finalizers_on_exit();
 394   }
 395   before_exit(thread);
 396   vm_exit(code);
 397 JVM_END
 398 
 399 
 400 JVM_ENTRY_NO_ENV(void, JVM_Halt(jint code))
 401   before_exit(thread);
 402   vm_exit(code);
 403 JVM_END
 404 
 405 
 406 JVM_LEAF(void, JVM_OnExit(void (*func)(void)))
 407   register_on_exit_function(func);
 408 JVM_END
 409 
 410 
 411 JVM_ENTRY_NO_ENV(void, JVM_GC(void))
 412   JVMWrapper("JVM_GC");
 413   if (!DisableExplicitGC) {
 414     Universe::heap()->collect(GCCause::_java_lang_system_gc);
 415   }
 416 JVM_END
 417 
 418 
 419 JVM_LEAF(jlong, JVM_MaxObjectInspectionAge(void))
 420   JVMWrapper("JVM_MaxObjectInspectionAge");
 421   return Universe::heap()->millis_since_last_gc();
 422 JVM_END
 423 
 424 
 425 JVM_LEAF(void, JVM_TraceInstructions(jboolean on))
 426   if (PrintJVMWarnings) warning("JVM_TraceInstructions not supported");
 427 JVM_END
 428 
 429 
 430 JVM_LEAF(void, JVM_TraceMethodCalls(jboolean on))
 431   if (PrintJVMWarnings) warning("JVM_TraceMethodCalls not supported");
 432 JVM_END
 433 
 434 static inline jlong convert_size_t_to_jlong(size_t val) {
 435   // In the 64-bit vm, a size_t can overflow a jlong (which is signed).
 436   NOT_LP64 (return (jlong)val;)
 437   LP64_ONLY(return (jlong)MIN2(val, (size_t)max_jlong);)
 438 }
 439 
 440 JVM_ENTRY_NO_ENV(jlong, JVM_TotalMemory(void))
 441   JVMWrapper("JVM_TotalMemory");
 442   size_t n = Universe::heap()->capacity();
 443   return convert_size_t_to_jlong(n);
 444 JVM_END
 445 
 446 
 447 JVM_ENTRY_NO_ENV(jlong, JVM_FreeMemory(void))
 448   JVMWrapper("JVM_FreeMemory");
 449   CollectedHeap* ch = Universe::heap();
 450   size_t n;
 451   {
 452      MutexLocker x(Heap_lock);
 453      n = ch->capacity() - ch->used();
 454   }
 455   return convert_size_t_to_jlong(n);
 456 JVM_END
 457 
 458 
 459 JVM_ENTRY_NO_ENV(jlong, JVM_MaxMemory(void))
 460   JVMWrapper("JVM_MaxMemory");
 461   size_t n = Universe::heap()->max_capacity();
 462   return convert_size_t_to_jlong(n);
 463 JVM_END
 464 
 465 
 466 JVM_ENTRY_NO_ENV(jint, JVM_ActiveProcessorCount(void))
 467   JVMWrapper("JVM_ActiveProcessorCount");
 468   return os::active_processor_count();
 469 JVM_END
 470 
 471 
 472 
 473 // java.lang.Throwable //////////////////////////////////////////////////////
 474 
 475 
 476 JVM_ENTRY(void, JVM_FillInStackTrace(JNIEnv *env, jobject receiver))
 477   JVMWrapper("JVM_FillInStackTrace");
 478   Handle exception(thread, JNIHandles::resolve_non_null(receiver));
 479   java_lang_Throwable::fill_in_stack_trace(exception);
 480 JVM_END
 481 
 482 
 483 JVM_ENTRY(void, JVM_PrintStackTrace(JNIEnv *env, jobject receiver, jobject printable))
 484   JVMWrapper("JVM_PrintStackTrace");
 485   // Note: This is no longer used in Merlin, but we still support it for compatibility.
 486   oop exception = JNIHandles::resolve_non_null(receiver);
 487   oop stream    = JNIHandles::resolve_non_null(printable);
 488   java_lang_Throwable::print_stack_trace(exception, stream);
 489 JVM_END
 490 
 491 
 492 JVM_ENTRY(jint, JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable))
 493   JVMWrapper("JVM_GetStackTraceDepth");
 494   oop exception = JNIHandles::resolve(throwable);
 495   return java_lang_Throwable::get_stack_trace_depth(exception, THREAD);
 496 JVM_END
 497 
 498 
 499 JVM_ENTRY(jobject, JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index))
 500   JVMWrapper("JVM_GetStackTraceElement");
 501   JvmtiVMObjectAllocEventCollector oam; // This ctor (throughout this module) may trigger a safepoint/GC
 502   oop exception = JNIHandles::resolve(throwable);
 503   oop element = java_lang_Throwable::get_stack_trace_element(exception, index, CHECK_NULL);
 504   return JNIHandles::make_local(env, element);
 505 JVM_END
 506 
 507 
 508 // java.lang.Object ///////////////////////////////////////////////
 509 
 510 
 511 JVM_ENTRY(jint, JVM_IHashCode(JNIEnv* env, jobject handle))
 512   JVMWrapper("JVM_IHashCode");
 513   // as implemented in the classic virtual machine; return 0 if object is NULL
 514   return handle == NULL ? 0 : ObjectSynchronizer::FastHashCode (THREAD, JNIHandles::resolve_non_null(handle)) ;
 515 JVM_END
 516 
 517 
 518 JVM_ENTRY(void, JVM_MonitorWait(JNIEnv* env, jobject handle, jlong ms))
 519   JVMWrapper("JVM_MonitorWait");
 520   Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
 521   assert(obj->is_instance() || obj->is_array(), "JVM_MonitorWait must apply to an object");
 522   JavaThreadInObjectWaitState jtiows(thread, ms != 0);
 523   if (JvmtiExport::should_post_monitor_wait()) {
 524     JvmtiExport::post_monitor_wait((JavaThread *)THREAD, (oop)obj(), ms);
 525   }
 526   ObjectSynchronizer::wait(obj, ms, CHECK);
 527 JVM_END
 528 
 529 
 530 JVM_ENTRY(void, JVM_MonitorNotify(JNIEnv* env, jobject handle))
 531   JVMWrapper("JVM_MonitorNotify");
 532   Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
 533   assert(obj->is_instance() || obj->is_array(), "JVM_MonitorNotify must apply to an object");
 534   ObjectSynchronizer::notify(obj, CHECK);
 535 JVM_END
 536 
 537 
 538 JVM_ENTRY(void, JVM_MonitorNotifyAll(JNIEnv* env, jobject handle))
 539   JVMWrapper("JVM_MonitorNotifyAll");
 540   Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
 541   assert(obj->is_instance() || obj->is_array(), "JVM_MonitorNotifyAll must apply to an object");
 542   ObjectSynchronizer::notifyall(obj, CHECK);
 543 JVM_END
 544 
 545 
 546 JVM_ENTRY(jobject, JVM_Clone(JNIEnv* env, jobject handle))
 547   JVMWrapper("JVM_Clone");
 548   Handle obj(THREAD, JNIHandles::resolve_non_null(handle));
 549   const KlassHandle klass (THREAD, obj->klass());
 550   JvmtiVMObjectAllocEventCollector oam;
 551 
 552 #ifdef ASSERT
 553   // Just checking that the cloneable flag is set correct
 554   if (obj->is_javaArray()) {
 555     guarantee(klass->is_cloneable(), "all arrays are cloneable");
 556   } else {
 557     guarantee(obj->is_instance(), "should be instanceOop");
 558     bool cloneable = klass->is_subtype_of(SystemDictionary::Cloneable_klass());
 559     guarantee(cloneable == klass->is_cloneable(), "incorrect cloneable flag");
 560   }
 561 #endif
 562 
 563   // Check if class of obj supports the Cloneable interface.
 564   // All arrays are considered to be cloneable (See JLS 20.1.5)
 565   if (!klass->is_cloneable()) {
 566     ResourceMark rm(THREAD);
 567     THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name());
 568   }
 569 
 570   // Make shallow object copy
 571   const int size = obj->size();
 572   oop new_obj = NULL;
 573   if (obj->is_javaArray()) {
 574     const int length = ((arrayOop)obj())->length();
 575     new_obj = CollectedHeap::array_allocate(klass, size, length, CHECK_NULL);
 576   } else {
 577     new_obj = CollectedHeap::obj_allocate(klass, size, CHECK_NULL);
 578   }
 579   // 4839641 (4840070): We must do an oop-atomic copy, because if another thread
 580   // is modifying a reference field in the clonee, a non-oop-atomic copy might
 581   // be suspended in the middle of copying the pointer and end up with parts
 582   // of two different pointers in the field.  Subsequent dereferences will crash.
 583   // 4846409: an oop-copy of objects with long or double fields or arrays of same
 584   // won't copy the longs/doubles atomically in 32-bit vm's, so we copy jlongs instead
 585   // of oops.  We know objects are aligned on a minimum of an jlong boundary.
 586   // The same is true of StubRoutines::object_copy and the various oop_copy
 587   // variants, and of the code generated by the inline_native_clone intrinsic.
 588   assert(MinObjAlignmentInBytes >= BytesPerLong, "objects misaligned");
 589   Copy::conjoint_jlongs_atomic((jlong*)obj(), (jlong*)new_obj,
 590                                (size_t)align_object_size(size) / HeapWordsPerLong);
 591   // Clear the header
 592   new_obj->init_mark();
 593 
 594   // Store check (mark entire object and let gc sort it out)
 595   BarrierSet* bs = Universe::heap()->barrier_set();
 596   assert(bs->has_write_region_opt(), "Barrier set does not have write_region");
 597   bs->write_region(MemRegion((HeapWord*)new_obj, size));
 598 
 599   // Caution: this involves a java upcall, so the clone should be
 600   // "gc-robust" by this stage.
 601   if (klass->has_finalizer()) {
 602     assert(obj->is_instance(), "should be instanceOop");
 603     new_obj = instanceKlass::register_finalizer(instanceOop(new_obj), CHECK_NULL);
 604   }
 605 
 606   return JNIHandles::make_local(env, oop(new_obj));
 607 JVM_END
 608 
 609 // java.lang.Compiler ////////////////////////////////////////////////////
 610 
 611 // The initial cuts of the HotSpot VM will not support JITs, and all existing
 612 // JITs would need extensive changes to work with HotSpot.  The JIT-related JVM
 613 // functions are all silently ignored unless JVM warnings are printed.
 614 
 615 JVM_LEAF(void, JVM_InitializeCompiler (JNIEnv *env, jclass compCls))
 616   if (PrintJVMWarnings) warning("JVM_InitializeCompiler not supported");
 617 JVM_END
 618 
 619 
 620 JVM_LEAF(jboolean, JVM_IsSilentCompiler(JNIEnv *env, jclass compCls))
 621   if (PrintJVMWarnings) warning("JVM_IsSilentCompiler not supported");
 622   return JNI_FALSE;
 623 JVM_END
 624 
 625 
 626 JVM_LEAF(jboolean, JVM_CompileClass(JNIEnv *env, jclass compCls, jclass cls))
 627   if (PrintJVMWarnings) warning("JVM_CompileClass not supported");
 628   return JNI_FALSE;
 629 JVM_END
 630 
 631 
 632 JVM_LEAF(jboolean, JVM_CompileClasses(JNIEnv *env, jclass cls, jstring jname))
 633   if (PrintJVMWarnings) warning("JVM_CompileClasses not supported");
 634   return JNI_FALSE;
 635 JVM_END
 636 
 637 
 638 JVM_LEAF(jobject, JVM_CompilerCommand(JNIEnv *env, jclass compCls, jobject arg))
 639   if (PrintJVMWarnings) warning("JVM_CompilerCommand not supported");
 640   return NULL;
 641 JVM_END
 642 
 643 
 644 JVM_LEAF(void, JVM_EnableCompiler(JNIEnv *env, jclass compCls))
 645   if (PrintJVMWarnings) warning("JVM_EnableCompiler not supported");
 646 JVM_END
 647 
 648 
 649 JVM_LEAF(void, JVM_DisableCompiler(JNIEnv *env, jclass compCls))
 650   if (PrintJVMWarnings) warning("JVM_DisableCompiler not supported");
 651 JVM_END
 652 
 653 
 654 
 655 // Error message support //////////////////////////////////////////////////////
 656 
 657 JVM_LEAF(jint, JVM_GetLastErrorString(char *buf, int len))
 658   JVMWrapper("JVM_GetLastErrorString");
 659   return (jint)os::lasterror(buf, len);
 660 JVM_END
 661 
 662 
 663 // java.io.File ///////////////////////////////////////////////////////////////
 664 
 665 JVM_LEAF(char*, JVM_NativePath(char* path))
 666   JVMWrapper2("JVM_NativePath (%s)", path);
 667   return os::native_path(path);
 668 JVM_END
 669 
 670 
 671 // Misc. class handling ///////////////////////////////////////////////////////////
 672 
 673 
 674 JVM_ENTRY(jclass, JVM_GetCallerClass(JNIEnv* env, int depth))
 675   JVMWrapper("JVM_GetCallerClass");
 676   klassOop k = thread->security_get_caller_class(depth);
 677   return (k == NULL) ? NULL : (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
 678 JVM_END
 679 
 680 
 681 JVM_ENTRY(jclass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf))
 682   JVMWrapper("JVM_FindPrimitiveClass");
 683   oop mirror = NULL;
 684   BasicType t = name2type(utf);
 685   if (t != T_ILLEGAL && t != T_OBJECT && t != T_ARRAY) {
 686     mirror = Universe::java_mirror(t);
 687   }
 688   if (mirror == NULL) {
 689     THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), (char*) utf);
 690   } else {
 691     return (jclass) JNIHandles::make_local(env, mirror);
 692   }
 693 JVM_END
 694 
 695 
 696 JVM_ENTRY(void, JVM_ResolveClass(JNIEnv* env, jclass cls))
 697   JVMWrapper("JVM_ResolveClass");
 698   if (PrintJVMWarnings) warning("JVM_ResolveClass not implemented");
 699 JVM_END
 700 
 701 
 702 // Returns a class loaded by the bootstrap class loader; or null
 703 // if not found.  ClassNotFoundException is not thrown.
 704 //
 705 // Rationale behind JVM_FindClassFromBootLoader
 706 // a> JVM_FindClassFromClassLoader was never exported in the export tables.
 707 // b> because of (a) java.dll has a direct dependecy on the  unexported
 708 //    private symbol "_JVM_FindClassFromClassLoader@20".
 709 // c> the launcher cannot use the private symbol as it dynamically opens
 710 //    the entry point, so if something changes, the launcher will fail
 711 //    unexpectedly at runtime, it is safest for the launcher to dlopen a
 712 //    stable exported interface.
 713 // d> re-exporting JVM_FindClassFromClassLoader as public, will cause its
 714 //    signature to change from _JVM_FindClassFromClassLoader@20 to
 715 //    JVM_FindClassFromClassLoader and will not be backward compatible
 716 //    with older JDKs.
 717 // Thus a public/stable exported entry point is the right solution,
 718 // public here means public in linker semantics, and is exported only
 719 // to the JDK, and is not intended to be a public API.
 720 
 721 JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env,
 722                                               const char* name))
 723   JVMWrapper2("JVM_FindClassFromBootLoader %s", name);
 724 
 725   // Java libraries should ensure that name is never null...
 726   if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
 727     // It's impossible to create this class;  the name cannot fit
 728     // into the constant pool.
 729     return NULL;
 730   }
 731 
 732   TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL);
 733   klassOop k = SystemDictionary::resolve_or_null(h_name, CHECK_NULL);
 734   if (k == NULL) {
 735     return NULL;
 736   }
 737 
 738   if (TraceClassResolution) {
 739     trace_class_resolution(k);
 740   }
 741   return (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
 742 JVM_END
 743 
 744 JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
 745                                                jboolean init, jobject loader,
 746                                                jboolean throwError))
 747   JVMWrapper3("JVM_FindClassFromClassLoader %s throw %s", name,
 748                throwError ? "error" : "exception");
 749   // Java libraries should ensure that name is never null...
 750   if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
 751     // It's impossible to create this class;  the name cannot fit
 752     // into the constant pool.
 753     if (throwError) {
 754       THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
 755     } else {
 756       THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name);
 757     }
 758   }
 759   TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL);
 760   Handle h_loader(THREAD, JNIHandles::resolve(loader));
 761   jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
 762                                                Handle(), throwError, THREAD);
 763 
 764   if (TraceClassResolution && result != NULL) {
 765     trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result)));
 766   }
 767   return result;
 768 JVM_END
 769 
 770 
 771 JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name,
 772                                          jboolean init, jclass from))
 773   JVMWrapper2("JVM_FindClassFromClass %s", name);
 774   if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
 775     // It's impossible to create this class;  the name cannot fit
 776     // into the constant pool.
 777     THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
 778   }
 779   TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL);
 780   oop from_class_oop = JNIHandles::resolve(from);
 781   klassOop from_class = (from_class_oop == NULL)
 782                            ? (klassOop)NULL
 783                            : java_lang_Class::as_klassOop(from_class_oop);
 784   oop class_loader = NULL;
 785   oop protection_domain = NULL;
 786   if (from_class != NULL) {
 787     class_loader = Klass::cast(from_class)->class_loader();
 788     protection_domain = Klass::cast(from_class)->protection_domain();
 789   }
 790   Handle h_loader(THREAD, class_loader);
 791   Handle h_prot  (THREAD, protection_domain);
 792   jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
 793                                                h_prot, true, thread);
 794 
 795   if (TraceClassResolution && result != NULL) {
 796     // this function is generally only used for class loading during verification.
 797     ResourceMark rm;
 798     oop from_mirror = JNIHandles::resolve_non_null(from);
 799     klassOop from_class = java_lang_Class::as_klassOop(from_mirror);
 800     const char * from_name = Klass::cast(from_class)->external_name();
 801 
 802     oop mirror = JNIHandles::resolve_non_null(result);
 803     klassOop to_class = java_lang_Class::as_klassOop(mirror);
 804     const char * to = Klass::cast(to_class)->external_name();
 805     tty->print("RESOLVE %s %s (verification)\n", from_name, to);
 806   }
 807 
 808   return result;
 809 JVM_END
 810 
 811 static void is_lock_held_by_thread(Handle loader, PerfCounter* counter, TRAPS) {
 812   if (loader.is_null()) {
 813     return;
 814   }
 815 
 816   // check whether the current caller thread holds the lock or not.
 817   // If not, increment the corresponding counter
 818   if (ObjectSynchronizer::query_lock_ownership((JavaThread*)THREAD, loader) !=
 819       ObjectSynchronizer::owner_self) {
 820     counter->inc();
 821   }
 822 }
 823 
 824 // common code for JVM_DefineClass() and JVM_DefineClassWithSource()
 825 // and JVM_DefineClassWithSourceCond()
 826 static jclass jvm_define_class_common(JNIEnv *env, const char *name,
 827                                       jobject loader, const jbyte *buf,
 828                                       jsize len, jobject pd, const char *source,
 829                                       jboolean verify, TRAPS) {
 830   if (source == NULL)  source = "__JVM_DefineClass__";
 831 
 832   assert(THREAD->is_Java_thread(), "must be a JavaThread");
 833   JavaThread* jt = (JavaThread*) THREAD;
 834 
 835   PerfClassTraceTime vmtimer(ClassLoader::perf_define_appclass_time(),
 836                              ClassLoader::perf_define_appclass_selftime(),
 837                              ClassLoader::perf_define_appclasses(),
 838                              jt->get_thread_stat()->perf_recursion_counts_addr(),
 839                              jt->get_thread_stat()->perf_timers_addr(),
 840                              PerfClassTraceTime::DEFINE_CLASS);
 841 
 842   if (UsePerfData) {
 843     ClassLoader::perf_app_classfile_bytes_read()->inc(len);
 844   }
 845 
 846   // Since exceptions can be thrown, class initialization can take place
 847   // if name is NULL no check for class name in .class stream has to be made.
 848   TempNewSymbol class_name = NULL;
 849   if (name != NULL) {
 850     const int str_len = (int)strlen(name);
 851     if (str_len > Symbol::max_length()) {
 852       // It's impossible to create this class;  the name cannot fit
 853       // into the constant pool.
 854       THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), name);
 855     }
 856     class_name = SymbolTable::new_symbol(name, str_len, CHECK_NULL);
 857   }
 858 
 859   ResourceMark rm(THREAD);
 860   ClassFileStream st((u1*) buf, len, (char *)source);
 861   Handle class_loader (THREAD, JNIHandles::resolve(loader));
 862   if (UsePerfData) {
 863     is_lock_held_by_thread(class_loader,
 864                            ClassLoader::sync_JVMDefineClassLockFreeCounter(),
 865                            THREAD);
 866   }
 867   Handle protection_domain (THREAD, JNIHandles::resolve(pd));
 868   klassOop k = SystemDictionary::resolve_from_stream(class_name, class_loader,
 869                                                      protection_domain, &st,
 870                                                      verify != 0,
 871                                                      CHECK_NULL);
 872 
 873   if (TraceClassResolution && k != NULL) {
 874     trace_class_resolution(k);
 875   }
 876 
 877   return (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
 878 }
 879 
 880 
 881 JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd))
 882   JVMWrapper2("JVM_DefineClass %s", name);
 883 
 884   return jvm_define_class_common(env, name, loader, buf, len, pd, NULL, true, THREAD);
 885 JVM_END
 886 
 887 
 888 JVM_ENTRY(jclass, JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source))
 889   JVMWrapper2("JVM_DefineClassWithSource %s", name);
 890 
 891   return jvm_define_class_common(env, name, loader, buf, len, pd, source, true, THREAD);
 892 JVM_END
 893 
 894 JVM_ENTRY(jclass, JVM_DefineClassWithSourceCond(JNIEnv *env, const char *name,
 895                                                 jobject loader, const jbyte *buf,
 896                                                 jsize len, jobject pd,
 897                                                 const char *source, jboolean verify))
 898   JVMWrapper2("JVM_DefineClassWithSourceCond %s", name);
 899 
 900   return jvm_define_class_common(env, name, loader, buf, len, pd, source, verify, THREAD);
 901 JVM_END
 902 
 903 JVM_ENTRY(jclass, JVM_FindLoadedClass(JNIEnv *env, jobject loader, jstring name))
 904   JVMWrapper("JVM_FindLoadedClass");
 905   ResourceMark rm(THREAD);
 906 
 907   Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
 908   Handle string = java_lang_String::internalize_classname(h_name, CHECK_NULL);
 909 
 910   const char* str   = java_lang_String::as_utf8_string(string());
 911   // Sanity check, don't expect null
 912   if (str == NULL) return NULL;
 913 
 914   const int str_len = (int)strlen(str);
 915   if (str_len > Symbol::max_length()) {
 916     // It's impossible to create this class;  the name cannot fit
 917     // into the constant pool.
 918     return NULL;
 919   }
 920   TempNewSymbol klass_name = SymbolTable::new_symbol(str, str_len, CHECK_NULL);
 921 
 922   // Security Note:
 923   //   The Java level wrapper will perform the necessary security check allowing
 924   //   us to pass the NULL as the initiating class loader.
 925   Handle h_loader(THREAD, JNIHandles::resolve(loader));
 926   if (UsePerfData) {
 927     is_lock_held_by_thread(h_loader,
 928                            ClassLoader::sync_JVMFindLoadedClassLockFreeCounter(),
 929                            THREAD);
 930   }
 931 
 932   klassOop k = SystemDictionary::find_instance_or_array_klass(klass_name,
 933                                                               h_loader,
 934                                                               Handle(),
 935                                                               CHECK_NULL);
 936 
 937   return (k == NULL) ? NULL :
 938             (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
 939 JVM_END
 940 
 941 
 942 // Reflection support //////////////////////////////////////////////////////////////////////////////
 943 
 944 JVM_ENTRY(jstring, JVM_GetClassName(JNIEnv *env, jclass cls))
 945   assert (cls != NULL, "illegal class");
 946   JVMWrapper("JVM_GetClassName");
 947   JvmtiVMObjectAllocEventCollector oam;
 948   ResourceMark rm(THREAD);
 949   const char* name;
 950   if (java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
 951     name = type2name(java_lang_Class::primitive_type(JNIHandles::resolve(cls)));
 952   } else {
 953     // Consider caching interned string in Klass
 954     klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls));
 955     assert(k->is_klass(), "just checking");
 956     name = Klass::cast(k)->external_name();
 957   }
 958   oop result = StringTable::intern((char*) name, CHECK_NULL);
 959   return (jstring) JNIHandles::make_local(env, result);
 960 JVM_END
 961 
 962 
 963 JVM_ENTRY(jobjectArray, JVM_GetClassInterfaces(JNIEnv *env, jclass cls))
 964   JVMWrapper("JVM_GetClassInterfaces");
 965   JvmtiVMObjectAllocEventCollector oam;
 966   oop mirror = JNIHandles::resolve_non_null(cls);
 967 
 968   // Special handling for primitive objects
 969   if (java_lang_Class::is_primitive(mirror)) {
 970     // Primitive objects does not have any interfaces
 971     objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
 972     return (jobjectArray) JNIHandles::make_local(env, r);
 973   }
 974 
 975   KlassHandle klass(thread, java_lang_Class::as_klassOop(mirror));
 976   // Figure size of result array
 977   int size;
 978   if (klass->oop_is_instance()) {
 979     size = instanceKlass::cast(klass())->local_interfaces()->length();
 980   } else {
 981     assert(klass->oop_is_objArray() || klass->oop_is_typeArray(), "Illegal mirror klass");
 982     size = 2;
 983   }
 984 
 985   // Allocate result array
 986   objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), size, CHECK_NULL);
 987   objArrayHandle result (THREAD, r);
 988   // Fill in result
 989   if (klass->oop_is_instance()) {
 990     // Regular instance klass, fill in all local interfaces
 991     for (int index = 0; index < size; index++) {
 992       klassOop k = klassOop(instanceKlass::cast(klass())->local_interfaces()->obj_at(index));
 993       result->obj_at_put(index, Klass::cast(k)->java_mirror());
 994     }
 995   } else {
 996     // All arrays implement java.lang.Cloneable and java.io.Serializable
 997     result->obj_at_put(0, Klass::cast(SystemDictionary::Cloneable_klass())->java_mirror());
 998     result->obj_at_put(1, Klass::cast(SystemDictionary::Serializable_klass())->java_mirror());
 999   }
1000   return (jobjectArray) JNIHandles::make_local(env, result());
1001 JVM_END
1002 
1003 
1004 JVM_ENTRY(jobject, JVM_GetClassLoader(JNIEnv *env, jclass cls))
1005   JVMWrapper("JVM_GetClassLoader");
1006   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
1007     return NULL;
1008   }
1009   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
1010   oop loader = Klass::cast(k)->class_loader();
1011   return JNIHandles::make_local(env, loader);
1012 JVM_END
1013 
1014 
1015 JVM_QUICK_ENTRY(jboolean, JVM_IsInterface(JNIEnv *env, jclass cls))
1016   JVMWrapper("JVM_IsInterface");
1017   oop mirror = JNIHandles::resolve_non_null(cls);
1018   if (java_lang_Class::is_primitive(mirror)) {
1019     return JNI_FALSE;
1020   }
1021   klassOop k = java_lang_Class::as_klassOop(mirror);
1022   jboolean result = Klass::cast(k)->is_interface();
1023   assert(!result || Klass::cast(k)->oop_is_instance(),
1024          "all interfaces are instance types");
1025   // The compiler intrinsic for isInterface tests the
1026   // Klass::_access_flags bits in the same way.
1027   return result;
1028 JVM_END
1029 
1030 
1031 JVM_ENTRY(jobjectArray, JVM_GetClassSigners(JNIEnv *env, jclass cls))
1032   JVMWrapper("JVM_GetClassSigners");
1033   JvmtiVMObjectAllocEventCollector oam;
1034   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
1035     // There are no signers for primitive types
1036     return NULL;
1037   }
1038 
1039   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
1040   objArrayOop signers = NULL;
1041   if (Klass::cast(k)->oop_is_instance()) {
1042     signers = instanceKlass::cast(k)->signers();
1043   }
1044 
1045   // If there are no signers set in the class, or if the class
1046   // is an array, return NULL.
1047   if (signers == NULL) return NULL;
1048 
1049   // copy of the signers array
1050   klassOop element = objArrayKlass::cast(signers->klass())->element_klass();
1051   objArrayOop signers_copy = oopFactory::new_objArray(element, signers->length(), CHECK_NULL);
1052   for (int index = 0; index < signers->length(); index++) {
1053     signers_copy->obj_at_put(index, signers->obj_at(index));
1054   }
1055 
1056   // return the copy
1057   return (jobjectArray) JNIHandles::make_local(env, signers_copy);
1058 JVM_END
1059 
1060 
1061 JVM_ENTRY(void, JVM_SetClassSigners(JNIEnv *env, jclass cls, jobjectArray signers))
1062   JVMWrapper("JVM_SetClassSigners");
1063   if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
1064     // This call is ignored for primitive types and arrays.
1065     // Signers are only set once, ClassLoader.java, and thus shouldn't
1066     // be called with an array.  Only the bootstrap loader creates arrays.
1067     klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
1068     if (Klass::cast(k)->oop_is_instance()) {
1069       instanceKlass::cast(k)->set_signers(objArrayOop(JNIHandles::resolve(signers)));
1070     }
1071   }
1072 JVM_END
1073 
1074 
1075 JVM_ENTRY(jobject, JVM_GetProtectionDomain(JNIEnv *env, jclass cls))
1076   JVMWrapper("JVM_GetProtectionDomain");
1077   if (JNIHandles::resolve(cls) == NULL) {
1078     THROW_(vmSymbols::java_lang_NullPointerException(), NULL);
1079   }
1080 
1081   if (java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
1082     // Primitive types does not have a protection domain.
1083     return NULL;
1084   }
1085 
1086   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls));
1087   return (jobject) JNIHandles::make_local(env, Klass::cast(k)->protection_domain());
1088 JVM_END
1089 
1090 
1091 // Obsolete since 1.2 (Class.setProtectionDomain removed), although
1092 // still defined in core libraries as of 1.5.
1093 JVM_ENTRY(void, JVM_SetProtectionDomain(JNIEnv *env, jclass cls, jobject protection_domain))
1094   JVMWrapper("JVM_SetProtectionDomain");
1095   if (JNIHandles::resolve(cls) == NULL) {
1096     THROW(vmSymbols::java_lang_NullPointerException());
1097   }
1098   if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
1099     // Call is ignored for primitive types
1100     klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls));
1101 
1102     // cls won't be an array, as this called only from ClassLoader.defineClass
1103     if (Klass::cast(k)->oop_is_instance()) {
1104       oop pd = JNIHandles::resolve(protection_domain);
1105       assert(pd == NULL || pd->is_oop(), "just checking");
1106       instanceKlass::cast(k)->set_protection_domain(pd);
1107     }
1108   }
1109 JVM_END
1110 
1111 
1112 JVM_ENTRY(jobject, JVM_DoPrivileged(JNIEnv *env, jclass cls, jobject action, jobject context, jboolean wrapException))
1113   JVMWrapper("JVM_DoPrivileged");
1114 
1115   if (action == NULL) {
1116     THROW_MSG_0(vmSymbols::java_lang_NullPointerException(), "Null action");
1117   }
1118 
1119   // Stack allocated list of privileged stack elements
1120   PrivilegedElement pi;
1121 
1122   // Check that action object understands "Object run()"
1123   Handle object (THREAD, JNIHandles::resolve(action));
1124 
1125   // get run() method
1126   methodOop m_oop = Klass::cast(object->klass())->uncached_lookup_method(
1127                                            vmSymbols::run_method_name(),
1128                                            vmSymbols::void_object_signature());
1129   methodHandle m (THREAD, m_oop);
1130   if (m.is_null() || !m->is_method() || !methodOop(m())->is_public() || methodOop(m())->is_static()) {
1131     THROW_MSG_0(vmSymbols::java_lang_InternalError(), "No run method");
1132   }
1133 
1134   // Compute the frame initiating the do privileged operation and setup the privileged stack
1135   vframeStream vfst(thread);
1136   vfst.security_get_caller_frame(1);
1137 
1138   if (!vfst.at_end()) {
1139     pi.initialize(&vfst, JNIHandles::resolve(context), thread->privileged_stack_top(), CHECK_NULL);
1140     thread->set_privileged_stack_top(&pi);
1141   }
1142 
1143 
1144   // invoke the Object run() in the action object. We cannot use call_interface here, since the static type
1145   // is not really known - it is either java.security.PrivilegedAction or java.security.PrivilegedExceptionAction
1146   Handle pending_exception;
1147   JavaValue result(T_OBJECT);
1148   JavaCallArguments args(object);
1149   JavaCalls::call(&result, m, &args, THREAD);
1150 
1151   // done with action, remove ourselves from the list
1152   if (!vfst.at_end()) {
1153     assert(thread->privileged_stack_top() != NULL && thread->privileged_stack_top() == &pi, "wrong top element");
1154     thread->set_privileged_stack_top(thread->privileged_stack_top()->next());
1155   }
1156 
1157   if (HAS_PENDING_EXCEPTION) {
1158     pending_exception = Handle(THREAD, PENDING_EXCEPTION);
1159     CLEAR_PENDING_EXCEPTION;
1160 
1161     if ( pending_exception->is_a(SystemDictionary::Exception_klass()) &&
1162         !pending_exception->is_a(SystemDictionary::RuntimeException_klass())) {
1163       // Throw a java.security.PrivilegedActionException(Exception e) exception
1164       JavaCallArguments args(pending_exception);
1165       THROW_ARG_0(vmSymbols::java_security_PrivilegedActionException(),
1166                   vmSymbols::exception_void_signature(),
1167                   &args);
1168     }
1169   }
1170 
1171   if (pending_exception.not_null()) THROW_OOP_0(pending_exception());
1172   return JNIHandles::make_local(env, (oop) result.get_jobject());
1173 JVM_END
1174 
1175 
1176 // Returns the inherited_access_control_context field of the running thread.
1177 JVM_ENTRY(jobject, JVM_GetInheritedAccessControlContext(JNIEnv *env, jclass cls))
1178   JVMWrapper("JVM_GetInheritedAccessControlContext");
1179   oop result = java_lang_Thread::inherited_access_control_context(thread->threadObj());
1180   return JNIHandles::make_local(env, result);
1181 JVM_END
1182 
1183 class RegisterArrayForGC {
1184  private:
1185   JavaThread *_thread;
1186  public:
1187   RegisterArrayForGC(JavaThread *thread, GrowableArray<oop>* array)  {
1188     _thread = thread;
1189     _thread->register_array_for_gc(array);
1190   }
1191 
1192   ~RegisterArrayForGC() {
1193     _thread->register_array_for_gc(NULL);
1194   }
1195 };
1196 
1197 
1198 JVM_ENTRY(jobject, JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls))
1199   JVMWrapper("JVM_GetStackAccessControlContext");
1200   if (!UsePrivilegedStack) return NULL;
1201 
1202   ResourceMark rm(THREAD);
1203   GrowableArray<oop>* local_array = new GrowableArray<oop>(12);
1204   JvmtiVMObjectAllocEventCollector oam;
1205 
1206   // count the protection domains on the execution stack. We collapse
1207   // duplicate consecutive protection domains into a single one, as
1208   // well as stopping when we hit a privileged frame.
1209 
1210   // Use vframeStream to iterate through Java frames
1211   vframeStream vfst(thread);
1212 
1213   oop previous_protection_domain = NULL;
1214   Handle privileged_context(thread, NULL);
1215   bool is_privileged = false;
1216   oop protection_domain = NULL;
1217 
1218   for(; !vfst.at_end(); vfst.next()) {
1219     // get method of frame
1220     methodOop method = vfst.method();
1221     intptr_t* frame_id   = vfst.frame_id();
1222 
1223     // check the privileged frames to see if we have a match
1224     if (thread->privileged_stack_top() && thread->privileged_stack_top()->frame_id() == frame_id) {
1225       // this frame is privileged
1226       is_privileged = true;
1227       privileged_context = Handle(thread, thread->privileged_stack_top()->privileged_context());
1228       protection_domain  = thread->privileged_stack_top()->protection_domain();
1229     } else {
1230       protection_domain = instanceKlass::cast(method->method_holder())->protection_domain();
1231     }
1232 
1233     if ((previous_protection_domain != protection_domain) && (protection_domain != NULL)) {
1234       local_array->push(protection_domain);
1235       previous_protection_domain = protection_domain;
1236     }
1237 
1238     if (is_privileged) break;
1239   }
1240 
1241 
1242   // either all the domains on the stack were system domains, or
1243   // we had a privileged system domain
1244   if (local_array->is_empty()) {
1245     if (is_privileged && privileged_context.is_null()) return NULL;
1246 
1247     oop result = java_security_AccessControlContext::create(objArrayHandle(), is_privileged, privileged_context, CHECK_NULL);
1248     return JNIHandles::make_local(env, result);
1249   }
1250 
1251   // the resource area must be registered in case of a gc
1252   RegisterArrayForGC ragc(thread, local_array);
1253   objArrayOop context = oopFactory::new_objArray(SystemDictionary::ProtectionDomain_klass(),
1254                                                  local_array->length(), CHECK_NULL);
1255   objArrayHandle h_context(thread, context);
1256   for (int index = 0; index < local_array->length(); index++) {
1257     h_context->obj_at_put(index, local_array->at(index));
1258   }
1259 
1260   oop result = java_security_AccessControlContext::create(h_context, is_privileged, privileged_context, CHECK_NULL);
1261 
1262   return JNIHandles::make_local(env, result);
1263 JVM_END
1264 
1265 
1266 JVM_QUICK_ENTRY(jboolean, JVM_IsArrayClass(JNIEnv *env, jclass cls))
1267   JVMWrapper("JVM_IsArrayClass");
1268   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
1269   return (k != NULL) && Klass::cast(k)->oop_is_javaArray() ? true : false;
1270 JVM_END
1271 
1272 
1273 JVM_QUICK_ENTRY(jboolean, JVM_IsPrimitiveClass(JNIEnv *env, jclass cls))
1274   JVMWrapper("JVM_IsPrimitiveClass");
1275   oop mirror = JNIHandles::resolve_non_null(cls);
1276   return (jboolean) java_lang_Class::is_primitive(mirror);
1277 JVM_END
1278 
1279 
1280 JVM_ENTRY(jclass, JVM_GetComponentType(JNIEnv *env, jclass cls))
1281   JVMWrapper("JVM_GetComponentType");
1282   oop mirror = JNIHandles::resolve_non_null(cls);
1283   oop result = Reflection::array_component_type(mirror, CHECK_NULL);
1284   return (jclass) JNIHandles::make_local(env, result);
1285 JVM_END
1286 
1287 
1288 JVM_ENTRY(jint, JVM_GetClassModifiers(JNIEnv *env, jclass cls))
1289   JVMWrapper("JVM_GetClassModifiers");
1290   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
1291     // Primitive type
1292     return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
1293   }
1294 
1295   Klass* k = Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)));
1296   debug_only(int computed_modifiers = k->compute_modifier_flags(CHECK_0));
1297   assert(k->modifier_flags() == computed_modifiers, "modifiers cache is OK");
1298   return k->modifier_flags();
1299 JVM_END
1300 
1301 
1302 // Inner class reflection ///////////////////////////////////////////////////////////////////////////////
1303 
1304 JVM_ENTRY(jobjectArray, JVM_GetDeclaredClasses(JNIEnv *env, jclass ofClass))
1305   JvmtiVMObjectAllocEventCollector oam;
1306   // ofClass is a reference to a java_lang_Class object. The mirror object
1307   // of an instanceKlass
1308 
1309   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
1310       ! Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_instance()) {
1311     oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
1312     return (jobjectArray)JNIHandles::make_local(env, result);
1313   }
1314 
1315   instanceKlassHandle k(thread, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)));
1316   InnerClassesIterator iter(k);
1317 
1318   if (iter.length() == 0) {
1319     // Neither an inner nor outer class
1320     oop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), 0, CHECK_NULL);
1321     return (jobjectArray)JNIHandles::make_local(env, result);
1322   }
1323 
1324   // find inner class info
1325   constantPoolHandle cp(thread, k->constants());
1326   int length = iter.length();
1327 
1328   // Allocate temp. result array
1329   objArrayOop r = oopFactory::new_objArray(SystemDictionary::Class_klass(), length/4, CHECK_NULL);
1330   objArrayHandle result (THREAD, r);
1331   int members = 0;
1332 
1333   for (; !iter.done(); iter.next()) {
1334     int ioff = iter.inner_class_info_index();
1335     int ooff = iter.outer_class_info_index();
1336 
1337     if (ioff != 0 && ooff != 0) {
1338       // Check to see if the name matches the class we're looking for
1339       // before attempting to find the class.
1340       if (cp->klass_name_at_matches(k, ooff)) {
1341         klassOop outer_klass = cp->klass_at(ooff, CHECK_NULL);
1342         if (outer_klass == k()) {
1343            klassOop ik = cp->klass_at(ioff, CHECK_NULL);
1344            instanceKlassHandle inner_klass (THREAD, ik);
1345 
1346            // Throws an exception if outer klass has not declared k as
1347            // an inner klass
1348            Reflection::check_for_inner_class(k, inner_klass, true, CHECK_NULL);
1349 
1350            result->obj_at_put(members, inner_klass->java_mirror());
1351            members++;
1352         }
1353       }
1354     }
1355   }
1356 
1357   if (members != length) {
1358     // Return array of right length
1359     objArrayOop res = oopFactory::new_objArray(SystemDictionary::Class_klass(), members, CHECK_NULL);
1360     for(int i = 0; i < members; i++) {
1361       res->obj_at_put(i, result->obj_at(i));
1362     }
1363     return (jobjectArray)JNIHandles::make_local(env, res);
1364   }
1365 
1366   return (jobjectArray)JNIHandles::make_local(env, result());
1367 JVM_END
1368 
1369 
1370 JVM_ENTRY(jclass, JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass))
1371 {
1372   // ofClass is a reference to a java_lang_Class object.
1373   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
1374       ! Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_instance()) {
1375     return NULL;
1376   }
1377 
1378   bool inner_is_member = false;
1379   klassOop outer_klass
1380     = instanceKlass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass))
1381                           )->compute_enclosing_class(&inner_is_member, CHECK_NULL);
1382   if (outer_klass == NULL)  return NULL;  // already a top-level class
1383   if (!inner_is_member)  return NULL;     // an anonymous class (inside a method)
1384   return (jclass) JNIHandles::make_local(env, Klass::cast(outer_klass)->java_mirror());
1385 }
1386 JVM_END
1387 
1388 // should be in instanceKlass.cpp, but is here for historical reasons
1389 klassOop instanceKlass::compute_enclosing_class_impl(instanceKlassHandle k,
1390                                                      bool* inner_is_member,
1391                                                      TRAPS) {
1392   Thread* thread = THREAD;
1393   InnerClassesIterator iter(k);
1394   if (iter.length() == 0) {
1395     // No inner class info => no declaring class
1396     return NULL;
1397   }
1398 
1399   constantPoolHandle i_cp(thread, k->constants());
1400 
1401   bool found = false;
1402   klassOop ok;
1403   instanceKlassHandle outer_klass;
1404   *inner_is_member = false;
1405 
1406   // Find inner_klass attribute
1407   for (; !iter.done() && !found; iter.next()) {
1408     int ioff = iter.inner_class_info_index();
1409     int ooff = iter.outer_class_info_index();
1410     int noff = iter.inner_name_index();
1411     if (ioff != 0) {
1412       // Check to see if the name matches the class we're looking for
1413       // before attempting to find the class.
1414       if (i_cp->klass_name_at_matches(k, ioff)) {
1415         klassOop inner_klass = i_cp->klass_at(ioff, CHECK_NULL);
1416         found = (k() == inner_klass);
1417         if (found && ooff != 0) {
1418           ok = i_cp->klass_at(ooff, CHECK_NULL);
1419           outer_klass = instanceKlassHandle(thread, ok);
1420           *inner_is_member = true;
1421         }
1422       }
1423     }
1424   }
1425 
1426   if (found && outer_klass.is_null()) {
1427     // It may be anonymous; try for that.
1428     int encl_method_class_idx = k->enclosing_method_class_index();
1429     if (encl_method_class_idx != 0) {
1430       ok = i_cp->klass_at(encl_method_class_idx, CHECK_NULL);
1431       outer_klass = instanceKlassHandle(thread, ok);
1432       *inner_is_member = false;
1433     }
1434   }
1435 
1436   // If no inner class attribute found for this class.
1437   if (outer_klass.is_null())  return NULL;
1438 
1439   // Throws an exception if outer klass has not declared k as an inner klass
1440   // We need evidence that each klass knows about the other, or else
1441   // the system could allow a spoof of an inner class to gain access rights.
1442   Reflection::check_for_inner_class(outer_klass, k, *inner_is_member, CHECK_NULL);
1443   return outer_klass();
1444 }
1445 
1446 JVM_ENTRY(jstring, JVM_GetClassSignature(JNIEnv *env, jclass cls))
1447   assert (cls != NULL, "illegal class");
1448   JVMWrapper("JVM_GetClassSignature");
1449   JvmtiVMObjectAllocEventCollector oam;
1450   ResourceMark rm(THREAD);
1451   // Return null for arrays and primatives
1452   if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
1453     klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls));
1454     if (Klass::cast(k)->oop_is_instance()) {
1455       Symbol* sym = instanceKlass::cast(k)->generic_signature();
1456       if (sym == NULL) return NULL;
1457       Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
1458       return (jstring) JNIHandles::make_local(env, str());
1459     }
1460   }
1461   return NULL;
1462 JVM_END
1463 
1464 
1465 JVM_ENTRY(jbyteArray, JVM_GetClassAnnotations(JNIEnv *env, jclass cls))
1466   assert (cls != NULL, "illegal class");
1467   JVMWrapper("JVM_GetClassAnnotations");
1468   ResourceMark rm(THREAD);
1469   // Return null for arrays and primitives
1470   if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
1471     klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve(cls));
1472     if (Klass::cast(k)->oop_is_instance()) {
1473       return (jbyteArray) JNIHandles::make_local(env,
1474                                   instanceKlass::cast(k)->class_annotations());
1475     }
1476   }
1477   return NULL;
1478 JVM_END
1479 
1480 
1481 JVM_ENTRY(jbyteArray, JVM_GetFieldAnnotations(JNIEnv *env, jobject field))
1482   assert(field != NULL, "illegal field");
1483   JVMWrapper("JVM_GetFieldAnnotations");
1484 
1485   // some of this code was adapted from from jni_FromReflectedField
1486 
1487   // field is a handle to a java.lang.reflect.Field object
1488   oop reflected = JNIHandles::resolve_non_null(field);
1489   oop mirror    = java_lang_reflect_Field::clazz(reflected);
1490   klassOop k    = java_lang_Class::as_klassOop(mirror);
1491   int slot      = java_lang_reflect_Field::slot(reflected);
1492   int modifiers = java_lang_reflect_Field::modifiers(reflected);
1493 
1494   fieldDescriptor fd;
1495   KlassHandle kh(THREAD, k);
1496   intptr_t offset = instanceKlass::cast(kh())->field_offset(slot);
1497 
1498   if (modifiers & JVM_ACC_STATIC) {
1499     // for static fields we only look in the current class
1500     if (!instanceKlass::cast(kh())->find_local_field_from_offset(offset,
1501                                                                  true, &fd)) {
1502       assert(false, "cannot find static field");
1503       return NULL;  // robustness
1504     }
1505   } else {
1506     // for instance fields we start with the current class and work
1507     // our way up through the superclass chain
1508     if (!instanceKlass::cast(kh())->find_field_from_offset(offset, false,
1509                                                            &fd)) {
1510       assert(false, "cannot find instance field");
1511       return NULL;  // robustness
1512     }
1513   }
1514 
1515   return (jbyteArray) JNIHandles::make_local(env, fd.annotations());
1516 JVM_END
1517 
1518 
1519 static methodOop jvm_get_method_common(jobject method, TRAPS) {
1520   // some of this code was adapted from from jni_FromReflectedMethod
1521 
1522   oop reflected = JNIHandles::resolve_non_null(method);
1523   oop mirror    = NULL;
1524   int slot      = 0;
1525 
1526   if (reflected->klass() == SystemDictionary::reflect_Constructor_klass()) {
1527     mirror = java_lang_reflect_Constructor::clazz(reflected);
1528     slot   = java_lang_reflect_Constructor::slot(reflected);
1529   } else {
1530     assert(reflected->klass() == SystemDictionary::reflect_Method_klass(),
1531            "wrong type");
1532     mirror = java_lang_reflect_Method::clazz(reflected);
1533     slot   = java_lang_reflect_Method::slot(reflected);
1534   }
1535   klassOop k = java_lang_Class::as_klassOop(mirror);
1536 
1537   KlassHandle kh(THREAD, k);
1538   methodOop m = instanceKlass::cast(kh())->method_with_idnum(slot);
1539   if (m == NULL) {
1540     assert(false, "cannot find method");
1541     return NULL;  // robustness
1542   }
1543 
1544   return m;
1545 }
1546 
1547 
1548 JVM_ENTRY(jbyteArray, JVM_GetMethodAnnotations(JNIEnv *env, jobject method))
1549   JVMWrapper("JVM_GetMethodAnnotations");
1550 
1551   // method is a handle to a java.lang.reflect.Method object
1552   methodOop m = jvm_get_method_common(method, CHECK_NULL);
1553   return (jbyteArray) JNIHandles::make_local(env, m->annotations());
1554 JVM_END
1555 
1556 
1557 JVM_ENTRY(jbyteArray, JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method))
1558   JVMWrapper("JVM_GetMethodDefaultAnnotationValue");
1559 
1560   // method is a handle to a java.lang.reflect.Method object
1561   methodOop m = jvm_get_method_common(method, CHECK_NULL);
1562   return (jbyteArray) JNIHandles::make_local(env, m->annotation_default());
1563 JVM_END
1564 
1565 
1566 JVM_ENTRY(jbyteArray, JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method))
1567   JVMWrapper("JVM_GetMethodParameterAnnotations");
1568 
1569   // method is a handle to a java.lang.reflect.Method object
1570   methodOop m = jvm_get_method_common(method, CHECK_NULL);
1571   return (jbyteArray) JNIHandles::make_local(env, m->parameter_annotations());
1572 JVM_END
1573 
1574 
1575 // New (JDK 1.4) reflection implementation /////////////////////////////////////
1576 
1577 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredFields(JNIEnv *env, jclass ofClass, jboolean publicOnly))
1578 {
1579   JVMWrapper("JVM_GetClassDeclaredFields");
1580   JvmtiVMObjectAllocEventCollector oam;
1581 
1582   // Exclude primitive types and array types
1583   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass)) ||
1584       Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_javaArray()) {
1585     // Return empty array
1586     oop res = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), 0, CHECK_NULL);
1587     return (jobjectArray) JNIHandles::make_local(env, res);
1588   }
1589 
1590   instanceKlassHandle k(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)));
1591   constantPoolHandle cp(THREAD, k->constants());
1592 
1593   // Ensure class is linked
1594   k->link_class(CHECK_NULL);
1595 
1596   // 4496456 We need to filter out java.lang.Throwable.backtrace
1597   bool skip_backtrace = false;
1598 
1599   // Allocate result
1600   int num_fields;
1601 
1602   if (publicOnly) {
1603     num_fields = 0;
1604     for (JavaFieldStream fs(k()); !fs.done(); fs.next()) {
1605       if (fs.access_flags().is_public()) ++num_fields;
1606     }
1607   } else {
1608     num_fields = k->java_fields_count();
1609 
1610     if (k() == SystemDictionary::Throwable_klass()) {
1611       num_fields--;
1612       skip_backtrace = true;
1613     }
1614   }
1615 
1616   objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), num_fields, CHECK_NULL);
1617   objArrayHandle result (THREAD, r);
1618 
1619   int out_idx = 0;
1620   fieldDescriptor fd;
1621   for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
1622     if (skip_backtrace) {
1623       // 4496456 skip java.lang.Throwable.backtrace
1624       int offset = fs.offset();
1625       if (offset == java_lang_Throwable::get_backtrace_offset()) continue;
1626     }
1627 
1628     if (!publicOnly || fs.access_flags().is_public()) {
1629       fd.initialize(k(), fs.index());
1630       oop field = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
1631       result->obj_at_put(out_idx, field);
1632       ++out_idx;
1633     }
1634   }
1635   assert(out_idx == num_fields, "just checking");
1636   return (jobjectArray) JNIHandles::make_local(env, result());
1637 }
1638 JVM_END
1639 
1640 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly))
1641 {
1642   JVMWrapper("JVM_GetClassDeclaredMethods");
1643   JvmtiVMObjectAllocEventCollector oam;
1644 
1645   // Exclude primitive types and array types
1646   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
1647       || Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_javaArray()) {
1648     // Return empty array
1649     oop res = oopFactory::new_objArray(SystemDictionary::reflect_Method_klass(), 0, CHECK_NULL);
1650     return (jobjectArray) JNIHandles::make_local(env, res);
1651   }
1652 
1653   instanceKlassHandle k(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)));
1654 
1655   // Ensure class is linked
1656   k->link_class(CHECK_NULL);
1657 
1658   objArrayHandle methods (THREAD, k->methods());
1659   int methods_length = methods->length();
1660   int num_methods = 0;
1661 
1662   int i;
1663   for (i = 0; i < methods_length; i++) {
1664     methodHandle method(THREAD, (methodOop) methods->obj_at(i));
1665     if (!method->is_initializer()) {
1666       if (!publicOnly || method->is_public()) {
1667         ++num_methods;
1668       }
1669     }
1670   }
1671 
1672   // Allocate result
1673   objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Method_klass(), num_methods, CHECK_NULL);
1674   objArrayHandle result (THREAD, r);
1675 
1676   int out_idx = 0;
1677   for (i = 0; i < methods_length; i++) {
1678     methodHandle method(THREAD, (methodOop) methods->obj_at(i));
1679     if (!method->is_initializer()) {
1680       if (!publicOnly || method->is_public()) {
1681         oop m = Reflection::new_method(method, UseNewReflection, false, CHECK_NULL);
1682         result->obj_at_put(out_idx, m);
1683         ++out_idx;
1684       }
1685     }
1686   }
1687   assert(out_idx == num_methods, "just checking");
1688   return (jobjectArray) JNIHandles::make_local(env, result());
1689 }
1690 JVM_END
1691 
1692 JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly))
1693 {
1694   JVMWrapper("JVM_GetClassDeclaredConstructors");
1695   JvmtiVMObjectAllocEventCollector oam;
1696 
1697   // Exclude primitive types and array types
1698   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
1699       || Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)))->oop_is_javaArray()) {
1700     // Return empty array
1701     oop res = oopFactory::new_objArray(SystemDictionary::reflect_Constructor_klass(), 0 , CHECK_NULL);
1702     return (jobjectArray) JNIHandles::make_local(env, res);
1703   }
1704 
1705   instanceKlassHandle k(THREAD, java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(ofClass)));
1706 
1707   // Ensure class is linked
1708   k->link_class(CHECK_NULL);
1709 
1710   objArrayHandle methods (THREAD, k->methods());
1711   int methods_length = methods->length();
1712   int num_constructors = 0;
1713 
1714   int i;
1715   for (i = 0; i < methods_length; i++) {
1716     methodHandle method(THREAD, (methodOop) methods->obj_at(i));
1717     if (method->is_initializer() && !method->is_static()) {
1718       if (!publicOnly || method->is_public()) {
1719         ++num_constructors;
1720       }
1721     }
1722   }
1723 
1724   // Allocate result
1725   objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Constructor_klass(), num_constructors, CHECK_NULL);
1726   objArrayHandle result(THREAD, r);
1727 
1728   int out_idx = 0;
1729   for (i = 0; i < methods_length; i++) {
1730     methodHandle method(THREAD, (methodOop) methods->obj_at(i));
1731     if (method->is_initializer() && !method->is_static()) {
1732       if (!publicOnly || method->is_public()) {
1733         oop m = Reflection::new_constructor(method, CHECK_NULL);
1734         result->obj_at_put(out_idx, m);
1735         ++out_idx;
1736       }
1737     }
1738   }
1739   assert(out_idx == num_constructors, "just checking");
1740   return (jobjectArray) JNIHandles::make_local(env, result());
1741 }
1742 JVM_END
1743 
1744 JVM_ENTRY(jint, JVM_GetClassAccessFlags(JNIEnv *env, jclass cls))
1745 {
1746   JVMWrapper("JVM_GetClassAccessFlags");
1747   if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
1748     // Primitive type
1749     return JVM_ACC_ABSTRACT | JVM_ACC_FINAL | JVM_ACC_PUBLIC;
1750   }
1751 
1752   Klass* k = Klass::cast(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)));
1753   return k->access_flags().as_int() & JVM_ACC_WRITTEN_FLAGS;
1754 }
1755 JVM_END
1756 
1757 
1758 // Constant pool access //////////////////////////////////////////////////////////
1759 
1760 JVM_ENTRY(jobject, JVM_GetClassConstantPool(JNIEnv *env, jclass cls))
1761 {
1762   JVMWrapper("JVM_GetClassConstantPool");
1763   JvmtiVMObjectAllocEventCollector oam;
1764 
1765   // Return null for primitives and arrays
1766   if (!java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) {
1767     klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
1768     if (Klass::cast(k)->oop_is_instance()) {
1769       instanceKlassHandle k_h(THREAD, k);
1770       Handle jcp = sun_reflect_ConstantPool::create(CHECK_NULL);
1771       sun_reflect_ConstantPool::set_cp_oop(jcp(), k_h->constants());
1772       return JNIHandles::make_local(jcp());
1773     }
1774   }
1775   return NULL;
1776 }
1777 JVM_END
1778 
1779 
1780 JVM_ENTRY(jint, JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool))
1781 {
1782   JVMWrapper("JVM_ConstantPoolGetSize");
1783   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
1784   return cp->length();
1785 }
1786 JVM_END
1787 
1788 
1789 static void bounds_check(constantPoolHandle cp, jint index, TRAPS) {
1790   if (!cp->is_within_bounds(index)) {
1791     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Constant pool index out of bounds");
1792   }
1793 }
1794 
1795 
1796 JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
1797 {
1798   JVMWrapper("JVM_ConstantPoolGetClassAt");
1799   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
1800   bounds_check(cp, index, CHECK_NULL);
1801   constantTag tag = cp->tag_at(index);
1802   if (!tag.is_klass() && !tag.is_unresolved_klass()) {
1803     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1804   }
1805   klassOop k = cp->klass_at(index, CHECK_NULL);
1806   return (jclass) JNIHandles::make_local(k->java_mirror());
1807 }
1808 JVM_END
1809 
1810 
1811 JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index))
1812 {
1813   JVMWrapper("JVM_ConstantPoolGetClassAtIfLoaded");
1814   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
1815   bounds_check(cp, index, CHECK_NULL);
1816   constantTag tag = cp->tag_at(index);
1817   if (!tag.is_klass() && !tag.is_unresolved_klass()) {
1818     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1819   }
1820   klassOop k = constantPoolOopDesc::klass_at_if_loaded(cp, index);
1821   if (k == NULL) return NULL;
1822   return (jclass) JNIHandles::make_local(k->java_mirror());
1823 }
1824 JVM_END
1825 
1826 static jobject get_method_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) {
1827   constantTag tag = cp->tag_at(index);
1828   if (!tag.is_method() && !tag.is_interface_method()) {
1829     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1830   }
1831   int klass_ref  = cp->uncached_klass_ref_index_at(index);
1832   klassOop k_o;
1833   if (force_resolution) {
1834     k_o = cp->klass_at(klass_ref, CHECK_NULL);
1835   } else {
1836     k_o = constantPoolOopDesc::klass_at_if_loaded(cp, klass_ref);
1837     if (k_o == NULL) return NULL;
1838   }
1839   instanceKlassHandle k(THREAD, k_o);
1840   Symbol* name = cp->uncached_name_ref_at(index);
1841   Symbol* sig  = cp->uncached_signature_ref_at(index);
1842   methodHandle m (THREAD, k->find_method(name, sig));
1843   if (m.is_null()) {
1844     THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up method in target class");
1845   }
1846   oop method;
1847   if (!m->is_initializer() || m->is_static()) {
1848     method = Reflection::new_method(m, true, true, CHECK_NULL);
1849   } else {
1850     method = Reflection::new_constructor(m, CHECK_NULL);
1851   }
1852   return JNIHandles::make_local(method);
1853 }
1854 
1855 JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
1856 {
1857   JVMWrapper("JVM_ConstantPoolGetMethodAt");
1858   JvmtiVMObjectAllocEventCollector oam;
1859   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
1860   bounds_check(cp, index, CHECK_NULL);
1861   jobject res = get_method_at_helper(cp, index, true, CHECK_NULL);
1862   return res;
1863 }
1864 JVM_END
1865 
1866 JVM_ENTRY(jobject, JVM_ConstantPoolGetMethodAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index))
1867 {
1868   JVMWrapper("JVM_ConstantPoolGetMethodAtIfLoaded");
1869   JvmtiVMObjectAllocEventCollector oam;
1870   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
1871   bounds_check(cp, index, CHECK_NULL);
1872   jobject res = get_method_at_helper(cp, index, false, CHECK_NULL);
1873   return res;
1874 }
1875 JVM_END
1876 
1877 static jobject get_field_at_helper(constantPoolHandle cp, jint index, bool force_resolution, TRAPS) {
1878   constantTag tag = cp->tag_at(index);
1879   if (!tag.is_field()) {
1880     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1881   }
1882   int klass_ref  = cp->uncached_klass_ref_index_at(index);
1883   klassOop k_o;
1884   if (force_resolution) {
1885     k_o = cp->klass_at(klass_ref, CHECK_NULL);
1886   } else {
1887     k_o = constantPoolOopDesc::klass_at_if_loaded(cp, klass_ref);
1888     if (k_o == NULL) return NULL;
1889   }
1890   instanceKlassHandle k(THREAD, k_o);
1891   Symbol* name = cp->uncached_name_ref_at(index);
1892   Symbol* sig  = cp->uncached_signature_ref_at(index);
1893   fieldDescriptor fd;
1894   klassOop target_klass = k->find_field(name, sig, &fd);
1895   if (target_klass == NULL) {
1896     THROW_MSG_0(vmSymbols::java_lang_RuntimeException(), "Unable to look up field in target class");
1897   }
1898   oop field = Reflection::new_field(&fd, true, CHECK_NULL);
1899   return JNIHandles::make_local(field);
1900 }
1901 
1902 JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
1903 {
1904   JVMWrapper("JVM_ConstantPoolGetFieldAt");
1905   JvmtiVMObjectAllocEventCollector oam;
1906   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
1907   bounds_check(cp, index, CHECK_NULL);
1908   jobject res = get_field_at_helper(cp, index, true, CHECK_NULL);
1909   return res;
1910 }
1911 JVM_END
1912 
1913 JVM_ENTRY(jobject, JVM_ConstantPoolGetFieldAtIfLoaded(JNIEnv *env, jobject unused, jobject jcpool, jint index))
1914 {
1915   JVMWrapper("JVM_ConstantPoolGetFieldAtIfLoaded");
1916   JvmtiVMObjectAllocEventCollector oam;
1917   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
1918   bounds_check(cp, index, CHECK_NULL);
1919   jobject res = get_field_at_helper(cp, index, false, CHECK_NULL);
1920   return res;
1921 }
1922 JVM_END
1923 
1924 JVM_ENTRY(jobjectArray, JVM_ConstantPoolGetMemberRefInfoAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
1925 {
1926   JVMWrapper("JVM_ConstantPoolGetMemberRefInfoAt");
1927   JvmtiVMObjectAllocEventCollector oam;
1928   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
1929   bounds_check(cp, index, CHECK_NULL);
1930   constantTag tag = cp->tag_at(index);
1931   if (!tag.is_field_or_method()) {
1932     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1933   }
1934   int klass_ref = cp->uncached_klass_ref_index_at(index);
1935   Symbol*  klass_name  = cp->klass_name_at(klass_ref);
1936   Symbol*  member_name = cp->uncached_name_ref_at(index);
1937   Symbol*  member_sig  = cp->uncached_signature_ref_at(index);
1938   objArrayOop  dest_o = oopFactory::new_objArray(SystemDictionary::String_klass(), 3, CHECK_NULL);
1939   objArrayHandle dest(THREAD, dest_o);
1940   Handle str = java_lang_String::create_from_symbol(klass_name, CHECK_NULL);
1941   dest->obj_at_put(0, str());
1942   str = java_lang_String::create_from_symbol(member_name, CHECK_NULL);
1943   dest->obj_at_put(1, str());
1944   str = java_lang_String::create_from_symbol(member_sig, CHECK_NULL);
1945   dest->obj_at_put(2, str());
1946   return (jobjectArray) JNIHandles::make_local(dest());
1947 }
1948 JVM_END
1949 
1950 JVM_ENTRY(jint, JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
1951 {
1952   JVMWrapper("JVM_ConstantPoolGetIntAt");
1953   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
1954   bounds_check(cp, index, CHECK_0);
1955   constantTag tag = cp->tag_at(index);
1956   if (!tag.is_int()) {
1957     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1958   }
1959   return cp->int_at(index);
1960 }
1961 JVM_END
1962 
1963 JVM_ENTRY(jlong, JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
1964 {
1965   JVMWrapper("JVM_ConstantPoolGetLongAt");
1966   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
1967   bounds_check(cp, index, CHECK_(0L));
1968   constantTag tag = cp->tag_at(index);
1969   if (!tag.is_long()) {
1970     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1971   }
1972   return cp->long_at(index);
1973 }
1974 JVM_END
1975 
1976 JVM_ENTRY(jfloat, JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
1977 {
1978   JVMWrapper("JVM_ConstantPoolGetFloatAt");
1979   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
1980   bounds_check(cp, index, CHECK_(0.0f));
1981   constantTag tag = cp->tag_at(index);
1982   if (!tag.is_float()) {
1983     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1984   }
1985   return cp->float_at(index);
1986 }
1987 JVM_END
1988 
1989 JVM_ENTRY(jdouble, JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
1990 {
1991   JVMWrapper("JVM_ConstantPoolGetDoubleAt");
1992   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
1993   bounds_check(cp, index, CHECK_(0.0));
1994   constantTag tag = cp->tag_at(index);
1995   if (!tag.is_double()) {
1996     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
1997   }
1998   return cp->double_at(index);
1999 }
2000 JVM_END
2001 
2002 JVM_ENTRY(jstring, JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index))
2003 {
2004   JVMWrapper("JVM_ConstantPoolGetStringAt");
2005   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
2006   bounds_check(cp, index, CHECK_NULL);
2007   constantTag tag = cp->tag_at(index);
2008   if (!tag.is_string() && !tag.is_unresolved_string()) {
2009     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2010   }
2011   oop str = cp->string_at(index, CHECK_NULL);
2012   return (jstring) JNIHandles::make_local(str);
2013 }
2014 JVM_END
2015 
2016 JVM_ENTRY(jstring, JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index))
2017 {
2018   JVMWrapper("JVM_ConstantPoolGetUTF8At");
2019   JvmtiVMObjectAllocEventCollector oam;
2020   constantPoolHandle cp = constantPoolHandle(THREAD, constantPoolOop(JNIHandles::resolve_non_null(jcpool)));
2021   bounds_check(cp, index, CHECK_NULL);
2022   constantTag tag = cp->tag_at(index);
2023   if (!tag.is_symbol()) {
2024     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Wrong type at constant pool index");
2025   }
2026   Symbol* sym = cp->symbol_at(index);
2027   Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
2028   return (jstring) JNIHandles::make_local(str());
2029 }
2030 JVM_END
2031 
2032 
2033 // Assertion support. //////////////////////////////////////////////////////////
2034 
2035 JVM_ENTRY(jboolean, JVM_DesiredAssertionStatus(JNIEnv *env, jclass unused, jclass cls))
2036   JVMWrapper("JVM_DesiredAssertionStatus");
2037   assert(cls != NULL, "bad class");
2038 
2039   oop r = JNIHandles::resolve(cls);
2040   assert(! java_lang_Class::is_primitive(r), "primitive classes not allowed");
2041   if (java_lang_Class::is_primitive(r)) return false;
2042 
2043   klassOop k = java_lang_Class::as_klassOop(r);
2044   assert(Klass::cast(k)->oop_is_instance(), "must be an instance klass");
2045   if (! Klass::cast(k)->oop_is_instance()) return false;
2046 
2047   ResourceMark rm(THREAD);
2048   const char* name = Klass::cast(k)->name()->as_C_string();
2049   bool system_class = Klass::cast(k)->class_loader() == NULL;
2050   return JavaAssertions::enabled(name, system_class);
2051 
2052 JVM_END
2053 
2054 
2055 // Return a new AssertionStatusDirectives object with the fields filled in with
2056 // command-line assertion arguments (i.e., -ea, -da).
2057 JVM_ENTRY(jobject, JVM_AssertionStatusDirectives(JNIEnv *env, jclass unused))
2058   JVMWrapper("JVM_AssertionStatusDirectives");
2059   JvmtiVMObjectAllocEventCollector oam;
2060   oop asd = JavaAssertions::createAssertionStatusDirectives(CHECK_NULL);
2061   return JNIHandles::make_local(env, asd);
2062 JVM_END
2063 
2064 // Verification ////////////////////////////////////////////////////////////////////////////////
2065 
2066 // Reflection for the verifier /////////////////////////////////////////////////////////////////
2067 
2068 // RedefineClasses support: bug 6214132 caused verification to fail.
2069 // All functions from this section should call the jvmtiThreadSate function:
2070 //   klassOop class_to_verify_considering_redefinition(klassOop klass).
2071 // The function returns a klassOop of the _scratch_class if the verifier
2072 // was invoked in the middle of the class redefinition.
2073 // Otherwise it returns its argument value which is the _the_class klassOop.
2074 // Please, refer to the description in the jvmtiThreadSate.hpp.
2075 
2076 JVM_ENTRY(const char*, JVM_GetClassNameUTF(JNIEnv *env, jclass cls))
2077   JVMWrapper("JVM_GetClassNameUTF");
2078   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2079   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2080   return Klass::cast(k)->name()->as_utf8();
2081 JVM_END
2082 
2083 
2084 JVM_QUICK_ENTRY(void, JVM_GetClassCPTypes(JNIEnv *env, jclass cls, unsigned char *types))
2085   JVMWrapper("JVM_GetClassCPTypes");
2086   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2087   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2088   // types will have length zero if this is not an instanceKlass
2089   // (length is determined by call to JVM_GetClassCPEntriesCount)
2090   if (Klass::cast(k)->oop_is_instance()) {
2091     constantPoolOop cp = instanceKlass::cast(k)->constants();
2092     for (int index = cp->length() - 1; index >= 0; index--) {
2093       constantTag tag = cp->tag_at(index);
2094       types[index] = (tag.is_unresolved_klass()) ? JVM_CONSTANT_Class :
2095                      (tag.is_unresolved_string()) ? JVM_CONSTANT_String : tag.value();
2096   }
2097   }
2098 JVM_END
2099 
2100 
2101 JVM_QUICK_ENTRY(jint, JVM_GetClassCPEntriesCount(JNIEnv *env, jclass cls))
2102   JVMWrapper("JVM_GetClassCPEntriesCount");
2103   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2104   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2105   if (!Klass::cast(k)->oop_is_instance())
2106     return 0;
2107   return instanceKlass::cast(k)->constants()->length();
2108 JVM_END
2109 
2110 
2111 JVM_QUICK_ENTRY(jint, JVM_GetClassFieldsCount(JNIEnv *env, jclass cls))
2112   JVMWrapper("JVM_GetClassFieldsCount");
2113   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2114   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2115   if (!Klass::cast(k)->oop_is_instance())
2116     return 0;
2117   return instanceKlass::cast(k)->java_fields_count();
2118 JVM_END
2119 
2120 
2121 JVM_QUICK_ENTRY(jint, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls))
2122   JVMWrapper("JVM_GetClassMethodsCount");
2123   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2124   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2125   if (!Klass::cast(k)->oop_is_instance())
2126     return 0;
2127   return instanceKlass::cast(k)->methods()->length();
2128 JVM_END
2129 
2130 
2131 // The following methods, used for the verifier, are never called with
2132 // array klasses, so a direct cast to instanceKlass is safe.
2133 // Typically, these methods are called in a loop with bounds determined
2134 // by the results of JVM_GetClass{Fields,Methods}Count, which return
2135 // zero for arrays.
2136 JVM_QUICK_ENTRY(void, JVM_GetMethodIxExceptionIndexes(JNIEnv *env, jclass cls, jint method_index, unsigned short *exceptions))
2137   JVMWrapper("JVM_GetMethodIxExceptionIndexes");
2138   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2139   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2140   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2141   int length = methodOop(method)->checked_exceptions_length();
2142   if (length > 0) {
2143     CheckedExceptionElement* table= methodOop(method)->checked_exceptions_start();
2144     for (int i = 0; i < length; i++) {
2145       exceptions[i] = table[i].class_cp_index;
2146     }
2147   }
2148 JVM_END
2149 
2150 
2151 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxExceptionsCount(JNIEnv *env, jclass cls, jint method_index))
2152   JVMWrapper("JVM_GetMethodIxExceptionsCount");
2153   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2154   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2155   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2156   return methodOop(method)->checked_exceptions_length();
2157 JVM_END
2158 
2159 
2160 JVM_QUICK_ENTRY(void, JVM_GetMethodIxByteCode(JNIEnv *env, jclass cls, jint method_index, unsigned char *code))
2161   JVMWrapper("JVM_GetMethodIxByteCode");
2162   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2163   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2164   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2165   memcpy(code, methodOop(method)->code_base(), methodOop(method)->code_size());
2166 JVM_END
2167 
2168 
2169 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxByteCodeLength(JNIEnv *env, jclass cls, jint method_index))
2170   JVMWrapper("JVM_GetMethodIxByteCodeLength");
2171   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2172   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2173   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2174   return methodOop(method)->code_size();
2175 JVM_END
2176 
2177 
2178 JVM_QUICK_ENTRY(void, JVM_GetMethodIxExceptionTableEntry(JNIEnv *env, jclass cls, jint method_index, jint entry_index, JVM_ExceptionTableEntryType *entry))
2179   JVMWrapper("JVM_GetMethodIxExceptionTableEntry");
2180   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2181   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2182   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2183   ExceptionTable extable((methodOop(method)));
2184   entry->start_pc   = extable.start_pc(entry_index);
2185   entry->end_pc     = extable.end_pc(entry_index);
2186   entry->handler_pc = extable.handler_pc(entry_index);
2187   entry->catchType  = extable.catch_type_index(entry_index);
2188 JVM_END
2189 
2190 
2191 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxExceptionTableLength(JNIEnv *env, jclass cls, int method_index))
2192   JVMWrapper("JVM_GetMethodIxExceptionTableLength");
2193   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2194   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2195   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2196   return methodOop(method)->exception_table_length();
2197 JVM_END
2198 
2199 
2200 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxModifiers(JNIEnv *env, jclass cls, int method_index))
2201   JVMWrapper("JVM_GetMethodIxModifiers");
2202   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2203   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2204   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2205   return methodOop(method)->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
2206 JVM_END
2207 
2208 
2209 JVM_QUICK_ENTRY(jint, JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index))
2210   JVMWrapper("JVM_GetFieldIxModifiers");
2211   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2212   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2213   return instanceKlass::cast(k)->field_access_flags(field_index) & JVM_RECOGNIZED_FIELD_MODIFIERS;
2214 JVM_END
2215 
2216 
2217 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index))
2218   JVMWrapper("JVM_GetMethodIxLocalsCount");
2219   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2220   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2221   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2222   return methodOop(method)->max_locals();
2223 JVM_END
2224 
2225 
2226 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxArgsSize(JNIEnv *env, jclass cls, int method_index))
2227   JVMWrapper("JVM_GetMethodIxArgsSize");
2228   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2229   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2230   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2231   return methodOop(method)->size_of_parameters();
2232 JVM_END
2233 
2234 
2235 JVM_QUICK_ENTRY(jint, JVM_GetMethodIxMaxStack(JNIEnv *env, jclass cls, int method_index))
2236   JVMWrapper("JVM_GetMethodIxMaxStack");
2237   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2238   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2239   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2240   return methodOop(method)->max_stack();
2241 JVM_END
2242 
2243 
2244 JVM_QUICK_ENTRY(jboolean, JVM_IsConstructorIx(JNIEnv *env, jclass cls, int method_index))
2245   JVMWrapper("JVM_IsConstructorIx");
2246   ResourceMark rm(THREAD);
2247   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2248   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2249   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2250   return methodOop(method)->name() == vmSymbols::object_initializer_name();
2251 JVM_END
2252 
2253 
2254 JVM_ENTRY(const char*, JVM_GetMethodIxNameUTF(JNIEnv *env, jclass cls, jint method_index))
2255   JVMWrapper("JVM_GetMethodIxIxUTF");
2256   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2257   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2258   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2259   return methodOop(method)->name()->as_utf8();
2260 JVM_END
2261 
2262 
2263 JVM_ENTRY(const char*, JVM_GetMethodIxSignatureUTF(JNIEnv *env, jclass cls, jint method_index))
2264   JVMWrapper("JVM_GetMethodIxSignatureUTF");
2265   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2266   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2267   oop method = instanceKlass::cast(k)->methods()->obj_at(method_index);
2268   return methodOop(method)->signature()->as_utf8();
2269 JVM_END
2270 
2271 /**
2272  * All of these JVM_GetCP-xxx methods are used by the old verifier to
2273  * read entries in the constant pool.  Since the old verifier always
2274  * works on a copy of the code, it will not see any rewriting that
2275  * may possibly occur in the middle of verification.  So it is important
2276  * that nothing it calls tries to use the cpCache instead of the raw
2277  * constant pool, so we must use cp->uncached_x methods when appropriate.
2278  */
2279 JVM_ENTRY(const char*, JVM_GetCPFieldNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2280   JVMWrapper("JVM_GetCPFieldNameUTF");
2281   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2282   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2283   constantPoolOop cp = instanceKlass::cast(k)->constants();
2284   switch (cp->tag_at(cp_index).value()) {
2285     case JVM_CONSTANT_Fieldref:
2286       return cp->uncached_name_ref_at(cp_index)->as_utf8();
2287     default:
2288       fatal("JVM_GetCPFieldNameUTF: illegal constant");
2289   }
2290   ShouldNotReachHere();
2291   return NULL;
2292 JVM_END
2293 
2294 
2295 JVM_ENTRY(const char*, JVM_GetCPMethodNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2296   JVMWrapper("JVM_GetCPMethodNameUTF");
2297   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2298   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2299   constantPoolOop cp = instanceKlass::cast(k)->constants();
2300   switch (cp->tag_at(cp_index).value()) {
2301     case JVM_CONSTANT_InterfaceMethodref:
2302     case JVM_CONSTANT_Methodref:
2303     case JVM_CONSTANT_NameAndType:  // for invokedynamic
2304       return cp->uncached_name_ref_at(cp_index)->as_utf8();
2305     default:
2306       fatal("JVM_GetCPMethodNameUTF: illegal constant");
2307   }
2308   ShouldNotReachHere();
2309   return NULL;
2310 JVM_END
2311 
2312 
2313 JVM_ENTRY(const char*, JVM_GetCPMethodSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))
2314   JVMWrapper("JVM_GetCPMethodSignatureUTF");
2315   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2316   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2317   constantPoolOop cp = instanceKlass::cast(k)->constants();
2318   switch (cp->tag_at(cp_index).value()) {
2319     case JVM_CONSTANT_InterfaceMethodref:
2320     case JVM_CONSTANT_Methodref:
2321     case JVM_CONSTANT_NameAndType:  // for invokedynamic
2322       return cp->uncached_signature_ref_at(cp_index)->as_utf8();
2323     default:
2324       fatal("JVM_GetCPMethodSignatureUTF: illegal constant");
2325   }
2326   ShouldNotReachHere();
2327   return NULL;
2328 JVM_END
2329 
2330 
2331 JVM_ENTRY(const char*, JVM_GetCPFieldSignatureUTF(JNIEnv *env, jclass cls, jint cp_index))
2332   JVMWrapper("JVM_GetCPFieldSignatureUTF");
2333   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2334   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2335   constantPoolOop cp = instanceKlass::cast(k)->constants();
2336   switch (cp->tag_at(cp_index).value()) {
2337     case JVM_CONSTANT_Fieldref:
2338       return cp->uncached_signature_ref_at(cp_index)->as_utf8();
2339     default:
2340       fatal("JVM_GetCPFieldSignatureUTF: illegal constant");
2341   }
2342   ShouldNotReachHere();
2343   return NULL;
2344 JVM_END
2345 
2346 
2347 JVM_ENTRY(const char*, JVM_GetCPClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2348   JVMWrapper("JVM_GetCPClassNameUTF");
2349   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2350   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2351   constantPoolOop cp = instanceKlass::cast(k)->constants();
2352   Symbol* classname = cp->klass_name_at(cp_index);
2353   return classname->as_utf8();
2354 JVM_END
2355 
2356 
2357 JVM_ENTRY(const char*, JVM_GetCPFieldClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2358   JVMWrapper("JVM_GetCPFieldClassNameUTF");
2359   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2360   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2361   constantPoolOop cp = instanceKlass::cast(k)->constants();
2362   switch (cp->tag_at(cp_index).value()) {
2363     case JVM_CONSTANT_Fieldref: {
2364       int class_index = cp->uncached_klass_ref_index_at(cp_index);
2365       Symbol* classname = cp->klass_name_at(class_index);
2366       return classname->as_utf8();
2367     }
2368     default:
2369       fatal("JVM_GetCPFieldClassNameUTF: illegal constant");
2370   }
2371   ShouldNotReachHere();
2372   return NULL;
2373 JVM_END
2374 
2375 
2376 JVM_ENTRY(const char*, JVM_GetCPMethodClassNameUTF(JNIEnv *env, jclass cls, jint cp_index))
2377   JVMWrapper("JVM_GetCPMethodClassNameUTF");
2378   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2379   k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2380   constantPoolOop cp = instanceKlass::cast(k)->constants();
2381   switch (cp->tag_at(cp_index).value()) {
2382     case JVM_CONSTANT_Methodref:
2383     case JVM_CONSTANT_InterfaceMethodref: {
2384       int class_index = cp->uncached_klass_ref_index_at(cp_index);
2385       Symbol* classname = cp->klass_name_at(class_index);
2386       return classname->as_utf8();
2387     }
2388     default:
2389       fatal("JVM_GetCPMethodClassNameUTF: illegal constant");
2390   }
2391   ShouldNotReachHere();
2392   return NULL;
2393 JVM_END
2394 
2395 
2396 JVM_ENTRY(jint, JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
2397   JVMWrapper("JVM_GetCPFieldModifiers");
2398   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2399   klassOop k_called = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(called_cls));
2400   k        = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2401   k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
2402   constantPoolOop cp = instanceKlass::cast(k)->constants();
2403   constantPoolOop cp_called = instanceKlass::cast(k_called)->constants();
2404   switch (cp->tag_at(cp_index).value()) {
2405     case JVM_CONSTANT_Fieldref: {
2406       Symbol* name      = cp->uncached_name_ref_at(cp_index);
2407       Symbol* signature = cp->uncached_signature_ref_at(cp_index);
2408       for (JavaFieldStream fs(k_called); !fs.done(); fs.next()) {
2409         if (fs.name() == name && fs.signature() == signature) {
2410           return fs.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS;
2411         }
2412       }
2413       return -1;
2414     }
2415     default:
2416       fatal("JVM_GetCPFieldModifiers: illegal constant");
2417   }
2418   ShouldNotReachHere();
2419   return 0;
2420 JVM_END
2421 
2422 
2423 JVM_QUICK_ENTRY(jint, JVM_GetCPMethodModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls))
2424   JVMWrapper("JVM_GetCPMethodModifiers");
2425   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
2426   klassOop k_called = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(called_cls));
2427   k        = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread);
2428   k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
2429   constantPoolOop cp = instanceKlass::cast(k)->constants();
2430   switch (cp->tag_at(cp_index).value()) {
2431     case JVM_CONSTANT_Methodref:
2432     case JVM_CONSTANT_InterfaceMethodref: {
2433       Symbol* name      = cp->uncached_name_ref_at(cp_index);
2434       Symbol* signature = cp->uncached_signature_ref_at(cp_index);
2435       objArrayOop methods = instanceKlass::cast(k_called)->methods();
2436       int methods_count = methods->length();
2437       for (int i = 0; i < methods_count; i++) {
2438         methodOop method = methodOop(methods->obj_at(i));
2439         if (method->name() == name && method->signature() == signature) {
2440             return method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
2441         }
2442       }
2443       return -1;
2444     }
2445     default:
2446       fatal("JVM_GetCPMethodModifiers: illegal constant");
2447   }
2448   ShouldNotReachHere();
2449   return 0;
2450 JVM_END
2451 
2452 
2453 // Misc //////////////////////////////////////////////////////////////////////////////////////////////
2454 
2455 JVM_LEAF(void, JVM_ReleaseUTF(const char *utf))
2456   // So long as UTF8::convert_to_utf8 returns resource strings, we don't have to do anything
2457 JVM_END
2458 
2459 
2460 JVM_ENTRY(jboolean, JVM_IsSameClassPackage(JNIEnv *env, jclass class1, jclass class2))
2461   JVMWrapper("JVM_IsSameClassPackage");
2462   oop class1_mirror = JNIHandles::resolve_non_null(class1);
2463   oop class2_mirror = JNIHandles::resolve_non_null(class2);
2464   klassOop klass1 = java_lang_Class::as_klassOop(class1_mirror);
2465   klassOop klass2 = java_lang_Class::as_klassOop(class2_mirror);
2466   return (jboolean) Reflection::is_same_class_package(klass1, klass2);
2467 JVM_END
2468 
2469 
2470 // IO functions ////////////////////////////////////////////////////////////////////////////////////////
2471 
2472 JVM_LEAF(jint, JVM_Open(const char *fname, jint flags, jint mode))
2473   JVMWrapper2("JVM_Open (%s)", fname);
2474 
2475   //%note jvm_r6
2476   int result = os::open(fname, flags, mode);
2477   if (result >= 0) {
2478     return result;
2479   } else {
2480     switch(errno) {
2481       case EEXIST:
2482         return JVM_EEXIST;
2483       default:
2484         return -1;
2485     }
2486   }
2487 JVM_END
2488 
2489 
2490 JVM_LEAF(jint, JVM_Close(jint fd))
2491   JVMWrapper2("JVM_Close (0x%x)", fd);
2492   //%note jvm_r6
2493   return os::close(fd);
2494 JVM_END
2495 
2496 
2497 JVM_LEAF(jint, JVM_Read(jint fd, char *buf, jint nbytes))
2498   JVMWrapper2("JVM_Read (0x%x)", fd);
2499 
2500   //%note jvm_r6
2501   return (jint)os::restartable_read(fd, buf, nbytes);
2502 JVM_END
2503 
2504 
2505 JVM_LEAF(jint, JVM_Write(jint fd, char *buf, jint nbytes))
2506   JVMWrapper2("JVM_Write (0x%x)", fd);
2507 
2508   //%note jvm_r6
2509   return (jint)os::write(fd, buf, nbytes);
2510 JVM_END
2511 
2512 
2513 JVM_LEAF(jint, JVM_Available(jint fd, jlong *pbytes))
2514   JVMWrapper2("JVM_Available (0x%x)", fd);
2515   //%note jvm_r6
2516   return os::available(fd, pbytes);
2517 JVM_END
2518 
2519 
2520 JVM_LEAF(jlong, JVM_Lseek(jint fd, jlong offset, jint whence))
2521   JVMWrapper4("JVM_Lseek (0x%x, %Ld, %d)", fd, offset, whence);
2522   //%note jvm_r6
2523   return os::lseek(fd, offset, whence);
2524 JVM_END
2525 
2526 
2527 JVM_LEAF(jint, JVM_SetLength(jint fd, jlong length))
2528   JVMWrapper3("JVM_SetLength (0x%x, %Ld)", fd, length);
2529   return os::ftruncate(fd, length);
2530 JVM_END
2531 
2532 
2533 JVM_LEAF(jint, JVM_Sync(jint fd))
2534   JVMWrapper2("JVM_Sync (0x%x)", fd);
2535   //%note jvm_r6
2536   return os::fsync(fd);
2537 JVM_END
2538 
2539 
2540 // Printing support //////////////////////////////////////////////////
2541 extern "C" {
2542 
2543 int jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) {
2544   // see bug 4399518, 4417214
2545   if ((intptr_t)count <= 0) return -1;
2546   return vsnprintf(str, count, fmt, args);
2547 }
2548 
2549 
2550 int jio_snprintf(char *str, size_t count, const char *fmt, ...) {
2551   va_list args;
2552   int len;
2553   va_start(args, fmt);
2554   len = jio_vsnprintf(str, count, fmt, args);
2555   va_end(args);
2556   return len;
2557 }
2558 
2559 
2560 int jio_fprintf(FILE* f, const char *fmt, ...) {
2561   int len;
2562   va_list args;
2563   va_start(args, fmt);
2564   len = jio_vfprintf(f, fmt, args);
2565   va_end(args);
2566   return len;
2567 }
2568 
2569 
2570 int jio_vfprintf(FILE* f, const char *fmt, va_list args) {
2571   if (Arguments::vfprintf_hook() != NULL) {
2572      return Arguments::vfprintf_hook()(f, fmt, args);
2573   } else {
2574     return vfprintf(f, fmt, args);
2575   }
2576 }
2577 
2578 
2579 JNIEXPORT int jio_printf(const char *fmt, ...) {
2580   int len;
2581   va_list args;
2582   va_start(args, fmt);
2583   len = jio_vfprintf(defaultStream::output_stream(), fmt, args);
2584   va_end(args);
2585   return len;
2586 }
2587 
2588 
2589 // HotSpot specific jio method
2590 void jio_print(const char* s) {
2591   // Try to make this function as atomic as possible.
2592   if (Arguments::vfprintf_hook() != NULL) {
2593     jio_fprintf(defaultStream::output_stream(), "%s", s);
2594   } else {
2595     // Make an unused local variable to avoid warning from gcc 4.x compiler.
2596     size_t count = ::write(defaultStream::output_fd(), s, (int)strlen(s));
2597   }
2598 }
2599 
2600 } // Extern C
2601 
2602 // java.lang.Thread //////////////////////////////////////////////////////////////////////////////
2603 
2604 // In most of the JVM Thread support functions we need to be sure to lock the Threads_lock
2605 // to prevent the target thread from exiting after we have a pointer to the C++ Thread or
2606 // OSThread objects.  The exception to this rule is when the target object is the thread
2607 // doing the operation, in which case we know that the thread won't exit until the
2608 // operation is done (all exits being voluntary).  There are a few cases where it is
2609 // rather silly to do operations on yourself, like resuming yourself or asking whether
2610 // you are alive.  While these can still happen, they are not subject to deadlocks if
2611 // the lock is held while the operation occurs (this is not the case for suspend, for
2612 // instance), and are very unlikely.  Because IsAlive needs to be fast and its
2613 // implementation is local to this file, we always lock Threads_lock for that one.
2614 
2615 static void thread_entry(JavaThread* thread, TRAPS) {
2616   HandleMark hm(THREAD);
2617   Handle obj(THREAD, thread->threadObj());
2618   JavaValue result(T_VOID);
2619   JavaCalls::call_virtual(&result,
2620                           obj,
2621                           KlassHandle(THREAD, SystemDictionary::Thread_klass()),
2622                           vmSymbols::run_method_name(),
2623                           vmSymbols::void_method_signature(),
2624                           THREAD);
2625 }
2626 
2627 
2628 JVM_ENTRY(void, JVM_StartThread(JNIEnv* env, jobject jthread))
2629   JVMWrapper("JVM_StartThread");
2630   JavaThread *native_thread = NULL;
2631 
2632   // We cannot hold the Threads_lock when we throw an exception,
2633   // due to rank ordering issues. Example:  we might need to grab the
2634   // Heap_lock while we construct the exception.
2635   bool throw_illegal_thread_state = false;
2636 
2637   // We must release the Threads_lock before we can post a jvmti event
2638   // in Thread::start.
2639   {
2640     // Ensure that the C++ Thread and OSThread structures aren't freed before
2641     // we operate.
2642     MutexLocker mu(Threads_lock);
2643 
2644     // Since JDK 5 the java.lang.Thread threadStatus is used to prevent
2645     // re-starting an already started thread, so we should usually find
2646     // that the JavaThread is null. However for a JNI attached thread
2647     // there is a small window between the Thread object being created
2648     // (with its JavaThread set) and the update to its threadStatus, so we
2649     // have to check for this
2650     if (java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread)) != NULL) {
2651       throw_illegal_thread_state = true;
2652     } else {
2653       // We could also check the stillborn flag to see if this thread was already stopped, but
2654       // for historical reasons we let the thread detect that itself when it starts running
2655 
2656       jlong size =
2657              java_lang_Thread::stackSize(JNIHandles::resolve_non_null(jthread));
2658       // Allocate the C++ Thread structure and create the native thread.  The
2659       // stack size retrieved from java is signed, but the constructor takes
2660       // size_t (an unsigned type), so avoid passing negative values which would
2661       // result in really large stacks.
2662       size_t sz = size > 0 ? (size_t) size : 0;
2663       native_thread = new JavaThread(&thread_entry, sz);
2664 
2665       // At this point it may be possible that no osthread was created for the
2666       // JavaThread due to lack of memory. Check for this situation and throw
2667       // an exception if necessary. Eventually we may want to change this so
2668       // that we only grab the lock if the thread was created successfully -
2669       // then we can also do this check and throw the exception in the
2670       // JavaThread constructor.
2671       if (native_thread->osthread() != NULL) {
2672         // Note: the current thread is not being used within "prepare".
2673         native_thread->prepare(jthread);
2674       }
2675     }
2676   }
2677 
2678   if (throw_illegal_thread_state) {
2679     THROW(vmSymbols::java_lang_IllegalThreadStateException());
2680   }
2681 
2682   assert(native_thread != NULL, "Starting null thread?");
2683 
2684   if (native_thread->osthread() == NULL) {
2685     // No one should hold a reference to the 'native_thread'.
2686     delete native_thread;
2687     if (JvmtiExport::should_post_resource_exhausted()) {
2688       JvmtiExport::post_resource_exhausted(
2689         JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR | JVMTI_RESOURCE_EXHAUSTED_THREADS,
2690         "unable to create new native thread");
2691     }
2692     THROW_MSG(vmSymbols::java_lang_OutOfMemoryError(),
2693               "unable to create new native thread");
2694   }
2695 
2696   Thread::start(native_thread);
2697 
2698 JVM_END
2699 
2700 // JVM_Stop is implemented using a VM_Operation, so threads are forced to safepoints
2701 // before the quasi-asynchronous exception is delivered.  This is a little obtrusive,
2702 // but is thought to be reliable and simple. In the case, where the receiver is the
2703 // same thread as the sender, no safepoint is needed.
2704 JVM_ENTRY(void, JVM_StopThread(JNIEnv* env, jobject jthread, jobject throwable))
2705   JVMWrapper("JVM_StopThread");
2706 
2707   oop java_throwable = JNIHandles::resolve(throwable);
2708   if (java_throwable == NULL) {
2709     THROW(vmSymbols::java_lang_NullPointerException());
2710   }
2711   oop java_thread = JNIHandles::resolve_non_null(jthread);
2712   JavaThread* receiver = java_lang_Thread::thread(java_thread);
2713   Events::log_exception(JavaThread::current(),
2714                         "JVM_StopThread thread JavaThread " INTPTR_FORMAT " as oop " INTPTR_FORMAT " [exception " INTPTR_FORMAT "]",
2715                         receiver, (address)java_thread, throwable);
2716   // First check if thread is alive
2717   if (receiver != NULL) {
2718     // Check if exception is getting thrown at self (use oop equality, since the
2719     // target object might exit)
2720     if (java_thread == thread->threadObj()) {
2721       THROW_OOP(java_throwable);
2722     } else {
2723       // Enques a VM_Operation to stop all threads and then deliver the exception...
2724       Thread::send_async_exception(java_thread, JNIHandles::resolve(throwable));
2725     }
2726   }
2727   else {
2728     // Either:
2729     // - target thread has not been started before being stopped, or
2730     // - target thread already terminated
2731     // We could read the threadStatus to determine which case it is
2732     // but that is overkill as it doesn't matter. We must set the
2733     // stillborn flag for the first case, and if the thread has already
2734     // exited setting this flag has no affect
2735     java_lang_Thread::set_stillborn(java_thread);
2736   }
2737 JVM_END
2738 
2739 
2740 JVM_ENTRY(jboolean, JVM_IsThreadAlive(JNIEnv* env, jobject jthread))
2741   JVMWrapper("JVM_IsThreadAlive");
2742 
2743   oop thread_oop = JNIHandles::resolve_non_null(jthread);
2744   return java_lang_Thread::is_alive(thread_oop);
2745 JVM_END
2746 
2747 
2748 JVM_ENTRY(void, JVM_SuspendThread(JNIEnv* env, jobject jthread))
2749   JVMWrapper("JVM_SuspendThread");
2750   oop java_thread = JNIHandles::resolve_non_null(jthread);
2751   JavaThread* receiver = java_lang_Thread::thread(java_thread);
2752 
2753   if (receiver != NULL) {
2754     // thread has run and has not exited (still on threads list)
2755 
2756     {
2757       MutexLockerEx ml(receiver->SR_lock(), Mutex::_no_safepoint_check_flag);
2758       if (receiver->is_external_suspend()) {
2759         // Don't allow nested external suspend requests. We can't return
2760         // an error from this interface so just ignore the problem.
2761         return;
2762       }
2763       if (receiver->is_exiting()) { // thread is in the process of exiting
2764         return;
2765       }
2766       receiver->set_external_suspend();
2767     }
2768 
2769     // java_suspend() will catch threads in the process of exiting
2770     // and will ignore them.
2771     receiver->java_suspend();
2772 
2773     // It would be nice to have the following assertion in all the
2774     // time, but it is possible for a racing resume request to have
2775     // resumed this thread right after we suspended it. Temporarily
2776     // enable this assertion if you are chasing a different kind of
2777     // bug.
2778     //
2779     // assert(java_lang_Thread::thread(receiver->threadObj()) == NULL ||
2780     //   receiver->is_being_ext_suspended(), "thread is not suspended");
2781   }
2782 JVM_END
2783 
2784 
2785 JVM_ENTRY(void, JVM_ResumeThread(JNIEnv* env, jobject jthread))
2786   JVMWrapper("JVM_ResumeThread");
2787   // Ensure that the C++ Thread and OSThread structures aren't freed before we operate.
2788   // We need to *always* get the threads lock here, since this operation cannot be allowed during
2789   // a safepoint. The safepoint code relies on suspending a thread to examine its state. If other
2790   // threads randomly resumes threads, then a thread might not be suspended when the safepoint code
2791   // looks at it.
2792   MutexLocker ml(Threads_lock);
2793   JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
2794   if (thr != NULL) {
2795     // the thread has run and is not in the process of exiting
2796     thr->java_resume();
2797   }
2798 JVM_END
2799 
2800 
2801 JVM_ENTRY(void, JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio))
2802   JVMWrapper("JVM_SetThreadPriority");
2803   // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
2804   MutexLocker ml(Threads_lock);
2805   oop java_thread = JNIHandles::resolve_non_null(jthread);
2806   java_lang_Thread::set_priority(java_thread, (ThreadPriority)prio);
2807   JavaThread* thr = java_lang_Thread::thread(java_thread);
2808   if (thr != NULL) {                  // Thread not yet started; priority pushed down when it is
2809     Thread::set_priority(thr, (ThreadPriority)prio);
2810   }
2811 JVM_END
2812 
2813 
2814 JVM_ENTRY(void, JVM_Yield(JNIEnv *env, jclass threadClass))
2815   JVMWrapper("JVM_Yield");
2816   if (os::dont_yield()) return;
2817 #ifndef USDT2
2818   HS_DTRACE_PROBE0(hotspot, thread__yield);
2819 #else /* USDT2 */
2820   HOTSPOT_THREAD_YIELD();
2821 #endif /* USDT2 */
2822   // When ConvertYieldToSleep is off (default), this matches the classic VM use of yield.
2823   // Critical for similar threading behaviour
2824   if (ConvertYieldToSleep) {
2825     os::sleep(thread, MinSleepInterval, false);
2826   } else {
2827     os::yield();
2828   }
2829 JVM_END
2830 
2831 
2832 JVM_ENTRY(void, JVM_Sleep(JNIEnv* env, jclass threadClass, jlong millis))
2833   JVMWrapper("JVM_Sleep");
2834 
2835   if (millis < 0) {
2836     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "timeout value is negative");
2837   }
2838 
2839   if (Thread::is_interrupted (THREAD, true) && !HAS_PENDING_EXCEPTION) {
2840     THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
2841   }
2842 
2843   // Save current thread state and restore it at the end of this block.
2844   // And set new thread state to SLEEPING.
2845   JavaThreadSleepState jtss(thread);
2846 
2847 #ifndef USDT2
2848   HS_DTRACE_PROBE1(hotspot, thread__sleep__begin, millis);
2849 #else /* USDT2 */
2850   HOTSPOT_THREAD_SLEEP_BEGIN(
2851                              millis);
2852 #endif /* USDT2 */
2853 
2854   if (millis == 0) {
2855     // When ConvertSleepToYield is on, this matches the classic VM implementation of
2856     // JVM_Sleep. Critical for similar threading behaviour (Win32)
2857     // It appears that in certain GUI contexts, it may be beneficial to do a short sleep
2858     // for SOLARIS
2859     if (ConvertSleepToYield) {
2860       os::yield();
2861     } else {
2862       ThreadState old_state = thread->osthread()->get_state();
2863       thread->osthread()->set_state(SLEEPING);
2864       os::sleep(thread, MinSleepInterval, false);
2865       thread->osthread()->set_state(old_state);
2866     }
2867   } else {
2868     ThreadState old_state = thread->osthread()->get_state();
2869     thread->osthread()->set_state(SLEEPING);
2870     if (os::sleep(thread, millis, true) == OS_INTRPT) {
2871       // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
2872       // us while we were sleeping. We do not overwrite those.
2873       if (!HAS_PENDING_EXCEPTION) {
2874 #ifndef USDT2
2875         HS_DTRACE_PROBE1(hotspot, thread__sleep__end,1);
2876 #else /* USDT2 */
2877         HOTSPOT_THREAD_SLEEP_END(
2878                                  1);
2879 #endif /* USDT2 */
2880         // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
2881         // to properly restore the thread state.  That's likely wrong.
2882         THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
2883       }
2884     }
2885     thread->osthread()->set_state(old_state);
2886   }
2887 #ifndef USDT2
2888   HS_DTRACE_PROBE1(hotspot, thread__sleep__end,0);
2889 #else /* USDT2 */
2890   HOTSPOT_THREAD_SLEEP_END(
2891                            0);
2892 #endif /* USDT2 */
2893 JVM_END
2894 
2895 JVM_ENTRY(jobject, JVM_CurrentThread(JNIEnv* env, jclass threadClass))
2896   JVMWrapper("JVM_CurrentThread");
2897   oop jthread = thread->threadObj();
2898   assert (thread != NULL, "no current thread!");
2899   return JNIHandles::make_local(env, jthread);
2900 JVM_END
2901 
2902 
2903 JVM_ENTRY(jint, JVM_CountStackFrames(JNIEnv* env, jobject jthread))
2904   JVMWrapper("JVM_CountStackFrames");
2905 
2906   // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
2907   oop java_thread = JNIHandles::resolve_non_null(jthread);
2908   bool throw_illegal_thread_state = false;
2909   int count = 0;
2910 
2911   {
2912     MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
2913     // We need to re-resolve the java_thread, since a GC might have happened during the
2914     // acquire of the lock
2915     JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
2916 
2917     if (thr == NULL) {
2918       // do nothing
2919     } else if(! thr->is_external_suspend() || ! thr->frame_anchor()->walkable()) {
2920       // Check whether this java thread has been suspended already. If not, throws
2921       // IllegalThreadStateException. We defer to throw that exception until
2922       // Threads_lock is released since loading exception class has to leave VM.
2923       // The correct way to test a thread is actually suspended is
2924       // wait_for_ext_suspend_completion(), but we can't call that while holding
2925       // the Threads_lock. The above tests are sufficient for our purposes
2926       // provided the walkability of the stack is stable - which it isn't
2927       // 100% but close enough for most practical purposes.
2928       throw_illegal_thread_state = true;
2929     } else {
2930       // Count all java activation, i.e., number of vframes
2931       for(vframeStream vfst(thr); !vfst.at_end(); vfst.next()) {
2932         // Native frames are not counted
2933         if (!vfst.method()->is_native()) count++;
2934        }
2935     }
2936   }
2937 
2938   if (throw_illegal_thread_state) {
2939     THROW_MSG_0(vmSymbols::java_lang_IllegalThreadStateException(),
2940                 "this thread is not suspended");
2941   }
2942   return count;
2943 JVM_END
2944 
2945 // Consider: A better way to implement JVM_Interrupt() is to acquire
2946 // Threads_lock to resolve the jthread into a Thread pointer, fetch
2947 // Thread->platformevent, Thread->native_thr, Thread->parker, etc.,
2948 // drop Threads_lock, and the perform the unpark() and thr_kill() operations
2949 // outside the critical section.  Threads_lock is hot so we want to minimize
2950 // the hold-time.  A cleaner interface would be to decompose interrupt into
2951 // two steps.  The 1st phase, performed under Threads_lock, would return
2952 // a closure that'd be invoked after Threads_lock was dropped.
2953 // This tactic is safe as PlatformEvent and Parkers are type-stable (TSM) and
2954 // admit spurious wakeups.
2955 
2956 JVM_ENTRY(void, JVM_Interrupt(JNIEnv* env, jobject jthread))
2957   JVMWrapper("JVM_Interrupt");
2958 
2959   // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
2960   oop java_thread = JNIHandles::resolve_non_null(jthread);
2961   MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
2962   // We need to re-resolve the java_thread, since a GC might have happened during the
2963   // acquire of the lock
2964   JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
2965   if (thr != NULL) {
2966     Thread::interrupt(thr);
2967   }
2968 JVM_END
2969 
2970 
2971 JVM_QUICK_ENTRY(jboolean, JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clear_interrupted))
2972   JVMWrapper("JVM_IsInterrupted");
2973 
2974   // Ensure that the C++ Thread and OSThread structures aren't freed before we operate
2975   oop java_thread = JNIHandles::resolve_non_null(jthread);
2976   MutexLockerEx ml(thread->threadObj() == java_thread ? NULL : Threads_lock);
2977   // We need to re-resolve the java_thread, since a GC might have happened during the
2978   // acquire of the lock
2979   JavaThread* thr = java_lang_Thread::thread(JNIHandles::resolve_non_null(jthread));
2980   if (thr == NULL) {
2981     return JNI_FALSE;
2982   } else {
2983     return (jboolean) Thread::is_interrupted(thr, clear_interrupted != 0);
2984   }
2985 JVM_END
2986 
2987 
2988 // Return true iff the current thread has locked the object passed in
2989 
2990 JVM_ENTRY(jboolean, JVM_HoldsLock(JNIEnv* env, jclass threadClass, jobject obj))
2991   JVMWrapper("JVM_HoldsLock");
2992   assert(THREAD->is_Java_thread(), "sanity check");
2993   if (obj == NULL) {
2994     THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
2995   }
2996   Handle h_obj(THREAD, JNIHandles::resolve(obj));
2997   return ObjectSynchronizer::current_thread_holds_lock((JavaThread*)THREAD, h_obj);
2998 JVM_END
2999 
3000 
3001 JVM_ENTRY(void, JVM_DumpAllStacks(JNIEnv* env, jclass))
3002   JVMWrapper("JVM_DumpAllStacks");
3003   VM_PrintThreads op;
3004   VMThread::execute(&op);
3005   if (JvmtiExport::should_post_data_dump()) {
3006     JvmtiExport::post_data_dump();
3007   }
3008 JVM_END
3009 
3010 JVM_ENTRY(void, JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring name))
3011   JVMWrapper("JVM_SetNativeThreadName");
3012   ResourceMark rm(THREAD);
3013   oop java_thread = JNIHandles::resolve_non_null(jthread);
3014   JavaThread* thr = java_lang_Thread::thread(java_thread);
3015   // Thread naming only supported for the current thread, doesn't work for
3016   // target threads.
3017   if (Thread::current() == thr && !thr->has_attached_via_jni()) {
3018     // we don't set the name of an attached thread to avoid stepping
3019     // on other programs
3020     const char *thread_name = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
3021     os::set_native_thread_name(thread_name);
3022   }
3023 JVM_END
3024 
3025 // java.lang.SecurityManager ///////////////////////////////////////////////////////////////////////
3026 
3027 static bool is_trusted_frame(JavaThread* jthread, vframeStream* vfst) {
3028   assert(jthread->is_Java_thread(), "must be a Java thread");
3029   if (jthread->privileged_stack_top() == NULL) return false;
3030   if (jthread->privileged_stack_top()->frame_id() == vfst->frame_id()) {
3031     oop loader = jthread->privileged_stack_top()->class_loader();
3032     if (loader == NULL) return true;
3033     bool trusted = java_lang_ClassLoader::is_trusted_loader(loader);
3034     if (trusted) return true;
3035   }
3036   return false;
3037 }
3038 
3039 JVM_ENTRY(jclass, JVM_CurrentLoadedClass(JNIEnv *env))
3040   JVMWrapper("JVM_CurrentLoadedClass");
3041   ResourceMark rm(THREAD);
3042 
3043   for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
3044     // if a method in a class in a trusted loader is in a doPrivileged, return NULL
3045     bool trusted = is_trusted_frame(thread, &vfst);
3046     if (trusted) return NULL;
3047 
3048     methodOop m = vfst.method();
3049     if (!m->is_native()) {
3050       klassOop holder = m->method_holder();
3051       oop      loader = instanceKlass::cast(holder)->class_loader();
3052       if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
3053         return (jclass) JNIHandles::make_local(env, Klass::cast(holder)->java_mirror());
3054       }
3055     }
3056   }
3057   return NULL;
3058 JVM_END
3059 
3060 
3061 JVM_ENTRY(jobject, JVM_CurrentClassLoader(JNIEnv *env))
3062   JVMWrapper("JVM_CurrentClassLoader");
3063   ResourceMark rm(THREAD);
3064 
3065   for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
3066 
3067     // if a method in a class in a trusted loader is in a doPrivileged, return NULL
3068     bool trusted = is_trusted_frame(thread, &vfst);
3069     if (trusted) return NULL;
3070 
3071     methodOop m = vfst.method();
3072     if (!m->is_native()) {
3073       klassOop holder = m->method_holder();
3074       assert(holder->is_klass(), "just checking");
3075       oop loader = instanceKlass::cast(holder)->class_loader();
3076       if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
3077         return JNIHandles::make_local(env, loader);
3078       }
3079     }
3080   }
3081   return NULL;
3082 JVM_END
3083 
3084 
3085 // Utility object for collecting method holders walking down the stack
3086 class KlassLink: public ResourceObj {
3087  public:
3088   KlassHandle klass;
3089   KlassLink*  next;
3090 
3091   KlassLink(KlassHandle k) { klass = k; next = NULL; }
3092 };
3093 
3094 
3095 JVM_ENTRY(jobjectArray, JVM_GetClassContext(JNIEnv *env))
3096   JVMWrapper("JVM_GetClassContext");
3097   ResourceMark rm(THREAD);
3098   JvmtiVMObjectAllocEventCollector oam;
3099   // Collect linked list of (handles to) method holders
3100   KlassLink* first = NULL;
3101   KlassLink* last  = NULL;
3102   int depth = 0;
3103 
3104   for(vframeStream vfst(thread); !vfst.at_end(); vfst.security_get_caller_frame(1)) {
3105     // Native frames are not returned
3106     if (!vfst.method()->is_native()) {
3107       klassOop holder = vfst.method()->method_holder();
3108       assert(holder->is_klass(), "just checking");
3109       depth++;
3110       KlassLink* l = new KlassLink(KlassHandle(thread, holder));
3111       if (first == NULL) {
3112         first = last = l;
3113       } else {
3114         last->next = l;
3115         last = l;
3116       }
3117     }
3118   }
3119 
3120   // Create result array of type [Ljava/lang/Class;
3121   objArrayOop result = oopFactory::new_objArray(SystemDictionary::Class_klass(), depth, CHECK_NULL);
3122   // Fill in mirrors corresponding to method holders
3123   int index = 0;
3124   while (first != NULL) {
3125     result->obj_at_put(index++, Klass::cast(first->klass())->java_mirror());
3126     first = first->next;
3127   }
3128   assert(index == depth, "just checking");
3129 
3130   return (jobjectArray) JNIHandles::make_local(env, result);
3131 JVM_END
3132 
3133 
3134 JVM_ENTRY(jint, JVM_ClassDepth(JNIEnv *env, jstring name))
3135   JVMWrapper("JVM_ClassDepth");
3136   ResourceMark rm(THREAD);
3137   Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
3138   Handle class_name_str = java_lang_String::internalize_classname(h_name, CHECK_0);
3139 
3140   const char* str = java_lang_String::as_utf8_string(class_name_str());
3141   TempNewSymbol class_name_sym = SymbolTable::probe(str, (int)strlen(str));
3142   if (class_name_sym == NULL) {
3143     return -1;
3144   }
3145 
3146   int depth = 0;
3147 
3148   for(vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
3149     if (!vfst.method()->is_native()) {
3150       klassOop holder = vfst.method()->method_holder();
3151       assert(holder->is_klass(), "just checking");
3152       if (instanceKlass::cast(holder)->name() == class_name_sym) {
3153         return depth;
3154       }
3155       depth++;
3156     }
3157   }
3158   return -1;
3159 JVM_END
3160 
3161 
3162 JVM_ENTRY(jint, JVM_ClassLoaderDepth(JNIEnv *env))
3163   JVMWrapper("JVM_ClassLoaderDepth");
3164   ResourceMark rm(THREAD);
3165   int depth = 0;
3166   for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
3167     // if a method in a class in a trusted loader is in a doPrivileged, return -1
3168     bool trusted = is_trusted_frame(thread, &vfst);
3169     if (trusted) return -1;
3170 
3171     methodOop m = vfst.method();
3172     if (!m->is_native()) {
3173       klassOop holder = m->method_holder();
3174       assert(holder->is_klass(), "just checking");
3175       oop loader = instanceKlass::cast(holder)->class_loader();
3176       if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
3177         return depth;
3178       }
3179       depth++;
3180     }
3181   }
3182   return -1;
3183 JVM_END
3184 
3185 
3186 // java.lang.Package ////////////////////////////////////////////////////////////////
3187 
3188 
3189 JVM_ENTRY(jstring, JVM_GetSystemPackage(JNIEnv *env, jstring name))
3190   JVMWrapper("JVM_GetSystemPackage");
3191   ResourceMark rm(THREAD);
3192   JvmtiVMObjectAllocEventCollector oam;
3193   char* str = java_lang_String::as_utf8_string(JNIHandles::resolve_non_null(name));
3194   oop result = ClassLoader::get_system_package(str, CHECK_NULL);
3195   return (jstring) JNIHandles::make_local(result);
3196 JVM_END
3197 
3198 
3199 JVM_ENTRY(jobjectArray, JVM_GetSystemPackages(JNIEnv *env))
3200   JVMWrapper("JVM_GetSystemPackages");
3201   JvmtiVMObjectAllocEventCollector oam;
3202   objArrayOop result = ClassLoader::get_system_packages(CHECK_NULL);
3203   return (jobjectArray) JNIHandles::make_local(result);
3204 JVM_END
3205 
3206 
3207 // ObjectInputStream ///////////////////////////////////////////////////////////////
3208 
3209 bool force_verify_field_access(klassOop current_class, klassOop field_class, AccessFlags access, bool classloader_only) {
3210   if (current_class == NULL) {
3211     return true;
3212   }
3213   if ((current_class == field_class) || access.is_public()) {
3214     return true;
3215   }
3216 
3217   if (access.is_protected()) {
3218     // See if current_class is a subclass of field_class
3219     if (Klass::cast(current_class)->is_subclass_of(field_class)) {
3220       return true;
3221     }
3222   }
3223 
3224   return (!access.is_private() && instanceKlass::cast(current_class)->is_same_class_package(field_class));
3225 }
3226 
3227 
3228 // JVM_AllocateNewObject and JVM_AllocateNewArray are unused as of 1.4
3229 JVM_ENTRY(jobject, JVM_AllocateNewObject(JNIEnv *env, jobject receiver, jclass currClass, jclass initClass))
3230   JVMWrapper("JVM_AllocateNewObject");
3231   JvmtiVMObjectAllocEventCollector oam;
3232   // Receiver is not used
3233   oop curr_mirror = JNIHandles::resolve_non_null(currClass);
3234   oop init_mirror = JNIHandles::resolve_non_null(initClass);
3235 
3236   // Cannot instantiate primitive types
3237   if (java_lang_Class::is_primitive(curr_mirror) || java_lang_Class::is_primitive(init_mirror)) {
3238     ResourceMark rm(THREAD);
3239     THROW_0(vmSymbols::java_lang_InvalidClassException());
3240   }
3241 
3242   // Arrays not allowed here, must use JVM_AllocateNewArray
3243   if (Klass::cast(java_lang_Class::as_klassOop(curr_mirror))->oop_is_javaArray() ||
3244       Klass::cast(java_lang_Class::as_klassOop(init_mirror))->oop_is_javaArray()) {
3245     ResourceMark rm(THREAD);
3246     THROW_0(vmSymbols::java_lang_InvalidClassException());
3247   }
3248 
3249   instanceKlassHandle curr_klass (THREAD, java_lang_Class::as_klassOop(curr_mirror));
3250   instanceKlassHandle init_klass (THREAD, java_lang_Class::as_klassOop(init_mirror));
3251 
3252   assert(curr_klass->is_subclass_of(init_klass()), "just checking");
3253 
3254   // Interfaces, abstract classes, and java.lang.Class classes cannot be instantiated directly.
3255   curr_klass->check_valid_for_instantiation(false, CHECK_NULL);
3256 
3257   // Make sure klass is initialized, since we are about to instantiate one of them.
3258   curr_klass->initialize(CHECK_NULL);
3259 
3260  methodHandle m (THREAD,
3261                  init_klass->find_method(vmSymbols::object_initializer_name(),
3262                                          vmSymbols::void_method_signature()));
3263   if (m.is_null()) {
3264     ResourceMark rm(THREAD);
3265     THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(),
3266                 methodOopDesc::name_and_sig_as_C_string(Klass::cast(init_klass()),
3267                                           vmSymbols::object_initializer_name(),
3268                                           vmSymbols::void_method_signature()));
3269   }
3270 
3271   if (curr_klass ==  init_klass && !m->is_public()) {
3272     // Calling the constructor for class 'curr_klass'.
3273     // Only allow calls to a public no-arg constructor.
3274     // This path corresponds to creating an Externalizable object.
3275     THROW_0(vmSymbols::java_lang_IllegalAccessException());
3276   }
3277 
3278   if (!force_verify_field_access(curr_klass(), init_klass(), m->access_flags(), false)) {
3279     // subclass 'curr_klass' does not have access to no-arg constructor of 'initcb'
3280     THROW_0(vmSymbols::java_lang_IllegalAccessException());
3281   }
3282 
3283   Handle obj = curr_klass->allocate_instance_handle(CHECK_NULL);
3284   // Call constructor m. This might call a constructor higher up in the hierachy
3285   JavaCalls::call_default_constructor(thread, m, obj, CHECK_NULL);
3286 
3287   return JNIHandles::make_local(obj());
3288 JVM_END
3289 
3290 
3291 JVM_ENTRY(jobject, JVM_AllocateNewArray(JNIEnv *env, jobject obj, jclass currClass, jint length))
3292   JVMWrapper("JVM_AllocateNewArray");
3293   JvmtiVMObjectAllocEventCollector oam;
3294   oop mirror = JNIHandles::resolve_non_null(currClass);
3295 
3296   if (java_lang_Class::is_primitive(mirror)) {
3297     THROW_0(vmSymbols::java_lang_InvalidClassException());
3298   }
3299   klassOop k = java_lang_Class::as_klassOop(mirror);
3300   oop result;
3301 
3302   if (k->klass_part()->oop_is_typeArray()) {
3303     // typeArray
3304     result = typeArrayKlass::cast(k)->allocate(length, CHECK_NULL);
3305   } else if (k->klass_part()->oop_is_objArray()) {
3306     // objArray
3307     objArrayKlassHandle oak(THREAD, k);
3308     oak->initialize(CHECK_NULL); // make sure class is initialized (matches Classic VM behavior)
3309     result = oak->allocate(length, CHECK_NULL);
3310   } else {
3311     THROW_0(vmSymbols::java_lang_InvalidClassException());
3312   }
3313   return JNIHandles::make_local(env, result);
3314 JVM_END
3315 
3316 
3317 // Return the first non-null class loader up the execution stack, or null
3318 // if only code from the null class loader is on the stack.
3319 
3320 JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env))
3321   for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
3322     // UseNewReflection
3323     vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection
3324     klassOop holder = vfst.method()->method_holder();
3325     oop loader = instanceKlass::cast(holder)->class_loader();
3326     if (loader != NULL) {
3327       return JNIHandles::make_local(env, loader);
3328     }
3329   }
3330   return NULL;
3331 JVM_END
3332 
3333 
3334 // Load a class relative to the most recent class on the stack  with a non-null
3335 // classloader.
3336 // This function has been deprecated and should not be considered part of the
3337 // specified JVM interface.
3338 
3339 JVM_ENTRY(jclass, JVM_LoadClass0(JNIEnv *env, jobject receiver,
3340                                  jclass currClass, jstring currClassName))
3341   JVMWrapper("JVM_LoadClass0");
3342   // Receiver is not used
3343   ResourceMark rm(THREAD);
3344 
3345   // Class name argument is not guaranteed to be in internal format
3346   Handle classname (THREAD, JNIHandles::resolve_non_null(currClassName));
3347   Handle string = java_lang_String::internalize_classname(classname, CHECK_NULL);
3348 
3349   const char* str = java_lang_String::as_utf8_string(string());
3350 
3351   if (str == NULL || (int)strlen(str) > Symbol::max_length()) {
3352     // It's impossible to create this class;  the name cannot fit
3353     // into the constant pool.
3354     THROW_MSG_0(vmSymbols::java_lang_NoClassDefFoundError(), str);
3355   }
3356 
3357   TempNewSymbol name = SymbolTable::new_symbol(str, CHECK_NULL);
3358   Handle curr_klass (THREAD, JNIHandles::resolve(currClass));
3359   // Find the most recent class on the stack with a non-null classloader
3360   oop loader = NULL;
3361   oop protection_domain = NULL;
3362   if (curr_klass.is_null()) {
3363     for (vframeStream vfst(thread);
3364          !vfst.at_end() && loader == NULL;
3365          vfst.next()) {
3366       if (!vfst.method()->is_native()) {
3367         klassOop holder = vfst.method()->method_holder();
3368         loader             = instanceKlass::cast(holder)->class_loader();
3369         protection_domain  = instanceKlass::cast(holder)->protection_domain();
3370       }
3371     }
3372   } else {
3373     klassOop curr_klass_oop = java_lang_Class::as_klassOop(curr_klass());
3374     loader            = instanceKlass::cast(curr_klass_oop)->class_loader();
3375     protection_domain = instanceKlass::cast(curr_klass_oop)->protection_domain();
3376   }
3377   Handle h_loader(THREAD, loader);
3378   Handle h_prot  (THREAD, protection_domain);
3379   jclass result =  find_class_from_class_loader(env, name, true, h_loader, h_prot,
3380                                                 false, thread);
3381   if (TraceClassResolution && result != NULL) {
3382     trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result)));
3383   }
3384   return result;
3385 JVM_END
3386 
3387 
3388 // Array ///////////////////////////////////////////////////////////////////////////////////////////
3389 
3390 
3391 // resolve array handle and check arguments
3392 static inline arrayOop check_array(JNIEnv *env, jobject arr, bool type_array_only, TRAPS) {
3393   if (arr == NULL) {
3394     THROW_0(vmSymbols::java_lang_NullPointerException());
3395   }
3396   oop a = JNIHandles::resolve_non_null(arr);
3397   if (!a->is_javaArray() || (type_array_only && !a->is_typeArray())) {
3398     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Argument is not an array");
3399   }
3400   return arrayOop(a);
3401 }
3402 
3403 
3404 JVM_ENTRY(jint, JVM_GetArrayLength(JNIEnv *env, jobject arr))
3405   JVMWrapper("JVM_GetArrayLength");
3406   arrayOop a = check_array(env, arr, false, CHECK_0);
3407   return a->length();
3408 JVM_END
3409 
3410 
3411 JVM_ENTRY(jobject, JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index))
3412   JVMWrapper("JVM_Array_Get");
3413   JvmtiVMObjectAllocEventCollector oam;
3414   arrayOop a = check_array(env, arr, false, CHECK_NULL);
3415   jvalue value;
3416   BasicType type = Reflection::array_get(&value, a, index, CHECK_NULL);
3417   oop box = Reflection::box(&value, type, CHECK_NULL);
3418   return JNIHandles::make_local(env, box);
3419 JVM_END
3420 
3421 
3422 JVM_ENTRY(jvalue, JVM_GetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jint wCode))
3423   JVMWrapper("JVM_GetPrimitiveArrayElement");
3424   jvalue value;
3425   value.i = 0; // to initialize value before getting used in CHECK
3426   arrayOop a = check_array(env, arr, true, CHECK_(value));
3427   assert(a->is_typeArray(), "just checking");
3428   BasicType type = Reflection::array_get(&value, a, index, CHECK_(value));
3429   BasicType wide_type = (BasicType) wCode;
3430   if (type != wide_type) {
3431     Reflection::widen(&value, type, wide_type, CHECK_(value));
3432   }
3433   return value;
3434 JVM_END
3435 
3436 
3437 JVM_ENTRY(void, JVM_SetArrayElement(JNIEnv *env, jobject arr, jint index, jobject val))
3438   JVMWrapper("JVM_SetArrayElement");
3439   arrayOop a = check_array(env, arr, false, CHECK);
3440   oop box = JNIHandles::resolve(val);
3441   jvalue value;
3442   value.i = 0; // to initialize value before getting used in CHECK
3443   BasicType value_type;
3444   if (a->is_objArray()) {
3445     // Make sure we do no unbox e.g. java/lang/Integer instances when storing into an object array
3446     value_type = Reflection::unbox_for_regular_object(box, &value);
3447   } else {
3448     value_type = Reflection::unbox_for_primitive(box, &value, CHECK);
3449   }
3450   Reflection::array_set(&value, a, index, value_type, CHECK);
3451 JVM_END
3452 
3453 
3454 JVM_ENTRY(void, JVM_SetPrimitiveArrayElement(JNIEnv *env, jobject arr, jint index, jvalue v, unsigned char vCode))
3455   JVMWrapper("JVM_SetPrimitiveArrayElement");
3456   arrayOop a = check_array(env, arr, true, CHECK);
3457   assert(a->is_typeArray(), "just checking");
3458   BasicType value_type = (BasicType) vCode;
3459   Reflection::array_set(&v, a, index, value_type, CHECK);
3460 JVM_END
3461 
3462 
3463 JVM_ENTRY(jobject, JVM_NewArray(JNIEnv *env, jclass eltClass, jint length))
3464   JVMWrapper("JVM_NewArray");
3465   JvmtiVMObjectAllocEventCollector oam;
3466   oop element_mirror = JNIHandles::resolve(eltClass);
3467   oop result = Reflection::reflect_new_array(element_mirror, length, CHECK_NULL);
3468   return JNIHandles::make_local(env, result);
3469 JVM_END
3470 
3471 
3472 JVM_ENTRY(jobject, JVM_NewMultiArray(JNIEnv *env, jclass eltClass, jintArray dim))
3473   JVMWrapper("JVM_NewMultiArray");
3474   JvmtiVMObjectAllocEventCollector oam;
3475   arrayOop dim_array = check_array(env, dim, true, CHECK_NULL);
3476   oop element_mirror = JNIHandles::resolve(eltClass);
3477   assert(dim_array->is_typeArray(), "just checking");
3478   oop result = Reflection::reflect_new_multi_array(element_mirror, typeArrayOop(dim_array), CHECK_NULL);
3479   return JNIHandles::make_local(env, result);
3480 JVM_END
3481 
3482 
3483 // Networking library support ////////////////////////////////////////////////////////////////////
3484 
3485 JVM_LEAF(jint, JVM_InitializeSocketLibrary())
3486   JVMWrapper("JVM_InitializeSocketLibrary");
3487   return 0;
3488 JVM_END
3489 
3490 
3491 JVM_LEAF(jint, JVM_Socket(jint domain, jint type, jint protocol))
3492   JVMWrapper("JVM_Socket");
3493   return os::socket(domain, type, protocol);
3494 JVM_END
3495 
3496 
3497 JVM_LEAF(jint, JVM_SocketClose(jint fd))
3498   JVMWrapper2("JVM_SocketClose (0x%x)", fd);
3499   //%note jvm_r6
3500   return os::socket_close(fd);
3501 JVM_END
3502 
3503 
3504 JVM_LEAF(jint, JVM_SocketShutdown(jint fd, jint howto))
3505   JVMWrapper2("JVM_SocketShutdown (0x%x)", fd);
3506   //%note jvm_r6
3507   return os::socket_shutdown(fd, howto);
3508 JVM_END
3509 
3510 
3511 JVM_LEAF(jint, JVM_Recv(jint fd, char *buf, jint nBytes, jint flags))
3512   JVMWrapper2("JVM_Recv (0x%x)", fd);
3513   //%note jvm_r6
3514   return os::recv(fd, buf, (size_t)nBytes, (uint)flags);
3515 JVM_END
3516 
3517 
3518 JVM_LEAF(jint, JVM_Send(jint fd, char *buf, jint nBytes, jint flags))
3519   JVMWrapper2("JVM_Send (0x%x)", fd);
3520   //%note jvm_r6
3521   return os::send(fd, buf, (size_t)nBytes, (uint)flags);
3522 JVM_END
3523 
3524 
3525 JVM_LEAF(jint, JVM_Timeout(int fd, long timeout))
3526   JVMWrapper2("JVM_Timeout (0x%x)", fd);
3527   //%note jvm_r6
3528   return os::timeout(fd, timeout);
3529 JVM_END
3530 
3531 
3532 JVM_LEAF(jint, JVM_Listen(jint fd, jint count))
3533   JVMWrapper2("JVM_Listen (0x%x)", fd);
3534   //%note jvm_r6
3535   return os::listen(fd, count);
3536 JVM_END
3537 
3538 
3539 JVM_LEAF(jint, JVM_Connect(jint fd, struct sockaddr *him, jint len))
3540   JVMWrapper2("JVM_Connect (0x%x)", fd);
3541   //%note jvm_r6
3542   return os::connect(fd, him, (socklen_t)len);
3543 JVM_END
3544 
3545 
3546 JVM_LEAF(jint, JVM_Bind(jint fd, struct sockaddr *him, jint len))
3547   JVMWrapper2("JVM_Bind (0x%x)", fd);
3548   //%note jvm_r6
3549   return os::bind(fd, him, (socklen_t)len);
3550 JVM_END
3551 
3552 
3553 JVM_LEAF(jint, JVM_Accept(jint fd, struct sockaddr *him, jint *len))
3554   JVMWrapper2("JVM_Accept (0x%x)", fd);
3555   //%note jvm_r6
3556   socklen_t socklen = (socklen_t)(*len);
3557   jint result = os::accept(fd, him, &socklen);
3558   *len = (jint)socklen;
3559   return result;
3560 JVM_END
3561 
3562 
3563 JVM_LEAF(jint, JVM_RecvFrom(jint fd, char *buf, int nBytes, int flags, struct sockaddr *from, int *fromlen))
3564   JVMWrapper2("JVM_RecvFrom (0x%x)", fd);
3565   //%note jvm_r6
3566   socklen_t socklen = (socklen_t)(*fromlen);
3567   jint result = os::recvfrom(fd, buf, (size_t)nBytes, (uint)flags, from, &socklen);
3568   *fromlen = (int)socklen;
3569   return result;
3570 JVM_END
3571 
3572 
3573 JVM_LEAF(jint, JVM_GetSockName(jint fd, struct sockaddr *him, int *len))
3574   JVMWrapper2("JVM_GetSockName (0x%x)", fd);
3575   //%note jvm_r6
3576   socklen_t socklen = (socklen_t)(*len);
3577   jint result = os::get_sock_name(fd, him, &socklen);
3578   *len = (int)socklen;
3579   return result;
3580 JVM_END
3581 
3582 
3583 JVM_LEAF(jint, JVM_SendTo(jint fd, char *buf, int len, int flags, struct sockaddr *to, int tolen))
3584   JVMWrapper2("JVM_SendTo (0x%x)", fd);
3585   //%note jvm_r6
3586   return os::sendto(fd, buf, (size_t)len, (uint)flags, to, (socklen_t)tolen);
3587 JVM_END
3588 
3589 
3590 JVM_LEAF(jint, JVM_SocketAvailable(jint fd, jint *pbytes))
3591   JVMWrapper2("JVM_SocketAvailable (0x%x)", fd);
3592   //%note jvm_r6
3593   return os::socket_available(fd, pbytes);
3594 JVM_END
3595 
3596 
3597 JVM_LEAF(jint, JVM_GetSockOpt(jint fd, int level, int optname, char *optval, int *optlen))
3598   JVMWrapper2("JVM_GetSockOpt (0x%x)", fd);
3599   //%note jvm_r6
3600   socklen_t socklen = (socklen_t)(*optlen);
3601   jint result = os::get_sock_opt(fd, level, optname, optval, &socklen);
3602   *optlen = (int)socklen;
3603   return result;
3604 JVM_END
3605 
3606 
3607 JVM_LEAF(jint, JVM_SetSockOpt(jint fd, int level, int optname, const char *optval, int optlen))
3608   JVMWrapper2("JVM_GetSockOpt (0x%x)", fd);
3609   //%note jvm_r6
3610   return os::set_sock_opt(fd, level, optname, optval, (socklen_t)optlen);
3611 JVM_END
3612 
3613 
3614 JVM_LEAF(int, JVM_GetHostName(char* name, int namelen))
3615   JVMWrapper("JVM_GetHostName");
3616   return os::get_host_name(name, namelen);
3617 JVM_END
3618 
3619 
3620 // Library support ///////////////////////////////////////////////////////////////////////////
3621 
3622 JVM_ENTRY_NO_ENV(void*, JVM_LoadLibrary(const char* name))
3623   //%note jvm_ct
3624   JVMWrapper2("JVM_LoadLibrary (%s)", name);
3625   char ebuf[1024];
3626   void *load_result;
3627   {
3628     ThreadToNativeFromVM ttnfvm(thread);
3629     load_result = os::dll_load(name, ebuf, sizeof ebuf);
3630   }
3631   if (load_result == NULL) {
3632     char msg[1024];
3633     jio_snprintf(msg, sizeof msg, "%s: %s", name, ebuf);
3634     // Since 'ebuf' may contain a string encoded using
3635     // platform encoding scheme, we need to pass
3636     // Exceptions::unsafe_to_utf8 to the new_exception method
3637     // as the last argument. See bug 6367357.
3638     Handle h_exception =
3639       Exceptions::new_exception(thread,
3640                                 vmSymbols::java_lang_UnsatisfiedLinkError(),
3641                                 msg, Exceptions::unsafe_to_utf8);
3642 
3643     THROW_HANDLE_0(h_exception);
3644   }
3645   return load_result;
3646 JVM_END
3647 
3648 
3649 JVM_LEAF(void, JVM_UnloadLibrary(void* handle))
3650   JVMWrapper("JVM_UnloadLibrary");
3651   os::dll_unload(handle);
3652 JVM_END
3653 
3654 
3655 JVM_LEAF(void*, JVM_FindLibraryEntry(void* handle, const char* name))
3656   JVMWrapper2("JVM_FindLibraryEntry (%s)", name);
3657   return os::dll_lookup(handle, name);
3658 JVM_END
3659 
3660 
3661 // Floating point support ////////////////////////////////////////////////////////////////////
3662 
3663 JVM_LEAF(jboolean, JVM_IsNaN(jdouble a))
3664   JVMWrapper("JVM_IsNaN");
3665   return g_isnan(a);
3666 JVM_END
3667 
3668 
3669 // JNI version ///////////////////////////////////////////////////////////////////////////////
3670 
3671 JVM_LEAF(jboolean, JVM_IsSupportedJNIVersion(jint version))
3672   JVMWrapper2("JVM_IsSupportedJNIVersion (%d)", version);
3673   return Threads::is_supported_jni_version_including_1_1(version);
3674 JVM_END
3675 
3676 
3677 // String support ///////////////////////////////////////////////////////////////////////////
3678 
3679 JVM_ENTRY(jstring, JVM_InternString(JNIEnv *env, jstring str))
3680   JVMWrapper("JVM_InternString");
3681   JvmtiVMObjectAllocEventCollector oam;
3682   if (str == NULL) return NULL;
3683   oop string = JNIHandles::resolve_non_null(str);
3684   oop result = StringTable::intern(string, CHECK_NULL);
3685   return (jstring) JNIHandles::make_local(env, result);
3686 JVM_END
3687 
3688 
3689 // Raw monitor support //////////////////////////////////////////////////////////////////////
3690 
3691 // The lock routine below calls lock_without_safepoint_check in order to get a raw lock
3692 // without interfering with the safepoint mechanism. The routines are not JVM_LEAF because
3693 // they might be called by non-java threads. The JVM_LEAF installs a NoHandleMark check
3694 // that only works with java threads.
3695 
3696 
3697 JNIEXPORT void* JNICALL JVM_RawMonitorCreate(void) {
3698   VM_Exit::block_if_vm_exited();
3699   JVMWrapper("JVM_RawMonitorCreate");
3700   return new Mutex(Mutex::native, "JVM_RawMonitorCreate");
3701 }
3702 
3703 
3704 JNIEXPORT void JNICALL  JVM_RawMonitorDestroy(void *mon) {
3705   VM_Exit::block_if_vm_exited();
3706   JVMWrapper("JVM_RawMonitorDestroy");
3707   delete ((Mutex*) mon);
3708 }
3709 
3710 
3711 JNIEXPORT jint JNICALL JVM_RawMonitorEnter(void *mon) {
3712   VM_Exit::block_if_vm_exited();
3713   JVMWrapper("JVM_RawMonitorEnter");
3714   ((Mutex*) mon)->jvm_raw_lock();
3715   return 0;
3716 }
3717 
3718 
3719 JNIEXPORT void JNICALL JVM_RawMonitorExit(void *mon) {
3720   VM_Exit::block_if_vm_exited();
3721   JVMWrapper("JVM_RawMonitorExit");
3722   ((Mutex*) mon)->jvm_raw_unlock();
3723 }
3724 
3725 
3726 // Support for Serialization
3727 
3728 typedef jfloat  (JNICALL *IntBitsToFloatFn  )(JNIEnv* env, jclass cb, jint    value);
3729 typedef jdouble (JNICALL *LongBitsToDoubleFn)(JNIEnv* env, jclass cb, jlong   value);
3730 typedef jint    (JNICALL *FloatToIntBitsFn  )(JNIEnv* env, jclass cb, jfloat  value);
3731 typedef jlong   (JNICALL *DoubleToLongBitsFn)(JNIEnv* env, jclass cb, jdouble value);
3732 
3733 static IntBitsToFloatFn   int_bits_to_float_fn   = NULL;
3734 static LongBitsToDoubleFn long_bits_to_double_fn = NULL;
3735 static FloatToIntBitsFn   float_to_int_bits_fn   = NULL;
3736 static DoubleToLongBitsFn double_to_long_bits_fn = NULL;
3737 
3738 
3739 void initialize_converter_functions() {
3740   if (JDK_Version::is_gte_jdk14x_version()) {
3741     // These functions only exist for compatibility with 1.3.1 and earlier
3742     return;
3743   }
3744 
3745   // called from universe_post_init()
3746   assert(
3747     int_bits_to_float_fn   == NULL &&
3748     long_bits_to_double_fn == NULL &&
3749     float_to_int_bits_fn   == NULL &&
3750     double_to_long_bits_fn == NULL ,
3751     "initialization done twice"
3752   );
3753   // initialize
3754   int_bits_to_float_fn   = CAST_TO_FN_PTR(IntBitsToFloatFn  , NativeLookup::base_library_lookup("java/lang/Float" , "intBitsToFloat"  , "(I)F"));
3755   long_bits_to_double_fn = CAST_TO_FN_PTR(LongBitsToDoubleFn, NativeLookup::base_library_lookup("java/lang/Double", "longBitsToDouble", "(J)D"));
3756   float_to_int_bits_fn   = CAST_TO_FN_PTR(FloatToIntBitsFn  , NativeLookup::base_library_lookup("java/lang/Float" , "floatToIntBits"  , "(F)I"));
3757   double_to_long_bits_fn = CAST_TO_FN_PTR(DoubleToLongBitsFn, NativeLookup::base_library_lookup("java/lang/Double", "doubleToLongBits", "(D)J"));
3758   // verify
3759   assert(
3760     int_bits_to_float_fn   != NULL &&
3761     long_bits_to_double_fn != NULL &&
3762     float_to_int_bits_fn   != NULL &&
3763     double_to_long_bits_fn != NULL ,
3764     "initialization failed"
3765   );
3766 }
3767 
3768 
3769 // Serialization
3770 JVM_ENTRY(void, JVM_SetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj,
3771                                             jlongArray fieldIDs, jcharArray typecodes, jbyteArray data))
3772   assert(!JDK_Version::is_gte_jdk14x_version(), "should only be used in 1.3.1 and earlier");
3773 
3774   typeArrayOop tcodes = typeArrayOop(JNIHandles::resolve(typecodes));
3775   typeArrayOop dbuf   = typeArrayOop(JNIHandles::resolve(data));
3776   typeArrayOop fids   = typeArrayOop(JNIHandles::resolve(fieldIDs));
3777   oop          o      = JNIHandles::resolve(obj);
3778 
3779   if (o == NULL || fids == NULL  || dbuf == NULL  || tcodes == NULL) {
3780     THROW(vmSymbols::java_lang_NullPointerException());
3781   }
3782 
3783   jsize nfids = fids->length();
3784   if (nfids == 0) return;
3785 
3786   if (tcodes->length() < nfids) {
3787     THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
3788   }
3789 
3790   jsize off = 0;
3791   /* loop through fields, setting values */
3792   for (jsize i = 0; i < nfids; i++) {
3793     jfieldID fid = (jfieldID)(intptr_t) fids->long_at(i);
3794     int field_offset;
3795     if (fid != NULL) {
3796       // NULL is a legal value for fid, but retrieving the field offset
3797       // trigger assertion in that case
3798       field_offset = jfieldIDWorkaround::from_instance_jfieldID(o->klass(), fid);
3799     }
3800 
3801     switch (tcodes->char_at(i)) {
3802       case 'Z':
3803         if (fid != NULL) {
3804           jboolean val = (dbuf->byte_at(off) != 0) ? JNI_TRUE : JNI_FALSE;
3805           o->bool_field_put(field_offset, val);
3806         }
3807         off++;
3808         break;
3809 
3810       case 'B':
3811         if (fid != NULL) {
3812           o->byte_field_put(field_offset, dbuf->byte_at(off));
3813         }
3814         off++;
3815         break;
3816 
3817       case 'C':
3818         if (fid != NULL) {
3819           jchar val = ((dbuf->byte_at(off + 0) & 0xFF) << 8)
3820                     + ((dbuf->byte_at(off + 1) & 0xFF) << 0);
3821           o->char_field_put(field_offset, val);
3822         }
3823         off += 2;
3824         break;
3825 
3826       case 'S':
3827         if (fid != NULL) {
3828           jshort val = ((dbuf->byte_at(off + 0) & 0xFF) << 8)
3829                      + ((dbuf->byte_at(off + 1) & 0xFF) << 0);
3830           o->short_field_put(field_offset, val);
3831         }
3832         off += 2;
3833         break;
3834 
3835       case 'I':
3836         if (fid != NULL) {
3837           jint ival = ((dbuf->byte_at(off + 0) & 0xFF) << 24)
3838                     + ((dbuf->byte_at(off + 1) & 0xFF) << 16)
3839                     + ((dbuf->byte_at(off + 2) & 0xFF) << 8)
3840                     + ((dbuf->byte_at(off + 3) & 0xFF) << 0);
3841           o->int_field_put(field_offset, ival);
3842         }
3843         off += 4;
3844         break;
3845 
3846       case 'F':
3847         if (fid != NULL) {
3848           jint ival = ((dbuf->byte_at(off + 0) & 0xFF) << 24)
3849                     + ((dbuf->byte_at(off + 1) & 0xFF) << 16)
3850                     + ((dbuf->byte_at(off + 2) & 0xFF) << 8)
3851                     + ((dbuf->byte_at(off + 3) & 0xFF) << 0);
3852           jfloat fval = (*int_bits_to_float_fn)(env, NULL, ival);
3853           o->float_field_put(field_offset, fval);
3854         }
3855         off += 4;
3856         break;
3857 
3858       case 'J':
3859         if (fid != NULL) {
3860           jlong lval = (((jlong) dbuf->byte_at(off + 0) & 0xFF) << 56)
3861                      + (((jlong) dbuf->byte_at(off + 1) & 0xFF) << 48)
3862                      + (((jlong) dbuf->byte_at(off + 2) & 0xFF) << 40)
3863                      + (((jlong) dbuf->byte_at(off + 3) & 0xFF) << 32)
3864                      + (((jlong) dbuf->byte_at(off + 4) & 0xFF) << 24)
3865                      + (((jlong) dbuf->byte_at(off + 5) & 0xFF) << 16)
3866                      + (((jlong) dbuf->byte_at(off + 6) & 0xFF) << 8)
3867                      + (((jlong) dbuf->byte_at(off + 7) & 0xFF) << 0);
3868           o->long_field_put(field_offset, lval);
3869         }
3870         off += 8;
3871         break;
3872 
3873       case 'D':
3874         if (fid != NULL) {
3875           jlong lval = (((jlong) dbuf->byte_at(off + 0) & 0xFF) << 56)
3876                      + (((jlong) dbuf->byte_at(off + 1) & 0xFF) << 48)
3877                      + (((jlong) dbuf->byte_at(off + 2) & 0xFF) << 40)
3878                      + (((jlong) dbuf->byte_at(off + 3) & 0xFF) << 32)
3879                      + (((jlong) dbuf->byte_at(off + 4) & 0xFF) << 24)
3880                      + (((jlong) dbuf->byte_at(off + 5) & 0xFF) << 16)
3881                      + (((jlong) dbuf->byte_at(off + 6) & 0xFF) << 8)
3882                      + (((jlong) dbuf->byte_at(off + 7) & 0xFF) << 0);
3883           jdouble dval = (*long_bits_to_double_fn)(env, NULL, lval);
3884           o->double_field_put(field_offset, dval);
3885         }
3886         off += 8;
3887         break;
3888 
3889       default:
3890         // Illegal typecode
3891         THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "illegal typecode");
3892     }
3893   }
3894 JVM_END
3895 
3896 
3897 JVM_ENTRY(void, JVM_GetPrimitiveFieldValues(JNIEnv *env, jclass cb, jobject obj,
3898                             jlongArray fieldIDs, jcharArray typecodes, jbyteArray data))
3899   assert(!JDK_Version::is_gte_jdk14x_version(), "should only be used in 1.3.1 and earlier");
3900 
3901   typeArrayOop tcodes = typeArrayOop(JNIHandles::resolve(typecodes));
3902   typeArrayOop dbuf   = typeArrayOop(JNIHandles::resolve(data));
3903   typeArrayOop fids   = typeArrayOop(JNIHandles::resolve(fieldIDs));
3904   oop          o      = JNIHandles::resolve(obj);
3905 
3906   if (o == NULL || fids == NULL  || dbuf == NULL  || tcodes == NULL) {
3907     THROW(vmSymbols::java_lang_NullPointerException());
3908   }
3909 
3910   jsize nfids = fids->length();
3911   if (nfids == 0) return;
3912 
3913   if (tcodes->length() < nfids) {
3914     THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
3915   }
3916 
3917   /* loop through fields, fetching values */
3918   jsize off = 0;
3919   for (jsize i = 0; i < nfids; i++) {
3920     jfieldID fid = (jfieldID)(intptr_t) fids->long_at(i);
3921     if (fid == NULL) {
3922       THROW(vmSymbols::java_lang_NullPointerException());
3923     }
3924     int field_offset = jfieldIDWorkaround::from_instance_jfieldID(o->klass(), fid);
3925 
3926      switch (tcodes->char_at(i)) {
3927        case 'Z':
3928          {
3929            jboolean val = o->bool_field(field_offset);
3930            dbuf->byte_at_put(off++, (val != 0) ? 1 : 0);
3931          }
3932          break;
3933 
3934        case 'B':
3935          dbuf->byte_at_put(off++, o->byte_field(field_offset));
3936          break;
3937 
3938        case 'C':
3939          {
3940            jchar val = o->char_field(field_offset);
3941            dbuf->byte_at_put(off++, (val >> 8) & 0xFF);
3942            dbuf->byte_at_put(off++, (val >> 0) & 0xFF);
3943          }
3944          break;
3945 
3946        case 'S':
3947          {
3948            jshort val = o->short_field(field_offset);
3949            dbuf->byte_at_put(off++, (val >> 8) & 0xFF);
3950            dbuf->byte_at_put(off++, (val >> 0) & 0xFF);
3951          }
3952          break;
3953 
3954        case 'I':
3955          {
3956            jint val = o->int_field(field_offset);
3957            dbuf->byte_at_put(off++, (val >> 24) & 0xFF);
3958            dbuf->byte_at_put(off++, (val >> 16) & 0xFF);
3959            dbuf->byte_at_put(off++, (val >> 8)  & 0xFF);
3960            dbuf->byte_at_put(off++, (val >> 0)  & 0xFF);
3961          }
3962          break;
3963 
3964        case 'F':
3965          {
3966            jfloat fval = o->float_field(field_offset);
3967            jint ival = (*float_to_int_bits_fn)(env, NULL, fval);
3968            dbuf->byte_at_put(off++, (ival >> 24) & 0xFF);
3969            dbuf->byte_at_put(off++, (ival >> 16) & 0xFF);
3970            dbuf->byte_at_put(off++, (ival >> 8)  & 0xFF);
3971            dbuf->byte_at_put(off++, (ival >> 0)  & 0xFF);
3972          }
3973          break;
3974 
3975        case 'J':
3976          {
3977            jlong val = o->long_field(field_offset);
3978            dbuf->byte_at_put(off++, (val >> 56) & 0xFF);
3979            dbuf->byte_at_put(off++, (val >> 48) & 0xFF);
3980            dbuf->byte_at_put(off++, (val >> 40) & 0xFF);
3981            dbuf->byte_at_put(off++, (val >> 32) & 0xFF);
3982            dbuf->byte_at_put(off++, (val >> 24) & 0xFF);
3983            dbuf->byte_at_put(off++, (val >> 16) & 0xFF);
3984            dbuf->byte_at_put(off++, (val >> 8)  & 0xFF);
3985            dbuf->byte_at_put(off++, (val >> 0)  & 0xFF);
3986          }
3987          break;
3988 
3989        case 'D':
3990          {
3991            jdouble dval = o->double_field(field_offset);
3992            jlong lval = (*double_to_long_bits_fn)(env, NULL, dval);
3993            dbuf->byte_at_put(off++, (lval >> 56) & 0xFF);
3994            dbuf->byte_at_put(off++, (lval >> 48) & 0xFF);
3995            dbuf->byte_at_put(off++, (lval >> 40) & 0xFF);
3996            dbuf->byte_at_put(off++, (lval >> 32) & 0xFF);
3997            dbuf->byte_at_put(off++, (lval >> 24) & 0xFF);
3998            dbuf->byte_at_put(off++, (lval >> 16) & 0xFF);
3999            dbuf->byte_at_put(off++, (lval >> 8)  & 0xFF);
4000            dbuf->byte_at_put(off++, (lval >> 0)  & 0xFF);
4001          }
4002          break;
4003 
4004        default:
4005          // Illegal typecode
4006          THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "illegal typecode");
4007      }
4008   }
4009 JVM_END
4010 
4011 
4012 // Shared JNI/JVM entry points //////////////////////////////////////////////////////////////
4013 
4014 jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) {
4015   // Security Note:
4016   //   The Java level wrapper will perform the necessary security check allowing
4017   //   us to pass the NULL as the initiating class loader.
4018   klassOop klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError != 0, CHECK_NULL);
4019 
4020   KlassHandle klass_handle(THREAD, klass);
4021   // Check if we should initialize the class
4022   if (init && klass_handle->oop_is_instance()) {
4023     klass_handle->initialize(CHECK_NULL);
4024   }
4025   return (jclass) JNIHandles::make_local(env, klass_handle->java_mirror());
4026 }
4027 
4028 
4029 // Internal SQE debugging support ///////////////////////////////////////////////////////////
4030 
4031 #ifndef PRODUCT
4032 
4033 extern "C" {
4034   JNIEXPORT jboolean JNICALL JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get);
4035   JNIEXPORT jboolean JNICALL JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get);
4036   JNIEXPORT void JNICALL JVM_VMBreakPoint(JNIEnv *env, jobject obj);
4037 }
4038 
4039 JVM_LEAF(jboolean, JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get))
4040   JVMWrapper("JVM_AccessBoolVMFlag");
4041   return is_get ? CommandLineFlags::boolAt((char*) name, (bool*) value) : CommandLineFlags::boolAtPut((char*) name, (bool*) value, INTERNAL);
4042 JVM_END
4043 
4044 JVM_LEAF(jboolean, JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get))
4045   JVMWrapper("JVM_AccessVMIntFlag");
4046   intx v;
4047   jboolean result = is_get ? CommandLineFlags::intxAt((char*) name, &v) : CommandLineFlags::intxAtPut((char*) name, &v, INTERNAL);
4048   *value = (jint)v;
4049   return result;
4050 JVM_END
4051 
4052 
4053 JVM_ENTRY(void, JVM_VMBreakPoint(JNIEnv *env, jobject obj))
4054   JVMWrapper("JVM_VMBreakPoint");
4055   oop the_obj = JNIHandles::resolve(obj);
4056   BREAKPOINT;
4057 JVM_END
4058 
4059 
4060 #endif
4061 
4062 
4063 // Method ///////////////////////////////////////////////////////////////////////////////////////////
4064 
4065 JVM_ENTRY(jobject, JVM_InvokeMethod(JNIEnv *env, jobject method, jobject obj, jobjectArray args0))
4066   JVMWrapper("JVM_InvokeMethod");
4067   Handle method_handle;
4068   if (thread->stack_available((address) &method_handle) >= JVMInvokeMethodSlack) {
4069     method_handle = Handle(THREAD, JNIHandles::resolve(method));
4070     Handle receiver(THREAD, JNIHandles::resolve(obj));
4071     objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
4072     oop result = Reflection::invoke_method(method_handle(), receiver, args, CHECK_NULL);
4073     jobject res = JNIHandles::make_local(env, result);
4074     if (JvmtiExport::should_post_vm_object_alloc()) {
4075       oop ret_type = java_lang_reflect_Method::return_type(method_handle());
4076       assert(ret_type != NULL, "sanity check: ret_type oop must not be NULL!");
4077       if (java_lang_Class::is_primitive(ret_type)) {
4078         // Only for primitive type vm allocates memory for java object.
4079         // See box() method.
4080         JvmtiExport::post_vm_object_alloc(JavaThread::current(), result);
4081       }
4082     }
4083     return res;
4084   } else {
4085     THROW_0(vmSymbols::java_lang_StackOverflowError());
4086   }
4087 JVM_END
4088 
4089 
4090 JVM_ENTRY(jobject, JVM_NewInstanceFromConstructor(JNIEnv *env, jobject c, jobjectArray args0))
4091   JVMWrapper("JVM_NewInstanceFromConstructor");
4092   oop constructor_mirror = JNIHandles::resolve(c);
4093   objArrayHandle args(THREAD, objArrayOop(JNIHandles::resolve(args0)));
4094   oop result = Reflection::invoke_constructor(constructor_mirror, args, CHECK_NULL);
4095   jobject res = JNIHandles::make_local(env, result);
4096   if (JvmtiExport::should_post_vm_object_alloc()) {
4097     JvmtiExport::post_vm_object_alloc(JavaThread::current(), result);
4098   }
4099   return res;
4100 JVM_END
4101 
4102 // Atomic ///////////////////////////////////////////////////////////////////////////////////////////
4103 
4104 JVM_LEAF(jboolean, JVM_SupportsCX8())
4105   JVMWrapper("JVM_SupportsCX8");
4106   return VM_Version::supports_cx8();
4107 JVM_END
4108 
4109 
4110 JVM_ENTRY(jboolean, JVM_CX8Field(JNIEnv *env, jobject obj, jfieldID fid, jlong oldVal, jlong newVal))
4111   JVMWrapper("JVM_CX8Field");
4112   jlong res;
4113   oop             o       = JNIHandles::resolve(obj);
4114   intptr_t        fldOffs = jfieldIDWorkaround::from_instance_jfieldID(o->klass(), fid);
4115   volatile jlong* addr    = (volatile jlong*)((address)o + fldOffs);
4116 
4117   assert(VM_Version::supports_cx8(), "cx8 not supported");
4118   res = Atomic::cmpxchg(newVal, addr, oldVal);
4119 
4120   return res == oldVal;
4121 JVM_END
4122 
4123 // DTrace ///////////////////////////////////////////////////////////////////
4124 
4125 JVM_ENTRY(jint, JVM_DTraceGetVersion(JNIEnv* env))
4126   JVMWrapper("JVM_DTraceGetVersion");
4127   return (jint)JVM_TRACING_DTRACE_VERSION;
4128 JVM_END
4129 
4130 JVM_ENTRY(jlong,JVM_DTraceActivate(
4131     JNIEnv* env, jint version, jstring module_name, jint providers_count,
4132     JVM_DTraceProvider* providers))
4133   JVMWrapper("JVM_DTraceActivate");
4134   return DTraceJSDT::activate(
4135     version, module_name, providers_count, providers, CHECK_0);
4136 JVM_END
4137 
4138 JVM_ENTRY(jboolean,JVM_DTraceIsProbeEnabled(JNIEnv* env, jmethodID method))
4139   JVMWrapper("JVM_DTraceIsProbeEnabled");
4140   return DTraceJSDT::is_probe_enabled(method);
4141 JVM_END
4142 
4143 JVM_ENTRY(void,JVM_DTraceDispose(JNIEnv* env, jlong handle))
4144   JVMWrapper("JVM_DTraceDispose");
4145   DTraceJSDT::dispose(handle);
4146 JVM_END
4147 
4148 JVM_ENTRY(jboolean,JVM_DTraceIsSupported(JNIEnv* env))
4149   JVMWrapper("JVM_DTraceIsSupported");
4150   return DTraceJSDT::is_supported();
4151 JVM_END
4152 
4153 // Returns an array of all live Thread objects (VM internal JavaThreads,
4154 // jvmti agent threads, and JNI attaching threads  are skipped)
4155 // See CR 6404306 regarding JNI attaching threads
4156 JVM_ENTRY(jobjectArray, JVM_GetAllThreads(JNIEnv *env, jclass dummy))
4157   ResourceMark rm(THREAD);
4158   ThreadsListEnumerator tle(THREAD, false, false);
4159   JvmtiVMObjectAllocEventCollector oam;
4160 
4161   int num_threads = tle.num_threads();
4162   objArrayOop r = oopFactory::new_objArray(SystemDictionary::Thread_klass(), num_threads, CHECK_NULL);
4163   objArrayHandle threads_ah(THREAD, r);
4164 
4165   for (int i = 0; i < num_threads; i++) {
4166     Handle h = tle.get_threadObj(i);
4167     threads_ah->obj_at_put(i, h());
4168   }
4169 
4170   return (jobjectArray) JNIHandles::make_local(env, threads_ah());
4171 JVM_END
4172 
4173 
4174 // Support for java.lang.Thread.getStackTrace() and getAllStackTraces() methods
4175 // Return StackTraceElement[][], each element is the stack trace of a thread in
4176 // the corresponding entry in the given threads array
4177 JVM_ENTRY(jobjectArray, JVM_DumpThreads(JNIEnv *env, jclass threadClass, jobjectArray threads))
4178   JVMWrapper("JVM_DumpThreads");
4179   JvmtiVMObjectAllocEventCollector oam;
4180 
4181   // Check if threads is null
4182   if (threads == NULL) {
4183     THROW_(vmSymbols::java_lang_NullPointerException(), 0);
4184   }
4185 
4186   objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(threads));
4187   objArrayHandle ah(THREAD, a);
4188   int num_threads = ah->length();
4189   // check if threads is non-empty array
4190   if (num_threads == 0) {
4191     THROW_(vmSymbols::java_lang_IllegalArgumentException(), 0);
4192   }
4193 
4194   // check if threads is not an array of objects of Thread class
4195   klassOop k = objArrayKlass::cast(ah->klass())->element_klass();
4196   if (k != SystemDictionary::Thread_klass()) {
4197     THROW_(vmSymbols::java_lang_IllegalArgumentException(), 0);
4198   }
4199 
4200   ResourceMark rm(THREAD);
4201 
4202   GrowableArray<instanceHandle>* thread_handle_array = new GrowableArray<instanceHandle>(num_threads);
4203   for (int i = 0; i < num_threads; i++) {
4204     oop thread_obj = ah->obj_at(i);
4205     instanceHandle h(THREAD, (instanceOop) thread_obj);
4206     thread_handle_array->append(h);
4207   }
4208 
4209   Handle stacktraces = ThreadService::dump_stack_traces(thread_handle_array, num_threads, CHECK_NULL);
4210   return (jobjectArray)JNIHandles::make_local(env, stacktraces());
4211 
4212 JVM_END
4213 
4214 // JVM monitoring and management support
4215 JVM_ENTRY_NO_ENV(void*, JVM_GetManagement(jint version))
4216   return Management::get_jmm_interface(version);
4217 JVM_END
4218 
4219 // com.sun.tools.attach.VirtualMachine agent properties support
4220 //
4221 // Initialize the agent properties with the properties maintained in the VM
4222 JVM_ENTRY(jobject, JVM_InitAgentProperties(JNIEnv *env, jobject properties))
4223   JVMWrapper("JVM_InitAgentProperties");
4224   ResourceMark rm;
4225 
4226   Handle props(THREAD, JNIHandles::resolve_non_null(properties));
4227 
4228   PUTPROP(props, "sun.java.command", Arguments::java_command());
4229   PUTPROP(props, "sun.jvm.flags", Arguments::jvm_flags());
4230   PUTPROP(props, "sun.jvm.args", Arguments::jvm_args());
4231   return properties;
4232 JVM_END
4233 
4234 JVM_ENTRY(jobjectArray, JVM_GetEnclosingMethodInfo(JNIEnv *env, jclass ofClass))
4235 {
4236   JVMWrapper("JVM_GetEnclosingMethodInfo");
4237   JvmtiVMObjectAllocEventCollector oam;
4238 
4239   if (ofClass == NULL) {
4240     return NULL;
4241   }
4242   Handle mirror(THREAD, JNIHandles::resolve_non_null(ofClass));
4243   // Special handling for primitive objects
4244   if (java_lang_Class::is_primitive(mirror())) {
4245     return NULL;
4246   }
4247   klassOop k = java_lang_Class::as_klassOop(mirror());
4248   if (!Klass::cast(k)->oop_is_instance()) {
4249     return NULL;
4250   }
4251   instanceKlassHandle ik_h(THREAD, k);
4252   int encl_method_class_idx = ik_h->enclosing_method_class_index();
4253   if (encl_method_class_idx == 0) {
4254     return NULL;
4255   }
4256   objArrayOop dest_o = oopFactory::new_objArray(SystemDictionary::Object_klass(), 3, CHECK_NULL);
4257   objArrayHandle dest(THREAD, dest_o);
4258   klassOop enc_k = ik_h->constants()->klass_at(encl_method_class_idx, CHECK_NULL);
4259   dest->obj_at_put(0, Klass::cast(enc_k)->java_mirror());
4260   int encl_method_method_idx = ik_h->enclosing_method_method_index();
4261   if (encl_method_method_idx != 0) {
4262     Symbol* sym = ik_h->constants()->symbol_at(
4263                         extract_low_short_from_int(
4264                           ik_h->constants()->name_and_type_at(encl_method_method_idx)));
4265     Handle str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
4266     dest->obj_at_put(1, str());
4267     sym = ik_h->constants()->symbol_at(
4268               extract_high_short_from_int(
4269                 ik_h->constants()->name_and_type_at(encl_method_method_idx)));
4270     str = java_lang_String::create_from_symbol(sym, CHECK_NULL);
4271     dest->obj_at_put(2, str());
4272   }
4273   return (jobjectArray) JNIHandles::make_local(dest());
4274 }
4275 JVM_END
4276 
4277 JVM_ENTRY(jintArray, JVM_GetThreadStateValues(JNIEnv* env,
4278                                               jint javaThreadState))
4279 {
4280   // If new thread states are added in future JDK and VM versions,
4281   // this should check if the JDK version is compatible with thread
4282   // states supported by the VM.  Return NULL if not compatible.
4283   //
4284   // This function must map the VM java_lang_Thread::ThreadStatus
4285   // to the Java thread state that the JDK supports.
4286   //
4287 
4288   typeArrayHandle values_h;
4289   switch (javaThreadState) {
4290     case JAVA_THREAD_STATE_NEW : {
4291       typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
4292       values_h = typeArrayHandle(THREAD, r);
4293       values_h->int_at_put(0, java_lang_Thread::NEW);
4294       break;
4295     }
4296     case JAVA_THREAD_STATE_RUNNABLE : {
4297       typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
4298       values_h = typeArrayHandle(THREAD, r);
4299       values_h->int_at_put(0, java_lang_Thread::RUNNABLE);
4300       break;
4301     }
4302     case JAVA_THREAD_STATE_BLOCKED : {
4303       typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
4304       values_h = typeArrayHandle(THREAD, r);
4305       values_h->int_at_put(0, java_lang_Thread::BLOCKED_ON_MONITOR_ENTER);
4306       break;
4307     }
4308     case JAVA_THREAD_STATE_WAITING : {
4309       typeArrayOop r = oopFactory::new_typeArray(T_INT, 2, CHECK_NULL);
4310       values_h = typeArrayHandle(THREAD, r);
4311       values_h->int_at_put(0, java_lang_Thread::IN_OBJECT_WAIT);
4312       values_h->int_at_put(1, java_lang_Thread::PARKED);
4313       break;
4314     }
4315     case JAVA_THREAD_STATE_TIMED_WAITING : {
4316       typeArrayOop r = oopFactory::new_typeArray(T_INT, 3, CHECK_NULL);
4317       values_h = typeArrayHandle(THREAD, r);
4318       values_h->int_at_put(0, java_lang_Thread::SLEEPING);
4319       values_h->int_at_put(1, java_lang_Thread::IN_OBJECT_WAIT_TIMED);
4320       values_h->int_at_put(2, java_lang_Thread::PARKED_TIMED);
4321       break;
4322     }
4323     case JAVA_THREAD_STATE_TERMINATED : {
4324       typeArrayOop r = oopFactory::new_typeArray(T_INT, 1, CHECK_NULL);
4325       values_h = typeArrayHandle(THREAD, r);
4326       values_h->int_at_put(0, java_lang_Thread::TERMINATED);
4327       break;
4328     }
4329     default:
4330       // Unknown state - probably incompatible JDK version
4331       return NULL;
4332   }
4333 
4334   return (jintArray) JNIHandles::make_local(env, values_h());
4335 }
4336 JVM_END
4337 
4338 
4339 JVM_ENTRY(jobjectArray, JVM_GetThreadStateNames(JNIEnv* env,
4340                                                 jint javaThreadState,
4341                                                 jintArray values))
4342 {
4343   // If new thread states are added in future JDK and VM versions,
4344   // this should check if the JDK version is compatible with thread
4345   // states supported by the VM.  Return NULL if not compatible.
4346   //
4347   // This function must map the VM java_lang_Thread::ThreadStatus
4348   // to the Java thread state that the JDK supports.
4349   //
4350 
4351   ResourceMark rm;
4352 
4353   // Check if threads is null
4354   if (values == NULL) {
4355     THROW_(vmSymbols::java_lang_NullPointerException(), 0);
4356   }
4357 
4358   typeArrayOop v = typeArrayOop(JNIHandles::resolve_non_null(values));
4359   typeArrayHandle values_h(THREAD, v);
4360 
4361   objArrayHandle names_h;
4362   switch (javaThreadState) {
4363     case JAVA_THREAD_STATE_NEW : {
4364       assert(values_h->length() == 1 &&
4365                values_h->int_at(0) == java_lang_Thread::NEW,
4366              "Invalid threadStatus value");
4367 
4368       objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
4369                                                1, /* only 1 substate */
4370                                                CHECK_NULL);
4371       names_h = objArrayHandle(THREAD, r);
4372       Handle name = java_lang_String::create_from_str("NEW", CHECK_NULL);
4373       names_h->obj_at_put(0, name());
4374       break;
4375     }
4376     case JAVA_THREAD_STATE_RUNNABLE : {
4377       assert(values_h->length() == 1 &&
4378                values_h->int_at(0) == java_lang_Thread::RUNNABLE,
4379              "Invalid threadStatus value");
4380 
4381       objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
4382                                                1, /* only 1 substate */
4383                                                CHECK_NULL);
4384       names_h = objArrayHandle(THREAD, r);
4385       Handle name = java_lang_String::create_from_str("RUNNABLE", CHECK_NULL);
4386       names_h->obj_at_put(0, name());
4387       break;
4388     }
4389     case JAVA_THREAD_STATE_BLOCKED : {
4390       assert(values_h->length() == 1 &&
4391                values_h->int_at(0) == java_lang_Thread::BLOCKED_ON_MONITOR_ENTER,
4392              "Invalid threadStatus value");
4393 
4394       objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
4395                                                1, /* only 1 substate */
4396                                                CHECK_NULL);
4397       names_h = objArrayHandle(THREAD, r);
4398       Handle name = java_lang_String::create_from_str("BLOCKED", CHECK_NULL);
4399       names_h->obj_at_put(0, name());
4400       break;
4401     }
4402     case JAVA_THREAD_STATE_WAITING : {
4403       assert(values_h->length() == 2 &&
4404                values_h->int_at(0) == java_lang_Thread::IN_OBJECT_WAIT &&
4405                values_h->int_at(1) == java_lang_Thread::PARKED,
4406              "Invalid threadStatus value");
4407       objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
4408                                                2, /* number of substates */
4409                                                CHECK_NULL);
4410       names_h = objArrayHandle(THREAD, r);
4411       Handle name0 = java_lang_String::create_from_str("WAITING.OBJECT_WAIT",
4412                                                        CHECK_NULL);
4413       Handle name1 = java_lang_String::create_from_str("WAITING.PARKED",
4414                                                        CHECK_NULL);
4415       names_h->obj_at_put(0, name0());
4416       names_h->obj_at_put(1, name1());
4417       break;
4418     }
4419     case JAVA_THREAD_STATE_TIMED_WAITING : {
4420       assert(values_h->length() == 3 &&
4421                values_h->int_at(0) == java_lang_Thread::SLEEPING &&
4422                values_h->int_at(1) == java_lang_Thread::IN_OBJECT_WAIT_TIMED &&
4423                values_h->int_at(2) == java_lang_Thread::PARKED_TIMED,
4424              "Invalid threadStatus value");
4425       objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
4426                                                3, /* number of substates */
4427                                                CHECK_NULL);
4428       names_h = objArrayHandle(THREAD, r);
4429       Handle name0 = java_lang_String::create_from_str("TIMED_WAITING.SLEEPING",
4430                                                        CHECK_NULL);
4431       Handle name1 = java_lang_String::create_from_str("TIMED_WAITING.OBJECT_WAIT",
4432                                                        CHECK_NULL);
4433       Handle name2 = java_lang_String::create_from_str("TIMED_WAITING.PARKED",
4434                                                        CHECK_NULL);
4435       names_h->obj_at_put(0, name0());
4436       names_h->obj_at_put(1, name1());
4437       names_h->obj_at_put(2, name2());
4438       break;
4439     }
4440     case JAVA_THREAD_STATE_TERMINATED : {
4441       assert(values_h->length() == 1 &&
4442                values_h->int_at(0) == java_lang_Thread::TERMINATED,
4443              "Invalid threadStatus value");
4444       objArrayOop r = oopFactory::new_objArray(SystemDictionary::String_klass(),
4445                                                1, /* only 1 substate */
4446                                                CHECK_NULL);
4447       names_h = objArrayHandle(THREAD, r);
4448       Handle name = java_lang_String::create_from_str("TERMINATED", CHECK_NULL);
4449       names_h->obj_at_put(0, name());
4450       break;
4451     }
4452     default:
4453       // Unknown state - probably incompatible JDK version
4454       return NULL;
4455   }
4456   return (jobjectArray) JNIHandles::make_local(env, names_h());
4457 }
4458 JVM_END
4459 
4460 JVM_ENTRY(void, JVM_GetVersionInfo(JNIEnv* env, jvm_version_info* info, size_t info_size))
4461 {
4462   memset(info, 0, sizeof(info_size));
4463 
4464   info->jvm_version = Abstract_VM_Version::jvm_version();
4465   info->update_version = 0;          /* 0 in HotSpot Express VM */
4466   info->special_update_version = 0;  /* 0 in HotSpot Express VM */
4467 
4468   // when we add a new capability in the jvm_version_info struct, we should also
4469   // consider to expose this new capability in the sun.rt.jvmCapabilities jvmstat
4470   // counter defined in runtimeService.cpp.
4471   info->is_attachable = AttachListener::is_attach_supported();
4472 #ifdef KERNEL
4473   info->is_kernel_jvm = 1; // true;
4474 #else  // KERNEL
4475   info->is_kernel_jvm = 0; // false;
4476 #endif // KERNEL
4477 }
4478 JVM_END