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];
|