Changeset 35775 in webkit for trunk/JavaScriptCore/API/JSStringRef.cpp
- Timestamp:
- Aug 15, 2008, 12:43:48 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/API/JSStringRef.cpp
r35478 r35775 28 28 #include "JSStringRef.h" 29 29 30 #include <wtf/Platform.h> 31 32 #include "APICast.h" 33 #include <kjs/JSType.h> 34 #include <kjs/JSString.h> 35 #include <kjs/operations.h> 36 #include <kjs/ustring.h> 37 #include <kjs/JSValue.h> 30 #include "OpaqueJSString.h" 38 31 #include <wtf/unicode/UTF8.h> 39 32 … … 43 36 JSStringRef JSStringCreateWithCharacters(const JSChar* chars, size_t numChars) 44 37 { 45 return toRef(UString(chars, static_cast<int>(numChars)).rep()->ref());38 return OpaqueJSString::create(chars, numChars).releaseRef(); 46 39 } 47 40 48 41 JSStringRef JSStringCreateWithUTF8CString(const char* string) 49 42 { 50 RefPtr<UString::Rep> result = UString::Rep::createFromUTF8(string); 51 if (result.get() == &UString::Rep::null) 52 return 0; 43 if (string) { 44 size_t length = strlen(string); 45 Vector<UChar, 1024> buffer(length); 46 UChar* p = buffer.data(); 47 if (conversionOK == convertUTF8ToUTF16(&string, string + length, &p, p + length)) 48 return OpaqueJSString::create(buffer.data(), p - buffer.data()).releaseRef(); 49 } 53 50 54 return toRef(result.release().releaseRef()); 51 // Null string. 52 return OpaqueJSString::create().releaseRef(); 55 53 } 56 54 57 55 JSStringRef JSStringRetain(JSStringRef string) 58 56 { 59 UString::Rep* rep = toJS(string);60 return toRef(rep->ref());57 string->ref(); 58 return string; 61 59 } 62 60 63 61 void JSStringRelease(JSStringRef string) 64 62 { 65 UString::Rep* rep = toJS(string); 66 bool needsLocking = rep->identifierTable(); 67 if (needsLocking) { 68 // It is wasteful to take the lock for non-shared contexts, but we don't have a good way 69 // to determine what the context is. 70 rep->deref(); 71 } else 72 rep->deref(); 63 string->deref(); 73 64 } 74 65 75 66 size_t JSStringGetLength(JSStringRef string) 76 67 { 77 UString::Rep* rep = toJS(string); 78 return rep->size(); 68 return string->length(); 79 69 } 80 70 81 71 const JSChar* JSStringGetCharactersPtr(JSStringRef string) 82 72 { 83 UString::Rep* rep = toJS(string); 84 return reinterpret_cast<const JSChar*>(rep->data()); 73 return string->characters(); 85 74 } 86 75 87 76 size_t JSStringGetMaximumUTF8CStringSize(JSStringRef string) 88 77 { 89 UString::Rep* rep = toJS(string);90 91 78 // Any UTF8 character > 3 bytes encodes as a UTF16 surrogate pair. 92 return rep->size() * 3 + 1; // + 1 for terminating '\0'79 return string->length() * 3 + 1; // + 1 for terminating '\0' 93 80 } 94 81 95 82 size_t JSStringGetUTF8CString(JSStringRef string, char* buffer, size_t bufferSize) 96 83 { 97 UString::Rep* rep = toJS(string);98 CString cString = UString(rep).UTF8String();84 if (!bufferSize) 85 return 0; 99 86 100 size_t length = std::min(bufferSize, cString.size() + 1); // + 1 for terminating '\0' 101 memcpy(buffer, cString.c_str(), length); 102 return length; 87 char* p = buffer; 88 const UChar* d = string->characters(); 89 ConversionResult result = convertUTF16ToUTF8(&d, d + string->length(), &p, p + bufferSize - 1, true); 90 *p++ = '\0'; 91 if (result != conversionOK && result != targetExhausted) 92 return 0; 93 94 return p - buffer; 103 95 } 104 96 105 97 bool JSStringIsEqual(JSStringRef a, JSStringRef b) 106 98 { 107 UString::Rep* aRep = toJS(a); 108 UString::Rep* bRep = toJS(b); 109 110 return UString(aRep) == UString(bRep); 99 unsigned len = a->length(); 100 return len == b->length() && 0 == memcmp(a->characters(), b->characters(), len * sizeof(UChar)); 111 101 } 112 102
Note:
See TracChangeset
for help on using the changeset viewer.