| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- //-------------------------------------------------------------------------------------------------------
- // 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);
- }
- }
|