comparison src/share/vm/oops/symbolOop.cpp @ 1138:dd57230ba8fe

6893268: additional dynamic language related optimizations in C2 Summary: C2 needs some additional optimizations to be able to handle MethodHandle invokes and invokedynamic instructions at the best performance. Reviewed-by: kvn, never
author twisti
date Tue, 05 Jan 2010 15:21:25 +0100
parents 2a1a77d3458f
children c18cbe5936b8
comparison
equal deleted inserted replaced
1137:97125851f396 1138:dd57230ba8fe
1 /* 1 /*
2 * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. 2 * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
23 */ 23 */
24 24
25 # include "incls/_precompiled.incl" 25 # include "incls/_precompiled.incl"
26 # include "incls/_symbolOop.cpp.incl" 26 # include "incls/_symbolOop.cpp.incl"
27 27
28
29 // ------------------------------------------------------------------
30 // symbolOopDesc::equals
31 //
32 // Compares the symbol with a string of the given length.
28 bool symbolOopDesc::equals(const char* str, int len) const { 33 bool symbolOopDesc::equals(const char* str, int len) const {
29 int l = utf8_length(); 34 int l = utf8_length();
30 if (l != len) return false; 35 if (l != len) return false;
31 while (l-- > 0) { 36 while (l-- > 0) {
32 if (str[l] != (char) byte_at(l)) 37 if (str[l] != (char) byte_at(l))
33 return false; 38 return false;
34 } 39 }
35 assert(l == -1, "we should be at the beginning"); 40 assert(l == -1, "we should be at the beginning");
36 return true; 41 return true;
37 } 42 }
43
44
45 // ------------------------------------------------------------------
46 // symbolOopDesc::starts_with
47 //
48 // Tests if the symbol starts with the specified prefix of the given
49 // length.
50 bool symbolOopDesc::starts_with(const char* prefix, int len) const {
51 if (len > utf8_length()) return false;
52 while (len-- > 0) {
53 if (prefix[len] != (char) byte_at(len))
54 return false;
55 }
56 assert(len == -1, "we should be at the beginning");
57 return true;
58 }
59
60
61 // ------------------------------------------------------------------
62 // symbolOopDesc::index_of
63 //
64 // Finds if the given string is a substring of this symbol's utf8 bytes.
65 // Return -1 on failure. Otherwise return the first index where str occurs.
66 int symbolOopDesc::index_of_at(int i, const char* str, int len) const {
67 assert(i >= 0 && i <= utf8_length(), "oob");
68 if (len <= 0) return 0;
69 char first_char = str[0];
70 address bytes = (address) ((symbolOopDesc*)this)->base();
71 address limit = bytes + utf8_length() - len; // inclusive limit
72 address scan = bytes + i;
73 if (scan > limit)
74 return -1;
75 for (;;) {
76 scan = (address) memchr(scan, first_char, (limit + 1 - scan));
77 if (scan == NULL)
78 return -1; // not found
79 assert(scan >= bytes+i && scan <= limit, "scan oob");
80 if (memcmp(scan, str, len) == 0)
81 return (int)(scan - bytes);
82 }
83 }
84
38 85
39 char* symbolOopDesc::as_C_string(char* buf, int size) const { 86 char* symbolOopDesc::as_C_string(char* buf, int size) const {
40 if (size > 0) { 87 if (size > 0) {
41 int len = MIN2(size - 1, utf8_length()); 88 int len = MIN2(size - 1, utf8_length());
42 for (int i = 0; i < len; i++) { 89 for (int i = 0; i < len; i++) {