//------------------------------------------------------------------------------------------------------- // 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" #include "JitTransferData.h" using namespace Js; void JitTransferData::AddJitTimeTypeRef(void* typeRef, Recycler* recycler) { Assert(typeRef != nullptr); EnsureJitTimeTypeRefs(recycler); this->jitTimeTypeRefs->AddNew(typeRef); } void JitTransferData::EnsureJitTimeTypeRefs(Recycler* recycler) { if (this->jitTimeTypeRefs == nullptr) { this->jitTimeTypeRefs = RecyclerNew(recycler, TypeRefSet, recycler); } } void JitTransferData::RecordTypeGuards(int typeGuardCount, TypeGuardTransferEntry* typeGuardTransferRecord, size_t typeGuardTransferPlusSize) { this->propertyGuardCount = typeGuardCount; this->propertyGuardsByPropertyId = typeGuardTransferRecord; this->propertyGuardsByPropertyIdPlusSize = typeGuardTransferPlusSize; } void JitTransferData::RecordCtorCacheGuards(CtorCacheGuardTransferEntry* ctorCacheTransferRecord, size_t ctorCacheTransferPlusSize) { this->ctorCacheGuardsByPropertyId = ctorCacheTransferRecord; this->ctorCacheGuardsByPropertyIdPlusSize = ctorCacheTransferPlusSize; } void JitTransferData::Cleanup() { // This dictionary is recycler allocated so it doesn't need to be explicitly freed. this->jitTimeTypeRefs = nullptr; if (this->lazyBailoutProperties != nullptr) { HeapDeleteArray(this->lazyBailoutPropertyCount, this->lazyBailoutProperties); this->lazyBailoutProperties = nullptr; } // All structures below are heap allocated and need to be freed explicitly. if (this->runtimeTypeRefs != nullptr) { if (this->runtimeTypeRefs->isOOPJIT) { midl_user_free(this->runtimeTypeRefs); } else { HeapDeletePlus(offsetof(PinnedTypeRefsIDL, typeRefs) + sizeof(void*)*this->runtimeTypeRefs->count - sizeof(PinnedTypeRefsIDL), PointerValue(this->runtimeTypeRefs)); } this->runtimeTypeRefs = nullptr; } if (this->propertyGuardsByPropertyId != nullptr) { HeapDeletePlus(this->propertyGuardsByPropertyIdPlusSize, this->propertyGuardsByPropertyId); this->propertyGuardsByPropertyId = nullptr; } this->propertyGuardCount = 0; this->propertyGuardsByPropertyIdPlusSize = 0; if (this->ctorCacheGuardsByPropertyId != nullptr) { HeapDeletePlus(this->ctorCacheGuardsByPropertyIdPlusSize, this->ctorCacheGuardsByPropertyId); this->ctorCacheGuardsByPropertyId = nullptr; } this->ctorCacheGuardsByPropertyIdPlusSize = 0; if (this->equivalentTypeGuards != nullptr) { HeapDeleteArray(this->equivalentTypeGuardCount, this->equivalentTypeGuards); this->equivalentTypeGuards = nullptr; } this->equivalentTypeGuardCount = 0; if (this->jitTransferRawData != nullptr) { HeapDelete(this->jitTransferRawData); this->jitTransferRawData = nullptr; } if (this->equivalentTypeGuardOffsets) { midl_user_free(this->equivalentTypeGuardOffsets); } if (this->typeGuardTransferData.entries != nullptr) { auto next = &this->typeGuardTransferData.entries; while (*next) { auto current = (*next); *next = (*next)->next; midl_user_free(current); } } if (this->ctorCacheTransferData.entries != nullptr) { CtorCacheTransferEntryIDL ** entries = this->ctorCacheTransferData.entries; for (uint i = 0; i < this->ctorCacheTransferData.ctorCachesCount; ++i) { midl_user_free(entries[i]); } midl_user_free(entries); } }