< prev index next >

src/hotspot/share/interpreter/interpreterRuntime.cpp

Print this page




 465 IRT_ENTRY(void, InterpreterRuntime::value_array_store(JavaThread* thread, void* val, arrayOopDesc* array, int index))
 466   assert(val != NULL, "can't store null into flat array");
 467   Klass* klass = array->klass();
 468   assert(klass->is_valueArray_klass(), "expected value array");
 469   assert(ArrayKlass::cast(klass)->element_klass() == ((oop)val)->klass(), "Store type incorrect");
 470 
 471   valueArrayOop varray = (valueArrayOop)array;
 472   ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
 473   ValueKlass* vklass = vaklass->element_klass();
 474   const int lh = vaklass->layout_helper();
 475   vklass->value_store(vklass->data_for_oop((oop)val), varray->value_at_addr(index, lh),
 476                       vaklass->element_byte_size(), true, false);
 477 IRT_END
 478 
 479 IRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address))
 480   // We may want to pass in more arguments - could make this slightly faster
 481   LastFrameAccessor last_frame(thread);
 482   ConstantPool* constants = last_frame.method()->constants();
 483   int i = last_frame.get_index_u2(Bytecodes::_multianewarray);
 484   Klass* klass = constants->klass_at(i, CHECK);
 485   bool is_qtype = constants->tag_at(i).is_Qdescriptor_klass();
 486   int   nof_dims = last_frame.number_of_dimensions();
 487   assert(klass->is_klass(), "not a class");
 488   assert(nof_dims >= 1, "multianewarray rank must be nonzero");
 489 
 490   if (is_qtype) { // Logically creates elements, ensure klass init
 491     klass->initialize(CHECK);
 492   }
 493 
 494   // We must create an array of jints to pass to multi_allocate.
 495   ResourceMark rm(thread);
 496   const int small_dims = 10;
 497   jint dim_array[small_dims];
 498   jint *dims = &dim_array[0];
 499   if (nof_dims > small_dims) {
 500     dims = (jint*) NEW_RESOURCE_ARRAY(jint, nof_dims);
 501   }
 502   for (int index = 0; index < nof_dims; index++) {
 503     // offset from first_size_address is addressed as local[index]
 504     int n = Interpreter::local_offset_in_bytes(index)/jintSize;
 505     dims[index] = first_size_address[n];




 465 IRT_ENTRY(void, InterpreterRuntime::value_array_store(JavaThread* thread, void* val, arrayOopDesc* array, int index))
 466   assert(val != NULL, "can't store null into flat array");
 467   Klass* klass = array->klass();
 468   assert(klass->is_valueArray_klass(), "expected value array");
 469   assert(ArrayKlass::cast(klass)->element_klass() == ((oop)val)->klass(), "Store type incorrect");
 470 
 471   valueArrayOop varray = (valueArrayOop)array;
 472   ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
 473   ValueKlass* vklass = vaklass->element_klass();
 474   const int lh = vaklass->layout_helper();
 475   vklass->value_store(vklass->data_for_oop((oop)val), varray->value_at_addr(index, lh),
 476                       vaklass->element_byte_size(), true, false);
 477 IRT_END
 478 
 479 IRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address))
 480   // We may want to pass in more arguments - could make this slightly faster
 481   LastFrameAccessor last_frame(thread);
 482   ConstantPool* constants = last_frame.method()->constants();
 483   int i = last_frame.get_index_u2(Bytecodes::_multianewarray);
 484   Klass* klass = constants->klass_at(i, CHECK);
 485   bool is_qtype = klass->name()->is_Q_array_signature();
 486   int   nof_dims = last_frame.number_of_dimensions();
 487   assert(klass->is_klass(), "not a class");
 488   assert(nof_dims >= 1, "multianewarray rank must be nonzero");
 489 
 490   if (is_qtype) { // Logically creates elements, ensure klass init
 491     klass->initialize(CHECK);
 492   }
 493 
 494   // We must create an array of jints to pass to multi_allocate.
 495   ResourceMark rm(thread);
 496   const int small_dims = 10;
 497   jint dim_array[small_dims];
 498   jint *dims = &dim_array[0];
 499   if (nof_dims > small_dims) {
 500     dims = (jint*) NEW_RESOURCE_ARRAY(jint, nof_dims);
 501   }
 502   for (int index = 0; index < nof_dims; index++) {
 503     // offset from first_size_address is addressed as local[index]
 504     int n = Interpreter::local_offset_in_bytes(index)/jintSize;
 505     dims[index] = first_size_address[n];


< prev index next >