< prev index next >

src/hotspot/share/oops/symbol.cpp

Print this page

        

@@ -85,10 +85,53 @@
   }
   assert(len == -1, "we should be at the beginning");
   return true;
 }
 
+bool Symbol::is_Q_signature() const {
+  return utf8_length() > 2 && char_at(0) == 'Q' && char_at(utf8_length() - 1) == ';';
+}
+
+Symbol* Symbol::fundamental_name(TRAPS) {
+  if ((char_at(0) == 'Q' || char_at(0) == 'L') && char_at(utf8_length() - 1) == ';') {
+    return SymbolTable::lookup(this, 1, utf8_length() - 1, CHECK_NULL);
+  } else {
+    // reference count is incremented to be consistent with the behavior with
+    // the SymbolTable::lookup() call above
+    this->increment_refcount();
+    return this;
+  }
+}
+
+bool Symbol::is_same_fundamental_type(Symbol* s) const {
+  if (this == s) return true;
+  if (utf8_length() < 3) return false;
+  int offset1, offset2, len;
+  if (char_at(utf8_length() - 1) == ';') {
+    if (char_at(0) != 'Q' && char_at(0) != 'L') return false;
+    offset1 = 1;
+    len = utf8_length() - 2;
+  } else {
+    offset1 = 0;
+    len = utf8_length();
+  }
+  if (s->char_at(s->utf8_length() - 1) == ';') {
+    if (s->char_at(0) != 'Q' && s->char_at(0) != 'L') return false;
+    offset2 = 1;
+  } else {
+    offset2 = 0;
+  }
+  if ((offset2 + len) > s->utf8_length()) return false;
+  if ((utf8_length() - offset1 * 2) != (s->utf8_length() - offset2 * 2))
+    return false;
+  int l = len;
+  while (l-- > 0) {
+    if (char_at(offset1 + l) != s->char_at(offset2 + l))
+      return false;
+  }
+  return true;
+}
 
 // ------------------------------------------------------------------
 // Symbol::index_of
 //
 // Finds if the given string is a substring of this symbol's utf8 bytes.

@@ -304,7 +347,19 @@
 
   jbyte* bytes = (jbyte*) s->bytes();
   return os::is_readable_range(bytes, bytes + len);
 }
 
+void Symbol::print_Qvalue_on(outputStream* st) const {
+  if (this == NULL) {
+    st->print("NULL");
+  } else {
+    st->print("'Q");
+    for (int i = 0; i < utf8_length(); i++) {
+      st->print("%c", char_at(i));
+    }
+    st->print(";'");
+  }
+}
+
 // SymbolTable prints this in its statistics
 NOT_PRODUCT(size_t Symbol::_total_count = 0;)
< prev index next >