< prev index next >

src/share/vm/classfile/symbolTable.cpp

Print this page

        

@@ -665,5 +665,36 @@
     return dcmd->_dcmdparser.num_arguments();
   } else {
     return 0;
   }
 }
+
+#ifndef PRODUCT
+// Internal test of TempNewSymbol
+void Test_TempNewSymbol() {
+  Thread* THREAD = Thread::current();
+  Symbol* sym = SymbolTable::new_symbol("abc", CATCH);
+  TempNewSymbol ss = sym;
+  assert(ss->refcount() == 1, "only one abc");
+  assert(ss->refcount() == sym->refcount(), "should match TempNewSymbol");
+
+  Symbol* sym1 = SymbolTable::new_symbol("efg", CATCH);
+  Symbol* sym2 = SymbolTable::new_symbol("hij", CATCH);
+  TempNewSymbol s1 = sym1;
+  TempNewSymbol s2 = sym2;
+  assert(s1->refcount() == 1, "one efg");
+  assert(s2->refcount() == 1, "one hij");
+
+  // Assignment operator
+  s1 = s2;
+  assert(sym2->refcount() == 2, "should be two hij");
+  assert(sym1->refcount() == 0, "should be no efg");
+
+  s1 = ss;  // s1 is abc
+  assert(s1->refcount() == 2, "should be two abc (s1 and ss)");
+  assert(sym2->refcount() == 1, "should only have one hij now (s2)");
+
+  TempNewSymbol s3;
+  s3 = SymbolTable::new_symbol("klm", CATCH);
+  assert(s3->refcount() == 1, "only one klm now");
+}
+#endif // PRODUCT
< prev index next >