blob: e03f930cebe4d5f7e66fd23e7e0b252e5a926ada [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
{
class PropertyString : public JavascriptString
{
protected:
Field(int) hitRate;
Field(PolymorphicInlineCache*) ldElemInlineCache;
Field(PolymorphicInlineCache*) stElemInlineCache;
Field(const Js::PropertyRecord*) propertyRecord;
DEFINE_VTABLE_CTOR(PropertyString, JavascriptString);
DECLARE_CONCRETE_STRING_CLASS;
PropertyString(StaticType* type, const Js::PropertyRecord* propertyRecord);
public:
PolymorphicInlineCache * GetLdElemInlineCache() const;
PolymorphicInlineCache * GetStElemInlineCache() const;
Js::PropertyRecord const * GetPropertyRecord() const { return this->propertyRecord; }
PolymorphicInlineCache * CreateBiggerPolymorphicInlineCache(bool isLdElem);
void LogCacheMiss();
int GetHitRate() const { return this->hitRate; };
void LogCacheHit() { ++this->hitRate; };
bool ShouldUseCache() const;
static PropertyString* New(StaticType* type, const Js::PropertyRecord* propertyRecord, Recycler *recycler);
virtual void const * GetOriginalStringReference() override;
virtual RecyclableObject * CloneToScriptContext(ScriptContext* requestContext) override;
static uint32 GetOffsetOfLdElemInlineCache() { return offsetof(PropertyString, ldElemInlineCache); }
static uint32 GetOffsetOfStElemInlineCache() { return offsetof(PropertyString, stElemInlineCache); }
static uint32 GetOffsetOfHitRate() { return offsetof(PropertyString, hitRate); }
#if ENABLE_DEBUG_CONFIG_OPTIONS
void DumpCache(bool ldElemCache)
{
PolymorphicInlineCache * cache = ldElemCache ? GetLdElemInlineCache() : GetStElemInlineCache();
Output::Print(_u("PropertyCache HitRate: %i; types: "), this->hitRate);
for (uint i = 0; i < cache->GetSize(); ++i)
{
Output::Print(_u("%p,"), cache->GetInlineCaches()[i].GetType());
}
Output::Print(_u("\n"));
}
#endif
#if ENABLE_TTD
//Get the associated property id for this string if there is on (e.g. it is a propertystring otherwise return Js::PropertyIds::_none)
virtual Js::PropertyId TryGetAssociatedPropertyId() const override { return this->propertyRecord->GetPropertyId(); }
#endif
public:
virtual VTableValue DummyVirtualFunctionToHinderLinkerICF()
{
return VTableValue::VtablePropertyString;
}
};
}