549 return entry; |
549 return entry; |
550 } |
550 } |
551 |
551 |
552 // |
552 // |
553 // Args: |
553 // Args: |
|
554 // Z_ARG2: oop of array |
554 // Z_ARG3: aberrant index |
555 // Z_ARG3: aberrant index |
555 // |
556 // |
556 address TemplateInterpreterGenerator::generate_ArrayIndexOutOfBounds_handler(const char * name) { |
557 address TemplateInterpreterGenerator::generate_ArrayIndexOutOfBounds_handler() { |
557 address entry = __ pc(); |
558 address entry = __ pc(); |
558 address excp = CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_ArrayIndexOutOfBoundsException); |
559 address excp = CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_ArrayIndexOutOfBoundsException); |
559 |
560 |
560 // Expression stack must be empty before entering the VM if an |
561 // Expression stack must be empty before entering the VM if an |
561 // exception happened. |
562 // exception happened. |
562 __ empty_expression_stack(); |
563 __ empty_expression_stack(); |
563 |
564 |
564 // Setup parameters. |
565 // Setup parameters. |
565 // Leave out the name and use register for array to create more detailed exceptions. |
566 // Pass register with array to create more detailed exceptions. |
566 __ load_absolute_address(Z_ARG2, (address) name); |
|
567 __ call_VM(noreg, excp, Z_ARG2, Z_ARG3); |
567 __ call_VM(noreg, excp, Z_ARG2, Z_ARG3); |
568 return entry; |
568 return entry; |
569 } |
569 } |
570 |
570 |
571 address TemplateInterpreterGenerator::generate_ClassCastException_handler() { |
571 address TemplateInterpreterGenerator::generate_ClassCastException_handler() { |