< prev index next >

src/hotspot/share/interpreter/bytecodeUtils.cpp

Print this page
rev 56281 : 8218628: Add detailed message to NullPointerException describing what is null.
Summary: This is the implementation of JEP 358: Helpful NullPointerExceptions.
Reviewed-by: coleenp
rev 56283 : [mq]: fixes_review_of_16.patch

*** 29,38 **** --- 29,39 ---- #include "interpreter/bytecodeUtils.hpp" #include "memory/resourceArea.hpp" #include "runtime/signature.hpp" #include "runtime/safepointVerifiers.hpp" #include "utilities/events.hpp" + #include "utilities/ostream.hpp" class SimulatedOperandStack; class ExceptionMessageBuilder; // The entries of a SimulatedOperandStack. They carry the analysis
*** 209,223 **** // Prints a string describing the failed action. void print_NPE_failed_action(outputStream *os, int bci); }; ! ! /* ! * Prints the name of the method that is described at constant pool ! * index cp_index in the constant pool of method 'method'. ! */ static void print_method_name(outputStream *os, Method* method, int cp_index) { ConstantPool* cp = method->constants(); Symbol* klass = cp->klass_ref_at_noresolve(cp_index); Symbol* name = cp->name_ref_at(cp_index); Symbol* signature = cp->signature_ref_at(cp_index); --- 210,221 ---- // Prints a string describing the failed action. void print_NPE_failed_action(outputStream *os, int bci); }; ! // Prints the name of the method that is described at constant pool ! // index cp_index in the constant pool of method 'method'. static void print_method_name(outputStream *os, Method* method, int cp_index) { ConstantPool* cp = method->constants(); Symbol* klass = cp->klass_ref_at_noresolve(cp_index); Symbol* name = cp->name_ref_at(cp_index); Symbol* signature = cp->signature_ref_at(cp_index);
*** 225,249 **** os->print("%s.%s(", klass->as_klass_external_name(), name->as_C_string()); signature->print_as_signature_external_parameters(os); os->print(")"); } ! /* ! * Prints the name of the field that is described at constant pool ! * index cp_index in the constant pool of method 'method'. ! */ static void print_field_and_class(outputStream *os, Method* method, int cp_index) { ConstantPool* cp = method->constants(); Symbol* klass = cp->klass_ref_at_noresolve(cp_index); Symbol *name = cp->name_ref_at(cp_index); os->print("%s.%s", klass->as_klass_external_name(), name->as_C_string()); } ! /* ! * Returns the name of the field that is described at constant pool ! * index cp_index in the constant pool of method 'method'. ! */ static char const* get_field_name(Method* method, int cp_index) { Symbol* name = method->constants()->name_ref_at(cp_index); return name->as_C_string(); } --- 223,243 ---- os->print("%s.%s(", klass->as_klass_external_name(), name->as_C_string()); signature->print_as_signature_external_parameters(os); os->print(")"); } ! // Prints the name of the field that is described at constant pool ! // index cp_index in the constant pool of method 'method'. static void print_field_and_class(outputStream *os, Method* method, int cp_index) { ConstantPool* cp = method->constants(); Symbol* klass = cp->klass_ref_at_noresolve(cp_index); Symbol *name = cp->name_ref_at(cp_index); os->print("%s.%s", klass->as_klass_external_name(), name->as_C_string()); } ! // Returns the name of the field that is described at constant pool ! // index cp_index in the constant pool of method 'method'. static char const* get_field_name(Method* method, int cp_index) { Symbol* name = method->constants()->name_ref_at(cp_index); return name->as_C_string(); }
*** 386,397 **** } ExceptionMessageBuilder::ExceptionMessageBuilder(Method* method, int bci) : _method(method), _nr_of_entries(0), _added_one(true), _all_processed(false) { ! ConstMethod* const_method = method->constMethod(); const int len = const_method->code_size(); _stacks = new GrowableArray<SimulatedOperandStack*> (len+1); for (int i = 0; i <= len; ++i) { --- 380,393 ---- } ExceptionMessageBuilder::ExceptionMessageBuilder(Method* method, int bci) : _method(method), _nr_of_entries(0), _added_one(true), _all_processed(false) { ! assert(bci >= 0, "BCI too low"); ! assert(bci < get_size(), "BCI too large"); + ConstMethod* const_method = method->constMethod(); const int len = const_method->code_size(); _stacks = new GrowableArray<SimulatedOperandStack*> (len+1); for (int i = 0; i <= len; ++i) {
*** 1356,1365 **** --- 1352,1362 ---- SystemDictionary::reflect_NativeConstructorAccessorImpl_klass()) { return false; } // Analyse the bytecodes. + ResourceMark rm; ExceptionMessageBuilder emb(method, bci); // The slot of the operand stack that contains the null reference. // Also checks for NPE explicitly constructed and returns -2. int slot = emb.get_NPE_null_slot(bci);
< prev index next >