blob: 5f4495eaca479b3ec8548d5a527b0c93ade5ae24 [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
// ChakraDiag does not link with Runtime.lib and does not include .cpp files, so this file will be included as a header
// For these reasons, we need the functions marked as inline in this file to remain inline
#include "RuntimeLibraryPch.h"
#include "DataStructures/LargeStack.h"
namespace Js
{
#pragma region StringCopyInfo
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
inline StringCopyInfo::StringCopyInfo()
{
// This constructor is just to satisfy LargeStack for now, as it creates an array of these. Ideally, it should only
// instantiate this class for pushed items using the copy constructor.
#if DBG
isInitialized = false;
#endif
}
// In the ChakraDiag case, this file is #included so the method needs to be marked as inline
// In the ChakraCore case, it's compiled standalone and then linked with, and the StringCopyInfo
// constructor is referenced by other translation units so it needs to not be inline
JS_DIAG_INLINE StringCopyInfo::StringCopyInfo(
JavascriptString *const sourceString,
_Inout_count_(sourceString->m_charLength) char16 *const destinationBuffer)
: sourceString(sourceString), destinationBuffer(destinationBuffer)
{
Assert(sourceString);
Assert(destinationBuffer);
#if DBG
isInitialized = true;
#endif
}
JS_DIAG_INLINE JavascriptString *StringCopyInfo::SourceString() const
{
Assert(isInitialized);
return sourceString;
}
JS_DIAG_INLINE char16 *StringCopyInfo::DestinationBuffer() const
{
Assert(isInitialized);
return destinationBuffer;
}
#ifndef IsJsDiag
void StringCopyInfo::InstantiateForceInlinedMembers()
{
// Force-inlined functions defined in a translation unit need a reference from an extern non-force-inlined function in
// the same translation unit to force an instantiation of the force-inlined function. Otherwise, if the force-inlined
// function is not referenced in the same translation unit, it will not be generated and the linker is not able to find
// the definition to inline the function in other translation units.
AnalysisAssert(false);
StringCopyInfo copyInfo;
JavascriptString *const string = nullptr;
char16 *const buffer = nullptr;
(StringCopyInfo());
(StringCopyInfo(string, buffer));
copyInfo.SourceString();
copyInfo.DestinationBuffer();
}
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma endregion
#pragma region StringCopyInfoStack
#ifndef IsJsDiag
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
StringCopyInfoStack::StringCopyInfoStack(ScriptContext *const scriptContext)
: scriptContext(scriptContext), allocator(nullptr), stack(nullptr)
{
Assert(scriptContext);
}
StringCopyInfoStack::~StringCopyInfoStack()
{
if (allocator)
{
scriptContext->ReleaseTemporaryAllocator(allocator);
}
}
bool StringCopyInfoStack::IsEmpty()
{
Assert(!allocator == !stack);
return !stack || !!stack->Empty();
}
void StringCopyInfoStack::Push(const StringCopyInfo copyInfo)
{
Assert(!allocator == !stack);
if(!stack)
CreateStack();
stack->Push(copyInfo);
}
const StringCopyInfo StringCopyInfoStack::Pop()
{
Assert(allocator);
Assert(stack);
return stack->Pop();
}
void StringCopyInfoStack::CreateStack()
{
Assert(!allocator);
Assert(!stack);
allocator = scriptContext->GetTemporaryAllocator(_u("StringCopyInfoStack"));
Assert(allocator);
stack = LargeStack<StringCopyInfo>::New(allocator->GetAllocator());
Assert(stack);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#endif
#pragma endregion
}