reflection.cpp revision 7418:ef7449e07592
1/*
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#include "precompiled.hpp"
26#include "classfile/javaClasses.hpp"
27#include "classfile/stringTable.hpp"
28#include "classfile/systemDictionary.hpp"
29#include "classfile/verifier.hpp"
30#include "classfile/vmSymbols.hpp"
31#include "interpreter/linkResolver.hpp"
32#include "memory/oopFactory.hpp"
33#include "memory/resourceArea.hpp"
34#include "memory/universe.inline.hpp"
35#include "oops/instanceKlass.hpp"
36#include "oops/objArrayKlass.hpp"
37#include "oops/objArrayOop.hpp"
38#include "prims/jvm.h"
39#include "prims/jvmtiExport.hpp"
40#include "runtime/arguments.hpp"
41#include "runtime/handles.inline.hpp"
42#include "runtime/javaCalls.hpp"
43#include "runtime/reflection.hpp"
44#include "runtime/reflectionUtils.hpp"
45#include "runtime/signature.hpp"
46#include "runtime/vframe.hpp"
47
48static void trace_class_resolution(Klass* to_class) {
49  ResourceMark rm;
50  int line_number = -1;
51  const char * source_file = NULL;
52  Klass* caller = NULL;
53  JavaThread* jthread = JavaThread::current();
54  if (jthread->has_last_Java_frame()) {
55    vframeStream vfst(jthread);
56    // skip over any frames belonging to java.lang.Class
57    while (!vfst.at_end() &&
58           vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class()) {
59      vfst.next();
60    }
61    if (!vfst.at_end()) {
62      // this frame is a likely suspect
63      caller = vfst.method()->method_holder();
64      line_number = vfst.method()->line_number_from_bci(vfst.bci());
65      Symbol* s = vfst.method()->method_holder()->source_file_name();
66      if (s != NULL) {
67        source_file = s->as_C_string();
68      }
69    }
70  }
71  if (caller != NULL) {
72    const char * from = caller->external_name();
73    const char * to = to_class->external_name();
74    // print in a single call to reduce interleaving between threads
75    if (source_file != NULL) {
76      tty->print("RESOLVE %s %s %s:%d (reflection)\n", from, to, source_file, line_number);
77    } else {
78      tty->print("RESOLVE %s %s (reflection)\n", from, to);
79    }
80  }
81}
82
83
84oop Reflection::box(jvalue* value, BasicType type, TRAPS) {
85  if (type == T_VOID) {
86    return NULL;
87  }
88  if (type == T_OBJECT || type == T_ARRAY) {
89    // regular objects are not boxed
90    return (oop) value->l;
91  }
92  oop result = java_lang_boxing_object::create(type, value, CHECK_NULL);
93  if (result == NULL) {
94    THROW_(vmSymbols::java_lang_IllegalArgumentException(), result);
95  }
96  return result;
97}
98
99
100BasicType Reflection::unbox_for_primitive(oop box, jvalue* value, TRAPS) {
101  if (box == NULL) {
102    THROW_(vmSymbols::java_lang_IllegalArgumentException(), T_ILLEGAL);
103  }
104  return java_lang_boxing_object::get_value(box, value);
105}
106
107BasicType Reflection::unbox_for_regular_object(oop box, jvalue* value) {
108  // Note:  box is really the unboxed oop.  It might even be a Short, etc.!
109  value->l = (jobject) box;
110  return T_OBJECT;
111}
112
113
114void Reflection::widen(jvalue* value, BasicType current_type, BasicType wide_type, TRAPS) {
115  assert(wide_type != current_type, "widen should not be called with identical types");
116  switch (wide_type) {
117    case T_BOOLEAN:
118    case T_BYTE:
119    case T_CHAR:
120      break;  // fail
121    case T_SHORT:
122      switch (current_type) {
123        case T_BYTE:
124          value->s = (jshort) value->b;
125          return;
126      }
127      break;  // fail
128    case T_INT:
129      switch (current_type) {
130        case T_BYTE:
131          value->i = (jint) value->b;
132          return;
133        case T_CHAR:
134          value->i = (jint) value->c;
135          return;
136        case T_SHORT:
137          value->i = (jint) value->s;
138          return;
139      }
140      break;  // fail
141    case T_LONG:
142      switch (current_type) {
143        case T_BYTE:
144          value->j = (jlong) value->b;
145          return;
146        case T_CHAR:
147          value->j = (jlong) value->c;
148          return;
149        case T_SHORT:
150          value->j = (jlong) value->s;
151          return;
152        case T_INT:
153          value->j = (jlong) value->i;
154          return;
155      }
156      break;  // fail
157    case T_FLOAT:
158      switch (current_type) {
159        case T_BYTE:
160          value->f = (jfloat) value->b;
161          return;
162        case T_CHAR:
163          value->f = (jfloat) value->c;
164          return;
165        case T_SHORT:
166          value->f = (jfloat) value->s;
167          return;
168        case T_INT:
169          value->f = (jfloat) value->i;
170          return;
171        case T_LONG:
172          value->f = (jfloat) value->j;
173          return;
174      }
175      break;  // fail
176    case T_DOUBLE:
177      switch (current_type) {
178        case T_BYTE:
179          value->d = (jdouble) value->b;
180          return;
181        case T_CHAR:
182          value->d = (jdouble) value->c;
183          return;
184        case T_SHORT:
185          value->d = (jdouble) value->s;
186          return;
187        case T_INT:
188          value->d = (jdouble) value->i;
189          return;
190        case T_FLOAT:
191          value->d = (jdouble) value->f;
192          return;
193        case T_LONG:
194          value->d = (jdouble) value->j;
195          return;
196      }
197      break;  // fail
198    default:
199      break;  // fail
200  }
201  THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "argument type mismatch");
202}
203
204
205BasicType Reflection::array_get(jvalue* value, arrayOop a, int index, TRAPS) {
206  if (!a->is_within_bounds(index)) {
207    THROW_(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), T_ILLEGAL);
208  }
209  if (a->is_objArray()) {
210    value->l = (jobject) objArrayOop(a)->obj_at(index);
211    return T_OBJECT;
212  } else {
213    assert(a->is_typeArray(), "just checking");
214    BasicType type = TypeArrayKlass::cast(a->klass())->element_type();
215    switch (type) {
216      case T_BOOLEAN:
217        value->z = typeArrayOop(a)->bool_at(index);
218        break;
219      case T_CHAR:
220        value->c = typeArrayOop(a)->char_at(index);
221        break;
222      case T_FLOAT:
223        value->f = typeArrayOop(a)->float_at(index);
224        break;
225      case T_DOUBLE:
226        value->d = typeArrayOop(a)->double_at(index);
227        break;
228      case T_BYTE:
229        value->b = typeArrayOop(a)->byte_at(index);
230        break;
231      case T_SHORT:
232        value->s = typeArrayOop(a)->short_at(index);
233        break;
234      case T_INT:
235        value->i = typeArrayOop(a)->int_at(index);
236        break;
237      case T_LONG:
238        value->j = typeArrayOop(a)->long_at(index);
239        break;
240      default:
241        return T_ILLEGAL;
242    }
243    return type;
244  }
245}
246
247
248void Reflection::array_set(jvalue* value, arrayOop a, int index, BasicType value_type, TRAPS) {
249  if (!a->is_within_bounds(index)) {
250    THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
251  }
252  if (a->is_objArray()) {
253    if (value_type == T_OBJECT) {
254      oop obj = (oop) value->l;
255      if (obj != NULL) {
256        Klass* element_klass = ObjArrayKlass::cast(a->klass())->element_klass();
257        if (!obj->is_a(element_klass)) {
258          THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "array element type mismatch");
259        }
260      }
261      objArrayOop(a)->obj_at_put(index, obj);
262    }
263  } else {
264    assert(a->is_typeArray(), "just checking");
265    BasicType array_type = TypeArrayKlass::cast(a->klass())->element_type();
266    if (array_type != value_type) {
267      // The widen operation can potentially throw an exception, but cannot block,
268      // so typeArrayOop a is safe if the call succeeds.
269      widen(value, value_type, array_type, CHECK);
270    }
271    switch (array_type) {
272      case T_BOOLEAN:
273        typeArrayOop(a)->bool_at_put(index, value->z);
274        break;
275      case T_CHAR:
276        typeArrayOop(a)->char_at_put(index, value->c);
277        break;
278      case T_FLOAT:
279        typeArrayOop(a)->float_at_put(index, value->f);
280        break;
281      case T_DOUBLE:
282        typeArrayOop(a)->double_at_put(index, value->d);
283        break;
284      case T_BYTE:
285        typeArrayOop(a)->byte_at_put(index, value->b);
286        break;
287      case T_SHORT:
288        typeArrayOop(a)->short_at_put(index, value->s);
289        break;
290      case T_INT:
291        typeArrayOop(a)->int_at_put(index, value->i);
292        break;
293      case T_LONG:
294        typeArrayOop(a)->long_at_put(index, value->j);
295        break;
296      default:
297        THROW(vmSymbols::java_lang_IllegalArgumentException());
298    }
299  }
300}
301
302
303Klass* Reflection::basic_type_mirror_to_arrayklass(oop basic_type_mirror, TRAPS) {
304  assert(java_lang_Class::is_primitive(basic_type_mirror), "just checking");
305  BasicType type = java_lang_Class::primitive_type(basic_type_mirror);
306  if (type == T_VOID) {
307    THROW_0(vmSymbols::java_lang_IllegalArgumentException());
308  } else {
309    return Universe::typeArrayKlassObj(type);
310  }
311}
312
313
314oop Reflection:: basic_type_arrayklass_to_mirror(Klass* basic_type_arrayklass, TRAPS) {
315  BasicType type = TypeArrayKlass::cast(basic_type_arrayklass)->element_type();
316  return Universe::java_mirror(type);
317}
318
319
320arrayOop Reflection::reflect_new_array(oop element_mirror, jint length, TRAPS) {
321  if (element_mirror == NULL) {
322    THROW_0(vmSymbols::java_lang_NullPointerException());
323  }
324  if (length < 0) {
325    THROW_0(vmSymbols::java_lang_NegativeArraySizeException());
326  }
327  if (java_lang_Class::is_primitive(element_mirror)) {
328    Klass* tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
329    return TypeArrayKlass::cast(tak)->allocate(length, THREAD);
330  } else {
331    Klass* k = java_lang_Class::as_Klass(element_mirror);
332    if (k->oop_is_array() && ArrayKlass::cast(k)->dimension() >= MAX_DIM) {
333      THROW_0(vmSymbols::java_lang_IllegalArgumentException());
334    }
335    return oopFactory::new_objArray(k, length, THREAD);
336  }
337}
338
339
340arrayOop Reflection::reflect_new_multi_array(oop element_mirror, typeArrayOop dim_array, TRAPS) {
341  assert(dim_array->is_typeArray(), "just checking");
342  assert(TypeArrayKlass::cast(dim_array->klass())->element_type() == T_INT, "just checking");
343
344  if (element_mirror == NULL) {
345    THROW_0(vmSymbols::java_lang_NullPointerException());
346  }
347
348  int len = dim_array->length();
349  if (len <= 0 || len > MAX_DIM) {
350    THROW_0(vmSymbols::java_lang_IllegalArgumentException());
351  }
352
353  jint dimensions[MAX_DIM];   // C array copy of intArrayOop
354  for (int i = 0; i < len; i++) {
355    int d = dim_array->int_at(i);
356    if (d < 0) {
357      THROW_0(vmSymbols::java_lang_NegativeArraySizeException());
358    }
359    dimensions[i] = d;
360  }
361
362  Klass* klass;
363  int dim = len;
364  if (java_lang_Class::is_primitive(element_mirror)) {
365    klass = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
366  } else {
367    klass = java_lang_Class::as_Klass(element_mirror);
368    if (klass->oop_is_array()) {
369      int k_dim = ArrayKlass::cast(klass)->dimension();
370      if (k_dim + len > MAX_DIM) {
371        THROW_0(vmSymbols::java_lang_IllegalArgumentException());
372      }
373      dim += k_dim;
374    }
375  }
376  klass = klass->array_klass(dim, CHECK_NULL);
377  oop obj = ArrayKlass::cast(klass)->multi_allocate(len, dimensions, CHECK_NULL);
378  assert(obj->is_array(), "just checking");
379  return arrayOop(obj);
380}
381
382
383oop Reflection::array_component_type(oop mirror, TRAPS) {
384  if (java_lang_Class::is_primitive(mirror)) {
385    return NULL;
386  }
387
388  Klass* klass = java_lang_Class::as_Klass(mirror);
389  if (!klass->oop_is_array()) {
390    return NULL;
391  }
392
393  oop result = java_lang_Class::component_mirror(mirror);
394#ifdef ASSERT
395  oop result2 = NULL;
396  if (ArrayKlass::cast(klass)->dimension() == 1) {
397    if (klass->oop_is_typeArray()) {
398      result2 = basic_type_arrayklass_to_mirror(klass, CHECK_NULL);
399    } else {
400      result2 = ObjArrayKlass::cast(klass)->element_klass()->java_mirror();
401    }
402  } else {
403    Klass* lower_dim = ArrayKlass::cast(klass)->lower_dimension();
404    assert(lower_dim->oop_is_array(), "just checking");
405    result2 = lower_dim->java_mirror();
406  }
407  assert(result == result2, "results must be consistent");
408#endif //ASSERT
409  return result;
410}
411
412
413bool Reflection::verify_class_access(Klass* current_class, Klass* new_class, bool classloader_only) {
414  // Verify that current_class can access new_class.  If the classloader_only
415  // flag is set, we automatically allow any accesses in which current_class
416  // doesn't have a classloader.
417  if ((current_class == NULL) ||
418      (current_class == new_class) ||
419      (new_class->is_public()) ||
420      is_same_class_package(current_class, new_class)) {
421    return true;
422  }
423  // Allow all accesses from sun/reflect/MagicAccessorImpl subclasses to
424  // succeed trivially.
425  if (current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
426    return true;
427  }
428
429  return can_relax_access_check_for(current_class, new_class, classloader_only);
430}
431
432static bool under_host_klass(InstanceKlass* ik, Klass* host_klass) {
433  DEBUG_ONLY(int inf_loop_check = 1000 * 1000 * 1000);
434  for (;;) {
435    Klass* hc = (Klass*) ik->host_klass();
436    if (hc == NULL)        return false;
437    if (hc == host_klass)  return true;
438    ik = InstanceKlass::cast(hc);
439
440    // There's no way to make a host class loop short of patching memory.
441    // Therefore there cannot be a loop here unless there's another bug.
442    // Still, let's check for it.
443    assert(--inf_loop_check > 0, "no host_klass loop");
444  }
445}
446
447bool Reflection::can_relax_access_check_for(
448    Klass* accessor, Klass* accessee, bool classloader_only) {
449  InstanceKlass* accessor_ik = InstanceKlass::cast(accessor);
450  InstanceKlass* accessee_ik  = InstanceKlass::cast(accessee);
451
452  // If either is on the other's host_klass chain, access is OK,
453  // because one is inside the other.
454  if (under_host_klass(accessor_ik, accessee) ||
455      under_host_klass(accessee_ik, accessor))
456    return true;
457
458  if ((RelaxAccessControlCheck &&
459        accessor_ik->major_version() < Verifier::NO_RELAX_ACCESS_CTRL_CHECK_VERSION &&
460        accessee_ik->major_version() < Verifier::NO_RELAX_ACCESS_CTRL_CHECK_VERSION) ||
461      (accessor_ik->major_version() < Verifier::STRICTER_ACCESS_CTRL_CHECK_VERSION &&
462       accessee_ik->major_version() < Verifier::STRICTER_ACCESS_CTRL_CHECK_VERSION)) {
463    return classloader_only &&
464      Verifier::relax_verify_for(accessor_ik->class_loader()) &&
465      accessor_ik->protection_domain() == accessee_ik->protection_domain() &&
466      accessor_ik->class_loader() == accessee_ik->class_loader();
467  } else {
468    return false;
469  }
470}
471
472bool Reflection::verify_field_access(Klass* current_class,
473                                     Klass* resolved_class,
474                                     Klass* field_class,
475                                     AccessFlags access,
476                                     bool classloader_only,
477                                     bool protected_restriction) {
478  // Verify that current_class can access a field of field_class, where that
479  // field's access bits are "access".  We assume that we've already verified
480  // that current_class can access field_class.
481  //
482  // If the classloader_only flag is set, we automatically allow any accesses
483  // in which current_class doesn't have a classloader.
484  //
485  // "resolved_class" is the runtime type of "field_class". Sometimes we don't
486  // need this distinction (e.g. if all we have is the runtime type, or during
487  // class file parsing when we only care about the static type); in that case
488  // callers should ensure that resolved_class == field_class.
489  //
490  if ((current_class == NULL) ||
491      (current_class == field_class) ||
492      access.is_public()) {
493    return true;
494  }
495
496  Klass* host_class = current_class;
497  while (host_class->oop_is_instance() &&
498         InstanceKlass::cast(host_class)->is_anonymous()) {
499    Klass* next_host_class = InstanceKlass::cast(host_class)->host_klass();
500    if (next_host_class == NULL)  break;
501    host_class = next_host_class;
502  }
503  if (host_class == field_class) {
504    return true;
505  }
506
507  if (access.is_protected()) {
508    if (!protected_restriction) {
509      // See if current_class (or outermost host class) is a subclass of field_class
510      // An interface may not access protected members of j.l.Object
511      if (!host_class->is_interface() && host_class->is_subclass_of(field_class)) {
512        if (access.is_static() || // static fields are ok, see 6622385
513            current_class == resolved_class ||
514            field_class == resolved_class ||
515            host_class->is_subclass_of(resolved_class) ||
516            resolved_class->is_subclass_of(host_class)) {
517          return true;
518        }
519      }
520    }
521  }
522
523  if (!access.is_private() && is_same_class_package(current_class, field_class)) {
524    return true;
525  }
526
527  // Allow all accesses from sun/reflect/MagicAccessorImpl subclasses to
528  // succeed trivially.
529  if (current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
530    return true;
531  }
532
533  return can_relax_access_check_for(
534    current_class, field_class, classloader_only);
535}
536
537
538bool Reflection::is_same_class_package(Klass* class1, Klass* class2) {
539  return InstanceKlass::cast(class1)->is_same_class_package(class2);
540}
541
542bool Reflection::is_same_package_member(Klass* class1, Klass* class2, TRAPS) {
543  return InstanceKlass::cast(class1)->is_same_package_member(class2, THREAD);
544}
545
546
547// Checks that the 'outer' klass has declared 'inner' as being an inner klass. If not,
548// throw an incompatible class change exception
549// If inner_is_member, require the inner to be a member of the outer.
550// If !inner_is_member, require the inner to be anonymous (a non-member).
551// Caller is responsible for figuring out in advance which case must be true.
552void Reflection::check_for_inner_class(instanceKlassHandle outer, instanceKlassHandle inner,
553                                       bool inner_is_member, TRAPS) {
554  InnerClassesIterator iter(outer);
555  constantPoolHandle cp   (THREAD, outer->constants());
556  for (; !iter.done(); iter.next()) {
557     int ioff = iter.inner_class_info_index();
558     int ooff = iter.outer_class_info_index();
559
560     if (inner_is_member && ioff != 0 && ooff != 0) {
561        Klass* o = cp->klass_at(ooff, CHECK);
562        if (o == outer()) {
563          Klass* i = cp->klass_at(ioff, CHECK);
564          if (i == inner()) {
565            return;
566          }
567        }
568     }
569     if (!inner_is_member && ioff != 0 && ooff == 0 &&
570         cp->klass_name_at_matches(inner, ioff)) {
571        Klass* i = cp->klass_at(ioff, CHECK);
572        if (i == inner()) {
573          return;
574        }
575     }
576  }
577
578  // 'inner' not declared as an inner klass in outer
579  ResourceMark rm(THREAD);
580  Exceptions::fthrow(
581    THREAD_AND_LOCATION,
582    vmSymbols::java_lang_IncompatibleClassChangeError(),
583    "%s and %s disagree on InnerClasses attribute",
584    outer->external_name(),
585    inner->external_name()
586  );
587}
588
589// Utility method converting a single SignatureStream element into java.lang.Class instance
590
591oop get_mirror_from_signature(methodHandle method, SignatureStream* ss, TRAPS) {
592  switch (ss->type()) {
593    default:
594      assert(ss->type() != T_VOID || ss->at_return_type(), "T_VOID should only appear as return type");
595      return java_lang_Class::primitive_mirror(ss->type());
596    case T_OBJECT:
597    case T_ARRAY:
598      Symbol* name        = ss->as_symbol(CHECK_NULL);
599      oop loader            = method->method_holder()->class_loader();
600      oop protection_domain = method->method_holder()->protection_domain();
601      Klass* k = SystemDictionary::resolve_or_fail(
602                                       name,
603                                       Handle(THREAD, loader),
604                                       Handle(THREAD, protection_domain),
605                                       true, CHECK_NULL);
606      if (TraceClassResolution) {
607        trace_class_resolution(k);
608      }
609      return k->java_mirror();
610  };
611}
612
613
614objArrayHandle Reflection::get_parameter_types(methodHandle method, int parameter_count, oop* return_type, TRAPS) {
615  // Allocate array holding parameter types (java.lang.Class instances)
616  objArrayOop m = oopFactory::new_objArray(SystemDictionary::Class_klass(), parameter_count, CHECK_(objArrayHandle()));
617  objArrayHandle mirrors (THREAD, m);
618  int index = 0;
619  // Collect parameter types
620  ResourceMark rm(THREAD);
621  Symbol*  signature  = method->signature();
622  SignatureStream ss(signature);
623  while (!ss.at_return_type()) {
624    oop mirror = get_mirror_from_signature(method, &ss, CHECK_(objArrayHandle()));
625    mirrors->obj_at_put(index++, mirror);
626    ss.next();
627  }
628  assert(index == parameter_count, "invalid parameter count");
629  if (return_type != NULL) {
630    // Collect return type as well
631    assert(ss.at_return_type(), "return type should be present");
632    *return_type = get_mirror_from_signature(method, &ss, CHECK_(objArrayHandle()));
633  }
634  return mirrors;
635}
636
637objArrayHandle Reflection::get_exception_types(methodHandle method, TRAPS) {
638  return method->resolved_checked_exceptions(CHECK_(objArrayHandle()));
639}
640
641
642Handle Reflection::new_type(Symbol* signature, KlassHandle k, TRAPS) {
643  // Basic types
644  BasicType type = vmSymbols::signature_type(signature);
645  if (type != T_OBJECT) {
646    return Handle(THREAD, Universe::java_mirror(type));
647  }
648
649  oop loader = InstanceKlass::cast(k())->class_loader();
650  oop protection_domain = k()->protection_domain();
651  Klass* result = SystemDictionary::resolve_or_fail(signature,
652                                    Handle(THREAD, loader),
653                                    Handle(THREAD, protection_domain),
654                                    true, CHECK_(Handle()));
655
656  if (TraceClassResolution) {
657    trace_class_resolution(result);
658  }
659
660  oop nt = result->java_mirror();
661  return Handle(THREAD, nt);
662}
663
664
665oop Reflection::new_method(methodHandle method, bool for_constant_pool_access, TRAPS) {
666  // Allow sun.reflect.ConstantPool to refer to <clinit> methods as java.lang.reflect.Methods.
667  assert(!method()->is_initializer() ||
668         (for_constant_pool_access && method()->is_static()),
669         "should call new_constructor instead");
670  instanceKlassHandle holder (THREAD, method->method_holder());
671  int slot = method->method_idnum();
672
673  Symbol*  signature  = method->signature();
674  int parameter_count = ArgumentCount(signature).size();
675  oop return_type_oop = NULL;
676  objArrayHandle parameter_types = get_parameter_types(method, parameter_count, &return_type_oop, CHECK_NULL);
677  if (parameter_types.is_null() || return_type_oop == NULL) return NULL;
678
679  Handle return_type(THREAD, return_type_oop);
680
681  objArrayHandle exception_types = get_exception_types(method, CHECK_NULL);
682
683  if (exception_types.is_null()) return NULL;
684
685  Symbol*  method_name = method->name();
686  oop name_oop = StringTable::intern(method_name, CHECK_NULL);
687  Handle name = Handle(THREAD, name_oop);
688  if (name == NULL) return NULL;
689
690  int modifiers = method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
691
692  Handle mh = java_lang_reflect_Method::create(CHECK_NULL);
693
694  java_lang_reflect_Method::set_clazz(mh(), holder->java_mirror());
695  java_lang_reflect_Method::set_slot(mh(), slot);
696  java_lang_reflect_Method::set_name(mh(), name());
697  java_lang_reflect_Method::set_return_type(mh(), return_type());
698  java_lang_reflect_Method::set_parameter_types(mh(), parameter_types());
699  java_lang_reflect_Method::set_exception_types(mh(), exception_types());
700  java_lang_reflect_Method::set_modifiers(mh(), modifiers);
701  java_lang_reflect_Method::set_override(mh(), false);
702  if (java_lang_reflect_Method::has_signature_field() &&
703      method->generic_signature() != NULL) {
704    Symbol*  gs = method->generic_signature();
705    Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL);
706    java_lang_reflect_Method::set_signature(mh(), sig());
707  }
708  if (java_lang_reflect_Method::has_annotations_field()) {
709    typeArrayOop an_oop = Annotations::make_java_array(method->annotations(), CHECK_NULL);
710    java_lang_reflect_Method::set_annotations(mh(), an_oop);
711  }
712  if (java_lang_reflect_Method::has_parameter_annotations_field()) {
713    typeArrayOop an_oop = Annotations::make_java_array(method->parameter_annotations(), CHECK_NULL);
714    java_lang_reflect_Method::set_parameter_annotations(mh(), an_oop);
715  }
716  if (java_lang_reflect_Method::has_annotation_default_field()) {
717    typeArrayOop an_oop = Annotations::make_java_array(method->annotation_default(), CHECK_NULL);
718    java_lang_reflect_Method::set_annotation_default(mh(), an_oop);
719  }
720  if (java_lang_reflect_Method::has_type_annotations_field()) {
721    typeArrayOop an_oop = Annotations::make_java_array(method->type_annotations(), CHECK_NULL);
722    java_lang_reflect_Method::set_type_annotations(mh(), an_oop);
723  }
724  return mh();
725}
726
727
728oop Reflection::new_constructor(methodHandle method, TRAPS) {
729  assert(method()->is_initializer(), "should call new_method instead");
730
731  instanceKlassHandle  holder (THREAD, method->method_holder());
732  int slot = method->method_idnum();
733
734  Symbol*  signature  = method->signature();
735  int parameter_count = ArgumentCount(signature).size();
736  objArrayHandle parameter_types = get_parameter_types(method, parameter_count, NULL, CHECK_NULL);
737  if (parameter_types.is_null()) return NULL;
738
739  objArrayHandle exception_types = get_exception_types(method, CHECK_NULL);
740  if (exception_types.is_null()) return NULL;
741
742  int modifiers = method->access_flags().as_int() & JVM_RECOGNIZED_METHOD_MODIFIERS;
743
744  Handle ch = java_lang_reflect_Constructor::create(CHECK_NULL);
745
746  java_lang_reflect_Constructor::set_clazz(ch(), holder->java_mirror());
747  java_lang_reflect_Constructor::set_slot(ch(), slot);
748  java_lang_reflect_Constructor::set_parameter_types(ch(), parameter_types());
749  java_lang_reflect_Constructor::set_exception_types(ch(), exception_types());
750  java_lang_reflect_Constructor::set_modifiers(ch(), modifiers);
751  java_lang_reflect_Constructor::set_override(ch(), false);
752  if (java_lang_reflect_Constructor::has_signature_field() &&
753      method->generic_signature() != NULL) {
754    Symbol*  gs = method->generic_signature();
755    Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL);
756    java_lang_reflect_Constructor::set_signature(ch(), sig());
757  }
758  if (java_lang_reflect_Constructor::has_annotations_field()) {
759    typeArrayOop an_oop = Annotations::make_java_array(method->annotations(), CHECK_NULL);
760    java_lang_reflect_Constructor::set_annotations(ch(), an_oop);
761  }
762  if (java_lang_reflect_Constructor::has_parameter_annotations_field()) {
763    typeArrayOop an_oop = Annotations::make_java_array(method->parameter_annotations(), CHECK_NULL);
764    java_lang_reflect_Constructor::set_parameter_annotations(ch(), an_oop);
765  }
766  if (java_lang_reflect_Constructor::has_type_annotations_field()) {
767    typeArrayOop an_oop = Annotations::make_java_array(method->type_annotations(), CHECK_NULL);
768    java_lang_reflect_Constructor::set_type_annotations(ch(), an_oop);
769  }
770  return ch();
771}
772
773
774oop Reflection::new_field(fieldDescriptor* fd, TRAPS) {
775  Symbol*  field_name = fd->name();
776  oop name_oop = StringTable::intern(field_name, CHECK_NULL);
777  Handle name = Handle(THREAD, name_oop);
778  Symbol*  signature  = fd->signature();
779  instanceKlassHandle  holder    (THREAD, fd->field_holder());
780  Handle type = new_type(signature, holder, CHECK_NULL);
781  Handle rh  = java_lang_reflect_Field::create(CHECK_NULL);
782
783  java_lang_reflect_Field::set_clazz(rh(), fd->field_holder()->java_mirror());
784  java_lang_reflect_Field::set_slot(rh(), fd->index());
785  java_lang_reflect_Field::set_name(rh(), name());
786  java_lang_reflect_Field::set_type(rh(), type());
787  // Note the ACC_ANNOTATION bit, which is a per-class access flag, is never set here.
788  java_lang_reflect_Field::set_modifiers(rh(), fd->access_flags().as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS);
789  java_lang_reflect_Field::set_override(rh(), false);
790  if (java_lang_reflect_Field::has_signature_field() &&
791      fd->has_generic_signature()) {
792    Symbol*  gs = fd->generic_signature();
793    Handle sig = java_lang_String::create_from_symbol(gs, CHECK_NULL);
794    java_lang_reflect_Field::set_signature(rh(), sig());
795  }
796  if (java_lang_reflect_Field::has_annotations_field()) {
797    typeArrayOop an_oop = Annotations::make_java_array(fd->annotations(), CHECK_NULL);
798    java_lang_reflect_Field::set_annotations(rh(), an_oop);
799  }
800  if (java_lang_reflect_Field::has_type_annotations_field()) {
801    typeArrayOop an_oop = Annotations::make_java_array(fd->type_annotations(), CHECK_NULL);
802    java_lang_reflect_Field::set_type_annotations(rh(), an_oop);
803  }
804  return rh();
805}
806
807oop Reflection::new_parameter(Handle method, int index, Symbol* sym,
808                              int flags, TRAPS) {
809  Handle name;
810
811  // A null symbol here translates to the empty string
812  if(NULL != sym) {
813    name = java_lang_String::create_from_symbol(sym, CHECK_NULL);
814  } else {
815    name = java_lang_String::create_from_str("", CHECK_NULL);
816  }
817
818  Handle rh = java_lang_reflect_Parameter::create(CHECK_NULL);
819  java_lang_reflect_Parameter::set_name(rh(), name());
820  java_lang_reflect_Parameter::set_modifiers(rh(), flags);
821  java_lang_reflect_Parameter::set_executable(rh(), method());
822  java_lang_reflect_Parameter::set_index(rh(), index);
823  return rh();
824}
825
826
827methodHandle Reflection::resolve_interface_call(instanceKlassHandle klass, methodHandle method,
828                                                KlassHandle recv_klass, Handle receiver, TRAPS) {
829  assert(!method.is_null() , "method should not be null");
830
831  CallInfo info;
832  Symbol*  signature  = method->signature();
833  Symbol*  name       = method->name();
834  LinkResolver::resolve_interface_call(info, receiver, recv_klass, klass,
835                                       name, signature,
836                                       KlassHandle(), false, true,
837                                       CHECK_(methodHandle()));
838  return info.selected_method();
839}
840
841
842oop Reflection::invoke(instanceKlassHandle klass, methodHandle reflected_method,
843                       Handle receiver, bool override, objArrayHandle ptypes,
844                       BasicType rtype, objArrayHandle args, bool is_method_invoke, TRAPS) {
845  ResourceMark rm(THREAD);
846
847  methodHandle method;      // actual method to invoke
848  KlassHandle target_klass; // target klass, receiver's klass for non-static
849
850  // Ensure klass is initialized
851  klass->initialize(CHECK_NULL);
852
853  bool is_static = reflected_method->is_static();
854  if (is_static) {
855    // ignore receiver argument
856    method = reflected_method;
857    target_klass = klass;
858  } else {
859    // check for null receiver
860    if (receiver.is_null()) {
861      THROW_0(vmSymbols::java_lang_NullPointerException());
862    }
863    // Check class of receiver against class declaring method
864    if (!receiver->is_a(klass())) {
865      THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "object is not an instance of declaring class");
866    }
867    // target klass is receiver's klass
868    target_klass = KlassHandle(THREAD, receiver->klass());
869    // no need to resolve if method is private or <init>
870    if (reflected_method->is_private() || reflected_method->name() == vmSymbols::object_initializer_name()) {
871      method = reflected_method;
872    } else {
873      // resolve based on the receiver
874      if (reflected_method->method_holder()->is_interface()) {
875        // resolve interface call
876        //
877        // Match resolution errors with those thrown due to reflection inlining
878        // Linktime resolution & IllegalAccessCheck already done by Class.getMethod()
879        method = resolve_interface_call(klass, reflected_method, target_klass, receiver, THREAD);
880        if (HAS_PENDING_EXCEPTION) {
881        // Method resolution threw an exception; wrap it in an InvocationTargetException
882          oop resolution_exception = PENDING_EXCEPTION;
883          CLEAR_PENDING_EXCEPTION;
884          // JVMTI has already reported the pending exception
885          // JVMTI internal flag reset is needed in order to report InvocationTargetException
886          if (THREAD->is_Java_thread()) {
887            JvmtiExport::clear_detected_exception((JavaThread*) THREAD);
888          }
889          JavaCallArguments args(Handle(THREAD, resolution_exception));
890          THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(),
891              vmSymbols::throwable_void_signature(),
892              &args);
893        }
894      }  else {
895        // if the method can be overridden, we resolve using the vtable index.
896        assert(!reflected_method->has_itable_index(), "");
897        int index = reflected_method->vtable_index();
898        method = reflected_method;
899        if (index != Method::nonvirtual_vtable_index) {
900          // target_klass might be an arrayKlassOop but all vtables start at
901          // the same place. The cast is to avoid virtual call and assertion.
902          InstanceKlass* inst = (InstanceKlass*)target_klass();
903          method = methodHandle(THREAD, inst->method_at_vtable(index));
904        }
905        if (!method.is_null()) {
906          // Check for abstract methods as well
907          if (method->is_abstract()) {
908            // new default: 6531596
909            ResourceMark rm(THREAD);
910            Handle h_origexception = Exceptions::new_exception(THREAD,
911                   vmSymbols::java_lang_AbstractMethodError(),
912                   Method::name_and_sig_as_C_string(target_klass(),
913                   method->name(),
914                   method->signature()));
915            JavaCallArguments args(h_origexception);
916            THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(),
917              vmSymbols::throwable_void_signature(),
918              &args);
919          }
920        }
921      }
922    }
923  }
924
925  // I believe this is a ShouldNotGetHere case which requires
926  // an internal vtable bug. If you ever get this please let Karen know.
927  if (method.is_null()) {
928    ResourceMark rm(THREAD);
929    THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(),
930                Method::name_and_sig_as_C_string(klass(),
931                                                        reflected_method->name(),
932                                                        reflected_method->signature()));
933  }
934
935  assert(ptypes->is_objArray(), "just checking");
936  int args_len = args.is_null() ? 0 : args->length();
937  // Check number of arguments
938  if (ptypes->length() != args_len) {
939    THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "wrong number of arguments");
940  }
941
942  // Create object to contain parameters for the JavaCall
943  JavaCallArguments java_args(method->size_of_parameters());
944
945  if (!is_static) {
946    java_args.push_oop(receiver);
947  }
948
949  for (int i = 0; i < args_len; i++) {
950    oop type_mirror = ptypes->obj_at(i);
951    oop arg = args->obj_at(i);
952    if (java_lang_Class::is_primitive(type_mirror)) {
953      jvalue value;
954      BasicType ptype = basic_type_mirror_to_basic_type(type_mirror, CHECK_NULL);
955      BasicType atype = unbox_for_primitive(arg, &value, CHECK_NULL);
956      if (ptype != atype) {
957        widen(&value, atype, ptype, CHECK_NULL);
958      }
959      switch (ptype) {
960        case T_BOOLEAN:     java_args.push_int(value.z);    break;
961        case T_CHAR:        java_args.push_int(value.c);    break;
962        case T_BYTE:        java_args.push_int(value.b);    break;
963        case T_SHORT:       java_args.push_int(value.s);    break;
964        case T_INT:         java_args.push_int(value.i);    break;
965        case T_LONG:        java_args.push_long(value.j);   break;
966        case T_FLOAT:       java_args.push_float(value.f);  break;
967        case T_DOUBLE:      java_args.push_double(value.d); break;
968        default:
969          THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "argument type mismatch");
970      }
971    } else {
972      if (arg != NULL) {
973        Klass* k = java_lang_Class::as_Klass(type_mirror);
974        if (!arg->is_a(k)) {
975          THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "argument type mismatch");
976        }
977      }
978      Handle arg_handle(THREAD, arg);         // Create handle for argument
979      java_args.push_oop(arg_handle); // Push handle
980    }
981  }
982
983  assert(java_args.size_of_parameters() == method->size_of_parameters(), "just checking");
984
985  // All oops (including receiver) is passed in as Handles. An potential oop is returned as an
986  // oop (i.e., NOT as an handle)
987  JavaValue result(rtype);
988  JavaCalls::call(&result, method, &java_args, THREAD);
989
990  if (HAS_PENDING_EXCEPTION) {
991    // Method threw an exception; wrap it in an InvocationTargetException
992    oop target_exception = PENDING_EXCEPTION;
993    CLEAR_PENDING_EXCEPTION;
994    // JVMTI has already reported the pending exception
995    // JVMTI internal flag reset is needed in order to report InvocationTargetException
996    if (THREAD->is_Java_thread()) {
997      JvmtiExport::clear_detected_exception((JavaThread*) THREAD);
998    }
999
1000    JavaCallArguments args(Handle(THREAD, target_exception));
1001    THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(),
1002                vmSymbols::throwable_void_signature(),
1003                &args);
1004  } else {
1005    if (rtype == T_BOOLEAN || rtype == T_BYTE || rtype == T_CHAR || rtype == T_SHORT)
1006      narrow((jvalue*) result.get_value_addr(), rtype, CHECK_NULL);
1007    return box((jvalue*) result.get_value_addr(), rtype, THREAD);
1008  }
1009}
1010
1011
1012void Reflection::narrow(jvalue* value, BasicType narrow_type, TRAPS) {
1013  switch (narrow_type) {
1014    case T_BOOLEAN:
1015     value->z = (jboolean) value->i;
1016     return;
1017    case T_BYTE:
1018     value->b = (jbyte) value->i;
1019     return;
1020    case T_CHAR:
1021     value->c = (jchar) value->i;
1022     return;
1023    case T_SHORT:
1024     value->s = (jshort) value->i;
1025     return;
1026    default:
1027      break; // fail
1028   }
1029  THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "argument type mismatch");
1030}
1031
1032
1033BasicType Reflection::basic_type_mirror_to_basic_type(oop basic_type_mirror, TRAPS) {
1034  assert(java_lang_Class::is_primitive(basic_type_mirror), "just checking");
1035  return java_lang_Class::primitive_type(basic_type_mirror);
1036}
1037
1038// This would be nicer if, say, java.lang.reflect.Method was a subclass
1039// of java.lang.reflect.Constructor
1040
1041oop Reflection::invoke_method(oop method_mirror, Handle receiver, objArrayHandle args, TRAPS) {
1042  oop mirror             = java_lang_reflect_Method::clazz(method_mirror);
1043  int slot               = java_lang_reflect_Method::slot(method_mirror);
1044  bool override          = java_lang_reflect_Method::override(method_mirror) != 0;
1045  objArrayHandle ptypes(THREAD, objArrayOop(java_lang_reflect_Method::parameter_types(method_mirror)));
1046
1047  oop return_type_mirror = java_lang_reflect_Method::return_type(method_mirror);
1048  BasicType rtype;
1049  if (java_lang_Class::is_primitive(return_type_mirror)) {
1050    rtype = basic_type_mirror_to_basic_type(return_type_mirror, CHECK_NULL);
1051  } else {
1052    rtype = T_OBJECT;
1053  }
1054
1055  instanceKlassHandle klass(THREAD, java_lang_Class::as_Klass(mirror));
1056  Method* m = klass->method_with_idnum(slot);
1057  if (m == NULL) {
1058    THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke");
1059  }
1060  methodHandle method(THREAD, m);
1061
1062  return invoke(klass, method, receiver, override, ptypes, rtype, args, true, THREAD);
1063}
1064
1065
1066oop Reflection::invoke_constructor(oop constructor_mirror, objArrayHandle args, TRAPS) {
1067  oop mirror             = java_lang_reflect_Constructor::clazz(constructor_mirror);
1068  int slot               = java_lang_reflect_Constructor::slot(constructor_mirror);
1069  bool override          = java_lang_reflect_Constructor::override(constructor_mirror) != 0;
1070  objArrayHandle ptypes(THREAD, objArrayOop(java_lang_reflect_Constructor::parameter_types(constructor_mirror)));
1071
1072  instanceKlassHandle klass(THREAD, java_lang_Class::as_Klass(mirror));
1073  Method* m = klass->method_with_idnum(slot);
1074  if (m == NULL) {
1075    THROW_MSG_0(vmSymbols::java_lang_InternalError(), "invoke");
1076  }
1077  methodHandle method(THREAD, m);
1078  assert(method->name() == vmSymbols::object_initializer_name(), "invalid constructor");
1079
1080  // Make sure klass gets initialize
1081  klass->initialize(CHECK_NULL);
1082
1083  // Create new instance (the receiver)
1084  klass->check_valid_for_instantiation(false, CHECK_NULL);
1085  Handle receiver = klass->allocate_instance_handle(CHECK_NULL);
1086
1087  // Ignore result from call and return receiver
1088  invoke(klass, method, receiver, override, ptypes, T_VOID, args, false, CHECK_NULL);
1089  return receiver();
1090}
1091