< prev index next >

src/hotspot/share/interpreter/interpreterRuntime.cpp

Print this page




 400   fatal("An exception should have been thrown above");
 401 JRT_END
 402 
 403 JRT_ENTRY(void, InterpreterRuntime::uninitialized_instance_value_field(JavaThread* thread, oopDesc* obj, int index))
 404   instanceHandle obj_h(THREAD, (instanceOop)obj);
 405   InstanceKlass* klass = InstanceKlass::cast(obj_h()->klass());
 406   Klass* field_k = klass->get_value_field_klass_or_null(index);
 407   assert(field_k != NULL, "Must have been initialized");
 408   ValueKlass* field_vklass = ValueKlass::cast(field_k);
 409   assert(field_vklass->is_initialized(), "Must have been initialized at this point");
 410   instanceOop res = (instanceOop)field_vklass->default_value();
 411   thread->set_vm_result(res);
 412 JRT_END
 413 
 414 JRT_ENTRY(void, InterpreterRuntime::write_flattened_value(JavaThread* thread, oopDesc* value, int offset, oopDesc* rcv))
 415   assert(oopDesc::is_oop(value), "Sanity check");
 416   assert(oopDesc::is_oop(rcv), "Sanity check");
 417   assert(value->is_value(), "Sanity check");
 418 
 419   ValueKlass* vklass = ValueKlass::cast(value->klass());

 420   vklass->value_store(vklass->data_for_oop(value), ((char*)(oopDesc*)rcv) + offset, true, true);

 421 JRT_END
 422 
 423 JRT_ENTRY(void, InterpreterRuntime::read_flattened_field(JavaThread* thread, oopDesc* obj, int index, Klass* field_holder))
 424   Handle obj_h(THREAD, obj);
 425 
 426   assert(oopDesc::is_oop(obj), "Sanity check");
 427 
 428   assert(field_holder->is_instance_klass(), "Sanity check");
 429   InstanceKlass* klass = InstanceKlass::cast(field_holder);
 430 
 431   assert(klass->field_is_flattened(index), "Sanity check");
 432 
 433   ValueKlass* field_vklass = ValueKlass::cast(klass->get_value_field_klass(index));
 434   assert(field_vklass->is_initialized(), "Must be initialized at this point");
 435 




 436   // allocate instance
 437   instanceOop res = field_vklass->allocate_instance(CHECK);
 438   // copy value
 439   field_vklass->value_store(((char*)(oopDesc*)obj_h()) + klass->field_offset(index),
 440                             field_vklass->data_for_oop(res), true, true);


 441   thread->set_vm_result(res);
 442 JRT_END
 443 
 444 JRT_ENTRY(void, InterpreterRuntime::newarray(JavaThread* thread, BasicType type, jint size))
 445   oop obj = oopFactory::new_typeArray(type, size, CHECK);
 446   thread->set_vm_result(obj);
 447 JRT_END
 448 
 449 
 450 JRT_ENTRY(void, InterpreterRuntime::anewarray(JavaThread* thread, ConstantPool* pool, int index, jint size))
 451   Klass*    klass = pool->klass_at(index, CHECK);
 452   bool      is_qtype_desc = pool->tag_at(index).is_Qdescriptor_klass();
 453   arrayOop obj;
 454   if ((!klass->is_array_klass()) && is_qtype_desc) { // Logically creates elements, ensure klass init
 455     klass->initialize(CHECK);
 456     obj = oopFactory::new_valueArray(klass, size, CHECK);
 457   } else {
 458     obj = oopFactory::new_objArray(klass, size, CHECK);
 459   }
 460   thread->set_vm_result(obj);
 461 JRT_END
 462 
 463 JRT_ENTRY(void, InterpreterRuntime::value_array_load(JavaThread* thread, arrayOopDesc* array, int index))
 464   Klass* klass = array->klass();
 465   assert(klass->is_valueArray_klass(), "expected value array oop");
 466 
 467   ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
 468   ValueKlass* vklass = vaklass->element_klass();
 469   arrayHandle ah(THREAD, array);
 470   instanceOop value_holder = vklass->allocate_instance(CHECK);




 471   void* src = ((valueArrayOop)ah())->value_at_addr(index, vaklass->layout_helper());
 472   vklass->value_store(src, vklass->data_for_oop(value_holder),
 473                         vaklass->element_byte_size(), true, false);


 474   thread->set_vm_result(value_holder);
 475 JRT_END
 476 
 477 JRT_ENTRY(void, InterpreterRuntime::value_array_store(JavaThread* thread, void* val, arrayOopDesc* array, int index))
 478   assert(val != NULL, "can't store null into flat array");
 479   Klass* klass = array->klass();
 480   assert(klass->is_valueArray_klass(), "expected value array");
 481   assert(ArrayKlass::cast(klass)->element_klass() == ((oop)val)->klass(), "Store type incorrect");
 482 
 483   valueArrayOop varray = (valueArrayOop)array;
 484   ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
 485   ValueKlass* vklass = vaklass->element_klass();

 486   const int lh = vaklass->layout_helper();
 487   vklass->value_store(vklass->data_for_oop((oop)val), varray->value_at_addr(index, lh),
 488                       vaklass->element_byte_size(), true, false);

 489 JRT_END
 490 
 491 JRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address))
 492   // We may want to pass in more arguments - could make this slightly faster
 493   LastFrameAccessor last_frame(thread);
 494   ConstantPool* constants = last_frame.method()->constants();
 495   int i = last_frame.get_index_u2(Bytecodes::_multianewarray);
 496   Klass* klass = constants->klass_at(i, CHECK);
 497   bool is_qtype = klass->name()->is_Q_array_signature();
 498   int   nof_dims = last_frame.number_of_dimensions();
 499   assert(klass->is_klass(), "not a class");
 500   assert(nof_dims >= 1, "multianewarray rank must be nonzero");
 501 
 502   if (is_qtype) { // Logically creates elements, ensure klass init
 503     klass->initialize(CHECK);
 504   }
 505 
 506   // We must create an array of jints to pass to multi_allocate.
 507   ResourceMark rm(thread);
 508   const int small_dims = 10;




 400   fatal("An exception should have been thrown above");
 401 JRT_END
 402 
 403 JRT_ENTRY(void, InterpreterRuntime::uninitialized_instance_value_field(JavaThread* thread, oopDesc* obj, int index))
 404   instanceHandle obj_h(THREAD, (instanceOop)obj);
 405   InstanceKlass* klass = InstanceKlass::cast(obj_h()->klass());
 406   Klass* field_k = klass->get_value_field_klass_or_null(index);
 407   assert(field_k != NULL, "Must have been initialized");
 408   ValueKlass* field_vklass = ValueKlass::cast(field_k);
 409   assert(field_vklass->is_initialized(), "Must have been initialized at this point");
 410   instanceOop res = (instanceOop)field_vklass->default_value();
 411   thread->set_vm_result(res);
 412 JRT_END
 413 
 414 JRT_ENTRY(void, InterpreterRuntime::write_flattened_value(JavaThread* thread, oopDesc* value, int offset, oopDesc* rcv))
 415   assert(oopDesc::is_oop(value), "Sanity check");
 416   assert(oopDesc::is_oop(rcv), "Sanity check");
 417   assert(value->is_value(), "Sanity check");
 418 
 419   ValueKlass* vklass = ValueKlass::cast(value->klass());
 420   if (!vklass->is_empty_value()) {
 421     vklass->value_store(vklass->data_for_oop(value), ((char*)(oopDesc*)rcv) + offset, true, true);
 422   }
 423 JRT_END
 424 
 425 JRT_ENTRY(void, InterpreterRuntime::read_flattened_field(JavaThread* thread, oopDesc* obj, int index, Klass* field_holder))
 426   Handle obj_h(THREAD, obj);
 427 
 428   assert(oopDesc::is_oop(obj), "Sanity check");
 429 
 430   assert(field_holder->is_instance_klass(), "Sanity check");
 431   InstanceKlass* klass = InstanceKlass::cast(field_holder);
 432 
 433   assert(klass->field_is_flattened(index), "Sanity check");
 434 
 435   ValueKlass* field_vklass = ValueKlass::cast(klass->get_value_field_klass(index));
 436   assert(field_vklass->is_initialized(), "Must be initialized at this point");
 437 
 438   instanceOop res = NULL;
 439   if (field_vklass->is_empty_value()) {
 440     res = (instanceOop)field_vklass->default_value();
 441   } else {
 442     // allocate instance
 443     res = field_vklass->allocate_instance(CHECK);
 444     // copy value
 445     field_vklass->value_store(((char*)(oopDesc*)obj_h()) + klass->field_offset(index),
 446         field_vklass->data_for_oop(res), true, true);
 447   }
 448   assert(res != NULL, "Must be set in one of two paths above");
 449   thread->set_vm_result(res);
 450 JRT_END
 451 
 452 JRT_ENTRY(void, InterpreterRuntime::newarray(JavaThread* thread, BasicType type, jint size))
 453   oop obj = oopFactory::new_typeArray(type, size, CHECK);
 454   thread->set_vm_result(obj);
 455 JRT_END
 456 
 457 
 458 JRT_ENTRY(void, InterpreterRuntime::anewarray(JavaThread* thread, ConstantPool* pool, int index, jint size))
 459   Klass*    klass = pool->klass_at(index, CHECK);
 460   bool      is_qtype_desc = pool->tag_at(index).is_Qdescriptor_klass();
 461   arrayOop obj;
 462   if ((!klass->is_array_klass()) && is_qtype_desc) { // Logically creates elements, ensure klass init
 463     klass->initialize(CHECK);
 464     obj = oopFactory::new_valueArray(klass, size, CHECK);
 465   } else {
 466     obj = oopFactory::new_objArray(klass, size, CHECK);
 467   }
 468   thread->set_vm_result(obj);
 469 JRT_END
 470 
 471 JRT_ENTRY(void, InterpreterRuntime::value_array_load(JavaThread* thread, arrayOopDesc* array, int index))
 472   Klass* klass = array->klass();
 473   assert(klass->is_valueArray_klass(), "expected value array oop");
 474 
 475   ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
 476   ValueKlass* vklass = vaklass->element_klass();
 477   arrayHandle ah(THREAD, array);
 478   instanceOop value_holder = NULL;
 479   if (vklass->is_empty_value()) {
 480     value_holder = (instanceOop)vklass->default_value();
 481   } else {
 482     value_holder = vklass->allocate_instance(CHECK);
 483     void* src = ((valueArrayOop)ah())->value_at_addr(index, vaklass->layout_helper());
 484     vklass->value_store(src, vklass->data_for_oop(value_holder),
 485         vaklass->element_byte_size(), true, false);
 486   }
 487   assert(value_holder != NULL, "Must be set in one of two paths above");
 488   thread->set_vm_result(value_holder);
 489 JRT_END
 490 
 491 JRT_ENTRY(void, InterpreterRuntime::value_array_store(JavaThread* thread, void* val, arrayOopDesc* array, int index))
 492   assert(val != NULL, "can't store null into flat array");
 493   Klass* klass = array->klass();
 494   assert(klass->is_valueArray_klass(), "expected value array");
 495   assert(ArrayKlass::cast(klass)->element_klass() == ((oop)val)->klass(), "Store type incorrect");
 496 
 497   valueArrayOop varray = (valueArrayOop)array;
 498   ValueArrayKlass* vaklass = ValueArrayKlass::cast(klass);
 499   ValueKlass* vklass = vaklass->element_klass();
 500   if (!vklass->is_empty_value()) {
 501     const int lh = vaklass->layout_helper();
 502     vklass->value_store(vklass->data_for_oop((oop)val), varray->value_at_addr(index, lh),
 503         vaklass->element_byte_size(), true, false);
 504   }
 505 JRT_END
 506 
 507 JRT_ENTRY(void, InterpreterRuntime::multianewarray(JavaThread* thread, jint* first_size_address))
 508   // We may want to pass in more arguments - could make this slightly faster
 509   LastFrameAccessor last_frame(thread);
 510   ConstantPool* constants = last_frame.method()->constants();
 511   int i = last_frame.get_index_u2(Bytecodes::_multianewarray);
 512   Klass* klass = constants->klass_at(i, CHECK);
 513   bool is_qtype = klass->name()->is_Q_array_signature();
 514   int   nof_dims = last_frame.number_of_dimensions();
 515   assert(klass->is_klass(), "not a class");
 516   assert(nof_dims >= 1, "multianewarray rank must be nonzero");
 517 
 518   if (is_qtype) { // Logically creates elements, ensure klass init
 519     klass->initialize(CHECK);
 520   }
 521 
 522   // We must create an array of jints to pass to multi_allocate.
 523   ResourceMark rm(thread);
 524   const int small_dims = 10;


< prev index next >