blob: 2483bbcad0ed3e614441db40ed2672f2eba39eab [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
namespace Js
{
template <bool fastHash>
struct EvalMapStringInternal
{
JsUtil::CharacterBuffer<char16> str;
hash_t hash;
ModuleID moduleID;
BOOL strict;
BOOL isLibraryCode;
EvalMapStringInternal() : str(), moduleID(0), strict(FALSE), isLibraryCode(FALSE), hash(0) {};
EvalMapStringInternal(__in_ecount(charLength) char16 const* content, int charLength, ModuleID moduleID, BOOL strict, BOOL isLibraryCode)
: str(content, charLength), moduleID(moduleID), strict(strict), isLibraryCode(isLibraryCode)
{
// NOTE: this hash is not equivalent to the character buffer hash
// Don't use a CharacteBuffer to do a map lookup on the EvalMapString.
if (fastHash)
{
hash = TAGHASH(str.FastHash());
}
else
{
hash = TAGHASH((hash_t)str);
}
};
EvalMapStringInternal& operator=(void * str)
{
Assert(str == null);
memset(this, 0, sizeof(EvalMapString));
return (*this);
}
inline ModuleID GetModuleID() const
{
return moduleID;
}
inline BOOL IsStrict() const
{
return strict;
}
// Equality and hash function
bool operator==(EvalMapStringInternal const& other) const
{
return this->str == other.str &&
this->GetModuleID() == other.GetModuleID() &&
this->IsStrict() == other.IsStrict() &&
this->isLibraryCode == other.isLibraryCode;
}
operator hash_t() const
{
return UNTAGHASH(hash);
}
};
typedef EvalMapStringInternal<true> FastEvalMapString;
typedef EvalMapStringInternal<false> EvalMapString;
void ConvertKey(const FastEvalMapString& src, EvalMapString& dest);
};