summaryrefslogtreecommitdiffstats
path: root/WebCore/bindings/v8/V8Binding.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/bindings/v8/V8Binding.cpp')
-rw-r--r--WebCore/bindings/v8/V8Binding.cpp23
1 files changed, 15 insertions, 8 deletions
diff --git a/WebCore/bindings/v8/V8Binding.cpp b/WebCore/bindings/v8/V8Binding.cpp
index 97805c0..1272fd4 100644
--- a/WebCore/bindings/v8/V8Binding.cpp
+++ b/WebCore/bindings/v8/V8Binding.cpp
@@ -442,25 +442,29 @@ static void cachedStringCallback(v8::Persistent<v8::Value> wrapper, void* parame
stringImpl->deref();
}
-v8::Local<v8::String> v8ExternalString(const String& string)
+RefPtr<StringImpl> lastStringImpl = 0;
+v8::Persistent<v8::String> lastV8String;
+
+v8::Local<v8::String> v8ExternalStringSlow(StringImpl* stringImpl)
{
- StringImpl* stringImpl = string.impl();
- if (!stringImpl || !stringImpl->length())
+ if (!stringImpl->length())
return v8::String::Empty();
if (!stringImplCacheEnabled)
- return makeExternalString(string);
+ return makeExternalString(String(stringImpl));
StringCache& stringCache = getStringCache();
v8::String* cachedV8String = stringCache.get(stringImpl);
- if (cachedV8String)
- {
+ if (cachedV8String) {
v8::Persistent<v8::String> handle(cachedV8String);
- if (!handle.IsNearDeath() && !handle.IsEmpty())
+ if (!handle.IsNearDeath() && !handle.IsEmpty()) {
+ lastStringImpl = stringImpl;
+ lastV8String = handle;
return v8::Local<v8::String>::New(handle);
+ }
}
- v8::Local<v8::String> newString = makeExternalString(string);
+ v8::Local<v8::String> newString = makeExternalString(String(stringImpl));
if (newString.IsEmpty())
return newString;
@@ -472,6 +476,9 @@ v8::Local<v8::String> v8ExternalString(const String& string)
wrapper.MakeWeak(stringImpl, cachedStringCallback);
stringCache.set(stringImpl, *wrapper);
+ lastStringImpl = stringImpl;
+ lastV8String = wrapper;
+
return newString;
}