Changeset 36006 in webkit for trunk/JavaScriptCore/kjs/JSString.h
- Timestamp:
- Aug 30, 2008, 11:58:07 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/JSString.h
r35900 r36006 26 26 #include "CommonIdentifiers.h" 27 27 #include "ExecState.h" 28 #include "JSCell.h"29 28 #include "JSNumberCell.h" 30 29 #include "PropertySlot.h" 31 30 #include "identifier.h" 32 #include "ustring.h"33 31 34 32 namespace KJS { 33 34 class JSString; 35 36 JSString* jsEmptyString(ExecState*); 37 JSString* jsString(ExecState*, const UString&); // returns empty string if passed null string 38 39 JSString* jsSingleCharacterString(ExecState*, UChar); 40 JSString* jsSingleCharacterSubstring(ExecState*, const UString&, unsigned offset); 41 JSString* jsSubstring(ExecState*, const UString&, unsigned offset, unsigned length); 42 43 // Non-trivial strings are two or more characters long. 44 // These functions are faster than just calling jsString. 45 JSString* jsNontrivialString(ExecState*, const UString&); 46 JSString* jsNontrivialString(ExecState*, const char*); 47 48 // Should be used for strings that are owned by an object that will 49 // likely outlive the JSValue this makes, such as the parse tree or a 50 // DOM object that contains a UString 51 JSString* jsOwnedString(ExecState*, const UString&); 35 52 36 53 class JSString : public JSCell { … … 47 64 { 48 65 } 49 66 JSString(PassRefPtr<UString::Rep> value, HasOtherOwnerType) 67 : m_value(value) 68 { 69 } 70 50 71 const UString& value() const { return m_value; } 51 72 … … 54 75 55 76 bool canGetIndex(unsigned i) { return i < static_cast<unsigned>(m_value.size()); } 56 JSValue* getIndex(ExecState* exec, unsigned i) 57 { 58 ASSERT(canGetIndex(i)); 59 return new (exec) JSString(m_value.substr(i, 1)); 60 } 77 JSString* getIndex(ExecState*, unsigned); 61 78 62 79 private: … … 81 98 }; 82 99 83 JSString* jsString(ExecState*, const UString&); // returns empty string if passed null string 84 JSString* jsString(ExecState*, const char* = ""); // returns empty string if passed 0 100 inline JSString* jsEmptyString(ExecState* exec) 101 { 102 return exec->globalData().smallStrings.emptyString(exec); 103 } 85 104 86 // Should be used for strings that are owned by an object that will 87 // likely outlive the JSValue this makes, such as the parse tree or a 88 // DOM object that contains a UString 89 JSString* jsOwnedString(ExecState*, const UString&); 105 inline JSString* jsSingleCharacterString(ExecState* exec, UChar c) 106 { 107 if (c <= 0xFF) 108 return exec->globalData().smallStrings.singleCharacterString(exec, c); 109 return new (exec) JSString(UString(&c, 1)); 110 } 111 112 inline JSString* jsSingleCharacterSubstring(ExecState* exec, const UString& s, unsigned offset) 113 { 114 ASSERT(offset < static_cast<unsigned>(s.size())); 115 UChar c = s.data()[offset]; 116 if (c <= 0xFF) 117 return exec->globalData().smallStrings.singleCharacterString(exec, c); 118 return new (exec) JSString(UString::Rep::create(s.rep(), offset, 1)); 119 } 120 121 inline JSString* jsNontrivialString(ExecState* exec, const char* s) 122 { 123 ASSERT(s); 124 ASSERT(s[0]); 125 ASSERT(s[1]); 126 return new (exec) JSString(s); 127 } 128 129 inline JSString* jsNontrivialString(ExecState* exec, const UString& s) 130 { 131 ASSERT(s.size() > 1); 132 return new (exec) JSString(s); 133 } 134 135 inline JSString* JSString::getIndex(ExecState* exec, unsigned i) 136 { 137 ASSERT(canGetIndex(i)); 138 return jsSingleCharacterSubstring(exec, m_value, i); 139 } 90 140 91 141 ALWAYS_INLINE bool JSString::getStringPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) 92 142 { 93 143 if (propertyName == exec->propertyNames().length) { 94 slot.setValue(jsNumber(exec, value().size()));144 slot.setValue(jsNumber(exec, m_value.size())); 95 145 return true; 96 146 } … … 99 149 unsigned i = propertyName.toStrictUInt32(&isStrictUInt32); 100 150 if (isStrictUInt32 && i < static_cast<unsigned>(m_value.size())) { 101 slot.setValue(jsS tring(exec, value().substr(i, 1)));151 slot.setValue(jsSingleCharacterSubstring(exec, m_value, i)); 102 152 return true; 103 153 } … … 109 159 { 110 160 if (propertyName < static_cast<unsigned>(m_value.size())) { 111 slot.setValue(jsS tring(exec, value().substr(propertyName, 1)));161 slot.setValue(jsSingleCharacterSubstring(exec, m_value, propertyName)); 112 162 return true; 113 163 }
Note:
See TracChangeset
for help on using the changeset viewer.