From 3326b03bb10e7c295b509b58f9014d26cf7f6089 Mon Sep 17 00:00:00 2001 From: "ap@webkit.org" Date: Tue, 13 May 2008 09:46:47 +0000 Subject: [PATCH] Reviewed by Geoffrey Garen. JavaScriptCore API claims to work with UTF8 strings, but only works with ASCII strings * kjs/ustring.h: * kjs/ustring.cpp: (KJS::UString::Rep::createFromUTF8): Added. Implementation adapted from JSStringCreateWithUTF8CString(). * API/JSStringRef.cpp: (JSStringCreateWithUTF8CString): * API/JSClassRef.cpp: (OpaqueJSClass::OpaqueJSClass): Use UString::Rep::createFromUTF8(). git-svn-id: https://svn.webkit.org/repository/webkit/trunk@33374 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- JavaScriptCore/API/JSClassRef.cpp | 9 +++------ JavaScriptCore/API/JSStringRef.cpp | 8 +++----- JavaScriptCore/ChangeLog | 18 ++++++++++++++++++ JavaScriptCore/kjs/ustring.cpp | 14 ++++++++++++++ JavaScriptCore/kjs/ustring.h | 4 ++++ 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/JavaScriptCore/API/JSClassRef.cpp b/JavaScriptCore/API/JSClassRef.cpp index ee1717c..2c01a40 100644 --- a/JavaScriptCore/API/JSClassRef.cpp +++ b/JavaScriptCore/API/JSClassRef.cpp @@ -39,8 +39,7 @@ using namespace KJS; const JSClassDefinition kJSClassDefinitionEmpty = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; OpaqueJSClass::OpaqueJSClass(const JSClassDefinition* definition, OpaqueJSClass* protoClass) - // FIXME: - : className(definition->className) + : className(UString::Rep::createFromUTF8(definition->className)) , parentClass(definition->parentClass) , prototypeClass(0) , staticValues(0) @@ -61,8 +60,7 @@ OpaqueJSClass::OpaqueJSClass(const JSClassDefinition* definition, OpaqueJSClass* if (const JSStaticValue* staticValue = definition->staticValues) { staticValues = new StaticValuesTable(); while (staticValue->name) { - // FIXME: - staticValues->add(Identifier(staticValue->name).ustring().rep(), + staticValues->add(Identifier(UString::Rep::createFromUTF8(staticValue->name).get()).ustring().rep(), new StaticValueEntry(staticValue->getProperty, staticValue->setProperty, staticValue->attributes)); ++staticValue; } @@ -71,8 +69,7 @@ OpaqueJSClass::OpaqueJSClass(const JSClassDefinition* definition, OpaqueJSClass* if (const JSStaticFunction* staticFunction = definition->staticFunctions) { staticFunctions = new StaticFunctionsTable(); while (staticFunction->name) { - // FIXME: - staticFunctions->add(Identifier(staticFunction->name).ustring().rep(), + staticFunctions->add(Identifier(UString::Rep::createFromUTF8(staticFunction->name).get()).ustring().rep(), new StaticFunctionEntry(staticFunction->callAsFunction, staticFunction->attributes)); ++staticFunction; } diff --git a/JavaScriptCore/API/JSStringRef.cpp b/JavaScriptCore/API/JSStringRef.cpp index 9e9f06d..13dfae6 100644 --- a/JavaScriptCore/API/JSStringRef.cpp +++ b/JavaScriptCore/API/JSStringRef.cpp @@ -51,13 +51,11 @@ JSStringRef JSStringCreateWithUTF8CString(const char* string) { JSLock lock; - size_t length = strlen(string); - Vector buffer(length); - UChar* p = buffer.data(); - if (conversionOK != convertUTF8ToUTF16(&string, string + length, &p, p + length)) + RefPtr result = UString::Rep::createFromUTF8(string); + if (result.get() == &UString::Rep::null) return 0; - return toRef(UString(buffer.data(), p - buffer.data()).rep()->ref()); + return toRef(result.release().releaseRef()); } JSStringRef JSStringRetain(JSStringRef string) diff --git a/JavaScriptCore/ChangeLog b/JavaScriptCore/ChangeLog index fae525f..a2cfa81 100644 --- a/JavaScriptCore/ChangeLog +++ b/JavaScriptCore/ChangeLog @@ -1,3 +1,21 @@ +2008-05-13 Alexey Proskuryakov + + Reviewed by Geoffrey Garen. + + JavaScriptCore API claims to work with UTF8 strings, but only works + with ASCII strings + + * kjs/ustring.h: + * kjs/ustring.cpp: + (KJS::UString::Rep::createFromUTF8): + Added. Implementation adapted from JSStringCreateWithUTF8CString(). + + * API/JSStringRef.cpp: + (JSStringCreateWithUTF8CString): + * API/JSClassRef.cpp: + (OpaqueJSClass::OpaqueJSClass): + Use UString::Rep::createFromUTF8(). + 2008-05-12 Mark Rowe Reviewed by Tim Hatcher. diff --git a/JavaScriptCore/kjs/ustring.cpp b/JavaScriptCore/kjs/ustring.cpp index 152e2d5..4b351a8 100644 --- a/JavaScriptCore/kjs/ustring.cpp +++ b/JavaScriptCore/kjs/ustring.cpp @@ -238,6 +238,20 @@ PassRefPtr UString::Rep::create(PassRefPtr base, int offset, return adoptRef(r); } +PassRefPtr UString::Rep::createFromUTF8(const char* string) +{ + if (!string) + return &UString::Rep::null; + + size_t length = strlen(string); + Vector buffer(length); + UChar* p = buffer.data(); + if (conversionOK != convertUTF8ToUTF16(&string, string + length, &p, p + length)) + return &UString::Rep::null; + + return UString::Rep::createCopying(buffer.data(), p - buffer.data()); +} + void UString::Rep::destroy() { // Static null and empty strings can never be destroyed, but we cannot rely on reference counting, because ref/deref are not thread-safe. diff --git a/JavaScriptCore/kjs/ustring.h b/JavaScriptCore/kjs/ustring.h index 33b5809..2e44949 100644 --- a/JavaScriptCore/kjs/ustring.h +++ b/JavaScriptCore/kjs/ustring.h @@ -94,6 +94,10 @@ namespace KJS { static PassRefPtr createCopying(const UChar *d, int l); static PassRefPtr create(PassRefPtr base, int offset, int length); + // Constructs a string from a UTF-8 string, using strict conversion (see comments in UTF8.h). + // Returns UString::Rep::null for null input or conversion failure. + static PassRefPtr createFromUTF8(const char*); + void destroy(); bool baseIsSelf() const { return baseString == this; } -- 1.8.3.1