Mercurial > hg > graal-compiler
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++) { |