-// -*- mode: c++; c-basic-offset: 4 -*-
/*
- * Copyright (C) 2006, 2007 Apple Computer, Inc. All rights reserved.
+ * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
#include "JSStringRefCF.h"
#include "APICast.h"
+#include "InitializeThreading.h"
+#include "JSCJSValue.h"
#include "JSStringRef.h"
-#include <kjs/JSLock.h>
-#include <kjs/ustring.h>
-#include <kjs/value.h>
-
-using namespace KJS;
+#include "OpaqueJSString.h"
+#include <wtf/StdLibExtras.h>
JSStringRef JSStringCreateWithCFString(CFStringRef string)
{
- JSLock lock;
- CFIndex length = CFStringGetLength(string);
- UString::Rep* rep;
+ JSC::initializeThreading();
+
+ // We cannot use CFIndex here since CFStringGetLength can return values larger than
+ // it can hold. (<rdar://problem/6806478>)
+ size_t length = CFStringGetLength(string);
if (!length)
- rep = UString("").rep()->ref();
- else {
- UniChar* buffer = static_cast<UniChar*>(fastMalloc(sizeof(UniChar) * length));
- CFStringGetCharacters(string, CFRangeMake(0, length), buffer);
- rep = UString(reinterpret_cast<UChar*>(buffer), length, false).rep()->ref();
- }
- return toRef(rep);
+ return &OpaqueJSString::create(reinterpret_cast<const LChar*>(""), 0).leakRef();
+
+ Vector<LChar, 1024> lcharBuffer(length);
+ CFIndex usedBufferLength;
+ CFIndex convertedSize = CFStringGetBytes(string, CFRangeMake(0, length), kCFStringEncodingISOLatin1, 0, false, lcharBuffer.data(), length, &usedBufferLength);
+ if (static_cast<size_t>(convertedSize) == length && static_cast<size_t>(usedBufferLength) == length)
+ return &OpaqueJSString::create(lcharBuffer.data(), length).leakRef();
+
+ auto buffer = std::make_unique<UniChar[]>(length);
+ CFStringGetCharacters(string, CFRangeMake(0, length), buffer.get());
+ static_assert(sizeof(UniChar) == sizeof(UChar), "UniChar and UChar must be same size");
+ return &OpaqueJSString::create(reinterpret_cast<UChar*>(buffer.get()), length).leakRef();
}
-CFStringRef JSStringCopyCFString(CFAllocatorRef alloc, JSStringRef string)
+CFStringRef JSStringCopyCFString(CFAllocatorRef allocator, JSStringRef string)
{
- UString::Rep* rep = toJS(string);
- return CFStringCreateWithCharacters(alloc, reinterpret_cast<const UniChar*>(rep->data()), rep->size());
+ if (!string || !string->length())
+ return CFSTR("");
+
+ if (string->is8Bit())
+ return CFStringCreateWithBytes(allocator, reinterpret_cast<const UInt8*>(string->characters8()), string->length(), kCFStringEncodingISOLatin1, false);
+
+ return CFStringCreateWithCharacters(allocator, reinterpret_cast<const UniChar*>(string->characters16()), string->length());
}