Fix an assertion beneath SerializedScriptValue::deserialize on 32-bit builds (e.g., on Windows)
Passing a JSValue to toRef on 32-bit builds can perform an allocation,
so we need to make sure we hold a JSLock when that occurs.
Reviewed by Oliver Hunt.
* bindings/js/SerializedScriptValue.cpp:
(WebCore::SerializedScriptValueData::serialize):
(WebCore::SerializedScriptValueData::deserialize):
Moved JSLocks from here...
(WebCore::SerializedScriptValue::create):
(WebCore::SerializedScriptValue::deserialize):
...to this higher level, from which toRef can be called.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@54023 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/bindings/js/SerializedScriptValue.cpp b/WebCore/bindings/js/SerializedScriptValue.cpp
index b97b6cf..fd9cb59 100644
--- a/WebCore/bindings/js/SerializedScriptValue.cpp
+++ b/WebCore/bindings/js/SerializedScriptValue.cpp
@@ -598,7 +598,6 @@
SerializedScriptValueData SerializedScriptValueData::serialize(ExecState* exec, JSValue inValue)
{
- JSLock lock(SilenceAssertionsOnly);
SerializingTreeWalker context(exec);
return walk<SerializingTreeWalker>(context, inValue);
}
@@ -761,7 +760,6 @@
JSValue SerializedScriptValueData::deserialize(ExecState* exec, JSGlobalObject* global, bool mustCopy) const
{
- JSLock lock(SilenceAssertionsOnly);
DeserializingTreeWalker context(exec, global, mustCopy);
return walk<DeserializingTreeWalker>(context, *this);
}
@@ -921,6 +919,7 @@
PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(JSContextRef originContext, JSValueRef apiValue, JSValueRef* exception)
{
+ JSLock lock(SilenceAssertionsOnly);
ExecState* exec = toJS(originContext);
JSValue value = toJS(exec, apiValue);
PassRefPtr<SerializedScriptValue> serializedValue = SerializedScriptValue::create(exec, value);
@@ -936,6 +935,7 @@
JSValueRef SerializedScriptValue::deserialize(JSContextRef destinationContext, JSValueRef* exception)
{
+ JSLock lock(SilenceAssertionsOnly);
ExecState* exec = toJS(destinationContext);
JSValue value = deserialize(exec, exec->lexicalGlobalObject());
if (exec->hadException()) {