blob: 9da14c65056f881b3e196af96b730977b6c5a16c [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#include "RuntimeLibraryPch.h"
namespace Js
{
DEFINE_RECYCLER_TRACKER_PERF_COUNTER(LiteralString);
LiteralString::LiteralString(StaticType * type) : JavascriptString(type)
{
}
LiteralString::LiteralString(StaticType * type, const char16* content, charcount_t charLength) :
JavascriptString(type, charLength, content)
{
#if defined(DBG) && defined(_M_IX86)
// Make sure content isn't on the stack by comparing to stack bounds in TIB
AssertMsg(!ThreadContext::IsOnStack((void*)content),
"LiteralString object created using stack buffer...");
#endif
#if SYSINFO_IMAGE_BASE_AVAILABLE
AssertMsg(AutoSystemInfo::IsJscriptModulePointer((void *)content)
|| type->GetScriptContext()->GetRecycler()->IsValidObject((void *)content),
"LiteralString can only be used with static or GC strings");
#endif
#ifdef PROFILE_STRINGS
StringProfiler::RecordNewString( type->GetScriptContext(), content, charLength );
#endif
}
LiteralString* LiteralString::New(StaticType* type, const char16* content, charcount_t charLength, Recycler* recycler)
{
return RecyclerNew(recycler, LiteralString, type, content, charLength);
}
LiteralString* LiteralString::CreateEmptyString(StaticType* type)
{
return RecyclerNew(type->GetScriptContext()->GetRecycler(), LiteralString, type, _u(""), 0);
}
ArenaLiteralString::ArenaLiteralString(StaticType * type, const char16* content, charcount_t charLength) :
JavascriptString(type, charLength, content)
{
#if defined(DBG) && defined(_M_IX86)
// Make sure content isn't on the stack by comparing to stack bounds in TIB
AssertMsg(!ThreadContext::IsOnStack((void*)content),
"ArenaLiteralString object created using stack buffer...");
#endif
AssertMsg(!type->GetScriptContext()->GetRecycler()->IsValidObject((void *)content),
"ArenaLiteralString should not be used with GC strings");
#ifdef PROFILE_STRINGS
StringProfiler::RecordNewString( type->GetScriptContext(), content, charLength );
#endif
}
ArenaLiteralString* ArenaLiteralString::New(StaticType* type, const char16* content, charcount_t charLength, Recycler* recycler)
{
return RecyclerNew(recycler, ArenaLiteralString, type, content, charLength);
}
ArenaLiteralString* ArenaLiteralString::New(StaticType* type, const char16* content, charcount_t charLength, ArenaAllocator* arena)
{
return Anew(arena, ArenaLiteralString, type, content, charLength);
}
RecyclableObject * ArenaLiteralString::CloneToScriptContext(ScriptContext* requestContext)
{
return JavascriptString::NewCopyBuffer(this->GetSz(), this->GetLength(), requestContext);
}
} // namespace Js