--- old/src/share/vm/classfile/symbolTable.cpp 2016-01-13 15:47:01.119922068 -0500 +++ new/src/share/vm/classfile/symbolTable.cpp 2016-01-13 15:47:00.635950062 -0500 @@ -667,3 +667,50 @@ return 0; } } + +#ifndef PRODUCT +// Internal test of TempNewSymbol +void Test_TempNewSymbol() { + Thread* THREAD = Thread::current(); + Symbol* abc = SymbolTable::new_symbol("abc", CATCH); + int abccount = abc->refcount(); + TempNewSymbol ss = abc; + assert(ss->refcount() == abccount, "only one abc"); + assert(ss->refcount() == abc->refcount(), "should match TempNewSymbol"); + + Symbol* efg = SymbolTable::new_symbol("efg", CATCH); + Symbol* hij = SymbolTable::new_symbol("hij", CATCH); + int efgcount = efg->refcount(); + int hijcount = hij->refcount(); + + TempNewSymbol s1 = efg; + TempNewSymbol s2 = hij; + assert(s1->refcount() == efgcount, "one efg"); + assert(s2->refcount() == hijcount, "one hij"); + + // Assignment operator + s1 = s2; + assert(hij->refcount() == hijcount + 1, "should be two hij"); + assert(efg->refcount() == efgcount - 1, "should be no efg"); + + s1 = ss; // s1 is abc + assert(s1->refcount() == abccount + 1, "should be two abc (s1 and ss)"); + assert(hij->refcount() == hijcount, "should only have one hij now (s2)"); + + s1 = s1; // self assignment + assert(s1->refcount() == abccount + 1, "should still be two abc (s1 and ss)"); + + TempNewSymbol s3; + s3 = SymbolTable::new_symbol("klm", CATCH); + // can't really assert that it's one + // assert(s3->refcount() == 1, "only one klm now"); + + Symbol* xyz = SymbolTable::new_symbol("xyz", CATCH); + int xyzcount = xyz->refcount(); + { // inner scope + TempNewSymbol s_inner = xyz; + } + assert(xyz->refcount() == (xyzcount - 1), + "Should have been decremented by dtor in inner scope"); +} +#endif // PRODUCT