//------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #include "Backend.h" CompileAssert(sizeof(FixedFieldIDL) == sizeof(FixedFieldInfo)); /* static */ void FixedFieldInfo::PopulateFixedField(_In_opt_ Js::Type * type, _In_opt_ Js::Var var, _Out_ FixedFieldInfo * fixed) { FixedFieldIDL * rawFF = fixed->GetRaw(); rawFF->fieldValue = var; rawFF->nextHasSameFixedField = false; if (var != nullptr && Js::JavascriptFunction::Is(var)) { Js::JavascriptFunction * funcObj = Js::JavascriptFunction::FromVar(var); rawFF->valueType = ValueType::FromObject(funcObj).GetRawData(); rawFF->funcInfoAddr = (void*)funcObj->GetFunctionInfo(); rawFF->isClassCtor = funcObj->GetFunctionInfo()->IsClassConstructor(); rawFF->localFuncId = funcObj->GetFunctionInfo()->GetLocalFunctionId(); if (Js::ScriptFunction::Is(var)) { rawFF->environmentAddr = (void*)Js::ScriptFunction::FromVar(funcObj)->GetEnvironment(); } } if (type != nullptr) { JITType::BuildFromJsType(type, (JITType*)&rawFF->type); } } void FixedFieldInfo::SetNextHasSameFixedField() { m_data.nextHasSameFixedField = TRUE; } bool FixedFieldInfo::IsClassCtor() const { return m_data.isClassCtor != FALSE; } bool FixedFieldInfo::NextHasSameFixedField() const { return m_data.nextHasSameFixedField != FALSE; } Js::LocalFunctionId FixedFieldInfo::GetLocalFuncId() const { return m_data.localFuncId; } ValueType FixedFieldInfo::GetValueType() const { CompileAssert(sizeof(ValueType) == sizeof(uint16)); return *(ValueType*)&m_data.valueType; } intptr_t FixedFieldInfo::GetFieldValue() const { return (intptr_t)PointerValue(m_data.fieldValue); } intptr_t FixedFieldInfo::GetFuncInfoAddr() const { return (intptr_t)PointerValue(m_data.funcInfoAddr); } intptr_t FixedFieldInfo::GetEnvironmentAddr() const { return (intptr_t)PointerValue(m_data.environmentAddr); } JITType * FixedFieldInfo::GetType() const { if (m_data.type.exists) { return (JITType*)&m_data.type; } else { return nullptr; } } FixedFieldIDL * FixedFieldInfo::GetRaw() { return &m_data; }