#include "config.h"
#include "V8Binding.h"
#include "AtomicString.h"
#include "CString.h"
#include "MathExtras.h"
#include "PlatformString.h"
#include "StringBuffer.h"
#include <v8.h>
namespace WebCore {
class WebCoreStringResource : public v8::String::ExternalStringResource {
public:
explicit WebCoreStringResource(const String& string)
: m_impl(string.impl())
{
}
virtual ~WebCoreStringResource() { }
const uint16_t* data() const
{
return reinterpret_cast<const uint16_t*>(m_impl.characters());
}
size_t length() const { return m_impl.length(); }
String webcoreString() { return m_impl; }
private:
String m_impl;
};
String v8StringToWebCoreString(v8::Handle<v8::String> v8String, bool externalize)
{
WebCoreStringResource* stringResource = static_cast<WebCoreStringResource*>(v8String->GetExternalStringResource());
if (stringResource)
return stringResource->webcoreString();
int length = v8String->Length();
if (!length) {
return StringImpl::empty();
}
UChar* buffer;
String result = String::createUninitialized(length, buffer);
v8String->Write(reinterpret_cast<uint16_t*>(buffer), 0, length);
if (externalize) {
WebCoreStringResource* resource = new WebCoreStringResource(result);
if (!v8String->MakeExternal(resource)) {
delete resource;
}
}
return result;
}
String v8ValueToWebCoreString(v8::Handle<v8::Value> object)
{
if (object->IsString())
return v8StringToWebCoreString(v8::Handle<v8::String>::Cast(object), true);
if (object->IsInt32()) {
int value = object->Int32Value();
const int kLowNumbers = 100;
static AtomicString lowNumbers[kLowNumbers + 1];
String webCoreString;
if (0 <= value && value <= kLowNumbers) {
webCoreString = lowNumbers[value];
if (!webCoreString) {
AtomicString valueString = AtomicString(String::number(value));
lowNumbers[value] = valueString;
webCoreString = valueString;
}
} else
webCoreString = String::number(value);
return webCoreString;
}
v8::TryCatch block;
v8::Handle<v8::String> v8String = object->ToString();
if (v8String.IsEmpty())
return StringImpl::empty();
return v8StringToWebCoreString(v8String, false);
}
AtomicString v8StringToAtomicWebCoreString(v8::Handle<v8::String> v8String)
{
String string = v8StringToWebCoreString(v8String, true);
return AtomicString(string);
}
AtomicString v8ValueToAtomicWebCoreString(v8::Handle<v8::Value> v8String)
{
String string = v8ValueToWebCoreString(v8String);
return AtomicString(string);
}
v8::Handle<v8::String> v8String(const String& string)
{
if (!string.length())
return v8::String::Empty();
return v8::String::NewExternal(new WebCoreStringResource(string));
}
v8::Local<v8::String> v8ExternalString(const String& string)
{
if (!string.length())
return v8::String::Empty();
return v8::String::NewExternal(new WebCoreStringResource(string));
}
}