blob: 25d907882aab3c78a01f8385224071521ebbc259 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#include "SCACorePch.h"
namespace Js
{
namespace SCACore
{
HRESULT ValidateTransferableVars(Var *vars, size_t count)
{
for (size_t i = 0; i < count; i++)
{
Js::TypeId typeId = Js::JavascriptOperators::GetTypeId(vars[i]);
if (typeId != TypeIds_ArrayBuffer)
{
AssertMsg(false, "These should have been filtered out by the host.");
return E_SCA_TRANSFERABLE_UNSUPPORTED;
}
if (Js::JavascriptOperators::IsObjectDetached(vars[i]))
{
return E_SCA_TRANSFERABLE_NEUTERED;
}
}
return S_OK;
}
HRESULT Serializer::SetTransferableVars(Var *vars, size_t count)
{
if (m_transferableVars != nullptr)
{
Assert(false);
return E_FAIL;
}
else if (count > 0)
{
HRESULT hr = ValidateTransferableVars(vars, count);
if (hr != S_OK)
{
return hr;
}
m_transferableVars = vars;
m_cTransferableVars = count;
}
return S_OK;
}
bool Serializer::WriteValue(Var rootObject)
{
ScriptContext *scriptContext = m_streamWriter.GetScriptContext();
BEGIN_JS_RUNTIME_CALL(scriptContext)
{
Js::SCASerializationEngine::Serialize(rootObject, &m_streamWriter, m_transferableVars, m_cTransferableVars, nullptr /*TBD*/);
}
END_JS_RUNTIME_CALL(scriptContext)
return true;
}
bool Serializer::DetachArrayBuffer()
{
Assert(false);
return true;
}
void Serializer::WriteRawBytes(const void* source, size_t length)
{
ScriptContext *scriptContext = m_streamWriter.GetScriptContext();
BEGIN_JS_RUNTIME_CALL(scriptContext)
{
m_streamWriter.Write(source, length);
}
END_JS_RUNTIME_CALL(scriptContext)
}
bool Serializer::Release(byte** data, size_t *dataLength)
{
*data = m_streamWriter.GetBuffer();
*dataLength = m_streamWriter.GetLength();
return true;
}
bool Deserializer::ReadRawBytes(size_t length, void **data)
{
m_streamReader.ReadRawBytes(data, length);
return true;
}
bool Deserializer::ReadBytes(size_t length, void **data)
{
m_streamReader.Read(*data, length);
return true;
}
Var Deserializer::ReadValue()
{
Var returnedValue = nullptr;
ScriptContext *scriptContext = m_streamReader.GetScriptContext();
BEGIN_JS_RUNTIME_CALL(scriptContext)
{
returnedValue = Js::SCADeserializationEngine::Deserialize(&m_streamReader, m_transferableVars, m_cTransferableVars);
}
END_JS_RUNTIME_CALL(scriptContext)
return returnedValue;
}
HRESULT Deserializer::SetTransferableVars(Var *vars, size_t count)
{
if (m_transferableVars != nullptr)
{
Assert(false);
return E_FAIL;
}
else if (count > 0)
{
HRESULT hr = ValidateTransferableVars(vars, count);
if (hr != S_OK)
{
return hr;
}
m_transferableVars = vars;
m_cTransferableVars = count;
}
return S_OK;
}
}
}