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