| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- //-------------------------------------------------------------------------------------------------------
- // 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"
- Region *
- Region::New(RegionType type, Region * parent, Func * func)
- {
- Region * region = JitAnew(func->m_alloc, Region);
- region->type = type;
- region->parent = parent;
- region->bailoutReturnThunkLabel = IR::LabelInstr::New(Js::OpCode::Label, func, true);
- if (type == RegionTypeTry)
- {
- region->selfOrFirstTryAncestor = region;
- }
- return region;
- }
- void
- Region::AllocateEHBailoutData(Func * func, IR::Instr * tryInstr)
- {
- if (this->GetType() == RegionTypeRoot)
- {
- this->ehBailoutData = NativeCodeDataNew(func->GetNativeCodeDataAllocator(), Js::EHBailoutData, -1 /*nestingDepth*/, 0 /*catchOffset*/, nullptr /*parent*/);
- }
- else
- {
- this->ehBailoutData = NativeCodeDataNew(func->GetNativeCodeDataAllocator(), Js::EHBailoutData, this->GetParent()->ehBailoutData->nestingDepth + 1, 0, this->GetParent()->ehBailoutData);
- if (this->GetType() == RegionTypeTry)
- {
- Assert(tryInstr);
- if (tryInstr->m_opcode == Js::OpCode::TryCatch)
- {
- this->ehBailoutData->catchOffset = tryInstr->AsBranchInstr()->GetTarget()->GetByteCodeOffset(); // ByteCode offset of the Catch
- }
- }
- }
- }
- Region *
- Region::GetSelfOrFirstTryAncestor()
- {
- if (!this->selfOrFirstTryAncestor)
- {
- Region* region = this;
- while (region && region->GetType() != RegionTypeTry)
- {
- region = region->GetParent();
- }
- this->selfOrFirstTryAncestor = region;
- }
- return this->selfOrFirstTryAncestor;
- }
|