diff -r f55c4f82ab9d -r 4b29a725c43c src/share/vm/opto/library_call.cpp --- a/src/share/vm/opto/library_call.cpp Thu Aug 19 14:51:47 2010 -0700 +++ b/src/share/vm/opto/library_call.cpp Fri Aug 20 23:40:30 2010 -0700 @@ -906,7 +906,8 @@ const int count_offset = java_lang_String::count_offset_in_bytes(); const int offset_offset = java_lang_String::offset_offset_in_bytes(); - _sp += 2; + int nargs = 2; + _sp += nargs; Node* argument = pop(); // pop non-receiver first: it was pushed second Node* receiver = pop(); @@ -914,11 +915,11 @@ // null check technically happens in the wrong place, which can lead to // invalid stack traces when string compare is inlined into a method // which handles NullPointerExceptions. - _sp += 2; + _sp += nargs; receiver = do_null_check(receiver, T_OBJECT); //should not do null check for argument for String.equals(), because spec //allows to specify NULL as argument. - _sp -= 2; + _sp -= nargs; if (stopped()) { return true; @@ -943,7 +944,9 @@ ciInstanceKlass* klass = env()->String_klass(); if (!stopped()) { + _sp += nargs; // gen_instanceof might do an uncommon trap Node* inst = gen_instanceof(argument, makecon(TypeKlassPtr::make(klass))); + _sp -= nargs; Node* cmp = _gvn.transform(new (C, 3) CmpINode(inst, intcon(1))); Node* bol = _gvn.transform(new (C, 2) BoolNode(cmp, BoolTest::ne)); @@ -2935,7 +2938,9 @@ switch (id) { case vmIntrinsics::_isInstance: // nothing is an instance of a primitive type + _sp += nargs; // gen_instanceof might do an uncommon trap query_value = gen_instanceof(obj, kls); + _sp -= nargs; break; case vmIntrinsics::_getModifiers: