From 8df3f8000c704596196c08d1e411b6d5dd126ad2 Mon Sep 17 00:00:00 2001 From: Paul Leathers Date: Wed, 11 May 2016 14:37:16 -0700 Subject: [PATCH 1/6] Restructure the FunctionBody hierarchy so that FunctionInfo is a standalone proxy from which FunctionProxy does not inherit, and FunctionProxy is the basis for all the representations of user functions (FunctionBody, etc.). FunctionInfo still points to the FunctionProxy that implements the function, and FunctionProxy points to FunctionInfo. Do this to facilitate re-deferral and to maximize the memory benefit. --- lib/Backend/Inline.cpp | 38 +-- lib/Backend/Inline.h | 2 +- lib/Backend/InliningDecider.cpp | 4 +- lib/Backend/InterpreterThunkEmitter.cpp | 81 +++--- lib/Backend/InterpreterThunkEmitter.h | 3 +- lib/Backend/Lower.cpp | 11 +- lib/Backend/LowerMDShared.cpp | 6 +- lib/Backend/NativeCodeGenerator.cpp | 6 +- lib/Backend/Opnd.cpp | 11 +- lib/Backend/Opnd.h | 1 + lib/Runtime/Base/FunctionBody.cpp | 187 ++++++------ lib/Runtime/Base/FunctionBody.h | 275 ++++++++++++++++-- lib/Runtime/Base/FunctionInfo.cpp | 5 +- lib/Runtime/Base/FunctionInfo.h | 31 +- lib/Runtime/Base/ScriptContext.cpp | 38 +-- lib/Runtime/Base/ScriptContext.h | 6 +- lib/Runtime/ByteCode/ByteCodeDumper.cpp | 4 +- lib/Runtime/ByteCode/ByteCodeSerializer.cpp | 4 +- lib/Runtime/Debug/TTSnapValues.cpp | 2 +- lib/Runtime/Language/AsmJsModule.cpp | 2 +- lib/Runtime/Language/DynamicProfileInfo.cpp | 8 +- .../Language/FunctionCodeGenJitTimeData.h | 2 +- .../Language/FunctionCodeGenRuntimeData.cpp | 3 +- lib/Runtime/Language/JavascriptOperators.cpp | 12 +- lib/Runtime/Library/GlobalObject.cpp | 3 +- lib/Runtime/Library/JavascriptFunction.cpp | 24 +- lib/Runtime/Library/ScriptFunction.cpp | 33 +-- lib/Runtime/Library/StackScriptFunction.cpp | 7 +- lib/Runtime/Runtime.h | 1 + lib/Runtime/Types/ScriptFunctionType.cpp | 2 +- 30 files changed, 540 insertions(+), 272 deletions(-) diff --git a/lib/Backend/Inline.cpp b/lib/Backend/Inline.cpp index 4423389d8c4..e0a3ee1081f 100644 --- a/lib/Backend/Inline.cpp +++ b/lib/Backend/Inline.cpp @@ -499,8 +499,8 @@ uint Inline::FillInlineesDataArray( Js::FunctionBody *inlineeFunctionBody = inlineeJitTimeData->GetFunctionBody(); if (!PHASE_OFF(Js::PolymorphicInlinePhase, inlineeFunctionBody)) { - const Js::FunctionCodeGenJitTimeData* rightInlineeJitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfo(inlineeFunctionBody); - const Js::FunctionCodeGenRuntimeData* rightInlineeRuntimeData = inlineeRuntimeData->GetRuntimeDataFromFunctionInfo(inlineeFunctionBody); + const Js::FunctionCodeGenJitTimeData* rightInlineeJitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfo(inlineeFunctionBody->GetFunctionInfo()); + const Js::FunctionCodeGenRuntimeData* rightInlineeRuntimeData = inlineeRuntimeData->GetRuntimeDataFromFunctionInfo(inlineeFunctionBody->GetFunctionInfo()); if (rightInlineeJitTimeData) { @@ -551,15 +551,15 @@ void Inline::FillInlineesDataArrayUsingFixedMethods( inlineeFuncBody = inlineeJitTimeData->GetFunctionBody(); if (!PHASE_OFF(Js::PolymorphicInlinePhase, inlineeFuncBody) && !PHASE_OFF(Js::PolymorphicInlineFixedMethodsPhase, inlineeFuncBody)) { - const Js::FunctionCodeGenJitTimeData* jitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfo(inlineeFuncBody); + const Js::FunctionCodeGenJitTimeData* jitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfo(inlineeFuncBody->GetFunctionInfo()); if (jitTimeData) { for (uint16 i = 0; i < cachedFixedInlineeCount; i++) { if (inlineeFuncBody == ((Js::JavascriptFunction*)(fixedFieldInfoArray[i].fieldValue))->GetFunctionBody()) { - inlineesDataArray[i].inlineeJitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfo(inlineeFuncBody); - inlineesDataArray[i].inlineeRuntimeData = inlineeRuntimeData->GetRuntimeDataFromFunctionInfo(inlineeFuncBody); + inlineesDataArray[i].inlineeJitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfo(inlineeFuncBody->GetFunctionInfo()); + inlineesDataArray[i].inlineeRuntimeData = inlineeRuntimeData->GetRuntimeDataFromFunctionInfo(inlineeFuncBody->GetFunctionInfo()); inlineesDataArray[i].functionBody = inlineeFuncBody; break; } @@ -759,7 +759,7 @@ Inline::InlinePolymorphicFunctionUsingFixedMethods(IR::Instr *callInstr, const J if (i == 0) { // Do all the general, non-function-object-specific checks just once. - if (!TryOptimizeCallInstrWithFixedMethod(callInstr, (Js::FunctionInfo*)(inlineesDataArray[i].functionBody), true, false, false, true /*isInlined*/, safeThis, true /*dontOptimizeJustCheck*/, i)) + if (!TryOptimizeCallInstrWithFixedMethod(callInstr, inlineesDataArray[i].functionBody->GetFunctionInfo(), true, false, false, true /*isInlined*/, safeThis, true /*dontOptimizeJustCheck*/, i)) { POLYMORPHIC_INLINE_TESTTRACE(_u("INLINING (Polymorphic; Using Fixed Methods): Skip Inline: can't optimize using Fixed Methods %d (Max: %d)\tInlinee: %s (%s):\tCaller: %s (%s)\n"), inlineeCount, Js::DynamicProfileInfo::maxPolymorphicInliningSize, @@ -771,7 +771,7 @@ Inline::InlinePolymorphicFunctionUsingFixedMethods(IR::Instr *callInstr, const J else { if (methodPropertyOpnd->GetFieldValueAsFixedFunction(i) && - methodPropertyOpnd->GetFieldValueAsFixedFunction(i)->GetFunctionInfo() != (Js::FunctionInfo*)(inlineesDataArray[i].functionBody)) + methodPropertyOpnd->GetFieldValueAsFixedFunction(i)->GetFunctionInfo() != inlineesDataArray[i].functionBody->GetFunctionInfo()) { POLYMORPHIC_INLINE_TESTTRACE(_u("INLINING (Polymorphic; Using Fixed Methods): Skip Inline: can't optimize using Fixed Methods %d (Max: %d)\tInlinee: %s (%s):\tCaller: %s (%s)\n"), inlineeCount, Js::DynamicProfileInfo::maxPolymorphicInliningSize, @@ -1012,7 +1012,7 @@ Inline::InlinePolymorphicFunction(IR::Instr *callInstr, const Js::FunctionCodeGe IR::RegOpnd* functionObject = callInstr->GetSrc1()->AsRegOpnd(); dispatchStartLabel->InsertBefore(IR::BranchInstr::New(Js::OpCode::BrAddr_A, inlineeStartLabel, IR::IndirOpnd::New(functionObject, Js::JavascriptFunction::GetOffsetOfFunctionInfo(), TyMachPtr, dispatchStartLabel->m_func), - IR::AddrOpnd::New(inlineesDataArray[i].functionBody, IR::AddrOpndKindDynamicFunctionBody, dispatchStartLabel->m_func), dispatchStartLabel->m_func)); + IR::AddrOpnd::New(inlineesDataArray[i].functionBody->GetFunctionInfo(), IR::AddrOpndKindDynamicFunctionInfo, dispatchStartLabel->m_func), dispatchStartLabel->m_func)); } CompletePolymorphicInlining(callInstr, returnValueOpnd, doneLabel, dispatchStartLabel, /*ldMethodFldInstr*/nullptr, IR::BailOutOnPolymorphicInlineFunction); @@ -3440,11 +3440,11 @@ Inline::InlineFunctionCommon(IR::Instr *callInstr, StackSym* originalCallTargetS #endif if (callInstr->m_opcode == Js::OpCode::CallIFixed) { - Assert(callInstr->GetFixedFunction()->GetFunctionInfo() == funcBody); + Assert(callInstr->GetFixedFunction()->GetFunctionInfo() == funcBody->GetFunctionInfo()); } else { - PrepareInsertionPoint(callInstr, funcBody, inlineBailoutChecksBeforeInstr); + PrepareInsertionPoint(callInstr, funcBody->GetFunctionInfo(), inlineBailoutChecksBeforeInstr); } Assert(formalCount <= Js::InlineeCallInfo::MaxInlineeArgoutCount); @@ -3961,14 +3961,14 @@ Inline::InsertJsFunctionCheck(IR::Instr *callInstr, IR::Instr *insertBeforeInstr } void -Inline::InsertFunctionBodyCheck(IR::Instr *callInstr, IR::Instr *insertBeforeInstr, IR::Instr* bailoutInstr, Js::FunctionInfo *funcInfo) +Inline::InsertFunctionInfoCheck(IR::Instr *callInstr, IR::Instr *insertBeforeInstr, IR::Instr* bailoutInstr, Js::FunctionInfo *funcInfo) { // if (JavascriptFunction::FromVar(r1)->functionInfo != funcInfo) goto noInlineLabel // BrNeq_I4 noInlineLabel, r1->functionInfo, funcInfo - IR::IndirOpnd* funcBody = IR::IndirOpnd::New(callInstr->GetSrc1()->AsRegOpnd(), Js::JavascriptFunction::GetOffsetOfFunctionInfo(), TyMachPtr, callInstr->m_func); - IR::AddrOpnd* inlinedFuncBody = IR::AddrOpnd::New(funcInfo, IR::AddrOpndKindDynamicFunctionBody, callInstr->m_func); - bailoutInstr->SetSrc1(funcBody); - bailoutInstr->SetSrc2(inlinedFuncBody); + IR::IndirOpnd* opndFuncInfo = IR::IndirOpnd::New(callInstr->GetSrc1()->AsRegOpnd(), Js::JavascriptFunction::GetOffsetOfFunctionInfo(), TyMachPtr, callInstr->m_func); + IR::AddrOpnd* inlinedFuncInfo = IR::AddrOpnd::New(funcInfo, IR::AddrOpndKindDynamicFunctionInfo, callInstr->m_func); + bailoutInstr->SetSrc1(opndFuncInfo); + bailoutInstr->SetSrc2(inlinedFuncInfo); insertBeforeInstr->InsertBefore(bailoutInstr); } @@ -3987,6 +3987,10 @@ Inline::InsertFunctionObjectCheck(IR::Instr *callInstr, IR::Instr *insertBeforeI IR::Instr * Inline::PrepareInsertionPoint(IR::Instr *callInstr, Js::FunctionInfo *funcInfo, IR::Instr *insertBeforeInstr, IR::BailOutKind bailOutKind) { + if (callInstr->m_func == this->topFunc && this->topFunc->GetLocalFunctionId()==160 && callInstr->GetByteCodeOffset()==0x1f) + { + *(volatile int*)this; + } Assert(insertBeforeInstr); Assert(insertBeforeInstr->m_func == callInstr->m_func); Assert(bailOutKind == IR::BailOutOnInlineFunction); @@ -4006,7 +4010,7 @@ Inline::PrepareInsertionPoint(IR::Instr *callInstr, Js::FunctionInfo *funcInfo, InsertFunctionTypeIdCheck(callInstr, insertBeforeInstr, bailOutIfNotJsFunction); // 3. Bailout if function body doesn't match funcInfo - InsertFunctionBodyCheck(callInstr, insertBeforeInstr, primaryBailOutInstr, funcInfo); + InsertFunctionInfoCheck(callInstr, insertBeforeInstr, primaryBailOutInstr, funcInfo); return primaryBailOutInstr; } @@ -5369,4 +5373,4 @@ Inline::Simd128FixLoadStoreInstr(Js::BuiltinFunction builtInId, IR::Instr * call } } -#endif \ No newline at end of file +#endif diff --git a/lib/Backend/Inline.h b/lib/Backend/Inline.h index 5623a8db6bb..af179aa673f 100644 --- a/lib/Backend/Inline.h +++ b/lib/Backend/Inline.h @@ -134,7 +134,7 @@ class Inline void InsertObjectCheck(IR::Instr *callInstr, IR::Instr* insertBeforeInstr, IR::Instr*bailOutInstr); void InsertFunctionTypeIdCheck(IR::Instr *callInstr, IR::Instr* insertBeforeInstr, IR::Instr*bailOutInstr); void InsertJsFunctionCheck(IR::Instr *callInstr, IR::Instr *insertBeforeInstr, IR::BailOutKind bailOutKind); - void InsertFunctionBodyCheck(IR::Instr *callInstr, IR::Instr *insertBeforeInstr, IR::Instr* bailoutInstr, Js::FunctionInfo *funcInfo); + void InsertFunctionInfoCheck(IR::Instr *callInstr, IR::Instr *insertBeforeInstr, IR::Instr* bailoutInstr, Js::FunctionInfo *funcInfo); void InsertFunctionObjectCheck(IR::Instr *callInstr, IR::Instr *insertBeforeInstr, IR::Instr* bailoutInstr, Js::FunctionInfo *funcInfo); void TryResetObjTypeSpecFldInfoOn(IR::PropertySymOpnd* propertySymOpnd); diff --git a/lib/Backend/InliningDecider.cpp b/lib/Backend/InliningDecider.cpp index ca3f1fb85a8..abf7eb65c38 100644 --- a/lib/Backend/InliningDecider.cpp +++ b/lib/Backend/InliningDecider.cpp @@ -151,7 +151,7 @@ uint InliningDecider::InlinePolymorphicCallSite(Js::FunctionBody *const inliner, AssertMsg(inlineeCount >= 2, "There are at least two polymorphic call site"); break; } - if (Inline(inliner, functionBodyArray[inlineeCount], isConstructorCall, true /*isPolymorphicCall*/, 0, profiledCallSiteId, recursiveInlineDepth, false)) + if (Inline(inliner, functionBodyArray[inlineeCount]->GetFunctionInfo(), isConstructorCall, true /*isPolymorphicCall*/, 0, profiledCallSiteId, recursiveInlineDepth, false)) { canInlineArray[inlineeCount] = true; actualInlineeCount++; @@ -272,7 +272,7 @@ Js::FunctionInfo *InliningDecider::Inline(Js::FunctionBody *const inliner, Js::F #endif this->bytecodeInlinedCount += inlinee->GetByteCodeCount(); - return inlinee; + return inlinee->GetFunctionInfo(); } Js::OpCode builtInInlineCandidateOpCode; diff --git a/lib/Backend/InterpreterThunkEmitter.cpp b/lib/Backend/InterpreterThunkEmitter.cpp index efbc5cec8c5..3e465b0f47d 100644 --- a/lib/Backend/InterpreterThunkEmitter.cpp +++ b/lib/Backend/InterpreterThunkEmitter.cpp @@ -6,14 +6,15 @@ #ifdef ENABLE_NATIVE_CODEGEN #ifdef _M_X64 -const BYTE InterpreterThunkEmitter::FunctionBodyOffset = 23; -const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 27; -const BYTE InterpreterThunkEmitter::CallBlockStartAddrOffset = 37; -const BYTE InterpreterThunkEmitter::ThunkSizeOffset = 51; -const BYTE InterpreterThunkEmitter::ErrorOffset = 60; -const BYTE InterpreterThunkEmitter::ThunkAddressOffset = 77; - -const BYTE InterpreterThunkEmitter::PrologSize = 76; +const BYTE InterpreterThunkEmitter::FunctionInfoOffset = 23; +const BYTE InterpreterThunkEmitter::FunctionProxyOffset = 27; +const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 31; +const BYTE InterpreterThunkEmitter::CallBlockStartAddrOffset = 41; +const BYTE InterpreterThunkEmitter::ThunkSizeOffset = 55; +const BYTE InterpreterThunkEmitter::ErrorOffset = 64; +const BYTE InterpreterThunkEmitter::ThunkAddressOffset = 81; + +const BYTE InterpreterThunkEmitter::PrologSize = 80; const BYTE InterpreterThunkEmitter::StackAllocSize = 0x28; // @@ -28,8 +29,9 @@ const BYTE InterpreterThunkEmitter::InterpreterThunk[] = { 0x48, 0x89, 0x4C, 0x24, 0x08, // mov qword ptr [rsp+8],rcx 0x4C, 0x89, 0x44, 0x24, 0x18, // mov qword ptr [rsp+18h],r8 0x4C, 0x89, 0x4C, 0x24, 0x20, // mov qword ptr [rsp+20h],r9 - 0x48, 0x8B, 0x41, 0x00, // mov rax, qword ptr [rcx+FunctionBodyOffset] - 0x48, 0x8B, 0x50, 0x00, // mov rdx, qword ptr [rax+DynamicThunkAddressOffset] + 0x48, 0x8B, 0x41, 0x00, // mov rax, qword ptr [rcx+FunctionInfoOffset] + 0x48, 0x8B, 0x48, 0x00, // mov rcx, qword ptr [rax+FunctionProxyOffset] + 0x48, 0x8B, 0x51, 0x00, // mov rdx, qword ptr [rcx+DynamicThunkAddressOffset] // Range Check for Valid call target 0x48, 0x83, 0xE2, 0xF8, // and rdx, 0xFFFFFFFFFFFFFFF8h ;Force 8 byte alignment 0x48, 0x8b, 0xca, // mov rcx, rdx @@ -45,7 +47,7 @@ const BYTE InterpreterThunkEmitter::InterpreterThunk[] = { 0x48, 0x83, 0xEC, StackAllocSize, // sub rsp,28h 0x48, 0xB8, 0x00, 0x00, 0x00 ,0x00, 0x00, 0x00, 0x00, 0x00, // mov rax, 0xFF, 0xE2, // jmp rdx - 0xCC // int 3 ;for alignment to size of 8 we are adding this + 0xCC, 0xCC, 0xCC, 0xCC, 0xCC // int 3 ;for alignment to size of 8 we are adding this }; const BYTE InterpreterThunkEmitter::Epilog[] = { @@ -54,11 +56,12 @@ const BYTE InterpreterThunkEmitter::Epilog[] = { }; #elif defined(_M_ARM) const BYTE InterpreterThunkEmitter::ThunkAddressOffset = 8; -const BYTE InterpreterThunkEmitter::FunctionBodyOffset = 18; -const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 22; -const BYTE InterpreterThunkEmitter::CallBlockStartAddressInstrOffset = 38; -const BYTE InterpreterThunkEmitter::CallThunkSizeInstrOffset = 50; -const BYTE InterpreterThunkEmitter::ErrorOffset = 60; +const BYTE InterpreterThunkEmitter::FunctionInfoOffset = 18; +const BYTE InterpreterThunkEmitter::FunctionProxyOffset = 22; +const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 26; +const BYTE InterpreterThunkEmitter::CallBlockStartAddressInstrOffset = 42; +const BYTE InterpreterThunkEmitter::CallThunkSizeInstrOffset = 54; +const BYTE InterpreterThunkEmitter::ErrorOffset = 64; const BYTE InterpreterThunkEmitter::InterpreterThunk[] = { 0x0F, 0xB4, // push {r0-r3} @@ -67,7 +70,8 @@ const BYTE InterpreterThunkEmitter::InterpreterThunk[] = { 0x00, 0x00, 0x00, 0x00, // movw r1,ThunkAddress 0x00, 0x00, 0x00, 0x00, // movt r1,ThunkAddress 0xD0, 0xF8, 0x00, 0x20, // ldr.w r2,[r0,#0x00] - 0xD2, 0xF8, 0x00, 0x30, // ldr.w r3,[r2,#0x00] + 0xD2, 0xF8, 0x00, 0x00, // ldr.w r0,[r2,#0x00] + 0xD0, 0xF8, 0x00, 0x30, // ldr.w r3,[r0,#0x00] 0x4F, 0xF6, 0xF9, 0x70, // mov r0,#0xFFF9 0xCF, 0xF6, 0xFF, 0x70, // movt r0,#0xFFFF 0x03, 0xEA, 0x00, 0x03, // and r3,r3,r0 @@ -83,9 +87,7 @@ const BYTE InterpreterThunkEmitter::InterpreterThunk[] = { //$safe: 0x02, 0xA8, // add r0,sp,#8 - 0x18, 0x47, // bx r3 - 0xFE, 0xDE, // int 3 ;Required for alignment - 0xFE, 0xDE // int 3 ;Required for alignment + 0x18, 0x47 // bx r3 }; const BYTE InterpreterThunkEmitter::JmpOffset = 2; @@ -101,9 +103,10 @@ const BYTE InterpreterThunkEmitter::Epilog[] = { 0x5D, 0xF8, 0x14, 0xFB // ldr pc,[sp],#0x14 }; #elif defined(_M_ARM64) -const BYTE InterpreterThunkEmitter::FunctionBodyOffset = 24; -const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 28; -const BYTE InterpreterThunkEmitter::ThunkAddressOffset = 32; +const BYTE InterpreterThunkEmitter::FunctionInfoOffset = 24; +const BYTE InterpreterThunkEmitter::FunctionProxyOffset = 28; +const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 32; +const BYTE InterpreterThunkEmitter::ThunkAddressOffset = 36; //TODO: saravind :Implement Range Check for ARM64 const BYTE InterpreterThunkEmitter::InterpreterThunk[] = { @@ -114,7 +117,8 @@ const BYTE InterpreterThunkEmitter::InterpreterThunk[] = { 0xE4, 0x17, 0x03, 0xA9, //stp x4, x5, [sp, #48] 0xE6, 0x1F, 0x04, 0xA9, //stp x6, x7, [sp, #64] 0x02, 0x00, 0x40, 0xF9, //ldr x2, [x0, #0x00] ;offset will be replaced with Offset of FunctionInfo - 0x43, 0x00, 0x40, 0xF9, //ldr x3, [x2, #0x00] ;offset will be replaced with offset of DynamicInterpreterThunk + 0x40, 0x00, 0x40, 0xF9, //ldr x0, [x2, #0x00] ;offset will be replaced with Offset of FunctionProxy + 0x03, 0x00, 0x40, 0xF9, //ldr x3, [x0, #0x00] ;offset will be replaced with offset of DynamicInterpreterThunk //Following 4 MOV Instrs are to move the 64-bit address of the InterpreterThunk address into register x1. 0x00, 0x00, 0x00, 0x00, //movz x1, #0x00 ;This is overwritten with the actual thunk address(16 - 0 bits) move 0x00, 0x00, 0x00, 0x00, //movk x1, #0x00, lsl #16 ;This is overwritten with the actual thunk address(32 - 16 bits) move @@ -136,18 +140,20 @@ const BYTE InterpreterThunkEmitter::Epilog[] = { 0xc0, 0x03, 0x5f, 0xd6 // ret }; #else -const BYTE InterpreterThunkEmitter::FunctionBodyOffset = 8; -const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 11; -const BYTE InterpreterThunkEmitter::CallBlockStartAddrOffset = 18; -const BYTE InterpreterThunkEmitter::ThunkSizeOffset = 23; -const BYTE InterpreterThunkEmitter::ErrorOffset = 30; -const BYTE InterpreterThunkEmitter::ThunkAddressOffset = 41; +const BYTE InterpreterThunkEmitter::FunctionInfoOffset = 8; +const BYTE InterpreterThunkEmitter::FunctionProxyOffset = 11; +const BYTE InterpreterThunkEmitter::DynamicThunkAddressOffset = 14; +const BYTE InterpreterThunkEmitter::CallBlockStartAddrOffset = 21; +const BYTE InterpreterThunkEmitter::ThunkSizeOffset = 26; +const BYTE InterpreterThunkEmitter::ErrorOffset = 33; +const BYTE InterpreterThunkEmitter::ThunkAddressOffset = 44; const BYTE InterpreterThunkEmitter::InterpreterThunk[] = { 0x55, // push ebp ;Prolog - setup the stack frame 0x8B, 0xEC, // mov ebp,esp 0x8B, 0x45, 0x08, // mov eax, dword ptr [ebp+8] - 0x8B, 0x40, 0x00, // mov eax, dword ptr [eax+FunctionBodyOffset] + 0x8B, 0x40, 0x00, // mov eax, dword ptr [eax+FunctionInfoOffset] + 0x8B, 0x40, 0x00, // mov eax, dword ptr [eax+FunctionProxyOffset] 0x8B, 0x48, 0x00, // mov ecx, dword ptr [eax+DynamicThunkAddressOffset] // Range Check for Valid call target 0x83, 0xE1, 0xF8, // and ecx, 0FFFFFFF8h @@ -163,7 +169,7 @@ const BYTE InterpreterThunkEmitter::InterpreterThunk[] = { 0x50, // push eax 0xB8, 0x00, 0x00, 0x00, 0x00, // mov eax, 0xFF, 0xE1, // jmp ecx - 0xCC // int 3 for 8byte alignment + 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC // int 3 for 8byte alignment }; const BYTE InterpreterThunkEmitter::Epilog[] = { @@ -387,7 +393,8 @@ void InterpreterThunkEmitter::EncodeInterpreterThunk(__in_bcount(thunkSize) BYTE Emit(thunkBuffer, ThunkAddressOffset + sizeof(movW), movT); // Encode LDR - Load of function Body - thunkBuffer[FunctionBodyOffset] = Js::JavascriptFunction::GetOffsetOfFunctionInfo(); + thunkBuffer[FunctionInfoOffset] = Js::JavascriptFunction::GetOffsetOfFunctionInfo(); + thunkBuffer[FunctionProxyOffset] = Js::FunctionInfo::GetOffsetOfFunctionProxy(); // Encode LDR - Load of interpreter thunk number thunkBuffer[DynamicThunkAddressOffset] = Js::FunctionBody::GetOffsetOfDynamicInterpreterThunk(); @@ -480,6 +487,11 @@ void InterpreterThunkEmitter::EncodeInterpreterThunk(__in_bcount(thunkSize) BYTE AssertMsg(offsetOfFunctionInfo < 0x8000, "Immediate offset for LDR must be less than 0x8000"); *(PULONG)&thunkBuffer[FunctionBodyOffset] |= (offsetOfFunctionInfo / 8) << 10; + ULONG offsetOfFunctionProxy = Js::FunctionInfo::GetOffsetOfFunctionProxy(); + AssertMsg(offsetOfFunctionProxy % 8 == 0, "Immediate offset for LDR must be 8 byte aligned"); + AssertMsg(offsetOfFunctionProxy < 0x8000, "Immediate offset for LDR must be less than 0x8000"); + *(PULONG)&thunkBuffer[FunctionProxyOffset] |= (offsetOfFunctionInfo / 8) << 10; + // Encode LDR - Load of interpreter thunk number ULONG offsetOfDynamicInterpreterThunk = Js::FunctionBody::GetOffsetOfDynamicInterpreterThunk(); AssertMsg(offsetOfDynamicInterpreterThunk % 8 == 0, "Immediate offset for LDR must be 8 byte aligned"); @@ -517,7 +529,8 @@ void InterpreterThunkEmitter::EncodeInterpreterThunk(__in_bcount(thunkSize) BYTE _Analysis_assume_(thunkSize == HeaderSize); Emit(thunkBuffer, ThunkAddressOffset, (uintptr_t)interpreterThunk); thunkBuffer[DynamicThunkAddressOffset] = Js::FunctionBody::GetOffsetOfDynamicInterpreterThunk(); - thunkBuffer[FunctionBodyOffset] = Js::JavascriptFunction::GetOffsetOfFunctionInfo(); + thunkBuffer[FunctionInfoOffset] = Js::JavascriptFunction::GetOffsetOfFunctionInfo(); + thunkBuffer[FunctionProxyOffset] = Js::FunctionInfo::GetOffsetOfFunctionProxy(); Emit(thunkBuffer, CallBlockStartAddrOffset, (uintptr_t) thunkBufferStartAddress + HeaderSize); uint totalThunkSize = (uint)(epilogStart - (thunkBufferStartAddress + HeaderSize)); Emit(thunkBuffer, ThunkSizeOffset, totalThunkSize); diff --git a/lib/Backend/InterpreterThunkEmitter.h b/lib/Backend/InterpreterThunkEmitter.h index 3c64b7b9476..525cc28936e 100644 --- a/lib/Backend/InterpreterThunkEmitter.h +++ b/lib/Backend/InterpreterThunkEmitter.h @@ -69,7 +69,8 @@ class InterpreterThunkEmitter /* -------static constants ----------*/ // Interpreter thunk buffer includes function prolog, setting up of arguments, jumping to the appropriate calling point. static const BYTE ThunkAddressOffset; - static const BYTE FunctionBodyOffset; + static const BYTE FunctionInfoOffset; + static const BYTE FunctionProxyOffset; static const BYTE DynamicThunkAddressOffset; static const BYTE InterpreterThunkEmitter::CallBlockStartAddrOffset; static const BYTE InterpreterThunkEmitter::ThunkSizeOffset; diff --git a/lib/Backend/Lower.cpp b/lib/Backend/Lower.cpp index c64fcc75954..c335a7e1f3e 100644 --- a/lib/Backend/Lower.cpp +++ b/lib/Backend/Lower.cpp @@ -6164,7 +6164,16 @@ Lowerer::GenerateScriptFunctionInit(IR::RegOpnd * regOpnd, IR::Opnd * vtableAddr GenerateMemInit(regOpnd, Js::ScriptFunction::GetOffsetOfConstructorCache(), LoadLibraryValueOpnd(insertBeforeInstr, LibraryValue::ValueConstructorCacheDefaultInstance), insertBeforeInstr, isZeroed); - GenerateMemInit(regOpnd, Js::ScriptFunction::GetOffsetOfFunctionInfo(), functionProxyOpnd, insertBeforeInstr, isZeroed); + IR::Opnd *functionInfoOpnd; + if (functionProxyOpnd->IsRegOpnd()) + { + functionInfoOpnd = IR::IndirOpnd::New(functionProxyOpnd->AsRegOpnd(), Js::FunctionProxy::GetOffsetOfFunctionInfo(), TyMachReg, func); + } + else + { + functionInfoOpnd = IR::MemRefOpnd::New((BYTE*)functionProxyOpnd->AsAddrOpnd()->m_address + Js::FunctionProxy::GetOffsetOfFunctionInfo(), TyMachReg, func); + } + GenerateMemInit(regOpnd, Js::ScriptFunction::GetOffsetOfFunctionInfo(), functionInfoOpnd, insertBeforeInstr, isZeroed); GenerateMemInit(regOpnd, Js::ScriptFunction::GetOffsetOfEnvironment(), envOpnd, insertBeforeInstr, isZeroed); GenerateMemInitNull(regOpnd, Js::ScriptFunction::GetOffsetOfCachedScopeObj(), insertBeforeInstr, isZeroed); GenerateMemInitNull(regOpnd, Js::ScriptFunction::GetOffsetOfHasInlineCaches(), insertBeforeInstr, isZeroed); diff --git a/lib/Backend/LowerMDShared.cpp b/lib/Backend/LowerMDShared.cpp index 6761b21b9e6..52045cf5576 100644 --- a/lib/Backend/LowerMDShared.cpp +++ b/lib/Backend/LowerMDShared.cpp @@ -1451,13 +1451,15 @@ LowererMD::Legalize(IR::Instr *const instr, bool fPostRegAlloc) if(instr->m_opcode == Js::OpCode::MOV) { uint src1Forms = L_Reg | L_Mem | L_Ptr; // Allow 64 bit values in x64 as well -#if _M_X64 if (dst->IsMemoryOpnd()) { +#if _M_X64 // Only allow <= 32 bit values src1Forms = L_Reg | L_Imm32; - } +#else + src1Forms = L_Reg | L_Ptr; #endif + } LegalizeOpnds( instr, L_Reg | L_Mem, diff --git a/lib/Backend/NativeCodeGenerator.cpp b/lib/Backend/NativeCodeGenerator.cpp index a93b8109afc..eb523aa3ec2 100644 --- a/lib/Backend/NativeCodeGenerator.cpp +++ b/lib/Backend/NativeCodeGenerator.cpp @@ -2231,7 +2231,7 @@ NativeCodeGenerator::GatherCodeGenData( if (!isJitTimeDataComputed) { - Js::FunctionCodeGenJitTimeData *inlineeJitTimeData = jitTimeData->AddInlinee(recycler, profiledCallSiteId, inlineeFunctionBodyArray[id], isInlined); + Js::FunctionCodeGenJitTimeData *inlineeJitTimeData = jitTimeData->AddInlinee(recycler, profiledCallSiteId, inlineeFunctionBodyArray[id]->GetFunctionInfo(), isInlined); if (isInlined) { GatherCodeGenData( @@ -2525,7 +2525,7 @@ NativeCodeGenerator::GatherCodeGenData(Js::FunctionBody *const topFunctionBody, const auto recycler = scriptContext->GetRecycler(); { - const auto jitTimeData = RecyclerNew(recycler, Js::FunctionCodeGenJitTimeData, functionBody, entryPoint); + const auto jitTimeData = RecyclerNew(recycler, Js::FunctionCodeGenJitTimeData, functionBody->GetFunctionInfo(), entryPoint); InliningDecider inliningDecider(functionBody, workItem->Type() == JsLoopBodyWorkItemType, functionBody->IsInDebugMode(), workItem->GetJitMode()); BEGIN_TEMP_ALLOCATOR(gatherCodeGenDataAllocator, scriptContext, _u("GatherCodeGenData")); @@ -3145,7 +3145,7 @@ bool NativeCodeGenerator::TryAggressiveInlining(Js::FunctionBody *const topFunct } else { - inlinee = inliningDecider.Inline(inlineeFunctionBody, inlinee, isConstructorCall, false, inliningDecider.GetConstantArgInfo(inlineeFunctionBody, profiledCallSiteId), profiledCallSiteId, inlineeFunctionBody == inlinee ? recursiveInlineDepth + 1 : 0, true); + inlinee = inliningDecider.Inline(inlineeFunctionBody, inlinee, isConstructorCall, false, inliningDecider.GetConstantArgInfo(inlineeFunctionBody, profiledCallSiteId), profiledCallSiteId, inlineeFunctionBody->GetFunctionInfo() == inlinee ? recursiveInlineDepth + 1 : 0, true); if (!inlinee) { return false; diff --git a/lib/Backend/Opnd.cpp b/lib/Backend/Opnd.cpp index d2180899e34..c590b4ad256 100644 --- a/lib/Backend/Opnd.cpp +++ b/lib/Backend/Opnd.cpp @@ -3067,6 +3067,7 @@ Opnd::GetAddrDescription(__out_ecount(count) char16 *const description, const si { char16 *buffer = description; size_t n = count; + Js::FunctionBody *functionBody = nullptr; if (address) { @@ -3231,14 +3232,20 @@ Opnd::GetAddrDescription(__out_ecount(count) char16 *const description, const si WriteToBuffer(&buffer, &n, _u(" (&RecyclerAllocatorFreeList)")); break; - case IR::AddrOpndKindDynamicFunctionBody: + case IR::AddrOpndKindDynamicFunctionInfo: DumpAddress(address, printToConsole, skipMaskedAddress); DumpFunctionInfo(&buffer, &n, (Js::FunctionInfo *)address, printToConsole); break; + case IR::AddrOpndKindDynamicFunctionBody: + DumpAddress(address, printToConsole, skipMaskedAddress); + DumpFunctionInfo(&buffer, &n, ((Js::FunctionBody *)address)->GetFunctionInfo(), printToConsole); + break; + case IR::AddrOpndKindDynamicFunctionBodyWeakRef: DumpAddress(address, printToConsole, skipMaskedAddress); - DumpFunctionInfo(&buffer, &n, ((RecyclerWeakReference *)address)->FastGet(), printToConsole, _u("FunctionBodyWeakRef")); + functionBody = ((RecyclerWeakReference *)address)->FastGet(); + DumpFunctionInfo(&buffer, &n, functionBody == nullptr ? nullptr : functionBody->GetFunctionInfo(), printToConsole, _u("FunctionBodyWeakRef")); break; case IR::AddrOpndKindDynamicFunctionEnvironmentRef: diff --git a/lib/Backend/Opnd.h b/lib/Backend/Opnd.h index 01fbb56c2e9..4e49742f440 100644 --- a/lib/Backend/Opnd.h +++ b/lib/Backend/Opnd.h @@ -60,6 +60,7 @@ enum AddrOpndKind : BYTE { AddrOpndKindDynamicMisc, // no profiling in dynamic JIT AddrOpndKindDynamicFunctionBody, + AddrOpndKindDynamicFunctionInfo, // use LoadRuntimeInlineCacheOpnd for runtime caches, // in relocatable JIT polymorphic inline caches aren't generated and can // be referenced directly (for now) diff --git a/lib/Runtime/Base/FunctionBody.cpp b/lib/Runtime/Base/FunctionBody.cpp index c3e63edf430..cc414ff47ef 100644 --- a/lib/Runtime/Base/FunctionBody.cpp +++ b/lib/Runtime/Base/FunctionBody.cpp @@ -68,8 +68,7 @@ namespace Js #endif // FunctionProxy methods - FunctionProxy::FunctionProxy(JavascriptMethod entryPoint, Attributes attributes, LocalFunctionId functionId, ScriptContext* scriptContext, Utf8SourceInfo* utf8SourceInfo, uint functionNumber): - FunctionInfo(entryPoint, attributes, functionId, (FunctionBody*) this), + FunctionProxy::FunctionProxy(ScriptContext* scriptContext, Utf8SourceInfo* utf8SourceInfo, uint functionNumber): m_isTopLevel(false), m_isPublicLibraryCode(false), m_scriptContext(scriptContext), @@ -392,14 +391,14 @@ namespace Js } FunctionBody * FunctionBody::NewFromRecycler(ScriptContext * scriptContext, const char16 * displayName, uint displayNameLength, uint displayShortNameOffset, uint nestedCount, - Utf8SourceInfo* sourceInfo, uint uScriptId, Js::LocalFunctionId functionId, Js::PropertyRecordList* boundPropertyRecords, Attributes attributes + Utf8SourceInfo* sourceInfo, uint uScriptId, Js::LocalFunctionId functionId, Js::PropertyRecordList* boundPropertyRecords, FunctionInfo::Attributes attributes #ifdef PERF_COUNTERS , bool isDeserializedFunction #endif ) { return FunctionBody::NewFromRecycler(scriptContext, displayName, displayNameLength, displayShortNameOffset, nestedCount, sourceInfo, - scriptContext->GetThreadContext()->NewFunctionNumber(), uScriptId, functionId, boundPropertyRecords, attributes + scriptContext->GetThreadContext()->NewFunctionNumber(), uScriptId, functionId, boundPropertyRecords, attributes #ifdef PERF_COUNTERS , isDeserializedFunction #endif @@ -407,7 +406,7 @@ namespace Js } FunctionBody * FunctionBody::NewFromRecycler(ScriptContext * scriptContext, const char16 * displayName, uint displayNameLength, uint displayShortNameOffset, uint nestedCount, - Utf8SourceInfo* sourceInfo, uint uFunctionNumber, uint uScriptId, Js::LocalFunctionId functionId, Js::PropertyRecordList* boundPropertyRecords, Attributes attributes + Utf8SourceInfo* sourceInfo, uint uFunctionNumber, uint uScriptId, Js::LocalFunctionId functionId, Js::PropertyRecordList* boundPropertyRecords, FunctionInfo::Attributes attributes #ifdef PERF_COUNTERS , bool isDeserializedFunction #endif @@ -423,7 +422,7 @@ namespace Js FunctionBody::FunctionBody(ScriptContext* scriptContext, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, uint nestedCount, Utf8SourceInfo* utf8SourceInfo, uint uFunctionNumber, uint uScriptId, - Js::LocalFunctionId functionId, Js::PropertyRecordList* boundPropertyRecords, Attributes attributes + Js::LocalFunctionId functionId, Js::PropertyRecordList* boundPropertyRecords, FunctionInfo::Attributes attributes #ifdef PERF_COUNTERS , bool isDeserializedFunction #endif @@ -854,7 +853,7 @@ namespace Js BOOL FunctionBody::IsInterpreterThunk() const { - bool isInterpreterThunk = this->originalEntryPoint == DefaultEntryThunk; + bool isInterpreterThunk = this->GetOriginalEntryPoint_Unchecked() == DefaultEntryThunk; #if DYNAMIC_INTERPRETER_THUNK isInterpreterThunk = isInterpreterThunk || IsDynamicInterpreterThunk(); #endif @@ -864,7 +863,7 @@ namespace Js BOOL FunctionBody::IsDynamicInterpreterThunk() const { #if DYNAMIC_INTERPRETER_THUNK - return this->GetScriptContext()->IsDynamicInterpreterThunk(this->originalEntryPoint); + return this->GetScriptContext()->IsDynamicInterpreterThunk(this->GetOriginalEntryPoint_Unchecked()); #else return FALSE; #endif @@ -1091,21 +1090,22 @@ namespace Js // DeferDeserializeFunctionInfo methods - DeferDeserializeFunctionInfo::DeferDeserializeFunctionInfo(int nestedCount, LocalFunctionId functionId, ByteCodeCache* byteCodeCache, const byte* serializedFunction, Utf8SourceInfo* sourceInfo, ScriptContext* scriptContext, uint functionNumber, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, NativeModule *nativeModule, Attributes attributes) : - FunctionProxy(DefaultDeferredDeserializeThunk, (Attributes)(attributes | DeferredDeserialize), functionId, scriptContext, sourceInfo, functionNumber), + DeferDeserializeFunctionInfo::DeferDeserializeFunctionInfo(int nestedCount, LocalFunctionId functionId, ByteCodeCache* byteCodeCache, const byte* serializedFunction, Utf8SourceInfo* sourceInfo, ScriptContext* scriptContext, uint functionNumber, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, NativeModule *nativeModule, FunctionInfo::Attributes attributes) : + FunctionProxy(scriptContext, sourceInfo, functionNumber), m_cache(byteCodeCache), m_functionBytes(serializedFunction), m_displayName(nullptr), m_displayNameLength(0), m_nativeModule(nativeModule) { + this->functionInfo = RecyclerNew(scriptContext->GetRecycler(), FunctionInfo, DefaultDeferredDeserializeThunk, (FunctionInfo::Attributes)(attributes | FunctionInfo::Attributes::DeferredDeserialize), functionId, this); this->m_defaultEntryPointInfo = RecyclerNew(scriptContext->GetRecycler(), ProxyEntryPointInfo, DefaultDeferredDeserializeThunk); PERF_COUNTER_INC(Code, DeferDeserializeFunctionProxy); SetDisplayName(displayName, displayNameLength, displayShortNameOffset, FunctionProxy::SetDisplayNameFlagsDontCopy); } - DeferDeserializeFunctionInfo* DeferDeserializeFunctionInfo::New(ScriptContext* scriptContext, int nestedCount, LocalFunctionId functionId, ByteCodeCache* byteCodeCache, const byte* serializedFunction, Utf8SourceInfo* sourceInfo, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, NativeModule *nativeModule, Attributes attributes) + DeferDeserializeFunctionInfo* DeferDeserializeFunctionInfo::New(ScriptContext* scriptContext, int nestedCount, LocalFunctionId functionId, ByteCodeCache* byteCodeCache, const byte* serializedFunction, Utf8SourceInfo* sourceInfo, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, NativeModule *nativeModule, FunctionInfo::Attributes attributes) { return RecyclerNewFinalized(scriptContext->GetRecycler(), DeferDeserializeFunctionInfo, @@ -1132,8 +1132,8 @@ namespace Js // ParseableFunctionInfo methods ParseableFunctionInfo::ParseableFunctionInfo(JavascriptMethod entryPoint, int nestedCount, LocalFunctionId functionId, Utf8SourceInfo* sourceInfo, ScriptContext* scriptContext, uint functionNumber, - const char16* displayName, uint displayNameLength, uint displayShortNameOffset, Attributes attributes, Js::PropertyRecordList* propertyRecords) : - FunctionProxy(entryPoint, attributes, functionId, scriptContext, sourceInfo, functionNumber), + const char16* displayName, uint displayNameLength, uint displayShortNameOffset, FunctionInfo::Attributes attributes, Js::PropertyRecordList* propertyRecords) : + FunctionProxy(scriptContext, sourceInfo, functionNumber), #if DYNAMIC_INTERPRETER_THUNK m_dynamicInterpreterThunk(nullptr), #endif @@ -1174,6 +1174,8 @@ namespace Js ,scopeObjectSize(0) #endif { + this->functionInfo = RecyclerNew(scriptContext->GetRecycler(), FunctionInfo, entryPoint, attributes, functionId, this); + if (nestedCount > 0) { nestedArray = RecyclerNewPlusZ(m_scriptContext->GetRecycler(), @@ -1202,11 +1204,11 @@ namespace Js } SetDisplayName(displayName, displayNameLength, displayShortNameOffset); - this->originalEntryPoint = DefaultEntryThunk; + this->SetOriginalEntryPoint(DefaultEntryThunk); } ParseableFunctionInfo* ParseableFunctionInfo::New(ScriptContext* scriptContext, int nestedCount, - LocalFunctionId functionId, Utf8SourceInfo* sourceInfo, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, Js::PropertyRecordList* propertyRecords, Attributes attributes) + LocalFunctionId functionId, Utf8SourceInfo* sourceInfo, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, Js::PropertyRecordList* propertyRecords, FunctionInfo::Attributes attributes) { #ifdef ENABLE_SCRIPT_PROFILING Assert( @@ -1241,7 +1243,7 @@ namespace Js displayName, displayNameLength, displayShortNameOffset, - (Attributes)(attributes | DeferredParse), + (FunctionInfo::Attributes)(attributes | FunctionInfo::Attributes::DeferredParse), propertyRecords); } @@ -1469,10 +1471,12 @@ namespace Js void FunctionProxy::UpdateFunctionBodyImpl(FunctionBody * body) { - Assert(functionBodyImpl == ((FunctionProxy*) this)); + FunctionInfo *functionInfo = this->GetFunctionInfo(); + Assert(functionInfo->GetFunctionProxy() == this); Assert(!this->IsFunctionBody() || body == this); - this->functionBodyImpl = body; - this->attributes = (Attributes)(this->attributes & ~(DeferredParse | DeferredDeserialize)); + functionInfo->SetFunctionProxy(body); + body->SetFunctionInfo(functionInfo); + body->SetAttributes((FunctionInfo::Attributes)(functionInfo->GetAttributes() & ~(FunctionInfo::Attributes::DeferredParse | FunctionInfo::Attributes::DeferredDeserialize))); this->UpdateReferenceInParentFunction(body); } @@ -1496,17 +1500,18 @@ namespace Js // ParseableFunctionInfo * FunctionProxy::EnsureDeserialized() { - FunctionProxy * executionFunctionBody = this->functionBodyImpl; + Assert(this == this->GetFunctionInfo()->GetFunctionProxy()); + FunctionProxy * executionFunctionBody = this; - if (executionFunctionBody == this && IsDeferredDeserializeFunction()) + if (IsDeferredDeserializeFunction()) { // No need to deserialize function body if scriptContext closed because we can't execute it. // Bigger problem is the script engine might have released bytecode file mapping and we can't deserialize. Assert(!m_scriptContext->IsClosed()); executionFunctionBody = ((DeferDeserializeFunctionInfo*) this)->Deserialize(); - this->functionBodyImpl = executionFunctionBody; - Assert(executionFunctionBody->HasBody()); + this->GetFunctionInfo()->SetFunctionProxy(executionFunctionBody); + Assert(executionFunctionBody->GetFunctionInfo()->HasBody()); Assert(executionFunctionBody != this); } @@ -1520,7 +1525,7 @@ namespace Js ScriptFunctionType * FunctionProxy::EnsureDeferredPrototypeType() { - Assert(this->GetFunctionProxy() == this); + Assert(this->GetFunctionInfo()->GetFunctionProxy() == this); return deferredPrototypeType != nullptr ? static_cast(deferredPrototypeType) : AllocDeferredPrototypeType(); } @@ -1627,14 +1632,16 @@ namespace Js FunctionBody* DeferDeserializeFunctionInfo::Deserialize() { - if (functionBodyImpl == (FunctionBody*) this) - { - FunctionBody * body = ByteCodeSerializer::DeserializeFunction(this->m_scriptContext, this); - this->Copy(body); - this->UpdateFunctionBodyImpl(body); - } + Assert(this->GetFunctionInfo()->GetFunctionProxy() == this); + + FunctionBody * body = ByteCodeSerializer::DeserializeFunction(this->m_scriptContext, this); + this->SetLocalFunctionId(body->GetLocalFunctionId()); + this->SetOriginalEntryPoint(body->GetOriginalEntryPoint()); + this->Copy(body); + this->UpdateFunctionBodyImpl(body); - return GetFunctionBody(); + Assert(body->GetFunctionBody() == body); + return body; } // @@ -1683,7 +1690,8 @@ namespace Js FunctionBody* ParseableFunctionInfo::Parse(ScriptFunction ** functionRef, bool isByteCodeDeserialization) { - if ((functionBodyImpl != (FunctionBody*) this) || !IsDeferredParseFunction()) + Assert(this == this->GetFunctionInfo()->GetFunctionProxy()); + if (!IsDeferredParseFunction()) { // If not deferredparsed, the functionBodyImpl and this will be the same, just return the current functionBody. Assert(GetFunctionBody()->IsFunctionParsed()); @@ -1714,10 +1722,10 @@ namespace Js this->GetNestedCount(), this->GetUtf8SourceInfo(), this->m_functionNumber, - this->GetUtf8SourceInfo()->GetSrcInfo()->sourceContextInfo->sourceContextId, /* script id */ - this->functionId, /* function id */ + this->GetUtf8SourceInfo()->GetSrcInfo()->sourceContextInfo->sourceContextId, + this->GetLocalFunctionId(), propertyRecordList, - (Attributes)(this->GetAttributes() & ~(Attributes::DeferredDeserialize | Attributes::DeferredParse)) + (FunctionInfo::Attributes)(this->GetAttributes() & ~(FunctionInfo::Attributes::DeferredDeserialize | FunctionInfo::Attributes::DeferredParse)) #ifdef PERF_COUNTERS , false /* is function from deferred deserialized proxy */ #endif @@ -1950,9 +1958,12 @@ namespace Js this->UpdateFunctionBodyImpl(funcBody); this->m_hasBeenParsed = true; + returnFunctionBody = funcBody; + } + else + { + returnFunctionBody = this->GetFunctionBody(); } - - returnFunctionBody = GetFunctionBody(); LEAVE_PINNED_SCOPE(); @@ -1980,10 +1991,10 @@ namespace Js this->GetNestedCount(), this->GetUtf8SourceInfo(), this->m_functionNumber, - this->GetUtf8SourceInfo()->GetSrcInfo()->sourceContextInfo->sourceContextId, /* script id */ - this->functionId, /* function id */ + this->GetUtf8SourceInfo()->GetSrcInfo()->sourceContextInfo->sourceContextId, + this->GetLocalFunctionId(), propertyRecordList, - (Attributes)(this->GetAttributes() & ~(Attributes::DeferredDeserialize | Attributes::DeferredParse)) + (FunctionInfo::Attributes)(this->GetAttributes() & ~(FunctionInfo::Attributes::DeferredDeserialize | FunctionInfo::Attributes::DeferredParse)) #ifdef PERF_COUNTERS , false /* is function from deferred deserialized proxy */ #endif @@ -2052,7 +2063,9 @@ namespace Js UpdateFunctionBodyImpl(funcBody); m_hasBeenParsed = true; - returnFunctionBody = GetFunctionBody(); + Assert(funcBody->GetFunctionBody() == funcBody); + + returnFunctionBody = funcBody; LEAVE_PINNED_SCOPE(); @@ -2301,17 +2314,14 @@ namespace Js #if DBG_DUMP if (PHASE_TRACE1(Js::FunctionSourceInfoParsePhase)) { - if (this->HasBody()) + Assert(this->GetFunctionInfo()->HasBody()); + if (this->IsFunctionBody()) { - FunctionProxy* proxy = this->GetFunctionProxy(); - if (proxy->IsFunctionBody()) - { - FunctionBody* functionBody = this->GetFunctionBody(); - Assert( functionBody != nullptr ); + FunctionBody* functionBody = this->GetFunctionBody(); + Assert( functionBody != nullptr ); - functionBody->PrintStatementSourceLineFromStartOffset(functionBody->StartInDocument()); - Output::Flush(); - } + functionBody->PrintStatementSourceLineFromStartOffset(functionBody->StartInDocument()); + Output::Flush(); } } #endif @@ -2893,7 +2903,7 @@ namespace Js BOOL FunctionBody::IsNativeOriginalEntryPoint() const { #if ENABLE_NATIVE_CODEGEN - return this->GetScriptContext()->IsNativeAddress(this->originalEntryPoint); + return this->GetScriptContext()->IsNativeAddress(this->GetOriginalEntryPoint_Unchecked()); #else return false; #endif @@ -2904,13 +2914,11 @@ namespace Js const FunctionEntryPointInfo *const simpleJitEntryPointInfo = GetSimpleJitEntryPointInfo(); return simpleJitEntryPointInfo && - reinterpret_cast(simpleJitEntryPointInfo->GetNativeAddress()) == originalEntryPoint; + reinterpret_cast(simpleJitEntryPointInfo->GetNativeAddress()) == GetOriginalEntryPoint_Unchecked(); } void FunctionProxy::Finalize(bool isShutdown) { - __super::Finalize(isShutdown); - this->CleanupFunctionProxyCounters(); } @@ -2954,7 +2962,7 @@ namespace Js bool FunctionProxy::HasValidNonProfileEntryPoint() const { JavascriptMethod directEntryPoint = this->GetDefaultEntryPointInfo()->jsMethod; - JavascriptMethod originalEntryPoint = this->originalEntryPoint; + JavascriptMethod originalEntryPoint = this->GetOriginalEntryPoint_Unchecked(); // Check the direct entry point to see if it is codegen thunk // if it is not, the background codegen thread has updated both original entry point and direct entry point @@ -2975,11 +2983,13 @@ namespace Js bool FunctionProxy::HasValidProfileEntryPoint() const { JavascriptMethod directEntryPoint = this->GetDefaultEntryPointInfo()->jsMethod; - if (this->originalEntryPoint == DefaultDeferredParsingThunk) + JavascriptMethod originalEntryPoint = this->GetOriginalEntryPoint_Unchecked(); + + if (originalEntryPoint == DefaultDeferredParsingThunk) { return directEntryPoint == ProfileDeferredParsingThunk; } - if (this->originalEntryPoint == DefaultDeferredDeserializeThunk) + if (originalEntryPoint == DefaultDeferredDeserializeThunk) { return directEntryPoint == ProfileDeferredDeserializeThunk; } @@ -3036,28 +3046,31 @@ namespace Js #endif this->SetEntryPoint(this->GetDefaultEntryPointInfo(), m_scriptContext->DeferredParsingThunk); - originalEntryPoint = DefaultDeferredParsingThunk; + this->SetOriginalEntryPoint(DefaultDeferredParsingThunk); } void ParseableFunctionInfo::SetInitialDefaultEntryPoint() { #ifdef ENABLE_SCRIPT_PROFILING Assert(m_scriptContext->CurrentThunk == ProfileEntryThunk || m_scriptContext->CurrentThunk == DefaultEntryThunk); - Assert(originalEntryPoint == DefaultDeferredParsingThunk || originalEntryPoint == ProfileDeferredParsingThunk || - originalEntryPoint == DefaultDeferredDeserializeThunk || originalEntryPoint == ProfileDeferredDeserializeThunk || - originalEntryPoint == DefaultEntryThunk || originalEntryPoint == ProfileEntryThunk); + Assert(this->GetOriginalEntryPoint_Unchecked() == DefaultDeferredParsingThunk || + this->GetOriginalEntryPoint_Unchecked() == ProfileDeferredParsingThunk || + this->GetOriginalEntryPoint_Unchecked() == DefaultDeferredDeserializeThunk || + this->GetOriginalEntryPoint_Unchecked() == ProfileDeferredDeserializeThunk || + this->GetOriginalEntryPoint_Unchecked() == DefaultEntryThunk || + this->GetOriginalEntryPoint_Unchecked() == ProfileEntryThunk); #else Assert(m_scriptContext->CurrentThunk == DefaultEntryThunk); - Assert(originalEntryPoint == DefaultDeferredParsingThunk || - originalEntryPoint == DefaultDeferredDeserializeThunk || - originalEntryPoint == DefaultEntryThunk); + Assert(this->GetOriginalEntryPoint_Unchecked() == DefaultDeferredParsingThunk || + this->GetOriginalEntryPoint_Unchecked() == DefaultDeferredDeserializeThunk || + this->GetOriginalEntryPoint_Unchecked() == DefaultEntryThunk); #endif Assert(this->m_defaultEntryPointInfo != nullptr); // CONSIDER: we can optimize this to generate the dynamic interpreter thunk up front // If we know that we are in the defer parsing thunk already this->SetEntryPoint(this->GetDefaultEntryPointInfo(), m_scriptContext->CurrentThunk); - this->originalEntryPoint = DefaultEntryThunk; + this->SetOriginalEntryPoint(DefaultEntryThunk); } void FunctionBody::SetCheckCodeGenEntryPoint(FunctionEntryPointInfo* entryPointInfo, JavascriptMethod entryPoint) @@ -3083,17 +3096,17 @@ namespace Js if (m_isAsmJsFunction) { - this->originalEntryPoint = this->m_scriptContext->GetNextDynamicAsmJsInterpreterThunk(&this->m_dynamicInterpreterThunk); + this->SetOriginalEntryPoint(this->m_scriptContext->GetNextDynamicAsmJsInterpreterThunk(&this->m_dynamicInterpreterThunk)); } else { - this->originalEntryPoint = this->m_scriptContext->GetNextDynamicInterpreterThunk(&this->m_dynamicInterpreterThunk); + this->SetOriginalEntryPoint(this->m_scriptContext->GetNextDynamicInterpreterThunk(&this->m_dynamicInterpreterThunk)); } JS_ETW(EtwTrace::LogMethodInterpreterThunkLoadEvent(this)); } else { - this->originalEntryPoint = (JavascriptMethod)InterpreterThunkEmitter::ConvertToEntryPoint(this->m_dynamicInterpreterThunk); + this->SetOriginalEntryPoint((JavascriptMethod)InterpreterThunkEmitter::ConvertToEntryPoint(this->m_dynamicInterpreterThunk)); } } @@ -3111,18 +3124,18 @@ namespace Js if (InterpreterStackFrame::IsDelayDynamicInterpreterThunk(this->GetEntryPoint(entryPointInfo))) { // We are not doing code gen on this function, just change the entry point directly - Assert(InterpreterStackFrame::IsDelayDynamicInterpreterThunk(originalEntryPoint)); + Assert(InterpreterStackFrame::IsDelayDynamicInterpreterThunk(this->GetOriginalEntryPoint_Unchecked())); GenerateDynamicInterpreterThunk(); - this->SetEntryPoint(entryPointInfo, originalEntryPoint); + this->SetEntryPoint(entryPointInfo, this->GetOriginalEntryPoint_Unchecked()); } else if (this->GetEntryPoint(entryPointInfo) == ProfileEntryThunk) { // We are not doing codegen on this function, just change the entry point directly // Don't replace the profile entry thunk - Assert(InterpreterStackFrame::IsDelayDynamicInterpreterThunk(originalEntryPoint)); + Assert(InterpreterStackFrame::IsDelayDynamicInterpreterThunk(this->GetOriginalEntryPoint_Unchecked())); GenerateDynamicInterpreterThunk(); } - else if (InterpreterStackFrame::IsDelayDynamicInterpreterThunk(originalEntryPoint)) + else if (InterpreterStackFrame::IsDelayDynamicInterpreterThunk(this->GetOriginalEntryPoint_Unchecked())) { JsUtil::JobProcessor * jobProcessor = this->GetScriptContext()->GetThreadContext()->GetJobProcessor(); if (jobProcessor->ProcessesInBackground()) @@ -3130,7 +3143,7 @@ namespace Js JsUtil::BackgroundJobProcessor * backgroundJobProcessor = static_cast(jobProcessor); AutoCriticalSection autocs(backgroundJobProcessor->GetCriticalSection()); // Check again under lock - if (InterpreterStackFrame::IsDelayDynamicInterpreterThunk(originalEntryPoint)) + if (InterpreterStackFrame::IsDelayDynamicInterpreterThunk(this->GetOriginalEntryPoint_Unchecked())) { // If the original entry point is DelayDynamicInterpreterThunk then there must be a version of this // function being codegen'd. @@ -3146,7 +3159,7 @@ namespace Js GenerateDynamicInterpreterThunk(); } } - return this->originalEntryPoint; + return this->GetOriginalEntryPoint_Unchecked(); } #endif @@ -3164,7 +3177,7 @@ namespace Js // keep originalEntryPoint updated with the latest known good native entry point if (entryPointInfo == this->GetDefaultEntryPointInfo()) { - this->originalEntryPoint = originalEntryPoint; + this->SetOriginalEntryPoint(originalEntryPoint); } if (entryPointInfo->entryPointIndex == 0 && this->NeedEnsureDynamicProfileInfo()) @@ -4240,11 +4253,11 @@ namespace Js if (!IsIntermediateCodeGenThunk(defaultEntryPointInfo->jsMethod) && defaultEntryPointInfo->jsMethod != DynamicProfileInfo::EnsureDynamicProfileInfoThunk) { - if (this->originalEntryPoint == DefaultDeferredParsingThunk) + if (this->GetOriginalEntryPoint_Unchecked() == DefaultDeferredParsingThunk) { defaultEntryPointInfo->jsMethod = ProfileDeferredParsingThunk; } - else if (this->originalEntryPoint == DefaultDeferredDeserializeThunk) + else if (this->GetOriginalEntryPoint_Unchecked() == DefaultDeferredDeserializeThunk) { defaultEntryPointInfo->jsMethod = ProfileDeferredDeserializeThunk; } @@ -4266,7 +4279,7 @@ namespace Js if (!this->HasValidEntryPoint()) { OUTPUT_TRACE_DEBUGONLY(Js::ScriptProfilerPhase, _u("FunctionBody::SetEntryToProfileMode, Assert due to HasValidEntryPoint(), directEntrypoint : 0x%0IX, originalentrypoint : 0x%0IX\n"), - this->GetDefaultEntryPointInfo()->jsMethod, this->originalEntryPoint); + this->GetDefaultEntryPointInfo()->jsMethod, this->GetOriginalEntryPoint()); AssertMsg(false, "Not a valid EntryPoint"); } @@ -4315,9 +4328,9 @@ namespace Js #endif // Store the originalEntryPoint to restore it back immediately. - JavascriptMethod originalEntryPoint = this->originalEntryPoint; + JavascriptMethod originalEntryPoint = this->GetOriginalEntryPoint_Unchecked(); this->CreateNewDefaultEntryPoint(); - this->originalEntryPoint = originalEntryPoint; + this->SetOriginalEntryPoint(originalEntryPoint); if (this->m_defaultEntryPointInfo) { this->GetDefaultFunctionEntryPointInfo()->entryPointIndex = 0; @@ -4454,11 +4467,11 @@ namespace Js defaultEntryPointInfo->jsMethod = DefaultDeferredParsingThunk; } - this->originalEntryPoint = DefaultDeferredParsingThunk; + this->SetOriginalEntryPoint(DefaultDeferredParsingThunk); // Abandon the shared type so a new function will get a new one this->deferredPrototypeType = nullptr; - this->attributes = (FunctionInfo::Attributes) (this->attributes | FunctionInfo::Attributes::DeferredParse); + this->SetAttributes((FunctionInfo::Attributes) (this->GetAttributes() | FunctionInfo::Attributes::DeferredParse)); } // Set other state back to before parse as well @@ -4502,7 +4515,7 @@ namespace Js this->entryPoints->ClearAndZero(); this->CreateNewDefaultEntryPoint(); - this->originalEntryPoint = DefaultEntryThunk; + this->SetOriginalEntryPoint(DefaultEntryThunk); m_defaultEntryPointInfo->jsMethod = m_scriptContext->CurrentThunk; if (this->deferredPrototypeType) @@ -4517,12 +4530,12 @@ namespace Js void FunctionBody::AddDeferParseAttribute() { - this->attributes = (FunctionInfo::Attributes) (this->attributes | DeferredParse); + this->SetAttributes((FunctionInfo::Attributes) (this->GetAttributes() | FunctionInfo::Attributes::DeferredParse)); } void FunctionBody::RemoveDeferParseAttribute() { - this->attributes = (FunctionInfo::Attributes) (this->attributes & (~DeferredParse)); + this->SetAttributes((FunctionInfo::Attributes) (this->GetAttributes() & (~FunctionInfo::Attributes::DeferredParse))); } Js::DebuggerScope * FunctionBody::GetDiagCatchScopeObjectAt(int byteCodeOffset) @@ -7390,7 +7403,7 @@ namespace Js void FunctionBody::InitDisableInlineApply() { SetDisableInlineApply( - (this->functionId != Js::Constants::NoFunctionId && PHASE_OFF(Js::InlinePhase, this)) || + (this->GetLocalFunctionId() != Js::Constants::NoFunctionId && PHASE_OFF(Js::InlinePhase, this)) || PHASE_OFF(Js::InlineApplyPhase, this)); } @@ -8660,7 +8673,7 @@ namespace Js { if (this->IsCodeGenDone()) { - Assert(this->functionProxy->HasBody()); + Assert(this->functionProxy->GetFunctionInfo()->HasBody()); #if ENABLE_NATIVE_CODEGEN if (nullptr != this->inlineeFrameMap) { diff --git a/lib/Runtime/Base/FunctionBody.h b/lib/Runtime/Base/FunctionBody.h index b1825a95664..e8eaf8b99ee 100644 --- a/lib/Runtime/Base/FunctionBody.h +++ b/lib/Runtime/Base/FunctionBody.h @@ -1224,7 +1224,7 @@ namespace Js // The function need not have been compiled yet- it could be parsed or compiled // at a later time // - class FunctionProxy : public FunctionInfo + class FunctionProxy : public FinalizableObject { static CriticalSection GlobalLock; public: @@ -1233,9 +1233,8 @@ namespace Js typedef JsUtil::List FunctionTypeWeakRefList; protected: - FunctionProxy(JavascriptMethod entryPoint, Attributes attributes, - LocalFunctionId functionId, ScriptContext* scriptContext, Utf8SourceInfo* utf8SourceInfo, uint functionNumber); - DEFINE_VTABLE_CTOR_NO_REGISTER(FunctionProxy, FunctionInfo); + FunctionProxy(ScriptContext* scriptContext, Utf8SourceInfo* utf8SourceInfo, uint functionNumber); + DEFINE_VTABLE_CTOR_NOBASE(FunctionProxy); enum class AuxPointerType : uint8 { DeferredStubs = 0, @@ -1272,6 +1271,8 @@ namespace Js void* GetAuxPtrWithLock(AuxPointerType e) const; void SetAuxPtr(AuxPointerType e, void* ptr); + FunctionInfo *functionInfo; + public: enum SetDisplayNameFlags { @@ -1280,6 +1281,54 @@ namespace Js SetDisplayNameFlagsRecyclerAllocated = 2 }; + virtual void Dispose(bool isShutdown) override + { + } + + virtual void Mark(Recycler *recycler) override { AssertMsg(false, "Mark called on object that isn't TrackableObject"); } + + static const uint GetOffsetOfFunctionInfo() { return offsetof(FunctionProxy, functionInfo); } + FunctionInfo * GetFunctionInfo() const + { + return this->functionInfo; + } + void SetFunctionInfo(FunctionInfo * functionInfo) + { + this->functionInfo = functionInfo; + } + + LocalFunctionId GetLocalFunctionId() const; + void SetLocalFunctionId(LocalFunctionId functionId); + + ParseableFunctionInfo* GetParseableFunctionInfo() const; + ParseableFunctionInfo** GetParseableFunctionInfoRef() const; + DeferDeserializeFunctionInfo* GetDeferDeserializeFunctionInfo() const; + FunctionBody * GetFunctionBody() const; + + void VerifyOriginalEntryPoint() const; + JavascriptMethod GetOriginalEntryPoint() const; + JavascriptMethod GetOriginalEntryPoint_Unchecked() const; + void SetOriginalEntryPoint(const JavascriptMethod originalEntryPoint); + + bool IsAsync() const; + bool IsDeferred() const; + bool IsLambda() const; + bool IsConstructor() const; + bool IsGenerator() const; + bool IsClassConstructor() const; + bool IsClassMethod() const; + bool IsModule() const; + bool HasSuperReference() const; + bool IsCoroutine() const; + bool GetCapturesThis() const; + void SetCapturesThis(); + bool GetEnclosedByGlobalFunc() const; + void SetEnclosedByGlobalFunc(); + BOOL IsDeferredDeserializeFunction() const; + BOOL IsDeferredParseFunction() const; + FunctionInfo::Attributes GetAttributes() const; + void SetAttributes(FunctionInfo::Attributes attributes); + Recycler* GetRecycler() const; uint32 GetSourceContextId() const; char16* GetDebugNumberSet(wchar(&bufferToWriteTo)[MAX_FUNCTION_BODY_DEBUG_STRING_SIZE]) const; @@ -1401,6 +1450,198 @@ namespace Js ScriptFunctionType * AllocDeferredPrototypeType(); }; + inline Js::LocalFunctionId FunctionProxy::GetLocalFunctionId() const + { + Assert(GetFunctionInfo()); + return GetFunctionInfo()->GetLocalFunctionId(); + } + + inline void FunctionProxy::SetLocalFunctionId(LocalFunctionId functionId) + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->SetLocalFunctionId(functionId); + } + + inline void FunctionProxy::VerifyOriginalEntryPoint() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->VerifyOriginalEntryPoint(); + } + + inline JavascriptMethod FunctionProxy::GetOriginalEntryPoint() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->GetOriginalEntryPoint(); + } + + inline JavascriptMethod FunctionProxy::GetOriginalEntryPoint_Unchecked() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->GetOriginalEntryPoint_Unchecked(); + } + + inline void FunctionProxy::SetOriginalEntryPoint(const JavascriptMethod originalEntryPoint) + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + GetFunctionInfo()->SetOriginalEntryPoint(originalEntryPoint); + } + + inline bool FunctionProxy::IsAsync() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->IsAsync(); + } + + inline bool FunctionProxy::IsDeferred() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->IsDeferred(); + } + + inline bool FunctionProxy::IsConstructor() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->IsConstructor(); + } + + inline bool FunctionProxy::IsGenerator() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->IsGenerator(); + } + + inline bool FunctionProxy::HasSuperReference() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->HasSuperReference(); + } + + inline bool FunctionProxy::IsCoroutine() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->IsCoroutine(); + } + + inline bool FunctionProxy::GetCapturesThis() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->GetCapturesThis(); + } + + inline void FunctionProxy::SetCapturesThis() + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + GetFunctionInfo()->SetCapturesThis(); + } + + inline bool FunctionProxy::GetEnclosedByGlobalFunc() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->GetEnclosedByGlobalFunc(); + } + + inline void FunctionProxy::SetEnclosedByGlobalFunc() + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + GetFunctionInfo()->SetEnclosedByGlobalFunc(); + } + + inline BOOL FunctionProxy::IsDeferredDeserializeFunction() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->IsDeferredDeserializeFunction(); + } + + inline BOOL FunctionProxy::IsDeferredParseFunction() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->IsDeferredParseFunction(); + } + + inline FunctionInfo::Attributes FunctionProxy::GetAttributes() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->GetAttributes(); + } + + inline void FunctionProxy::SetAttributes(FunctionInfo::Attributes attributes) + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + GetFunctionInfo()->SetAttributes(attributes); + } + + inline ParseableFunctionInfo** FunctionProxy::GetParseableFunctionInfoRef() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->GetParseableFunctionInfoRef(); + } + + inline bool FunctionProxy::IsLambda() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->IsLambda(); + } + + inline bool FunctionProxy::IsClassConstructor() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->IsClassConstructor(); + } + + inline bool FunctionProxy::IsClassMethod() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->IsClassMethod(); + } + + inline bool FunctionProxy::IsModule() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->IsModule(); + } + + inline ParseableFunctionInfo* FunctionProxy::GetParseableFunctionInfo() const + { + Assert(!IsDeferredDeserializeFunction()); + return (ParseableFunctionInfo*)this; + } + + inline DeferDeserializeFunctionInfo* FunctionProxy::GetDeferDeserializeFunctionInfo() const + { + Assert(IsDeferredDeserializeFunction()); + return (DeferDeserializeFunctionInfo*)this; + } + + inline FunctionBody * FunctionProxy::GetFunctionBody() const + { + Assert(IsFunctionBody()); + return (FunctionBody*)this; + } + // Represents a function from the byte code cache which will // be deserialized upon use class DeferDeserializeFunctionInfo: public FunctionProxy @@ -1408,9 +1649,9 @@ namespace Js friend struct ByteCodeSerializer; private: - DeferDeserializeFunctionInfo(int nestedFunctionCount, LocalFunctionId functionId, ByteCodeCache* byteCodeCache, const byte* serializedFunction, Utf8SourceInfo* sourceInfo, ScriptContext* scriptContext, uint functionNumber, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, NativeModule *nativeModule, Attributes attributes); + DeferDeserializeFunctionInfo(int nestedFunctionCount, LocalFunctionId functionId, ByteCodeCache* byteCodeCache, const byte* serializedFunction, Utf8SourceInfo* sourceInfo, ScriptContext* scriptContext, uint functionNumber, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, NativeModule *nativeModule, FunctionInfo::Attributes attributes); public: - static DeferDeserializeFunctionInfo* New(ScriptContext* scriptContext, int nestedFunctionCount, LocalFunctionId functionId, ByteCodeCache* byteCodeCache, const byte* serializedFunction, Utf8SourceInfo* utf8SourceInfo, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, NativeModule *nativeModule, Attributes attributes); + static DeferDeserializeFunctionInfo* New(ScriptContext* scriptContext, int nestedFunctionCount, LocalFunctionId functionId, ByteCodeCache* byteCodeCache, const byte* serializedFunction, Utf8SourceInfo* utf8SourceInfo, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, NativeModule *nativeModule, FunctionInfo::Attributes attributes); virtual void Finalize(bool isShutdown) override; FunctionBody* Deserialize(); @@ -1435,7 +1676,7 @@ namespace Js friend class ByteCodeBufferReader; protected: - ParseableFunctionInfo(JavascriptMethod method, int nestedFunctionCount, LocalFunctionId functionId, Utf8SourceInfo* sourceInfo, ScriptContext* scriptContext, uint functionNumber, const char16* displayName, uint m_displayNameLength, uint displayShortNameOffset, Attributes attributes, Js::PropertyRecordList* propertyRecordList); + ParseableFunctionInfo(JavascriptMethod method, int nestedFunctionCount, LocalFunctionId functionId, Utf8SourceInfo* sourceInfo, ScriptContext* scriptContext, uint functionNumber, const char16* displayName, uint m_displayNameLength, uint displayShortNameOffset, FunctionInfo::Attributes attributes, Js::PropertyRecordList* propertyRecordList); public: struct NestedArray @@ -1464,7 +1705,7 @@ namespace Js uint GetNestedCount() const { return nestedArray == nullptr ? 0 : nestedArray->nestedCount; } public: - static ParseableFunctionInfo* New(ScriptContext* scriptContext, int nestedFunctionCount, LocalFunctionId functionId, Utf8SourceInfo* utf8SourceInfo, const char16* displayName, uint m_displayNameLength, uint displayShortNameOffset, Js::PropertyRecordList* propertyRecordList, Attributes attributes); + static ParseableFunctionInfo* New(ScriptContext* scriptContext, int nestedFunctionCount, LocalFunctionId functionId, Utf8SourceInfo* utf8SourceInfo, const char16* displayName, uint m_displayNameLength, uint displayShortNameOffset, Js::PropertyRecordList* propertyRecordList, FunctionInfo::Attributes attributes); DEFINE_VTABLE_CTOR_NO_REGISTER(ParseableFunctionInfo, FunctionProxy); FunctionBody* Parse(ScriptFunction ** functionRef = nullptr, bool isByteCodeDeserialization = false); @@ -1651,12 +1892,6 @@ namespace Js void SetNestedFunc(FunctionProxy* nestedFunc, uint index, uint32 flags); void ClearNestedFunctionParentFunctionReference(); - void SetCapturesThis() { attributes = (Attributes)(attributes | Attributes::CapturesThis); } - bool GetCapturesThis() { return (attributes & Attributes::CapturesThis) != 0; } - - void SetEnclosedByGlobalFunc() { attributes = (Attributes)(attributes | Attributes::EnclosedByGlobalFunc ); } - bool GetEnclosedByGlobalFunc() { return (attributes & Attributes::EnclosedByGlobalFunc) != 0; } - void BuildDeferredStubs(ParseNode *pnodeFnc); DeferredFunctionStub *GetDeferredStubs() const { return static_cast(this->GetAuxPtr(AuxPointerType::DeferredStubs)); } void SetDeferredStubs(DeferredFunctionStub *stub) { this->SetAuxPtr(AuxPointerType::DeferredStubs, stub); } @@ -2107,7 +2342,7 @@ namespace Js #endif FunctionBody(ScriptContext* scriptContext, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, uint nestedCount, Utf8SourceInfo* sourceInfo, - uint uFunctionNumber, uint uScriptId, Js::LocalFunctionId functionId, Js::PropertyRecordList* propRecordList, Attributes attributes + uint uFunctionNumber, uint uScriptId, Js::LocalFunctionId functionId, Js::PropertyRecordList* propRecordList, FunctionInfo::Attributes attributes #ifdef PERF_COUNTERS , bool isDeserializedFunction = false #endif @@ -2126,7 +2361,7 @@ namespace Js public: FunctionBody(ByteCodeCache* cache, Utf8SourceInfo* sourceInfo, ScriptContext* scriptContext): - ParseableFunctionInfo((JavascriptMethod) nullptr, 0, (LocalFunctionId) 0, sourceInfo, scriptContext, 0, nullptr, 0, 0, None, nullptr) + ParseableFunctionInfo((JavascriptMethod) nullptr, 0, (LocalFunctionId) 0, sourceInfo, scriptContext, 0, nullptr, 0, 0, FunctionInfo::Attributes::None, nullptr) { // Dummy constructor- does nothing // Must be stack allocated @@ -2134,13 +2369,13 @@ namespace Js } static FunctionBody * NewFromRecycler(Js::ScriptContext * scriptContext, const char16 * displayName, uint displayNameLength, uint displayShortNameOffset, uint nestedCount, - Utf8SourceInfo* sourceInfo, uint uScriptId, Js::LocalFunctionId functionId, Js::PropertyRecordList* boundPropertyRecords, Attributes attributes + Utf8SourceInfo* sourceInfo, uint uScriptId, Js::LocalFunctionId functionId, Js::PropertyRecordList* boundPropertyRecords, FunctionInfo::Attributes attributes #ifdef PERF_COUNTERS , bool isDeserializedFunction #endif ); static FunctionBody * NewFromRecycler(Js::ScriptContext * scriptContext, const char16 * displayName, uint displayNameLength, uint displayShortNameOffset, uint nestedCount, - Utf8SourceInfo* sourceInfo, uint uFunctionNumber, uint uScriptId, Js::LocalFunctionId functionId, Js::PropertyRecordList* boundPropertyRecords, Attributes attributes + Utf8SourceInfo* sourceInfo, uint uFunctionNumber, uint uScriptId, Js::LocalFunctionId functionId, Js::PropertyRecordList* boundPropertyRecords, FunctionInfo::Attributes attributes #ifdef PERF_COUNTERS , bool isDeserializedFunction #endif @@ -2404,8 +2639,6 @@ namespace Js void CleanupPerfCounter(); #endif - virtual void Dispose(bool isShutdown) override { } - bool HasRejit() const { if(this->entryPoints) @@ -2576,7 +2809,7 @@ namespace Js void SetDisableInlineApply(bool set); bool IsInlineSpreadDisabled() const { return disableInlineSpread; } - void InitDisableInlineSpread() { disableInlineSpread = this->functionId != Js::Constants::NoFunctionId && PHASE_OFF(Js::InlinePhase, this); } + void InitDisableInlineSpread() { disableInlineSpread = this->GetLocalFunctionId() != Js::Constants::NoFunctionId && PHASE_OFF(Js::InlinePhase, this); } void SetDisableInlineSpread(bool set) { disableInlineSpread = set; } bool CheckCalleeContextForInlining(FunctionProxy* calleeFunctionProxy); diff --git a/lib/Runtime/Base/FunctionInfo.cpp b/lib/Runtime/Base/FunctionInfo.cpp index 5de06af8e9a..a6c4cb45b7d 100644 --- a/lib/Runtime/Base/FunctionInfo.cpp +++ b/lib/Runtime/Base/FunctionInfo.cpp @@ -6,7 +6,7 @@ namespace Js { - FunctionInfo::FunctionInfo(JavascriptMethod entryPoint, Attributes attributes, LocalFunctionId functionId, FunctionBody* functionBodyImpl) + FunctionInfo::FunctionInfo(JavascriptMethod entryPoint, Attributes attributes, LocalFunctionId functionId, FunctionProxy* functionBodyImpl) : originalEntryPoint(entryPoint), attributes(attributes), functionBodyImpl(functionBodyImpl), functionId(functionId) { #if !DYNAMIC_INTERPRETER_THUNK @@ -40,8 +40,7 @@ namespace Js FunctionBody * FunctionInfo::GetFunctionBody() const { - Assert(functionBodyImpl == nullptr || functionBodyImpl->IsFunctionBody()); - return (FunctionBody *)functionBodyImpl; + return functionBodyImpl == nullptr ? nullptr : functionBodyImpl->GetFunctionBody(); } FunctionInfo::Attributes FunctionInfo::GetAttributes(Js::RecyclableObject * function) diff --git a/lib/Runtime/Base/FunctionInfo.h b/lib/Runtime/Base/FunctionInfo.h index 9320b20db29..ef4dc23a927 100644 --- a/lib/Runtime/Base/FunctionInfo.h +++ b/lib/Runtime/Base/FunctionInfo.h @@ -39,9 +39,14 @@ namespace Js Module = 0x20000, // The function is the function body wrapper for a module EnclosedByGlobalFunc = 0x40000, }; - FunctionInfo(JavascriptMethod entryPoint, Attributes attributes = None, LocalFunctionId functionId = Js::Constants::NoFunctionId, FunctionBody* functionBodyImpl = NULL); + FunctionInfo(JavascriptMethod entryPoint, Attributes attributes = None, LocalFunctionId functionId = Js::Constants::NoFunctionId, FunctionProxy* functionBodyImpl = nullptr); static DWORD GetFunctionBodyImplOffset() { return offsetof(FunctionInfo, functionBodyImpl); } + static BYTE GetOffsetOfFunctionProxy() + { + CompileAssert(offsetof(FunctionInfo, functionBodyImpl) <= UCHAR_MAX); + return offsetof(FunctionInfo, functionBodyImpl); + } static DWORD GetAttributesOffset() { return offsetof(FunctionInfo, attributes); } void VerifyOriginalEntryPoint() const; @@ -67,10 +72,14 @@ namespace Js { return functionBodyImpl; } + void SetFunctionProxy(FunctionProxy * proxy) + { + functionBodyImpl = proxy; + } ParseableFunctionInfo* GetParseableFunctionInfo() const { - Assert(functionBodyImpl == NULL || !IsDeferredDeserializeFunction()); - return (ParseableFunctionInfo*) functionBodyImpl; + Assert(functionBodyImpl == nullptr || !IsDeferredDeserializeFunction()); + return (ParseableFunctionInfo*)functionBodyImpl; } ParseableFunctionInfo** GetParseableFunctionInfoRef() const { @@ -79,19 +88,23 @@ namespace Js } DeferDeserializeFunctionInfo* GetDeferDeserializeFunctionInfo() const { - Assert(functionBodyImpl == NULL || IsDeferredDeserializeFunction()); + Assert(functionBodyImpl == nullptr || IsDeferredDeserializeFunction()); return (DeferDeserializeFunctionInfo*)functionBodyImpl; } FunctionBody * GetFunctionBody() const; Attributes GetAttributes() const { return attributes; } static Attributes GetAttributes(Js::RecyclableObject * function); - Js::LocalFunctionId GetLocalFunctionId() const { return functionId; } - virtual void Finalize(bool isShutdown) + void SetAttributes(Attributes attr) { attributes = attr; } + + LocalFunctionId GetLocalFunctionId() const { return functionId; } + void SetLocalFunctionId(LocalFunctionId functionId) { this->functionId = functionId; } + + virtual void Finalize(bool isShutdown) override { } - virtual void Dispose(bool isShutdown) + virtual void Dispose(bool isShutdown) override { } @@ -99,6 +112,10 @@ namespace Js BOOL IsDeferredDeserializeFunction() const { return ((this->attributes & DeferredDeserialize) == DeferredDeserialize); } BOOL IsDeferredParseFunction() const { return ((this->attributes & DeferredParse) == DeferredParse); } + void SetCapturesThis() { attributes = (Attributes)(attributes | Attributes::CapturesThis); } + bool GetCapturesThis() const { return (attributes & Attributes::CapturesThis) != 0; } + void SetEnclosedByGlobalFunc() { attributes = (Attributes)(attributes | Attributes::EnclosedByGlobalFunc ); } + bool GetEnclosedByGlobalFunc() const { return (attributes & Attributes::EnclosedByGlobalFunc) != 0; } protected: JavascriptMethod originalEntryPoint; diff --git a/lib/Runtime/Base/ScriptContext.cpp b/lib/Runtime/Base/ScriptContext.cpp index e6936e8c20c..21aa4a19a22 100644 --- a/lib/Runtime/Base/ScriptContext.cpp +++ b/lib/Runtime/Base/ScriptContext.cpp @@ -2128,7 +2128,7 @@ if (!sourceList) dict->Add(key, pFuncScript); } - bool ScriptContext::IsInNewFunctionMap(EvalMapString const& key, ParseableFunctionInfo **ppFuncBody) + bool ScriptContext::IsInNewFunctionMap(EvalMapString const& key, FunctionInfo **ppFuncInfo) { if (this->cache->newFunctionCache == nullptr) { @@ -2136,7 +2136,7 @@ if (!sourceList) } // If eval map cleanup is false, to preserve existing behavior, add it to the eval map MRU list - bool success = this->cache->newFunctionCache->TryGetValue(key, ppFuncBody); + bool success = this->cache->newFunctionCache->TryGetValue(key, ppFuncInfo); if (success) { this->cache->newFunctionCache->NotifyAdd(key); @@ -2150,13 +2150,13 @@ if (!sourceList) return success; } - void ScriptContext::AddToNewFunctionMap(EvalMapString const& key, ParseableFunctionInfo *pFuncBody) + void ScriptContext::AddToNewFunctionMap(EvalMapString const& key, FunctionInfo *pFuncInfo) { if (this->cache->newFunctionCache == nullptr) { this->cache->newFunctionCache = RecyclerNew(this->recycler, NewFunctionCache, this->recycler); } - this->cache->newFunctionCache->Add(key, pFuncBody); + this->cache->newFunctionCache->Add(key, pFuncInfo); } @@ -3192,6 +3192,8 @@ if (!sourceList) JavascriptMethod entryPoint = pFunction->GetEntryPoint(); FunctionInfo * info = pFunction->GetFunctionInfo(); FunctionProxy * proxy = info->GetFunctionProxy(); + +#if 0 if (proxy != info) { #ifdef ENABLE_SCRIPT_PROFILING @@ -3236,6 +3238,13 @@ if (!sourceList) return; } +#else + if (proxy == nullptr) + { + return; + } + Assert(proxy->GetFunctionInfo() == info); +#endif if (!proxy->IsFunctionBody()) { @@ -3338,27 +3347,6 @@ if (!sourceList) #endif OUTPUT_TRACE(Js::ScriptProfilerPhase, _u("\n")); - FunctionInfo * info = pFunction->GetFunctionInfo(); - if (proxy != info) - { - // The thunk can deal with moving to the function body -#ifdef ENABLE_SCRIPT_PROFILING - Assert(entryPoint == DefaultDeferredParsingThunk || entryPoint == ProfileDeferredParsingThunk - || entryPoint == DefaultDeferredDeserializeThunk || entryPoint == ProfileDeferredDeserializeThunk - || entryPoint == CrossSite::DefaultThunk || entryPoint == CrossSite::ProfileThunk); -#else - Assert(entryPoint == DefaultDeferredParsingThunk - || entryPoint == DefaultDeferredDeserializeThunk - || entryPoint == CrossSite::DefaultThunk); -#endif - - Assert(!proxy->IsDeferred()); - Assert(proxy->GetFunctionBody()->GetProfileSession() == proxy->GetScriptContext()->GetProfileSession()); - - return; - } - - #if ENABLE_NATIVE_CODEGEN if (!IsIntermediateCodeGenThunk(entryPoint) && entryPoint != DynamicProfileInfo::EnsureDynamicProfileInfoThunk) #endif diff --git a/lib/Runtime/Base/ScriptContext.h b/lib/Runtime/Base/ScriptContext.h index 5ed1fd39d6a..45fac98491e 100644 --- a/lib/Runtime/Base/ScriptContext.h +++ b/lib/Runtime/Base/ScriptContext.h @@ -324,7 +324,7 @@ namespace Js typedef JsUtil::BaseDictionary SecondLevelEvalCache; typedef TwoLevelHashRecord EvalMapRecord; typedef JsUtil::Cache, FastEvalMapStringComparer> EvalCacheTopLevelDictionary; - typedef JsUtil::Cache> NewFunctionCache; + typedef JsUtil::Cache> NewFunctionCache; typedef JsUtil::BaseDictionary ParseableFunctionInfoMap; // This is the dictionary used by script context to cache the eval. typedef TwoLevelHashDictionary EvalCacheDictionary; @@ -1021,8 +1021,8 @@ namespace Js inline bool EnableEvalMapCleanup() { return CONFIG_FLAG(EnableEvalMapCleanup); }; uint GetNextSourceContextId(); - bool IsInNewFunctionMap(EvalMapString const& key, ParseableFunctionInfo **ppFuncBody); - void AddToNewFunctionMap(EvalMapString const& key, ParseableFunctionInfo *pFuncBody); + bool IsInNewFunctionMap(EvalMapString const& key, FunctionInfo **ppFuncInfo); + void AddToNewFunctionMap(EvalMapString const& key, FunctionInfo *pFuncInfo); SourceContextInfo * GetSourceContextInfo(DWORD_PTR hostSourceContext, IActiveScriptDataCache* profileDataCache); SourceContextInfo * GetSourceContextInfo(uint hash); diff --git a/lib/Runtime/ByteCode/ByteCodeDumper.cpp b/lib/Runtime/ByteCode/ByteCodeDumper.cpp index 021b0748d5f..9d6f2deb33b 100644 --- a/lib/Runtime/ByteCode/ByteCodeDumper.cpp +++ b/lib/Runtime/ByteCode/ByteCodeDumper.cpp @@ -812,7 +812,7 @@ namespace Js case OpCode::NewInnerScFunc: case OpCode::NewInnerScGenFunc: { - FunctionProxy* pfuncActual = dumpFunction->GetNestedFunc((uint)data->SlotIndex)->GetFunctionProxy(); + FunctionProxy* pfuncActual = dumpFunction->GetNestedFunc((uint)data->SlotIndex); Output::Print(_u(" R%d = env:R%d, %s()"), data->Value, data->Instance, pfuncActual->EnsureDeserialized()->GetDisplayName()); break; @@ -862,7 +862,7 @@ namespace Js case OpCode::NewStackScFunc: case OpCode::NewScGenFunc: { - FunctionProxy* pfuncActual = dumpFunction->GetNestedFunc((uint)data->SlotIndex)->GetFunctionProxy(); + FunctionProxy* pfuncActual = dumpFunction->GetNestedFunc((uint)data->SlotIndex); Output::Print(_u(" R%d = %s()"), data->Value, pfuncActual->EnsureDeserialized()->GetDisplayName()); break; diff --git a/lib/Runtime/ByteCode/ByteCodeSerializer.cpp b/lib/Runtime/ByteCode/ByteCodeSerializer.cpp index bf92e3dd577..0438b420c80 100644 --- a/lib/Runtime/ByteCode/ByteCodeSerializer.cpp +++ b/lib/Runtime/ByteCode/ByteCodeSerializer.cpp @@ -2222,7 +2222,7 @@ class ByteCodeBufferBuilder ; PrependInt32(builder, _u("BitFlags"), bitFlags); - PrependInt32(builder, _u("Relative Function ID"), function->functionId - topFunctionId); // Serialized function ids are relative to the top function ID + PrependInt32(builder, _u("Relative Function ID"), function->GetLocalFunctionId() - topFunctionId); // Serialized function ids are relative to the top function ID PrependInt32(builder, _u("Attributes"), function->GetAttributes()); AssertMsg((function->GetAttributes() & ~(FunctionInfo::Attributes::ErrorOnNew @@ -2413,7 +2413,7 @@ class ByteCodeBufferBuilder HRESULT AddTopFunctionBody(FunctionBody * function, SRCINFO const * srcInfo) { - topFunctionId = function->functionId; + topFunctionId = function->GetLocalFunctionId(); return AddFunctionBody(functionsTable, function, srcInfo); } diff --git a/lib/Runtime/Debug/TTSnapValues.cpp b/lib/Runtime/Debug/TTSnapValues.cpp index 09ac8af7361..41008c40180 100644 --- a/lib/Runtime/Debug/TTSnapValues.cpp +++ b/lib/Runtime/Debug/TTSnapValues.cpp @@ -1289,7 +1289,7 @@ namespace TTD functionInfo->SetGrfscr(functionInfo->GetGrfscr() | fscrGlobalCode); Js::EvalMapString key(source, length, moduleID, strictMode, /* isLibraryCode = */ false); - ctx->AddToNewFunctionMap(key, functionInfo); + ctx->AddToNewFunctionMap(key, functionInfo->GetFunctionInfo()); Js::FunctionBody* fb = JsSupport::ForceAndGetFunctionBody(pfuncScript->GetParseableFunctionInfo()); diff --git a/lib/Runtime/Language/AsmJsModule.cpp b/lib/Runtime/Language/AsmJsModule.cpp index 8f89cb19b9b..1da9875c93f 100644 --- a/lib/Runtime/Language/AsmJsModule.cpp +++ b/lib/Runtime/Language/AsmJsModule.cpp @@ -621,6 +621,7 @@ namespace Js CompileScriptException se; funcBody = deferParseFunction->ParseAsmJs(&ps, &se, &parseTree); + fncNode->sxFnc.funcInfo->byteCodeFunction = funcBody; TRACE_BYTECODE(_u("\nDeferred parse %s\n"), funcBody->GetDisplayName()); if (parseTree && parseTree->nop == knopProg) @@ -637,7 +638,6 @@ namespace Js } } GetByteCodeGenerator()->PushFuncInfo(_u("Start asm.js AST prepass"), fncNode->sxFnc.funcInfo); - fncNode->sxFnc.funcInfo->byteCodeFunction->SetBoundPropertyRecords(GetByteCodeGenerator()->EnsurePropertyRecordList()); BindArguments(fncNode->sxFnc.pnodeParams); ASTPrepass(pnodeBody, func); GetByteCodeGenerator()->PopFuncInfo(_u("End asm.js AST prepass")); diff --git a/lib/Runtime/Language/DynamicProfileInfo.cpp b/lib/Runtime/Language/DynamicProfileInfo.cpp index ab72e92b8ea..28bbdc4e0d0 100644 --- a/lib/Runtime/Language/DynamicProfileInfo.cpp +++ b/lib/Runtime/Language/DynamicProfileInfo.cpp @@ -413,7 +413,7 @@ namespace Js } // Mark the callsite bit where caller and callee is same function - if (functionBody == calleeFunctionInfo && callSiteId < 32) + if (calleeFunctionInfo && functionBody == calleeFunctionInfo->GetFunctionProxy() && callSiteId < 32) { this->m_recursiveInlineInfo = this->m_recursiveInlineInfo | (1 << callSiteId); } @@ -769,7 +769,8 @@ namespace Js if (sourceId == CurrentSourceId) // caller and callee in same file { - return functionBody->GetUtf8SourceInfo()->FindFunction(functionId); + FunctionProxy *inlineeProxy = functionBody->GetUtf8SourceInfo()->FindFunction(functionId); + return inlineeProxy ? inlineeProxy->GetFunctionInfo() : nullptr; } if (sourceId != NoSourceId && sourceId != InvalidSourceId) @@ -783,7 +784,8 @@ namespace Js Utf8SourceInfo *srcInfo = sourceList->Item(i)->Get(); if (srcInfo && srcInfo->GetHostSourceContext() == sourceId) { - return srcInfo->FindFunction(functionId); + FunctionProxy *inlineeProxy = srcInfo->FindFunction(functionId); + return inlineeProxy ? inlineeProxy->GetFunctionInfo() : nullptr; } } } diff --git a/lib/Runtime/Language/FunctionCodeGenJitTimeData.h b/lib/Runtime/Language/FunctionCodeGenJitTimeData.h index d2f4de343ed..671eca40a34 100644 --- a/lib/Runtime/Language/FunctionCodeGenJitTimeData.h +++ b/lib/Runtime/Language/FunctionCodeGenJitTimeData.h @@ -583,7 +583,7 @@ namespace Js bool IsPolymorphicCallSite(const ProfileId profiledCallSiteId) const; // This function walks all the chained jittimedata and returns the one which match the functionInfo. // This can return null, if the functionInfo doesn't match. - const FunctionCodeGenJitTimeData *GetJitTimeDataFromFunctionInfo(FunctionInfo *polyFunctionInfo) const; + const FunctionCodeGenJitTimeData *GetJitTimeDataFromFunctionInfo(FunctionInfo *polyFunctioInfoy) const; ObjTypeSpecFldInfo* GetGlobalObjTypeSpecFldInfo(uint propertyInfoId) const { diff --git a/lib/Runtime/Language/FunctionCodeGenRuntimeData.cpp b/lib/Runtime/Language/FunctionCodeGenRuntimeData.cpp index 86c8dc1fd89..72eba4b566c 100644 --- a/lib/Runtime/Language/FunctionCodeGenRuntimeData.cpp +++ b/lib/Runtime/Language/FunctionCodeGenRuntimeData.cpp @@ -112,7 +112,8 @@ namespace Js const FunctionCodeGenRuntimeData *FunctionCodeGenRuntimeData::GetRuntimeDataFromFunctionInfo(FunctionInfo *polyFunctionInfo) const { const FunctionCodeGenRuntimeData *next = this; - while (next && next->functionBody != polyFunctionInfo) + FunctionProxy *polyFunctionProxy = polyFunctionInfo->GetFunctionProxy(); + while (next && next->functionBody != polyFunctionProxy) { next = next->next; } diff --git a/lib/Runtime/Language/JavascriptOperators.cpp b/lib/Runtime/Language/JavascriptOperators.cpp index de124c1bef4..993c6e9db0e 100644 --- a/lib/Runtime/Language/JavascriptOperators.cpp +++ b/lib/Runtime/Language/JavascriptOperators.cpp @@ -5539,13 +5539,6 @@ namespace Js ScriptFunction *func = entry->func; FunctionProxy * proxy = func->GetFunctionProxy(); - if (proxy != proxy->GetFunctionProxy()) - { - // The FunctionProxy has changed since the object was cached, e.g., due to execution - // of a deferred function through a different object. - proxy = proxy->GetFunctionProxy(); - func->SetFunctionInfo(proxy); - } // Reset the function's type to the default type with no properties // Use the cached type on the function proxy rather than the type in the func cache entry @@ -9790,10 +9783,7 @@ namespace Js JavascriptOperators::GetDeferredDeserializedFunctionProxy(JavascriptFunction* func) { FunctionProxy* proxy = func->GetFunctionProxy(); - if (proxy->GetFunctionProxy() != proxy) - { - proxy = proxy->GetFunctionProxy(); - } + Assert(proxy->GetFunctionInfo()->GetFunctionProxy() != proxy); return proxy; } diff --git a/lib/Runtime/Library/GlobalObject.cpp b/lib/Runtime/Library/GlobalObject.cpp index d15c4646503..be1a7826513 100644 --- a/lib/Runtime/Library/GlobalObject.cpp +++ b/lib/Runtime/Library/GlobalObject.cpp @@ -764,6 +764,7 @@ namespace Js { // This could happen if the top level function is marked as deferred, we need to parse this to generate the script compile information (RegisterScript depends on that) Js::JavascriptFunction::DeferredParse(&pEvalFunction); + proxy = pEvalFunction->GetFunctionProxy(); } scriptContext->RegisterScript(proxy); @@ -984,7 +985,7 @@ namespace Js { FunctionBody* parentFuncBody = pfuncCaller->GetFunctionBody(); Utf8SourceInfo* parentUtf8SourceInfo = parentFuncBody->GetUtf8SourceInfo(); - Utf8SourceInfo* utf8SourceInfo = funcBody->GetFunctionProxy()->GetUtf8SourceInfo(); + Utf8SourceInfo* utf8SourceInfo = funcBody->GetUtf8SourceInfo(); utf8SourceInfo->SetCallerUtf8SourceInfo(parentUtf8SourceInfo); } } diff --git a/lib/Runtime/Library/JavascriptFunction.cpp b/lib/Runtime/Library/JavascriptFunction.cpp index d3a7362d8d3..b9a1327fcfc 100644 --- a/lib/Runtime/Library/JavascriptFunction.cpp +++ b/lib/Runtime/Library/JavascriptFunction.cpp @@ -208,11 +208,11 @@ namespace Js BOOL strictMode = FALSE; JavascriptFunction *pfuncScript; - ParseableFunctionInfo *pfuncBodyCache = NULL; + FunctionInfo *pfuncInfoCache = NULL; char16 const * sourceString = bs->GetSz(); charcount_t sourceLen = bs->GetLength(); EvalMapString key(sourceString, sourceLen, moduleID, strictMode, /* isLibraryCode = */ false); - if (!scriptContext->IsInNewFunctionMap(key, &pfuncBodyCache)) + if (!scriptContext->IsInNewFunctionMap(key, &pfuncInfoCache)) { // Validate formals here scriptContext->GetGlobalObject()->ValidateSyntax( @@ -237,20 +237,15 @@ namespace Js Assert(functionInfo); functionInfo->SetGrfscr(functionInfo->GetGrfscr() | fscrGlobalCode); - scriptContext->AddToNewFunctionMap(key, functionInfo); + scriptContext->AddToNewFunctionMap(key, functionInfo->GetFunctionInfo()); + } + else if (pfuncInfoCache->IsCoroutine()) + { + pfuncScript = scriptContext->GetLibrary()->CreateGeneratorVirtualScriptFunction(pfuncInfoCache->GetFunctionProxy()); } else { - // Get the latest proxy - FunctionProxy * proxy = pfuncBodyCache->GetFunctionProxy(); - if (proxy->IsCoroutine()) - { - pfuncScript = scriptContext->GetLibrary()->CreateGeneratorVirtualScriptFunction(proxy); - } - else - { - pfuncScript = scriptContext->GetLibrary()->CreateScriptFunction(proxy); - } + pfuncScript = scriptContext->GetLibrary()->CreateScriptFunction(pfuncInfoCache->GetFunctionProxy()); } #if ENABLE_TTD @@ -1532,7 +1527,6 @@ namespace Js ParseableFunctionInfo* functionInfo = (*functionRef)->GetParseableFunctionInfo(); Assert(functionInfo); - Assert(functionInfo->HasBody()); functionInfo->GetFunctionBody()->AddDeferParseAttribute(); functionInfo->GetFunctionBody()->ResetEntryPoint(); functionInfo->GetFunctionBody()->ResetInParams(); @@ -1647,7 +1641,7 @@ namespace Js // calls the default entry point the next time around if (funcInfo->IsDeferredDeserializeFunction()) { - DeferDeserializeFunctionInfo* deferDeserializeFunction = (DeferDeserializeFunctionInfo*) funcInfo; + DeferDeserializeFunctionInfo* deferDeserializeFunction = funcInfo->GetDeferDeserializeFunctionInfo(); // This is the first call to the function, ensure dynamic profile info // Deserialize is a no-op if the function has already been deserialized diff --git a/lib/Runtime/Library/ScriptFunction.cpp b/lib/Runtime/Library/ScriptFunction.cpp index b8f4fc3e31c..20f9794fced 100644 --- a/lib/Runtime/Library/ScriptFunction.cpp +++ b/lib/Runtime/Library/ScriptFunction.cpp @@ -32,11 +32,11 @@ namespace Js {} ScriptFunction::ScriptFunction(FunctionProxy * proxy, ScriptFunctionType* deferredPrototypeType) - : ScriptFunctionBase(deferredPrototypeType, proxy), + : ScriptFunctionBase(deferredPrototypeType, proxy->GetFunctionInfo()), environment((FrameDisplay*)&NullFrameDisplay), cachedScopeObj(nullptr), homeObj(nullptr), hasInlineCaches(false), hasSuperReference(false), isActiveScript(false) { - Assert(proxy->GetFunctionProxy() == proxy); + Assert(proxy->GetFunctionInfo()->GetFunctionProxy() == proxy); Assert(proxy->EnsureDeferredPrototypeType() == deferredPrototypeType); DebugOnly(VerifyEntryPoint()); @@ -260,31 +260,25 @@ namespace Js FunctionProxy * ScriptFunction::GetFunctionProxy() const { Assert(this->functionInfo->HasBody()); - return reinterpret_cast(this->functionInfo); + return this->functionInfo->GetFunctionProxy(); } JavascriptMethod ScriptFunction::UpdateUndeferredBody(FunctionBody* newFunctionInfo) { // Update deferred parsed/serialized function to the real function body Assert(this->functionInfo->HasBody()); - if (this->functionInfo != newFunctionInfo) - { - Assert(this->functionInfo->GetFunctionBody() == newFunctionInfo); - Assert(!newFunctionInfo->IsDeferred()); - DynamicType * type = this->GetDynamicType(); + Assert(this->functionInfo->GetFunctionBody() == newFunctionInfo); + Assert(!newFunctionInfo->IsDeferred()); - // If the type is shared, it must be the shared one in the old function proxy + DynamicType * type = this->GetDynamicType(); - DebugOnly(FunctionProxy * oldProxy = this->GetFunctionProxy()); - this->functionInfo = newFunctionInfo; + // If the type is shared, it must be the shared one in the old function proxy - if (type->GetIsShared()) - { - // if it is shared, it must still be the deferred prototype from the old proxy - Assert(type == oldProxy->GetDeferredPrototypeType()); + this->functionInfo = newFunctionInfo->GetFunctionInfo(); - // the type is still shared, we can't modify it, just migrate to the shared one in the function body - this->ReplaceType(newFunctionInfo->EnsureDeferredPrototypeType()); - } + if (type->GetIsShared()) + { + // the type is still shared, we can't modify it, just migrate to the shared one in the function body + this->ReplaceType(newFunctionInfo->EnsureDeferredPrototypeType()); } // The type has change from the default, it is not share, just use that one. @@ -297,8 +291,7 @@ namespace Js #endif Js::FunctionEntryPointInfo* defaultEntryPointInfo = newFunctionInfo->GetDefaultFunctionEntryPointInfo(); - JavascriptMethod thunkEntryPoint = this->UpdateThunkEntryPoint(defaultEntryPointInfo, - directEntryPoint); + JavascriptMethod thunkEntryPoint = this->UpdateThunkEntryPoint(defaultEntryPointInfo, directEntryPoint); this->GetScriptFunctionType()->SetEntryPointInfo(defaultEntryPointInfo); diff --git a/lib/Runtime/Library/StackScriptFunction.cpp b/lib/Runtime/Library/StackScriptFunction.cpp index 00b93184867..9e027520def 100644 --- a/lib/Runtime/Library/StackScriptFunction.cpp +++ b/lib/Runtime/Library/StackScriptFunction.cpp @@ -125,7 +125,7 @@ namespace Js for (uint i = 0; i < current->GetNestedCount(); i++) { FunctionProxy * nested = current->GetNestedFunc(i); - functionObjectToBox.Add(nested->GetFunctionProxy()); + functionObjectToBox.Add(nested); if (nested->IsFunctionBody()) { nested->GetFunctionBody()->ClearStackNestedFuncParent(); @@ -143,7 +143,7 @@ namespace Js bool StackScriptFunction::BoxState::NeedBoxScriptFunction(ScriptFunction * scriptFunction) { - return functionObjectToBox.Contains(scriptFunction->GetFunctionProxy()->GetFunctionProxy()); + return functionObjectToBox.Contains(scriptFunction->GetFunctionProxy()); } void StackScriptFunction::BoxState::Box() @@ -727,8 +727,7 @@ namespace Js Output::Flush(); } - // Make sure we use the latest function proxy (if it is parsed or deserialized) - FunctionProxy * functionBody = stackFunction->GetFunctionProxy()->GetFunctionProxy(); + FunctionProxy * functionBody = stackFunction->GetFunctionProxy(); boxedFunction = ScriptFunction::OP_NewScFunc(boxedFrameDisplay, &functionBody); stackFunction->boxedScriptFunction = boxedFunction; stackFunction->SetEnvironment(boxedFrameDisplay); diff --git a/lib/Runtime/Runtime.h b/lib/Runtime/Runtime.h index 3688d974902..c82251ff4ac 100644 --- a/lib/Runtime/Runtime.h +++ b/lib/Runtime/Runtime.h @@ -241,6 +241,7 @@ namespace Js struct TickDelta; class ByteBlock; class FunctionInfo; + class FunctionProxy; class FunctionBody; class ParseableFunctionInfo; struct StatementLocation; diff --git a/lib/Runtime/Types/ScriptFunctionType.cpp b/lib/Runtime/Types/ScriptFunctionType.cpp index fd76a03654a..76c7eb57731 100644 --- a/lib/Runtime/Types/ScriptFunctionType.cpp +++ b/lib/Runtime/Types/ScriptFunctionType.cpp @@ -21,7 +21,7 @@ namespace Js ScriptFunctionType * ScriptFunctionType::New(FunctionProxy * proxy, bool isShared) { - Assert(proxy->GetFunctionProxy() == proxy); + Assert(proxy->GetFunctionInfo()->GetFunctionProxy() == proxy); ScriptContext * scriptContext = proxy->GetScriptContext(); JavascriptLibrary * library = scriptContext->GetLibrary(); DynamicObject * functionPrototype = proxy->IsAsync() ? library->GetAsyncFunctionPrototype() : library->GetFunctionPrototype(); From f15f3c4ca16285dc1ccdb229078f063f305291c6 Mon Sep 17 00:00:00 2001 From: Paul Leathers Date: Wed, 11 May 2016 14:37:16 -0700 Subject: [PATCH 2/6] Redefer function bodies that are not currently being executed and are eligible for deferred parsing (e.g., not arrow functions, not functions-in-block). This is experimental behavior, off by default. Define an 'on' mode in which all eligible functions are redeferred on GC, as well as a 'stress' mode in which all candidates are redeferred on each stack probe. This change is built on a previous PR that refactors the FunctionBody hierarchy to make it easier to toggle between deferred and fully-compiled states. --- lib/Backend/Inline.cpp | 7 +- lib/Backend/Opnd.cpp | 2 +- lib/Common/ConfigFlagsList.h | 1 + lib/Common/Memory/CustomHeap.cpp | 4 + lib/Parser/Parse.cpp | 15 +- lib/Parser/Parse.h | 4 +- lib/Parser/ptree.h | 3 + lib/Runtime/Base/FunctionBody.cpp | 208 ++++++++-- lib/Runtime/Base/FunctionBody.h | 125 ++++--- lib/Runtime/Base/FunctionInfo.h | 2 + lib/Runtime/Base/ScriptContext.cpp | 14 + lib/Runtime/Base/ScriptContext.h | 1 + lib/Runtime/Base/ThreadContext.cpp | 74 +++- lib/Runtime/Base/ThreadContext.h | 5 + lib/Runtime/ByteCode/ByteCodeEmitter.cpp | 2 +- lib/Runtime/ByteCode/ByteCodeGenerator.cpp | 36 +- lib/Runtime/ByteCode/ByteCodeGenerator.h | 2 +- lib/Runtime/ByteCode/ScopeInfo.cpp | 10 +- lib/Runtime/ByteCode/ScopeInfo.h | 12 +- .../Language/FunctionCodeGenJitTimeData.cpp | 3 +- lib/Runtime/Language/InlineCache.h | 2 +- .../Language/InterpreterStackFrame.cpp | 8 +- .../Library/InJavascript/Intl.js.bc.32b.h | 354 +++++++++--------- .../Library/InJavascript/Intl.js.bc.64b.h | 342 ++++++++--------- lib/Runtime/Library/JavascriptFunction.cpp | 8 +- lib/Runtime/Library/JavascriptFunction.h | 2 +- lib/Runtime/Library/JavascriptProxy.cpp | 2 +- lib/Runtime/Library/ScriptFunction.cpp | 2 +- lib/Runtime/Library/StackScriptFunction.cpp | 8 +- lib/Runtime/SerializableFunctionFields.h | 2 +- 30 files changed, 776 insertions(+), 484 deletions(-) diff --git a/lib/Backend/Inline.cpp b/lib/Backend/Inline.cpp index e0a3ee1081f..5d8846d5e7b 100644 --- a/lib/Backend/Inline.cpp +++ b/lib/Backend/Inline.cpp @@ -497,7 +497,7 @@ uint Inline::FillInlineesDataArray( } Js::FunctionBody *inlineeFunctionBody = inlineeJitTimeData->GetFunctionBody(); - if (!PHASE_OFF(Js::PolymorphicInlinePhase, inlineeFunctionBody)) + if (inlineeFunctionBody && !PHASE_OFF(Js::PolymorphicInlinePhase, inlineeFunctionBody)) { const Js::FunctionCodeGenJitTimeData* rightInlineeJitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfo(inlineeFunctionBody->GetFunctionInfo()); const Js::FunctionCodeGenRuntimeData* rightInlineeRuntimeData = inlineeRuntimeData->GetRuntimeDataFromFunctionInfo(inlineeFunctionBody->GetFunctionInfo()); @@ -549,14 +549,15 @@ void Inline::FillInlineesDataArrayUsingFixedMethods( while (inlineeJitTimeData) { inlineeFuncBody = inlineeJitTimeData->GetFunctionBody(); - if (!PHASE_OFF(Js::PolymorphicInlinePhase, inlineeFuncBody) && !PHASE_OFF(Js::PolymorphicInlineFixedMethodsPhase, inlineeFuncBody)) + if (inlineeFuncBody && !PHASE_OFF(Js::PolymorphicInlinePhase, inlineeFuncBody) && !PHASE_OFF(Js::PolymorphicInlineFixedMethodsPhase, inlineeFuncBody)) { const Js::FunctionCodeGenJitTimeData* jitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfo(inlineeFuncBody->GetFunctionInfo()); if (jitTimeData) { for (uint16 i = 0; i < cachedFixedInlineeCount; i++) { - if (inlineeFuncBody == ((Js::JavascriptFunction*)(fixedFieldInfoArray[i].fieldValue))->GetFunctionBody()) + Js::ParseableFunctionInfo *info = ((Js::JavascriptFunction*)(fixedFieldInfoArray[i].fieldValue))->GetParseableFunctionInfo(); + if (info->IsFunctionBody() && inlineeFuncBody == info->GetFunctionBody()) { inlineesDataArray[i].inlineeJitTimeData = inlineeJitTimeData->GetJitTimeDataFromFunctionInfo(inlineeFuncBody->GetFunctionInfo()); inlineesDataArray[i].inlineeRuntimeData = inlineeRuntimeData->GetRuntimeDataFromFunctionInfo(inlineeFuncBody->GetFunctionInfo()); diff --git a/lib/Backend/Opnd.cpp b/lib/Backend/Opnd.cpp index c590b4ad256..28f57e55966 100644 --- a/lib/Backend/Opnd.cpp +++ b/lib/Backend/Opnd.cpp @@ -3234,7 +3234,7 @@ Opnd::GetAddrDescription(__out_ecount(count) char16 *const description, const si case IR::AddrOpndKindDynamicFunctionInfo: DumpAddress(address, printToConsole, skipMaskedAddress); - DumpFunctionInfo(&buffer, &n, (Js::FunctionInfo *)address, printToConsole); + DumpFunctionInfo(&buffer, &n, ((Js::FunctionBody *)address)->GetFunctionInfo(), printToConsole); break; case IR::AddrOpndKindDynamicFunctionBody: diff --git a/lib/Common/ConfigFlagsList.h b/lib/Common/ConfigFlagsList.h index d1da8cb225a..5bb54e6b602 100644 --- a/lib/Common/ConfigFlagsList.h +++ b/lib/Common/ConfigFlagsList.h @@ -10,6 +10,7 @@ PHASE(All) PHASE(Parse) PHASE(RegexCompile) PHASE(DeferParse) + PHASE(Redeferral) PHASE(DeferEventHandlers) PHASE(FunctionSourceInfoParse) PHASE(StringTemplateParse) diff --git a/lib/Common/Memory/CustomHeap.cpp b/lib/Common/Memory/CustomHeap.cpp index de58c7b1e9a..3463e6f4789 100644 --- a/lib/Common/Memory/CustomHeap.cpp +++ b/lib/Common/Memory/CustomHeap.cpp @@ -243,6 +243,10 @@ Allocation* Heap::Alloc(size_t bytes, ushort pdataCount, ushort xdataSize, bool { page = AllocNewPage(bucket, canAllocInPreReservedHeapPageSegment, isAnyJittedCode, isAllJITCodeInPreReservedRegion); } + else if (!canAllocInPreReservedHeapPageSegment && isAnyJittedCode) + { + *isAllJITCodeInPreReservedRegion = false; + } // Out of memory if (page == nullptr) diff --git a/lib/Parser/Parse.cpp b/lib/Parser/Parse.cpp index ce6312e7a63..79520701103 100644 --- a/lib/Parser/Parse.cpp +++ b/lib/Parser/Parse.cpp @@ -4881,7 +4881,7 @@ bool Parser::ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, usho BOOL isDeferredFnc = IsDeferredFnc(); AnalysisAssert(isDeferredFnc || pnodeFnc); isTopLevelDeferredFunc = - (!isDeferredFnc + (!fLambda && DeferredParse(pnodeFnc->sxFnc.functionId) && (!pnodeFnc->sxFnc.IsNested() || CONFIG_FLAG(DeferNested)) // Don't defer if this is a function expression not contained in a statement or other expression. @@ -4892,6 +4892,9 @@ bool Parser::ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, usho && !fModule ); + pnodeFnc->sxFnc.SetCanBeDeferred(isTopLevelDeferredFunc && !pnodeFnc->sxFnc.IsGenerator()); + isTopLevelDeferredFunc = isTopLevelDeferredFunc && !isDeferredFnc; + if (!fLambda && !isDeferredFnc && !isLikelyIIFE && @@ -6364,6 +6367,11 @@ ParseNodePtr Parser::GenerateEmptyConstructor(bool extends) pnodeFnc->sxFnc.deferredStub = nullptr; pnodeFnc->sxFnc.funcInfo = nullptr; + // In order to (re-)defer the default constructor, we need to, for instance, track + // deferred class expression the way we track function expression, since we lose the part of the source + // that tells us which we have. + pnodeFnc->sxFnc.canBeDeferred = false; + #ifdef DBG pnodeFnc->sxFnc.deferredParseNextFunctionId = *(this->m_nextFunctionId); #endif @@ -10306,6 +10314,7 @@ void Parser::ParseStmtList(ParseNodePtr *ppnodeList, ParseNodePtr **pppnodeLast, // i.e. smEnvironment == SM_OnFunctionCode Assert(m_currentNodeFunc != nullptr); m_currentNodeFunc->sxFnc.SetAsmjsMode(); + m_currentNodeFunc->sxFnc.SetCanBeDeferred(false); m_InAsmMode = true; CHAKRATEL_LANGSTATS_INC_LANGFEATURECOUNT(AsmJSFunctionCount, m_scriptContext); @@ -10560,7 +10569,7 @@ void Parser::InitPids() wellKnownPropertyPids._star = m_phtbl->PidHashNameLen(_u("*"), sizeof("*") - 1); } -void Parser::RestoreScopeInfo(Js::FunctionBody* functionBody) +void Parser::RestoreScopeInfo(Js::ParseableFunctionInfo* functionBody) { if (!functionBody) { @@ -10616,7 +10625,7 @@ void Parser::RestoreScopeInfo(Js::FunctionBody* functionBody) scopeInfo->GetScopeInfo(this, nullptr, nullptr, scope); } -void Parser::FinishScopeInfo(Js::FunctionBody *functionBody) +void Parser::FinishScopeInfo(Js::ParseableFunctionInfo *functionBody) { if (!functionBody) { diff --git a/lib/Parser/Parse.h b/lib/Parser/Parse.h index 142596ce13d..d2e854ac910 100644 --- a/lib/Parser/Parse.h +++ b/lib/Parser/Parse.h @@ -967,8 +967,8 @@ class Parser void RemovePrevPidRef(IdentPtr pid, PidRefStack *lastRef); void SetPidRefsInScopeDynamic(IdentPtr pid, int blockId); - void RestoreScopeInfo(Js::FunctionBody* functionBody); - void FinishScopeInfo(Js::FunctionBody* functionBody); + void RestoreScopeInfo(Js::ParseableFunctionInfo* functionBody); + void FinishScopeInfo(Js::ParseableFunctionInfo* functionBody); BOOL PnodeLabelNoAST(IdentToken* pToken, LabelId* pLabelIdList); LabelId* CreateLabelId(IdentToken* pToken); diff --git a/lib/Parser/ptree.h b/lib/Parser/ptree.h index 723bc1f2e65..b3c2821ce76 100644 --- a/lib/Parser/ptree.h +++ b/lib/Parser/ptree.h @@ -246,6 +246,7 @@ struct PnFnc #endif RestorePoint *pRestorePoint; DeferredFunctionStub *deferredStub; + bool canBeDeferred; static const int32 MaxStackClosureAST = 800000; @@ -316,6 +317,7 @@ struct PnFnc void SetUsesArguments(bool set = true) { SetFlags(kFunctionUsesArguments, set); } void SetIsDefaultModuleExport(bool set = true) { SetFlags(kFunctionIsDefaultModuleExport, set); } void SetNestedFuncEscapes(bool set = true) { nestedFuncEscapes = set; } + void SetCanBeDeferred(bool set = true) { canBeDeferred = set; } bool CallsEval() const { return HasFlags(kFunctionCallsEval); } bool ChildCallsEval() const { return HasFlags(kFunctionChildCallsEval); } @@ -353,6 +355,7 @@ struct PnFnc bool UsesArguments() const { return HasFlags(kFunctionUsesArguments); } bool IsDefaultModuleExport() const { return HasFlags(kFunctionIsDefaultModuleExport); } bool NestedFuncEscapes() const { return nestedFuncEscapes; } + bool CanBeDeferred() const { return canBeDeferred; } size_t LengthInBytes() { diff --git a/lib/Runtime/Base/FunctionBody.cpp b/lib/Runtime/Base/FunctionBody.cpp index cc414ff47ef..e620203519c 100644 --- a/lib/Runtime/Base/FunctionBody.cpp +++ b/lib/Runtime/Base/FunctionBody.cpp @@ -328,16 +328,6 @@ namespace Js void FunctionBody::CopySourceInfo(ParseableFunctionInfo* originalFunctionInfo) { - this->m_sourceIndex = originalFunctionInfo->GetSourceIndex(); - this->m_cchStartOffset = originalFunctionInfo->StartInDocument(); - this->m_cchLength = originalFunctionInfo->LengthInChars(); - this->m_lineNumber = originalFunctionInfo->GetRelativeLineNumber(); - this->m_columnNumber = originalFunctionInfo->GetRelativeColumnNumber(); - this->m_isEval = originalFunctionInfo->IsEval(); - this->m_isDynamicFunction = originalFunctionInfo->IsDynamicFunction(); - this->m_cbStartOffset = originalFunctionInfo->StartOffset(); - this->m_cbLength = originalFunctionInfo->LengthInBytes(); - this->FinishSourceInfo(); } @@ -453,7 +443,6 @@ namespace Js loopInterpreterLimit(CONFIG_FLAG(LoopInterpretCount)), savedPolymorphicCacheState(0), debuggerScopeIndex(0), - flags(Flags_HasNoExplicitReturnValue), m_hasFinally(false), #if ENABLE_PROFILE_INFO dynamicProfileInfo(nullptr), @@ -564,6 +553,76 @@ namespace Js InitDisableInlineSpread(); } + void FunctionBody::UpdateActiveFunctionSet(BVSparse *pActiveFuncs) const + { + if (pActiveFuncs->TestAndSet(this->GetFunctionNumber())) + { + return; + } + FunctionCodeGenRuntimeData **data = this->GetCodeGenRuntimeDataWithLock(); + if (data == nullptr) + { + return; + } + for (uint i = 0; i < this->GetProfiledCallSiteCount(); i++) + { + for (FunctionCodeGenRuntimeData *inlineeData = data[i]; inlineeData; inlineeData = inlineeData->GetNext()) + { + inlineeData->GetFunctionBody()->UpdateActiveFunctionSet(pActiveFuncs); + } + } + } + + void FunctionBody::RedeferFunction() + { + bool isJitCandidate = false; + Assert(this->CanBeDeferred()); + + // Make sure the function won't be jitted + MapEntryPoints([&](int index, FunctionEntryPointInfo *entryPointInfo) + { + if (entryPointInfo->IsCodeGenPending() || entryPointInfo->IsCodeGenQueued()) + { + isJitCandidate = true; + } + }); + if (isJitCandidate) + { + return; + } + + PHASE_PRINT_TRACE(Js::RedeferralPhase, this, L"Redeferring function %d.%d: %s\n", + GetSourceContextId(), GetLocalFunctionId(), + GetDisplayName() ? GetDisplayName() : L"(Anonymous function)"); + + ParseableFunctionInfo * parseableFunctionInfo = + Js::ParseableFunctionInfo::NewDeferredFunctionFromFunctionBody(this); + + if (this->m_referenceInParentFunction) + { + Assert(*this->m_referenceInParentFunction == this); + *m_referenceInParentFunction = parseableFunctionInfo; + } + + FunctionInfo * functionInfo = this->GetFunctionInfo(); + + this->MapFunctionObjectTypes([&](DynamicType* type) + { + Assert(type->GetTypeId() == TypeIds_Function); + + ScriptFunctionType* functionType = (ScriptFunctionType*)type; + functionType->SetEntryPoint(GetScriptContext()->DeferredParsingThunk); + }); + + this->Cleanup(false); + + // New allocation is done at this point, so update existing structures + // Adjust functionInfo attributes, point to new proxy + functionInfo->SetAttributes((FunctionInfo::Attributes)(functionInfo->GetAttributes() | FunctionInfo::Attributes::DeferredParse)); + functionInfo->SetFunctionProxy(parseableFunctionInfo); + functionInfo->SetOriginalEntryPoint(DefaultEntryThunk); + } + void FunctionBody::SetDefaultFunctionEntryPointInfo(FunctionEntryPointInfo* entryPointInfo, const JavascriptMethod originalEntryPoint) { Assert(entryPointInfo); @@ -1040,9 +1099,10 @@ namespace Js } } - void ParseableFunctionInfo::Copy(FunctionBody* other) + void ParseableFunctionInfo::Copy(ParseableFunctionInfo * other) { #define CopyDeferParseField(field) other->field = this->field; + CopyDeferParseField(flags); CopyDeferParseField(m_isDeclaration); CopyDeferParseField(m_isAccessor); CopyDeferParseField(m_isStrictMode); @@ -1057,6 +1117,7 @@ namespace Js CopyDeferParseField(m_grfscr); other->SetScopeInfo(this->GetScopeInfo()); CopyDeferParseField(m_utf8SourceHasBeenSet); + CopyDeferParseField(m_referenceInParentFunction); #if DBG CopyDeferParseField(deferredParseNextFunctionId); CopyDeferParseField(scopeObjectSize); @@ -1067,8 +1128,23 @@ namespace Js other->SetDeferredStubs(this->GetDeferredStubs()); CopyDeferParseField(m_isAsmjsMode); CopyDeferParseField(m_isAsmJsFunction); -#undef CopyDeferParseField + other->SetFunctionObjectTypeList(this->GetFunctionObjectTypeList()); + + CopyDeferParseField(m_sourceIndex); + CopyDeferParseField(m_cchStartOffset); + CopyDeferParseField(m_cchLength); + CopyDeferParseField(m_lineNumber); + CopyDeferParseField(m_columnNumber); + CopyDeferParseField(m_cbStartOffset); + CopyDeferParseField(m_cbLength); + +#undef CopyDeferParseField + } + + void ParseableFunctionInfo::Copy(FunctionBody* other) + { + this->Copy(static_cast(other)); other->CopySourceInfo(this); } @@ -1137,6 +1213,7 @@ namespace Js #if DYNAMIC_INTERPRETER_THUNK m_dynamicInterpreterThunk(nullptr), #endif + flags(Flags_HasNoExplicitReturnValue), m_hasBeenParsed(false), m_isGlobalFunc(false), m_isDeclaration(false), @@ -1207,6 +1284,41 @@ namespace Js this->SetOriginalEntryPoint(DefaultEntryThunk); } + ParseableFunctionInfo::ParseableFunctionInfo(ParseableFunctionInfo * proxy) : + FunctionProxy(proxy->GetScriptContext(), proxy->GetUtf8SourceInfo(), proxy->GetFunctionNumber()), +#if DYNAMIC_INTERPRETER_THUNK + m_dynamicInterpreterThunk(nullptr), +#endif + m_hasBeenParsed(false), + m_isNamedFunctionExpression(proxy->GetIsNamedFunctionExpression()), + m_isNameIdentifierRef (proxy->GetIsNameIdentifierRef()), + m_isStaticNameFunction(proxy->GetIsStaticNameFunction()), + m_reportedInParamCount(proxy->GetReportedInParamsCount()), + m_reparsed(proxy->IsReparsed()) +#if DBG + ,m_wasEverAsmjsMode(proxy->m_wasEverAsmjsMode) +#endif + { + proxy->Copy(this); + + FunctionInfo * functionInfo = proxy->GetFunctionInfo(); + this->functionInfo = functionInfo; + + uint nestedCount = proxy->GetNestedCount(); + if (nestedCount > 0) + { + nestedArray = RecyclerNewPlusZ(m_scriptContext->GetRecycler(), + nestedCount*sizeof(FunctionProxy*), NestedArray, nestedCount); + } + else + { + nestedArray = nullptr; + } + + SetBoundPropertyRecords(proxy->GetBoundPropertyRecords()); + SetDisplayName(proxy->GetDisplayName(), proxy->GetDisplayNameLength(), proxy->GetShortDisplayNameOffset()); + } + ParseableFunctionInfo* ParseableFunctionInfo::New(ScriptContext* scriptContext, int nestedCount, LocalFunctionId functionId, Utf8SourceInfo* sourceInfo, const char16* displayName, uint displayNameLength, uint displayShortNameOffset, Js::PropertyRecordList* propertyRecords, FunctionInfo::Attributes attributes) { @@ -1247,6 +1359,31 @@ namespace Js propertyRecords); } + ParseableFunctionInfo * + ParseableFunctionInfo::NewDeferredFunctionFromFunctionBody(FunctionBody * functionBody) + { + ScriptContext * scriptContext = functionBody->GetScriptContext(); + uint nestedCount = functionBody->GetNestedCount(); + + ParseableFunctionInfo * info = RecyclerNewWithBarrierFinalized(scriptContext->GetRecycler(), + ParseableFunctionInfo, + functionBody); + + // Create new entry point info + info->m_defaultEntryPointInfo = RecyclerNew(scriptContext->GetRecycler(), ProxyEntryPointInfo, scriptContext->DeferredParsingThunk); + + // Initialize nested function array, update back pointers + for (uint i = 0; i < nestedCount; i++) + { + FunctionProxy * nestedProxy = functionBody->GetNestedFunc(i); + info->SetNestedFunc(nestedProxy, i, 0); + } + + // Update function objects + + return info; + } + DWORD_PTR FunctionProxy::GetSecondaryHostSourceContext() const { return this->GetUtf8SourceInfo()->GetSecondaryHostSourceContext(); @@ -1545,10 +1682,20 @@ namespace Js } // Function object type list methods + FunctionProxy::FunctionTypeWeakRefList* FunctionProxy::GetFunctionObjectTypeList() const + { + return static_cast(this->GetAuxPtr(AuxPointerType::FunctionObjectTypeList)); + } + + void FunctionProxy::SetFunctionObjectTypeList(FunctionProxy::FunctionTypeWeakRefList* list) + { + this->SetAuxPtr(AuxPointerType::FunctionObjectTypeList, list); + } + template void FunctionProxy::MapFunctionObjectTypes(Fn func) { - FunctionTypeWeakRefList* functionObjectTypeList = static_cast(this->GetAuxPtr(AuxPointerType::FunctionObjectTypeList)); + FunctionTypeWeakRefList* functionObjectTypeList = this->GetFunctionObjectTypeList(); if (functionObjectTypeList != nullptr) { functionObjectTypeList->Map([&](int, FunctionTypeWeakRef* typeWeakRef) @@ -1572,14 +1719,15 @@ namespace Js FunctionProxy::FunctionTypeWeakRefList* FunctionProxy::EnsureFunctionObjectTypeList() { - FunctionTypeWeakRefList* functionObjectTypeList = static_cast(this->GetAuxPtr(AuxPointerType::FunctionObjectTypeList)); + FunctionTypeWeakRefList* functionObjectTypeList = this->GetFunctionObjectTypeList(); if (functionObjectTypeList == nullptr) { Recycler* recycler = this->GetScriptContext()->GetRecycler(); - this->SetAuxPtr(AuxPointerType::FunctionObjectTypeList, RecyclerNew(recycler, FunctionTypeWeakRefList, recycler)); + functionObjectTypeList = RecyclerNew(recycler, FunctionTypeWeakRefList, recycler); + this->SetFunctionObjectTypeList(functionObjectTypeList); } - return static_cast(this->GetAuxPtr(AuxPointerType::FunctionObjectTypeList)); + return functionObjectTypeList; } void FunctionProxy::RegisterFunctionObjectType(DynamicType* functionType) @@ -1732,6 +1880,7 @@ namespace Js ); this->Copy(funcBody); + this->UpdateFunctionBodyImpl(funcBody); PERF_COUNTER_DEC(Code, DeferredFunction); if (!this->GetSourceContextInfo()->IsDynamic()) @@ -1870,7 +2019,7 @@ namespace Js hrParser = ps.ParseSourceWithOffset(&parseTree, pszStart, offset, length, charOffset, isCesu8, grfscr, &se, &nextFunctionId, funcBody->GetRelativeLineNumber(), funcBody->GetSourceContextInfo(), funcBody); - Assert(FAILED(hrParser) || nextFunctionId == funcBody->deferredParseNextFunctionId || isDebugOrAsmJsReparse || isByteCodeDeserialization); +// Assert(FAILED(hrParser) || nextFunctionId == funcBody->deferredParseNextFunctionId || isDebugOrAsmJsReparse || isByteCodeDeserialization); if (FAILED(hrParser)) { @@ -1956,7 +2105,6 @@ namespace Js // Restore if the function has nameIdentifier reference, as that name on the left side will not be parsed again while deferparse. funcBody->SetIsNameIdentifierRef(this->GetIsNameIdentifierRef()); - this->UpdateFunctionBodyImpl(funcBody); this->m_hasBeenParsed = true; returnFunctionBody = funcBody; } @@ -3420,33 +3568,34 @@ namespace Js } } - void FunctionBody::SetStackNestedFuncParent(FunctionBody * parentFunctionBody) + void FunctionBody::SetStackNestedFuncParent(FunctionInfo * parentFunctionInfo) { + FunctionBody * parentFunctionBody = parentFunctionInfo->GetFunctionBody(); Assert(this->GetStackNestedFuncParent() == nullptr); Assert(CanDoStackNestedFunc()); Assert(parentFunctionBody->DoStackNestedFunc()); - this->SetAuxPtr(AuxPointerType::StackNestedFuncParent, this->GetScriptContext()->GetRecycler()->CreateWeakReferenceHandle(parentFunctionBody)); + this->SetAuxPtr(AuxPointerType::StackNestedFuncParent, this->GetScriptContext()->GetRecycler()->CreateWeakReferenceHandle(parentFunctionInfo)); } - FunctionBody * FunctionBody::GetStackNestedFuncParentStrongRef() + FunctionInfo * FunctionBody::GetStackNestedFuncParentStrongRef() { Assert(this->GetStackNestedFuncParent() != nullptr); return this->GetStackNestedFuncParent()->Get(); } - RecyclerWeakReference * FunctionBody::GetStackNestedFuncParent() + RecyclerWeakReference * FunctionBody::GetStackNestedFuncParent() { - return static_cast*>(this->GetAuxPtr(AuxPointerType::StackNestedFuncParent)); + return static_cast*>(this->GetAuxPtr(AuxPointerType::StackNestedFuncParent)); } - FunctionBody * FunctionBody::GetAndClearStackNestedFuncParent() + FunctionInfo * FunctionBody::GetAndClearStackNestedFuncParent() { if (this->GetAuxPtr(AuxPointerType::StackNestedFuncParent)) { - FunctionBody * parentFunctionBody = GetStackNestedFuncParentStrongRef(); + FunctionInfo * parentFunctionInfo = GetStackNestedFuncParentStrongRef(); ClearStackNestedFuncParent(); - return parentFunctionBody; + return parentFunctionInfo; } return nullptr; } @@ -4098,7 +4247,7 @@ namespace Js } #endif - void FunctionBody::SetIsNonUserCode(bool set) + void ParseableFunctionInfo::SetIsNonUserCode(bool set) { // Mark current function as a non-user code, so that we can distinguish cases where exceptions are // caught in non-user code (see ProbeContainer::HasAllowedForException). @@ -4107,7 +4256,7 @@ namespace Js // Propagate setting for all functions in this scope (nested). this->ForEachNestedFunc([&](FunctionProxy* proxy, uint32 index) { - Js::FunctionBody * pBody = proxy->GetFunctionBody(); + ParseableFunctionInfo * pBody = proxy->GetParseableFunctionInfo(); if (pBody != nullptr) { pBody->SetIsNonUserCode(set); @@ -7114,6 +7263,7 @@ namespace Js } else { + inlineCache->Unregister(this->m_scriptContext); AllocatorDelete(IsInstInlineCacheAllocator, this->m_scriptContext->GetIsInstInlineCacheAllocator(), inlineCache); } } diff --git a/lib/Runtime/Base/FunctionBody.h b/lib/Runtime/Base/FunctionBody.h index e8eaf8b99ee..7f9ebd57846 100644 --- a/lib/Runtime/Base/FunctionBody.h +++ b/lib/Runtime/Base/FunctionBody.h @@ -1324,6 +1324,7 @@ namespace Js void SetCapturesThis(); bool GetEnclosedByGlobalFunc() const; void SetEnclosedByGlobalFunc(); + bool CanBeDeferred() const; BOOL IsDeferredDeserializeFunction() const; BOOL IsDeferredParseFunction() const; FunctionInfo::Attributes GetAttributes() const; @@ -1362,6 +1363,8 @@ namespace Js // Function object type list methods FunctionTypeWeakRefList* EnsureFunctionObjectTypeList(); + FunctionTypeWeakRefList* GetFunctionObjectTypeList() const; + void SetFunctionObjectTypeList(FunctionTypeWeakRefList* list); void RegisterFunctionObjectType(DynamicType* functionType); template void MapFunctionObjectTypes(Fn func); @@ -1437,6 +1440,7 @@ namespace Js bool m_isTopLevel : 1; // Indicates that this function is top-level function, currently being used in script profiler and debugger bool m_isPublicLibraryCode: 1; // Indicates this function is public boundary library code that should be visible in JS stack + bool m_canBeDeferred : 1; void CleanupFunctionProxyCounters() { PERF_COUNTER_DEC(Code, TotalFunction); @@ -1603,6 +1607,13 @@ namespace Js return GetFunctionInfo()->IsLambda(); } + inline bool FunctionProxy::CanBeDeferred() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->CanBeDeferred(); + } + inline bool FunctionProxy::IsClassConstructor() const { Assert(GetFunctionInfo()); @@ -1678,6 +1689,8 @@ namespace Js protected: ParseableFunctionInfo(JavascriptMethod method, int nestedFunctionCount, LocalFunctionId functionId, Utf8SourceInfo* sourceInfo, ScriptContext* scriptContext, uint functionNumber, const char16* displayName, uint m_displayNameLength, uint displayShortNameOffset, FunctionInfo::Attributes attributes, Js::PropertyRecordList* propertyRecordList); + ParseableFunctionInfo(ParseableFunctionInfo * proxy); + public: struct NestedArray { @@ -1706,12 +1719,51 @@ namespace Js public: static ParseableFunctionInfo* New(ScriptContext* scriptContext, int nestedFunctionCount, LocalFunctionId functionId, Utf8SourceInfo* utf8SourceInfo, const char16* displayName, uint m_displayNameLength, uint displayShortNameOffset, Js::PropertyRecordList* propertyRecordList, FunctionInfo::Attributes attributes); + static ParseableFunctionInfo* NewDeferredFunctionFromFunctionBody(FunctionBody *functionBody); DEFINE_VTABLE_CTOR_NO_REGISTER(ParseableFunctionInfo, FunctionProxy); FunctionBody* Parse(ScriptFunction ** functionRef = nullptr, bool isByteCodeDeserialization = false); #ifndef TEMP_DISABLE_ASMJS FunctionBody* ParseAsmJs(Parser * p, __out CompileScriptException * se, __out ParseNodePtr * ptree); #endif + + enum FunctionBodyFlags : byte + { + Flags_None = 0x00, + Flags_StackNestedFunc = 0x01, + Flags_HasOrParentHasArguments = 0x02, + Flags_HasTry = 0x04, + Flags_HasThis = 0x08, + Flags_NonUserCode = 0x10, + Flags_HasOnlyThisStatements = 0x20, + Flags_HasNoExplicitReturnValue = 0x40, // Returns undefined, i.e. has no return statements or return with no expression + Flags_HasRestParameter = 0x80 + }; + + bool GetHasThis() const { return (flags & Flags_HasThis) != 0; } + void SetHasThis(bool has) { SetFlags(has, Flags_HasThis); } + + bool GetHasTry() const { return (flags & Flags_HasTry) != 0; } + void SetHasTry(bool has) { SetFlags(has, Flags_HasTry); } + + bool GetHasOrParentHasArguments() const { return (flags & Flags_HasOrParentHasArguments) != 0; } + void SetHasOrParentHasArguments(bool has) { SetFlags(has, Flags_HasOrParentHasArguments); } + + bool DoStackNestedFunc() const { return (flags & Flags_StackNestedFunc) != 0; } + void SetStackNestedFunc(bool does) { SetFlags(does, Flags_StackNestedFunc); } + + bool IsNonUserCode() const { return (flags & Flags_NonUserCode) != 0; } + void SetIsNonUserCode(bool set); + + bool GetHasNoExplicitReturnValue() { return (flags & Flags_HasNoExplicitReturnValue) != 0; } + void SetHasNoExplicitReturnValue(bool has) { SetFlags(has, Flags_HasNoExplicitReturnValue); } + + bool GetHasOnlyThisStmts() const { return (flags & Flags_HasOnlyThisStatements) != 0; } + void SetHasOnlyThisStmts(bool has) { SetFlags(has, Flags_HasOnlyThisStatements); } + + bool GetHasRestParameter() const { return (flags & Flags_HasRestParameter) != 0; } + void SetHasRestParameter() { SetFlags(true, Flags_HasRestParameter); } + virtual uint GetDisplayNameLength() const { return m_displayNameLength; } virtual uint GetShortDisplayNameOffset() const { return m_displayShortNameOffset; } bool GetIsDeclaration() const { return m_isDeclaration; } @@ -1855,6 +1907,7 @@ namespace Js } void SetSourceInfo(uint sourceIndex, ParseNodePtr node, bool isEval, bool isDynamicFunction); + void Copy(ParseableFunctionInfo * proxy); void Copy(FunctionBody* other); const char16* GetExternalDisplayName() const; @@ -1891,7 +1944,6 @@ namespace Js ParseableFunctionInfo* GetNestedFunctionForExecution(uint index); void SetNestedFunc(FunctionProxy* nestedFunc, uint index, uint32 flags); void ClearNestedFunctionParentFunctionReference(); - void BuildDeferredStubs(ParseNode *pnodeFnc); DeferredFunctionStub *GetDeferredStubs() const { return static_cast(this->GetAuxPtr(AuxPointerType::DeferredStubs)); } void SetDeferredStubs(DeferredFunctionStub *stub) { this->SetAuxPtr(AuxPointerType::DeferredStubs, stub); } @@ -1899,6 +1951,18 @@ namespace Js protected: static HRESULT MapDeferredReparseError(HRESULT& hrParse, const CompileScriptException& se); + void SetFlags(bool does, FunctionBodyFlags newFlags) + { + if (does) + { + flags = (FunctionBodyFlags)(flags | newFlags); + } + else + { + flags = (FunctionBodyFlags)(flags & ~newFlags); + } + } + bool m_hasBeenParsed : 1; // Has function body been parsed- true for actual function bodies, false for deferparse bool m_isDeclaration : 1; bool m_isAccessor : 1; // Function is a property getter or setter @@ -2205,19 +2269,6 @@ namespace Js // This value be set on the stack (on a particular offset), when the frame value got changed. static const int LocalsChangeDirtyValue = 1; - enum FunctionBodyFlags : byte - { - Flags_None = 0x00, - Flags_StackNestedFunc = 0x01, - Flags_HasOrParentHasArguments = 0x02, - Flags_HasTry = 0x04, - Flags_HasThis = 0x08, - Flags_NonUserCode = 0x10, - Flags_HasOnlyThisStatements = 0x20, - Flags_HasNoExplicitReturnValue = 0x40, // Returns undefined, i.e. has no return statements or return with no expression - Flags_HasRestParameter = 0x80 - }; - #define DEFINE_FUNCTION_BODY_FIELDS 1 #define CURRENT_ACCESS_MODIFIER public: #include "SerializableFunctionFields.h" @@ -2384,6 +2435,9 @@ namespace Js FunctionEntryPointInfo * GetEntryPointInfo(int index) const; FunctionEntryPointInfo * TryGetEntryPointInfo(int index) const; + void RedeferFunction(); + void UpdateActiveFunctionSet(BVSparse *pActiveFuncs) const; + Js::RootObjectBase * LoadRootObject() const; Js::RootObjectBase * GetRootObject() const; ByteBlock* GetAuxiliaryData() const { return static_cast(this->GetAuxPtr(AuxPointerType::AuxBlock)); } @@ -2756,6 +2810,7 @@ namespace Js // Field accessors bool GetHasBailoutInstrInJittedCode() const { return this->m_hasBailoutInstrInJittedCode; } void SetHasBailoutInstrInJittedCode(bool hasBailout) { this->m_hasBailoutInstrInJittedCode = hasBailout; } + bool GetCanDefer() const { return this->functionInfo->CanBeDeferred() && this->m_depth == 0; } bool GetCanReleaseLoopHeaders() const { return (this->m_depth == 0); } void SetPendingLoopHeaderRelease(bool pendingLoopHeaderRelease) { this->m_pendingLoopHeaderRelease = pendingLoopHeaderRelease; } @@ -2923,44 +2978,22 @@ namespace Js private: void ResetProfileIds(); - void SetFlags(bool does, FunctionBodyFlags newFlags) - { - if (does) - { - flags = (FunctionBodyFlags)(flags | newFlags); - } - else - { - flags = (FunctionBodyFlags)(flags & ~newFlags); - } - } public: - bool GetHasThis() const { return (flags & Flags_HasThis) != 0; } - void SetHasThis(bool has) { SetFlags(has, Flags_HasThis); } - - bool GetHasTry() const { return (flags & Flags_HasTry) != 0; } - void SetHasTry(bool has) { SetFlags(has, Flags_HasTry); } - bool GetHasFinally() const { return m_hasFinally; } void SetHasFinally(bool has){ m_hasFinally = has; } bool GetFuncEscapes() const { return funcEscapes; } void SetFuncEscapes(bool does) { funcEscapes = does; } - bool GetHasOrParentHasArguments() const { return (flags & Flags_HasOrParentHasArguments) != 0; } - void SetHasOrParentHasArguments(bool has) { SetFlags(has, Flags_HasOrParentHasArguments); } - - bool DoStackNestedFunc() const { return (flags & Flags_StackNestedFunc) != 0; } - void SetStackNestedFunc(bool does) { SetFlags(does, Flags_StackNestedFunc); } #if DBG bool CanDoStackNestedFunc() const { return m_canDoStackNestedFunc; } void SetCanDoStackNestedFunc() { m_canDoStackNestedFunc = true; } #endif - RecyclerWeakReference * GetStackNestedFuncParent(); - FunctionBody * GetStackNestedFuncParentStrongRef(); - FunctionBody * GetAndClearStackNestedFuncParent(); + RecyclerWeakReference * GetStackNestedFuncParent(); + FunctionInfo * GetStackNestedFuncParentStrongRef(); + FunctionInfo * GetAndClearStackNestedFuncParent(); void ClearStackNestedFuncParent(); - void SetStackNestedFuncParent(FunctionBody * parentFunctionBody); + void SetStackNestedFuncParent(FunctionInfo * parentFunctionInfo); #if defined(_M_IX86) || defined(_M_X64) bool DoStackClosure() const { @@ -2975,24 +3008,12 @@ namespace Js bool DoStackFrameDisplay() const { return DoStackClosure(); } bool DoStackScopeSlots() const { return DoStackClosure(); } - bool IsNonUserCode() const { return (flags & Flags_NonUserCode) != 0; } - void SetIsNonUserCode(bool set); - - bool GetHasNoExplicitReturnValue() { return (flags & Flags_HasNoExplicitReturnValue) != 0; } - void SetHasNoExplicitReturnValue(bool has) { SetFlags(has, Flags_HasNoExplicitReturnValue); } - - bool GetHasOnlyThisStmts() const { return (flags & Flags_HasOnlyThisStatements) != 0; } - void SetHasOnlyThisStmts(bool has) { SetFlags(has, Flags_HasOnlyThisStatements); } - bool GetIsFirstFunctionObject() const { return m_firstFunctionObject; } void SetIsNotFirstFunctionObject() { m_firstFunctionObject = false; } bool GetInlineCachesOnFunctionObject() { return m_inlineCachesOnFunctionObject; } void SetInlineCachesOnFunctionObject(bool has) { m_inlineCachesOnFunctionObject = has; } - bool GetHasRestParameter() const { return (flags & Flags_HasRestParameter) != 0; } - void SetHasRestParameter() { SetFlags(true, Flags_HasRestParameter); } - bool NeedScopeObjectForArguments(bool hasNonSimpleParams) { Assert(HasReferenceableBuiltInArguments()); diff --git a/lib/Runtime/Base/FunctionInfo.h b/lib/Runtime/Base/FunctionInfo.h index ef4dc23a927..f5355e0524d 100644 --- a/lib/Runtime/Base/FunctionInfo.h +++ b/lib/Runtime/Base/FunctionInfo.h @@ -38,6 +38,7 @@ namespace Js Async = 0x10000, Module = 0x20000, // The function is the function body wrapper for a module EnclosedByGlobalFunc = 0x40000, + CanDefer = 0x80000 }; FunctionInfo(JavascriptMethod entryPoint, Attributes attributes = None, LocalFunctionId functionId = Js::Constants::NoFunctionId, FunctionProxy* functionBodyImpl = nullptr); @@ -63,6 +64,7 @@ namespace Js bool IsClassMethod() const { return ((this->attributes & ClassMethod) != 0); } bool IsModule() const { return ((this->attributes & Module) != 0); } bool HasSuperReference() const { return ((this->attributes & SuperReference) != 0); } + bool CanBeDeferred() const { return ((this->attributes & CanDefer) != 0); } bool IsCoroutine() const { return ((this->attributes & (Async | Generator)) != 0); } BOOL HasBody() const { return functionBodyImpl != NULL; } diff --git a/lib/Runtime/Base/ScriptContext.cpp b/lib/Runtime/Base/ScriptContext.cpp index 21aa4a19a22..f98eb056006 100644 --- a/lib/Runtime/Base/ScriptContext.cpp +++ b/lib/Runtime/Base/ScriptContext.cpp @@ -1018,6 +1018,20 @@ namespace Js } #endif + void ScriptContext::RedeferFunctionBodies(ActiveFunctionSet *pActiveFuncs) + { + Assert(!this->IsClosed()); + + auto fn = [&](FunctionBody *functionBody) { + if (functionBody->GetFunctionInfo()->GetFunctionProxy() == functionBody && functionBody->CanBeDeferred() && !pActiveFuncs->Test(functionBody->GetFunctionNumber()) && functionBody->GetByteCode() != nullptr && functionBody->GetCanDefer()) + { + functionBody->RedeferFunction(); + } + }; + + this->MapFunction(fn); + } + bool ScriptContext::DoUndeferGlobalFunctions() const { return CONFIG_FLAG(DeferTopLevelTillFirstCall) && !AutoSystemInfo::Data.IsLowMemoryProcess(); diff --git a/lib/Runtime/Base/ScriptContext.h b/lib/Runtime/Base/ScriptContext.h index 45fac98491e..4088aac394a 100644 --- a/lib/Runtime/Base/ScriptContext.h +++ b/lib/Runtime/Base/ScriptContext.h @@ -425,6 +425,7 @@ namespace Js const ScriptContextBase* GetScriptContextBase() const { return static_cast(this); } + void RedeferFunctionBodies(ActiveFunctionSet *pActive); bool DoUndeferGlobalFunctions() const; bool IsUndeclBlockVar(Var var) const { return this->javascriptLibrary->IsUndeclBlockVar(var); } diff --git a/lib/Runtime/Base/ThreadContext.cpp b/lib/Runtime/Base/ThreadContext.cpp index 75800082a00..cd100935d74 100644 --- a/lib/Runtime/Base/ThreadContext.cpp +++ b/lib/Runtime/Base/ThreadContext.cpp @@ -1601,6 +1601,14 @@ ThreadContext::ProbeStackNoDispose(size_t size, Js::ScriptContext *scriptContext this->CheckInterruptPoll(); } } + + if (PHASE_STRESS1(Js::RedeferralPhase)) + { + if (JsUtil::ExternalApi::IsScriptActiveOnCurrentThreadContext()) + { + this->RedeferFunctionBodies(); + } + } } void @@ -2333,6 +2341,7 @@ ThreadContext::PreCollectionCallBack(CollectionFlags flags) #ifdef PERF_COUNTERS PHASE_PRINT_TESTTRACE1(Js::DeferParsePhase, _u("TestTrace: deferparse - # of func: %d # deferparsed: %d\n"), PerfCounter::CodeCounterSet::GetTotalFunctionCounter().GetValue(), PerfCounter::CodeCounterSet::GetDeferredFunctionCounter().GetValue()); #endif + // This needs to be done before ClearInlineCaches since that method can empty the list of // script contexts with inline caches this->ClearScriptContextCaches(); @@ -2409,12 +2418,69 @@ ThreadContext::PostCollectionCallBack() // Recycler is null in the case where the ThreadContext is in the process of creating the recycler and // we have a GC triggered (say because the -recyclerStress flag is passed in) - if (this->recycler != NULL && this->recycler->InCacheCleanupCollection()) + if (this->recycler != NULL) { - this->recycler->ClearCacheCleanupCollection(); - for (Js::ScriptContext *scriptContext = scriptContextList; scriptContext; scriptContext = scriptContext->next) + if (this->recycler->InCacheCleanupCollection()) + { + this->recycler->ClearCacheCleanupCollection(); + for (Js::ScriptContext *scriptContext = scriptContextList; scriptContext; scriptContext = scriptContext->next) + { + scriptContext->CleanupWeakReferenceDictionaries(); + } + } + + HRESULT hr = S_OK; + BEGIN_TRANSLATE_OOM_TO_HRESULT + { + this->RedeferFunctionBodies(); + } + END_TRANSLATE_OOM_TO_HRESULT(hr); + } +} + +void +ThreadContext::RedeferFunctionBodies() +{ + // TODO: Heuristic to decide whether we need/want to redefer now. + if (!PHASE_ON1(Js::RedeferralPhase)) + { + return; + } + + // Collect the set of active functions. + ActiveFunctionSet *pActiveFuncs = nullptr; + pActiveFuncs = Anew(this->GetThreadAlloc(), ActiveFunctionSet, this->GetThreadAlloc()); + this->GetActiveFunctions(pActiveFuncs); + + Js::ScriptContext *scriptContext; + for (scriptContext = GetScriptContextList(); scriptContext; scriptContext = scriptContext->next) + { + if (scriptContext->IsClosed()) + { + continue; + } + scriptContext->RedeferFunctionBodies(pActiveFuncs); + } + + Adelete(this->GetThreadAlloc(), pActiveFuncs); +} + +void +ThreadContext::GetActiveFunctions(ActiveFunctionSet * pActiveFuncs) +{ + if (!this->IsInScript()) + { + return; + } + + Js::JavascriptStackWalker walker(GetScriptContextList(), TRUE, NULL, true); + Js::JavascriptFunction *function = nullptr; + while (walker.GetCallerWithoutInlinedFrames(&function)) + { + if (function->GetFunctionInfo()->HasBody()) { - scriptContext->CleanupWeakReferenceDictionaries(); + Js::FunctionBody *body = function->GetFunctionInfo()->GetFunctionBody(); + body->UpdateActiveFunctionSet(pActiveFuncs); } } } diff --git a/lib/Runtime/Base/ThreadContext.h b/lib/Runtime/Base/ThreadContext.h index 85ad9dff092..6a446bbe7f7 100644 --- a/lib/Runtime/Base/ThreadContext.h +++ b/lib/Runtime/Base/ThreadContext.h @@ -14,6 +14,8 @@ namespace Js typedef JsUtil::List ReturnedValueList; } +typedef BVSparse ActiveFunctionSet; + using namespace PlatformAgnostic; struct IAuthorFileContext; @@ -1188,6 +1190,9 @@ class ThreadContext sealed : static size_t GetProcessCodeSize() { return processNativeCodeSize; } size_t GetSourceSize() { return sourceCodeSize; } + void RedeferFunctionBodies(); + void GetActiveFunctions(ActiveFunctionSet * ppActive); + Js::ScriptEntryExitRecord * GetScriptEntryExit() const { return entryExitRecord; } void RegisterCodeGenRecyclableData(Js::CodeGenRecyclableData *const codeGenRecyclableData); void UnregisterCodeGenRecyclableData(Js::CodeGenRecyclableData *const codeGenRecyclableData); diff --git a/lib/Runtime/ByteCode/ByteCodeEmitter.cpp b/lib/Runtime/ByteCode/ByteCodeEmitter.cpp index 75879074b13..fd5971c57a0 100644 --- a/lib/Runtime/ByteCode/ByteCodeEmitter.cpp +++ b/lib/Runtime/ByteCode/ByteCodeEmitter.cpp @@ -3228,7 +3228,7 @@ void ByteCodeGenerator::EmitOneFunction(ParseNode *pnode) Js::FunctionProxy * nested = byteCodeFunction->GetNestedFunc(i); if (nested->IsFunctionBody()) { - nested->GetFunctionBody()->SetStackNestedFuncParent(byteCodeFunction); + nested->GetFunctionBody()->SetStackNestedFuncParent(byteCodeFunction->GetFunctionInfo()); } } } diff --git a/lib/Runtime/ByteCode/ByteCodeGenerator.cpp b/lib/Runtime/ByteCode/ByteCodeGenerator.cpp index d99dcaf4e2a..490db5e4a02 100644 --- a/lib/Runtime/ByteCode/ByteCodeGenerator.cpp +++ b/lib/Runtime/ByteCode/ByteCodeGenerator.cpp @@ -967,7 +967,7 @@ Js::RegSlot ByteCodeGenerator::EnregisterStringTemplateCallsiteConstant(ParseNod // // Restore all outer func scope info when reparsing a deferred func. // -void ByteCodeGenerator::RestoreScopeInfo(Js::FunctionBody* functionBody) +void ByteCodeGenerator::RestoreScopeInfo(Js::ParseableFunctionInfo* functionBody) { if (functionBody && functionBody->GetScopeInfo()) { @@ -1040,7 +1040,7 @@ void ByteCodeGenerator::RestoreScopeInfo(Js::FunctionBody* functionBody) FuncInfo * ByteCodeGenerator::StartBindGlobalStatements(ParseNode *pnode) { - if (parentScopeInfo) + if (parentScopeInfo && parentScopeInfo->GetParent() && (!parentScopeInfo->GetParent()->GetIsGlobalFunc() || parentScopeInfo->GetParent()->IsEval())) { Assert(CONFIG_FLAG(DeferNested)); trackEnvDepth = true; @@ -1193,6 +1193,11 @@ FuncInfo * ByteCodeGenerator::StartBindFunction(const char16 *name, uint nameLen Assert(!parsedFunctionBody->IsDeferredParseFunction() || parsedFunctionBody->IsReparsed()); pnode->sxFnc.SetDeclaration(parsedFunctionBody->GetIsDeclaration()); + if (!pnode->sxFnc.CanBeDeferred()) + { + parsedFunctionBody->SetAttributes( + (Js::FunctionInfo::Attributes)(parsedFunctionBody->GetAttributes() & ~Js::FunctionInfo::Attributes::CanDefer)); + } funcExprWithName = !(parsedFunctionBody->GetIsDeclaration() || pnode->sxFnc.IsMethod()) && pnode->sxFnc.pnodeName != nullptr && @@ -1211,8 +1216,7 @@ FuncInfo * ByteCodeGenerator::StartBindFunction(const char16 *name, uint nameLen Js::ParseableFunctionInfo *parent = parsedFunctionBody->GetScopeInfo()->GetParent(); if (parent) { - Assert(parent->GetFunctionBody()); - if (parent->GetFunctionBody()->GetHasOrParentHasArguments()) + if (parent->GetHasOrParentHasArguments()) { parsedFunctionBody->SetHasOrParentHasArguments(true); } @@ -1267,6 +1271,10 @@ FuncInfo * ByteCodeGenerator::StartBindFunction(const char16 *name, uint nameLen if (pnode->sxFnc.IsModule()) { attributes = (Js::FunctionInfo::Attributes)(attributes | Js::FunctionInfo::Attributes::Module); + } + if (pnode->sxFnc.CanBeDeferred()) + { + attributes = (Js::FunctionInfo::Attributes)(attributes | Js::FunctionInfo::Attributes::CanDefer); } if (createFunctionBody) @@ -1890,7 +1898,7 @@ void ByteCodeGenerator::Generate(__in ParseNode *pnode, uint32 grfscr, __in Byte void ByteCodeGenerator::CheckDeferParseHasMaybeEscapedNestedFunc() { - if (!this->parentScopeInfo) + if (!this->parentScopeInfo || (this->parentScopeInfo->GetParent() && this->parentScopeInfo->GetParent()->GetIsGlobalFunc())) { return; } @@ -1918,15 +1926,14 @@ void ByteCodeGenerator::CheckDeferParseHasMaybeEscapedNestedFunc() else { // We have to wait until it is parsed before we populate the stack nested func parent. - Js::FunctionBody * parentFunctionBody = nullptr; FuncInfo * parentFunc = top->GetBodyScope()->GetEnclosingFunc(); if (!parentFunc->IsGlobalFunction()) { - parentFunctionBody = parentFunc->GetParsedFunctionBody(); - Assert(parentFunctionBody != rootFuncBody); - if (parentFunctionBody->DoStackNestedFunc()) + Assert(parentFunc->byteCodeFunction != rootFuncBody); + Js::ParseableFunctionInfo * parentFunctionInfo = parentFunc->byteCodeFunction; + if (parentFunctionInfo->DoStackNestedFunc()) { - rootFuncBody->SetStackNestedFuncParent(parentFunctionBody); + rootFuncBody->SetStackNestedFuncParent(parentFunctionInfo->GetFunctionInfo()); } } } @@ -1935,12 +1942,17 @@ void ByteCodeGenerator::CheckDeferParseHasMaybeEscapedNestedFunc() { FuncInfo * funcInfo = i.Data(); Assert(funcInfo->IsRestored()); - Js::FunctionBody * functionBody = funcInfo->GetParsedFunctionBody(); - bool didStackNestedFunc = functionBody->DoStackNestedFunc(); + Js::ParseableFunctionInfo * parseableFunctionInfo = funcInfo->byteCodeFunction; + bool didStackNestedFunc = parseableFunctionInfo->DoStackNestedFunc(); if (!didStackNestedFunc) { return; } + if (!parseableFunctionInfo->IsFunctionBody()) + { + continue; + } + Js::FunctionBody * functionBody = funcInfo->GetParsedFunctionBody(); if (funcInfo->HasMaybeEscapedNestedFunc()) { // This should box the rest of the parent functions. diff --git a/lib/Runtime/ByteCode/ByteCodeGenerator.h b/lib/Runtime/ByteCode/ByteCodeGenerator.h index 2126386138d..8125c0e5140 100644 --- a/lib/Runtime/ByteCode/ByteCodeGenerator.h +++ b/lib/Runtime/ByteCode/ByteCodeGenerator.h @@ -207,7 +207,7 @@ class ByteCodeGenerator return protoReg; } - void RestoreScopeInfo(Js::FunctionBody* funcInfo); + void RestoreScopeInfo(Js::ParseableFunctionInfo* funcInfo); FuncInfo *StartBindGlobalStatements(ParseNode *pnode); void AssignPropertyId(Symbol *sym, Js::ParseableFunctionInfo* functionInfo); void AssignPropertyId(IdentPtr pid); diff --git a/lib/Runtime/ByteCode/ScopeInfo.cpp b/lib/Runtime/ByteCode/ScopeInfo.cpp index a3802e3edf2..7d4e5eb1c2c 100644 --- a/lib/Runtime/ByteCode/ScopeInfo.cpp +++ b/lib/Runtime/ByteCode/ScopeInfo.cpp @@ -48,7 +48,7 @@ namespace Js ScopeInfo* ScopeInfo::FromParent(FunctionBody* parent) { return RecyclerNew(parent->GetScriptContext()->GetRecycler(), // Alloc with ParseableFunctionInfo - ScopeInfo, parent, 0); + ScopeInfo, parent->GetFunctionInfo(), 0); } inline void AddSlotCount(int& count, int addCount) @@ -62,7 +62,7 @@ namespace Js // // Create scope info for an outer scope. // - ScopeInfo* ScopeInfo::FromScope(ByteCodeGenerator* byteCodeGenerator, FunctionBody* parent, Scope* scope, ScriptContext *scriptContext) + ScopeInfo* ScopeInfo::FromScope(ByteCodeGenerator* byteCodeGenerator, ParseableFunctionInfo* parent, Scope* scope, ScriptContext *scriptContext) { int count = scope->Count(); @@ -74,7 +74,7 @@ namespace Js ScopeInfo* scopeInfo = RecyclerNewPlusZ(scriptContext->GetRecycler(), count * sizeof(SymbolInfo), - ScopeInfo, parent, count); + ScopeInfo, parent ? parent->GetFunctionInfo() : nullptr, count); scopeInfo->isDynamic = scope->GetIsDynamic(); scopeInfo->isObject = scope->GetIsObject(); scopeInfo->mustInstantiate = scope->GetMustInstantiate(); @@ -146,9 +146,9 @@ namespace Js // If we are reparsing a deferred function, we already have correct "parent" info in // funcBody->scopeInfo. parentFunc is the knopProg shell and should not be used in this // case. We should use existing parent if available. - FunctionBody * parent = funcBody->GetScopeInfo() ? + ParseableFunctionInfo * parent = funcBody->GetScopeInfo() ? funcBody->GetScopeInfo()->GetParent() : - parentFunc ? parentFunc->byteCodeFunction->GetFunctionBody() : nullptr; + parentFunc ? parentFunc->byteCodeFunction : nullptr; ScopeInfo* funcExprScopeInfo = nullptr; Scope* funcExprScope = func->GetFuncExprScope(); diff --git a/lib/Runtime/ByteCode/ScopeInfo.h b/lib/Runtime/ByteCode/ScopeInfo.h index bce1cdffda2..7a99a790b36 100644 --- a/lib/Runtime/ByteCode/ScopeInfo.h +++ b/lib/Runtime/ByteCode/ScopeInfo.h @@ -34,7 +34,7 @@ namespace Js { }; private: - FunctionBody * const parent; // link to parent function body + FunctionInfo * const parent; // link to parent function ScopeInfo* funcExprScopeInfo; // optional func expr scope info ScopeInfo* paramScopeInfo; // optional param scope info @@ -53,7 +53,7 @@ namespace Js { SymbolInfo symbols[]; // symbol PropertyIDs, index == sym.scopeSlot private: - ScopeInfo(FunctionBody * parent, int symbolCount) + ScopeInfo(FunctionInfo * parent, int symbolCount) : parent(parent), funcExprScopeInfo(nullptr), paramScopeInfo(nullptr), symbolCount(symbolCount), scope(nullptr), areNamesCached(false), canMergeWithBodyScope(true), hasLocalInClosure(false) { } @@ -177,19 +177,19 @@ namespace Js { void SaveSymbolInfo(Symbol* sym, MapSymbolData* mapSymbolData); static ScopeInfo* FromParent(FunctionBody* parent); - static ScopeInfo* FromScope(ByteCodeGenerator* byteCodeGenerator, FunctionBody* parent, Scope* scope, ScriptContext *scriptContext); + static ScopeInfo* FromScope(ByteCodeGenerator* byteCodeGenerator, ParseableFunctionInfo* parent, Scope* scope, ScriptContext *scriptContext); static void SaveParentScopeInfo(FuncInfo* parentFunc, FuncInfo* func); static void SaveScopeInfo(ByteCodeGenerator* byteCodeGenerator, FuncInfo* parentFunc, FuncInfo* func); public: - FunctionBody * GetParent() const + ParseableFunctionInfo * GetParent() const { - return parent; + return parent ? parent->GetParseableFunctionInfo() : nullptr; } ScopeInfo* GetParentScopeInfo() const { - return parent->GetScopeInfo(); + return parent ? parent->GetParseableFunctionInfo()->GetScopeInfo() : nullptr; } ScopeInfo* GetFuncExprScopeInfo() const diff --git a/lib/Runtime/Language/FunctionCodeGenJitTimeData.cpp b/lib/Runtime/Language/FunctionCodeGenJitTimeData.cpp index 3edbd45f6e5..41146824a6c 100644 --- a/lib/Runtime/Language/FunctionCodeGenJitTimeData.cpp +++ b/lib/Runtime/Language/FunctionCodeGenJitTimeData.cpp @@ -820,7 +820,8 @@ namespace Js FunctionBody *FunctionCodeGenJitTimeData::GetFunctionBody() const { - return this->functionInfo->GetFunctionBody(); + FunctionProxy *proxy = this->functionInfo->GetFunctionProxy(); + return proxy && proxy->IsFunctionBody() ? proxy->GetFunctionBody() : nullptr; } bool FunctionCodeGenJitTimeData::IsPolymorphicCallSite(const ProfileId profiledCallSiteId) const diff --git a/lib/Runtime/Language/InlineCache.h b/lib/Runtime/Language/InlineCache.h index a250f766d75..39e78d581ce 100644 --- a/lib/Runtime/Language/InlineCache.h +++ b/lib/Runtime/Language/InlineCache.h @@ -969,11 +969,11 @@ namespace Js bool IsEmpty() const { return type == nullptr; } bool TryGetResult(Var instance, JavascriptFunction * function, JavascriptBoolean ** result); void Cache(Type * instanceType, JavascriptFunction * function, JavascriptBoolean * result, ScriptContext * scriptContext); + void Unregister(ScriptContext * scriptContext); private: void Set(Type * instanceType, JavascriptFunction * function, JavascriptBoolean * result); void Clear(); - void Unregister(ScriptContext * scriptContext); }; // Two-entry Type-indexed circular cache diff --git a/lib/Runtime/Language/InterpreterStackFrame.cpp b/lib/Runtime/Language/InterpreterStackFrame.cpp index 77c588d2887..582e1b18317 100644 --- a/lib/Runtime/Language/InterpreterStackFrame.cpp +++ b/lib/Runtime/Language/InterpreterStackFrame.cpp @@ -1801,6 +1801,8 @@ namespace Js AssertMsg(!executeFunction->IsDeferredParseFunction(), "Non-intrinsic functions must provide byte-code to execute"); + executeFunction->BeginExecution(); + bool fReleaseAlloc = false; InterpreterStackFrame* newInstance = nullptr; Var* allocation = nullptr; @@ -1930,8 +1932,6 @@ namespace Js } #endif - executeFunction->BeginExecution(); - Var aReturn = nullptr; { @@ -3803,7 +3803,7 @@ namespace Js AssertMsg(static_cast(args.Info.Flags) == flags, "Flags don't fit into the CallInfo field?"); if (spreadIndices != nullptr) { - JavascriptFunction::CallSpreadFunction(function, function->GetEntryPoint(), args, spreadIndices); + JavascriptFunction::CallSpreadFunction(function, args, spreadIndices); } else { @@ -3817,7 +3817,7 @@ namespace Js AssertMsg(static_cast(args.Info.Flags) == flags, "Flags don't fit into the CallInfo field?"); if (spreadIndices != nullptr) { - SetReg((RegSlot)playout->Return, JavascriptFunction::CallSpreadFunction(function, function->GetEntryPoint(), args, spreadIndices)); + SetReg((RegSlot)playout->Return, JavascriptFunction::CallSpreadFunction(function, args, spreadIndices)); } else { diff --git a/lib/Runtime/Library/InJavascript/Intl.js.bc.32b.h b/lib/Runtime/Library/InJavascript/Intl.js.bc.32b.h index 80819100f09..d7242bf9362 100644 --- a/lib/Runtime/Library/InJavascript/Intl.js.bc.32b.h +++ b/lib/Runtime/Library/InJavascript/Intl.js.bc.32b.h @@ -2732,18 +2732,18 @@ namespace Js /* 00005230 */ 0x00, 0x3B, 0x1A, 0x01, 0x00, 0x6D, 0x1A, 0x01, 0x00, 0x6D, 0x1A, 0x01, 0x00, 0x8D, 0x1A, 0x01, /* 00005240 */ 0x00, 0x8D, 0x1A, 0x01, 0x00, 0x0A, 0x1B, 0x01, 0x00, 0x0A, 0x1B, 0x01, 0x00, 0x8F, 0x1B, 0x01, /* 00005250 */ 0x00, 0x8F, 0x1B, 0x01, 0x00, 0x18, 0x1C, 0x01, 0x00, 0x18, 0x1C, 0x01, 0x00, 0x1F, 0x1C, 0x01, -/* 00005260 */ 0x00, 0x1F, 0x1C, 0x01, 0x00, 0x24, 0x1C, 0x01, 0x00, 0x24, 0x1C, 0x01, 0x00, 0x44, 0x39, 0x6E, -/* 00005270 */ 0x00, 0x08, 0x00, 0x7F, 0x02, 0xFE, 0x99, 0x02, 0xFE, 0xA8, 0x41, 0x00, 0x00, 0xFE, 0x75, 0x01, +/* 00005260 */ 0x00, 0x1F, 0x1C, 0x01, 0x00, 0x24, 0x1C, 0x01, 0x00, 0x24, 0x1C, 0x01, 0x00, 0x44, 0xB9, 0xDC, +/* 00005270 */ 0x00, 0x00, 0x00, 0x7F, 0x02, 0xFE, 0x99, 0x02, 0xFE, 0xA8, 0x41, 0x00, 0x00, 0xFE, 0x75, 0x01, /* 00005280 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0xFE, 0x75, 0x01, 0xFF, 0xAF, 0x1A, 0x01, 0x00, 0xFF, 0xAF, -/* 00005290 */ 0x1A, 0x01, 0x00, 0x01, 0x04, 0x04, 0x05, 0x05, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00005290 */ 0x1A, 0x01, 0x00, 0x40, 0x01, 0x04, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 000052A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 000052B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x9A, 0x02, 0x07, 0x0C, /* 000052C0 */ 0xA8, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFA, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 000052D0 */ 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0xDA, 0x52, 0x00, 0x00, 0xBF, 0x7E, 0x10, 0x8A, 0x27, 0xFF, +/* 000052D0 */ 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0xDA, 0x52, 0x00, 0x00, 0xBF, 0xFD, 0x20, 0x84, 0x27, 0xFF, /* 000052E0 */ 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x01, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x01, 0x00, 0xFE, /* 000052F0 */ 0x97, 0x01, 0x18, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x97, 0x01, 0xFF, 0x89, 0x1A, -/* 00005300 */ 0x01, 0x00, 0xFF, 0x89, 0x1A, 0x01, 0x00, 0x39, 0x13, 0x2F, 0x3E, 0x09, 0xFE, 0xAC, 0x01, 0xFE, -/* 00005310 */ 0xA7, 0x01, 0x21, 0x10, 0x40, 0x3D, 0x3C, 0x3D, 0x3D, 0x12, 0x3B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00005300 */ 0x01, 0x00, 0xFF, 0x89, 0x1A, 0x01, 0x00, 0x40, 0x39, 0x13, 0x2F, 0x3E, 0x09, 0xFE, 0xAC, 0x01, +/* 00005310 */ 0xFE, 0xA7, 0x01, 0x21, 0x10, 0x3D, 0x3C, 0x3D, 0x3D, 0x12, 0x3B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00005320 */ 0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00005330 */ 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x9B, 0x02, 0x02, 0xFE, 0x9C, 0x02, 0x02, 0xFE, 0x9D, 0x02, 0x02, /* 00005340 */ 0xFE, 0x9E, 0x02, 0x03, 0x04, 0x02, 0xFE, 0x9F, 0x02, 0x02, 0xFE, 0xA0, 0x02, 0x02, 0xFE, 0xA1, @@ -2970,7 +2970,7 @@ namespace Js /* 00006110 */ 0x00, 0xB0, 0xDC, 0x00, 0x00, 0xE0, 0xDB, 0x00, 0x00, 0x66, 0xD8, 0x00, 0x00, 0x49, 0xD5, 0x00, /* 00006120 */ 0x00, 0x05, 0xD4, 0x00, 0x00, 0xC7, 0xD1, 0x00, 0x00, 0xF5, 0xD0, 0x00, 0x00, 0x23, 0xD0, 0x00, /* 00006130 */ 0x00, 0x51, 0xCF, 0x00, 0x00, 0x81, 0xCC, 0x00, 0x00, 0x28, 0xCB, 0x00, 0x00, 0xBA, 0xB2, 0x00, -/* 00006140 */ 0x00, 0x23, 0x9A, 0x00, 0x00, 0x49, 0x61, 0x00, 0x00, 0xBF, 0x7E, 0x31, 0x82, 0xA7, 0xFF, 0x03, +/* 00006140 */ 0x00, 0x23, 0x9A, 0x00, 0x00, 0x49, 0x61, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x84, 0xA7, 0xFF, 0x03, /* 00006150 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0x03, 0x1A, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x33, 0x00, /* 00006160 */ 0xFE, 0x84, 0xAC, 0x0E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x84, 0xAC, 0xFE, 0xAF, /* 00006170 */ 0x6D, 0xFE, 0xAF, 0x6D, 0x01, 0x13, 0x2F, 0x3B, 0x09, 0xD9, 0xD9, 0x01, 0x10, 0x01, 0x09, 0x11, @@ -3092,11 +3092,11 @@ namespace Js /* 000068B0 */ 0x17, 0x00, 0x00, 0xB5, 0x95, 0x00, 0x00, 0x73, 0x8F, 0x00, 0x00, 0xCC, 0x8E, 0x00, 0x00, 0x86, /* 000068C0 */ 0x8C, 0x00, 0x00, 0x7B, 0x8A, 0x00, 0x00, 0xD2, 0x85, 0x00, 0x00, 0x24, 0x7C, 0x00, 0x00, 0xA4, /* 000068D0 */ 0x79, 0x00, 0x00, 0x28, 0x77, 0x00, 0x00, 0xAC, 0x74, 0x00, 0x00, 0xF4, 0x71, 0x00, 0x00, 0x4A, -/* 000068E0 */ 0x6F, 0x00, 0x00, 0x04, 0x6E, 0x00, 0x00, 0xEB, 0x68, 0x00, 0x00, 0xBF, 0x7E, 0x11, 0x8A, 0x27, +/* 000068E0 */ 0x6F, 0x00, 0x00, 0x04, 0x6E, 0x00, 0x00, 0xEB, 0x68, 0x00, 0x00, 0xBF, 0xFD, 0x22, 0x84, 0x27, /* 000068F0 */ 0xFF, 0x03, 0xFE, 0x22, 0x03, 0xFE, 0x4D, 0x05, 0x1B, 0xFF, 0xA0, 0x41, 0x03, 0x00, 0x42, 0x00, /* 00006900 */ 0xFF, 0x7D, 0x10, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x7D, 0x10, -/* 00006910 */ 0x01, 0x00, 0xFE, 0x0D, 0x08, 0xFE, 0x0D, 0x08, 0x03, 0x07, 0x15, 0x19, 0x09, 0x7A, 0x7A, 0x04, -/* 00006920 */ 0x08, 0x09, 0x08, 0x20, 0x20, 0x20, 0x20, 0x01, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x17, 0x18, +/* 00006910 */ 0x01, 0x00, 0xFE, 0x0D, 0x08, 0xFE, 0x0D, 0x08, 0x08, 0x03, 0x07, 0x15, 0x19, 0x09, 0x7A, 0x7A, +/* 00006920 */ 0x04, 0x08, 0x09, 0x20, 0x20, 0x20, 0x20, 0x01, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x17, 0x18, /* 00006930 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 00006940 */ 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0xB9, 0x03, 0x02, 0xFE, 0xC3, 0x02, 0x02, 0xFE, 0xF2, /* 00006950 */ 0x02, 0x02, 0xFE, 0xBA, 0x03, 0x02, 0xFE, 0x46, 0x03, 0x02, 0xFE, 0xAD, 0x03, 0x02, 0xFE, 0xB1, @@ -3157,11 +3157,11 @@ namespace Js /* 00006CC0 */ 0xFE, 0x5B, 0x03, 0xFE, 0xBB, 0x03, 0xFE, 0xC5, 0x01, 0x00, 0xFF, 0xB3, 0x10, 0x01, 0x00, 0x0A, /* 00006CD0 */ 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x2A, 0x00, 0x92, 0x00, 0x29, 0x00, 0x4C, 0x00, /* 00006CE0 */ 0x25, 0x00, 0x6C, 0x00, 0x2A, 0x00, 0x92, 0x00, 0x13, 0x01, 0xDE, 0x03, 0x28, 0x00, 0x3F, 0x00, -/* 00006CF0 */ 0x61, 0x00, 0x5B, 0x01, 0x3B, 0x00, 0x45, 0x00, 0x00, 0xFD, 0x6C, 0x00, 0x00, 0x3F, 0x7E, 0x1D, -/* 00006D00 */ 0x0A, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x66, 0x05, 0x60, 0xFF, 0xA2, 0x41, +/* 00006CF0 */ 0x61, 0x00, 0x5B, 0x01, 0x3B, 0x00, 0x45, 0x00, 0x00, 0xFD, 0x6C, 0x00, 0x00, 0xBF, 0xFC, 0x3A, +/* 00006D00 */ 0x04, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x66, 0x05, 0x60, 0xFF, 0xA2, 0x41, /* 00006D10 */ 0x11, 0x00, 0x43, 0x00, 0xFF, 0x31, 0x17, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 00006D20 */ 0xFF, 0x31, 0x17, 0x01, 0x00, 0xE9, 0xE9, 0x04, 0x05, 0x07, 0x05, 0x1A, 0x1A, 0x05, 0x02, 0x01, -/* 00006D30 */ 0x01, 0x05, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00006D20 */ 0xFF, 0x31, 0x17, 0x01, 0x00, 0xE9, 0xE9, 0x41, 0x04, 0x05, 0x07, 0x05, 0x1A, 0x1A, 0x05, 0x02, +/* 00006D30 */ 0x01, 0x01, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00006D40 */ 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00006D50 */ 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0xAD, 0x03, 0x02, 0xFE, 0x5C, 0x03, 0x04, 0x90, 0x8F, 0x01, /* 00006D60 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x98, 0x07, 0x07, 0x05, 0x00, 0x00, @@ -3174,10 +3174,10 @@ namespace Js /* 00006DD0 */ 0x04, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x98, 0x08, /* 00006DE0 */ 0x08, 0x05, 0x01, 0x00, 0x9D, 0x08, 0x07, 0x05, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, /* 00006DF0 */ 0x00, 0xFF, 0x60, 0x17, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x84, 0x00, 0x26, -/* 00006E00 */ 0x00, 0x35, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00006E00 */ 0x00, 0x35, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00006E10 */ 0xFE, 0x3E, 0x05, 0x39, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x41, 0x00, 0xFF, 0x61, 0x0D, 0x01, 0x00, /* 00006E20 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x61, 0x0D, 0x01, 0x00, 0xFE, 0x6B, 0x02, 0xFE, -/* 00006E30 */ 0x6B, 0x02, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, 0x03, 0x01, 0x09, 0x04, 0x04, 0x04, 0x04, +/* 00006E30 */ 0x6B, 0x02, 0x09, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, /* 00006E40 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, /* 00006E50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 00006E60 */ 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0xB8, 0x03, 0x02, 0xFE, 0xC3, 0x02, 0xAA, 0x5B, 0x05, @@ -3194,11 +3194,11 @@ namespace Js /* 00006F10 */ 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x31, 0x02, 0xFE, 0xFD, 0x01, /* 00006F20 */ 0xFE, 0x36, 0x02, 0xFE, 0x42, 0x02, 0x00, 0xFF, 0x88, 0x0D, 0x01, 0x00, 0x07, 0x05, 0x00, 0x00, /* 00006F30 */ 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x2A, 0x00, 0x8B, 0x00, 0x26, 0x00, 0x4C, 0x00, 0x15, 0x00, 0x6C, -/* 00006F40 */ 0x00, 0x2A, 0x00, 0x8B, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x07, 0xFF, +/* 00006F40 */ 0x00, 0x2A, 0x00, 0x8B, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x07, 0xFF, /* 00006F50 */ 0x01, 0xFE, 0x50, 0x03, 0xFE, 0x22, 0x05, 0x10, 0xFF, 0xA1, 0x41, 0x21, 0x00, 0x40, 0x00, 0xFF, /* 00006F60 */ 0xE3, 0x06, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0xE3, 0x06, 0x01, 0x00, -/* 00006F70 */ 0xFE, 0xCA, 0x03, 0xFE, 0xCA, 0x03, 0x0A, 0x09, 0x0D, 0x0A, 0x61, 0x60, 0x04, 0x04, 0x0C, 0x06, -/* 00006F80 */ 0x0B, 0x06, 0x06, 0x06, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00006F70 */ 0xFE, 0xCA, 0x03, 0xFE, 0xCA, 0x03, 0x0B, 0x0A, 0x09, 0x0D, 0x0A, 0x61, 0x60, 0x04, 0x04, 0x0C, +/* 00006F80 */ 0x06, 0x06, 0x06, 0x06, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00006F90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00006FA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0xB8, 0x03, 0x02, /* 00006FB0 */ 0xFE, 0xC3, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFE, 0xEB, @@ -3237,10 +3237,10 @@ namespace Js /* 000071C0 */ 0x00, 0xFF, 0x0E, 0x07, 0x01, 0x00, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x39, 0x00, 0x2A, /* 000071D0 */ 0x00, 0x81, 0x00, 0x26, 0x00, 0x48, 0x00, 0x15, 0x00, 0x68, 0x00, 0x2A, 0x00, 0x83, 0x00, 0x0D, /* 000071E0 */ 0x00, 0x36, 0x00, 0x50, 0x00, 0x53, 0x00, 0x20, 0x00, 0x51, 0x00, 0x6D, 0x00, 0x85, 0x00, 0x5E, -/* 000071F0 */ 0x00, 0x52, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xC3, 0x02, 0xFE, 0x02, +/* 000071F0 */ 0x00, 0x52, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xC3, 0x02, 0xFE, 0x02, /* 00007200 */ 0x05, 0x10, 0xFF, 0xA1, 0x41, 0x21, 0x00, 0x3F, 0x00, 0xFF, 0x1B, 0x01, 0x01, 0x00, 0xFF, 0x00, /* 00007210 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x1B, 0x01, 0x01, 0x00, 0xFE, 0x69, 0x05, 0xFE, 0x69, 0x05, -/* 00007220 */ 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x04, 0x04, 0x09, 0x09, 0x0B, 0x07, 0x06, 0x07, 0x07, 0xFF, +/* 00007220 */ 0x0B, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x04, 0x04, 0x09, 0x09, 0x07, 0x06, 0x07, 0x07, 0xFF, /* 00007230 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, /* 00007240 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, /* 00007250 */ 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, @@ -3280,10 +3280,10 @@ namespace Js /* 00007470 */ 0x00, 0x1B, 0x00, 0x09, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x44, 0x00, 0x20, 0x00, 0x5B, 0x00, 0x26, /* 00007480 */ 0x00, 0x38, 0x00, 0x22, 0x00, 0x39, 0x00, 0x25, 0x00, 0xA1, 0x00, 0x26, 0x00, 0x49, 0x00, 0x0A, /* 00007490 */ 0x00, 0x3B, 0x00, 0x25, 0x00, 0x40, 0x00, 0x26, 0x00, 0x5B, 0x00, 0x23, 0x00, 0x51, 0x00, 0x42, -/* 000074A0 */ 0x00, 0x67, 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, +/* 000074A0 */ 0x00, 0x67, 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, /* 000074B0 */ 0x0F, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF5, 0x04, 0x64, 0xFF, 0xA0, 0x41, 0x31, /* 000074C0 */ 0x00, 0x3E, 0x00, 0xFE, 0x21, 0xFE, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x21, 0xFE, -/* 000074D0 */ 0xFE, 0xBA, 0x02, 0xFE, 0xBA, 0x02, 0x0A, 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, +/* 000074D0 */ 0xFE, 0xBA, 0x02, 0xFE, 0xBA, 0x02, 0x0B, 0x0A, 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, /* 000074E0 */ 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 000074F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00007500 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x72, 0x03, @@ -3320,10 +3320,10 @@ namespace Js /* 000076F0 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x31, 0x02, 0xFE, 0xFB, 0x01, 0xFE, 0x26, 0x02, 0x00, 0xFE, /* 00007700 */ 0x40, 0xFE, 0x09, 0x07, 0x00, 0x00, 0x00, 0x23, 0x00, 0x50, 0x00, 0x2A, 0x00, 0x71, 0x00, 0x45, /* 00007710 */ 0x00, 0x54, 0x00, 0x44, 0x00, 0x3D, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x25, 0x00, 0x3B, 0x00, 0x56, -/* 00007720 */ 0x00, 0x77, 0x00, 0x69, 0x00, 0x5B, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x0F, 0xFF, 0x01, 0xFF, +/* 00007720 */ 0x00, 0x77, 0x00, 0x69, 0x00, 0x5B, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x0F, 0xFF, 0x01, 0xFF, /* 00007730 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE8, 0x04, 0x64, 0xFF, 0xA0, 0x41, 0x31, 0x00, 0x3D, 0x00, 0xFE, /* 00007740 */ 0xF9, 0xFA, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xF9, 0xFA, 0xFE, 0xBA, 0x02, 0xFE, -/* 00007750 */ 0xBA, 0x02, 0x0A, 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, 0x0B, 0x03, 0x03, 0x03, +/* 00007750 */ 0xBA, 0x02, 0x0B, 0x0A, 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, 0x03, 0x03, 0x03, /* 00007760 */ 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00007770 */ 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00007780 */ 0xFF, 0x00, 0x00, 0x03, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x71, 0x03, 0x02, 0xFE, 0x5D, 0x03, @@ -3360,10 +3360,10 @@ namespace Js /* 00007970 */ 0x00, 0xFE, 0x31, 0x02, 0xFE, 0xFB, 0x01, 0xFE, 0x26, 0x02, 0x00, 0xFE, 0x18, 0xFB, 0x09, 0x07, /* 00007980 */ 0x00, 0x00, 0x00, 0x23, 0x00, 0x50, 0x00, 0x2A, 0x00, 0x71, 0x00, 0x45, 0x00, 0x54, 0x00, 0x44, /* 00007990 */ 0x00, 0x3D, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x25, 0x00, 0x3B, 0x00, 0x56, 0x00, 0x77, 0x00, 0x69, -/* 000079A0 */ 0x00, 0x5B, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x0F, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 000079A0 */ 0x00, 0x5B, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x0F, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 000079B0 */ 0xFE, 0xDB, 0x04, 0x60, 0xFF, 0xA0, 0x41, 0x31, 0x00, 0x3C, 0x00, 0xFE, 0xD7, 0xF7, 0xFF, 0x00, -/* 000079C0 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xD7, 0xF7, 0xFE, 0xB4, 0x02, 0xFE, 0xB4, 0x02, 0x0A, 0x0C, -/* 000079D0 */ 0x11, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, +/* 000079C0 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xD7, 0xF7, 0xFE, 0xB4, 0x02, 0xFE, 0xB4, 0x02, 0x0B, 0x0A, +/* 000079D0 */ 0x0C, 0x11, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, /* 000079E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0xFF, 0xFF, /* 000079F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, /* 00007A00 */ 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x70, 0x03, 0x02, 0xFE, 0x5D, 0x03, 0x04, 0x02, 0xFE, 0xB7, @@ -3400,10 +3400,10 @@ namespace Js /* 00007BF0 */ 0x00, 0xFE, 0x31, 0x02, 0xFE, 0xFB, 0x01, 0xFE, 0x26, 0x02, 0x00, 0xFE, 0xF6, 0xF7, 0x09, 0x07, /* 00007C00 */ 0x00, 0x00, 0x00, 0x23, 0x00, 0x50, 0x00, 0x2A, 0x00, 0x6D, 0x00, 0x45, 0x00, 0x54, 0x00, 0x44, /* 00007C10 */ 0x00, 0x3D, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x25, 0x00, 0x3B, 0x00, 0x56, 0x00, 0x75, 0x00, 0x69, -/* 00007C20 */ 0x00, 0x5B, 0x00, 0x00, 0x3F, 0x7E, 0x25, 0x8B, 0xA7, 0xFF, 0x01, 0xFE, 0x7D, 0x03, 0xFE, 0x58, +/* 00007C20 */ 0x00, 0x5B, 0x00, 0x00, 0xBF, 0xFC, 0x4A, 0x86, 0xA7, 0xFF, 0x01, 0xFE, 0x7D, 0x03, 0xFE, 0x58, /* 00007C30 */ 0x04, 0x0C, 0xFF, 0xB3, 0x41, 0x01, 0x00, 0x3B, 0x00, 0xFE, 0x61, 0xDB, 0xFF, 0x00, 0x10, 0x01, -/* 00007C40 */ 0x00, 0x04, 0x04, 0xFE, 0x61, 0xDB, 0xFE, 0x04, 0x1C, 0xFE, 0x04, 0x1C, 0x1C, 0x29, 0x41, 0x07, -/* 00007C50 */ 0xFE, 0xAA, 0x01, 0xFE, 0x8A, 0x01, 0x03, 0x01, 0x0C, 0x22, 0x0E, 0x45, 0x2B, 0x2B, 0x2B, 0x2B, +/* 00007C40 */ 0x00, 0x04, 0x04, 0xFE, 0x61, 0xDB, 0xFE, 0x04, 0x1C, 0xFE, 0x04, 0x1C, 0x45, 0x1C, 0x29, 0x41, +/* 00007C50 */ 0x07, 0xFE, 0xAA, 0x01, 0xFE, 0x8A, 0x01, 0x03, 0x01, 0x0C, 0x22, 0x0E, 0x2B, 0x2B, 0x2B, 0x2B, /* 00007C60 */ 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00007C70 */ 0xFF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, /* 00007C80 */ 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x27, 0x03, 0x04, 0x02, 0xFE, 0xC3, 0x02, 0x08, 0x02, 0xFE, 0x7F, @@ -3555,10 +3555,10 @@ namespace Js /* 000085A0 */ 0x00, 0x04, 0x00, 0x38, 0x00, 0x07, 0x00, 0x5C, 0x00, 0x34, 0x00, 0xE3, 0x00, 0x28, 0x00, 0x48, /* 000085B0 */ 0x00, 0x01, 0x00, 0x4C, 0x00, 0x1B, 0x00, 0x7C, 0x01, 0x1D, 0x00, 0x7B, 0x00, 0x25, 0x00, 0x68, /* 000085C0 */ 0x00, 0x35, 0x00, 0x83, 0x00, 0x0E, 0x00, 0x40, 0x00, 0x0C, 0x00, 0x6F, 0x00, 0x06, 0x00, 0x40, -/* 000085D0 */ 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x47, 0xFF, 0x01, 0xFE, 0x7C, 0x03, 0xFE, 0x1E, 0x04, 0x0C, +/* 000085D0 */ 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x47, 0xFF, 0x01, 0xFE, 0x7C, 0x03, 0xFE, 0x1E, 0x04, 0x0C, /* 000085E0 */ 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x3A, 0x00, 0xFE, 0xEB, 0xCD, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, -/* 000085F0 */ 0x03, 0xFE, 0xEB, 0xCD, 0xFE, 0x66, 0x0D, 0xFE, 0x66, 0x0D, 0x07, 0x12, 0x16, 0x06, 0xC8, 0xBB, -/* 00008600 */ 0x03, 0x02, 0x10, 0x07, 0x01, 0x0A, 0x0A, 0x0A, 0x0A, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 000085F0 */ 0x03, 0xFE, 0xEB, 0xCD, 0xFE, 0x66, 0x0D, 0xFE, 0x66, 0x0D, 0x01, 0x07, 0x12, 0x16, 0x06, 0xC8, +/* 00008600 */ 0xBB, 0x03, 0x02, 0x10, 0x07, 0x0A, 0x0A, 0x0A, 0x0A, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00008610 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00008620 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0xA7, 0x03, 0x04, /* 00008630 */ 0x02, 0xFE, 0x8D, 0x03, 0x03, 0x02, 0xFE, 0xA8, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFE, @@ -3629,10 +3629,10 @@ namespace Js /* 00008A40 */ 0x91, 0x00, 0x2F, 0x00, 0x77, 0x00, 0x0E, 0x00, 0x41, 0x00, 0x2C, 0x00, 0x8E, 0x00, 0x0E, 0x00, /* 00008A50 */ 0x3F, 0x00, 0x2C, 0x00, 0x8A, 0x00, 0x0E, 0x00, 0x40, 0x00, 0x2C, 0x00, 0x8C, 0x00, 0x0E, 0x00, /* 00008A60 */ 0x42, 0x00, 0x2C, 0x00, 0x90, 0x00, 0x0E, 0x00, 0x42, 0x00, 0x2C, 0x00, 0x90, 0x00, 0x0E, 0x00, -/* 00008A70 */ 0x48, 0x00, 0x2C, 0x00, 0x8F, 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x07, +/* 00008A70 */ 0x48, 0x00, 0x2C, 0x00, 0x8F, 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x07, /* 00008A80 */ 0xFF, 0x01, 0xFE, 0x7B, 0x03, 0xFE, 0x0C, 0x04, 0x0C, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x39, 0x00, /* 00008A90 */ 0xFE, 0xF7, 0xC8, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xF7, 0xC8, 0xFE, 0x81, 0x04, -/* 00008AA0 */ 0xFE, 0x81, 0x04, 0x09, 0x11, 0x16, 0x07, 0x43, 0x40, 0x03, 0x05, 0x06, 0x06, 0x01, 0x01, 0x01, +/* 00008AA0 */ 0xFE, 0x81, 0x04, 0x01, 0x09, 0x11, 0x16, 0x07, 0x43, 0x40, 0x03, 0x05, 0x06, 0x06, 0x01, 0x01, /* 00008AB0 */ 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00008AC0 */ 0xFF, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00008AD0 */ 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x97, 0x03, 0x02, 0xFE, 0xA2, 0x03, 0x04, 0x03, 0x02, 0xFE, 0xA3, @@ -3662,10 +3662,10 @@ namespace Js /* 00008C50 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x02, 0x00, 0xFE, 0xAC, 0xC9, 0x0A, 0x00, 0x00, 0x00, /* 00008C60 */ 0x00, 0x49, 0x00, 0x90, 0x00, 0x08, 0x00, 0x2B, 0x00, 0x42, 0x00, 0x01, 0x01, 0x06, 0x00, 0x3C, /* 00008C70 */ 0x00, 0x08, 0x00, 0x6E, 0x00, 0x47, 0x00, 0x82, 0x00, 0x0E, 0x00, 0x33, 0x00, 0x44, 0x00, 0x8D, -/* 00008C80 */ 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0x7A, 0x03, +/* 00008C80 */ 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0x7A, 0x03, /* 00008C90 */ 0xFE, 0xFC, 0x03, 0x0C, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x38, 0x00, 0xFE, 0xBE, 0xC3, 0xFF, 0x00, -/* 00008CA0 */ 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xBE, 0xC3, 0xFE, 0x2B, 0x05, 0xFE, 0x2B, 0x05, 0x09, 0x14, -/* 00008CB0 */ 0x19, 0x07, 0x50, 0x4B, 0x03, 0x05, 0x06, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, +/* 00008CA0 */ 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xBE, 0xC3, 0xFE, 0x2B, 0x05, 0xFE, 0x2B, 0x05, 0x01, 0x09, +/* 00008CB0 */ 0x14, 0x19, 0x07, 0x50, 0x4B, 0x03, 0x05, 0x06, 0x06, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, /* 00008CC0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x18, 0xFF, 0xFF, 0xFF, /* 00008CD0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, /* 00008CE0 */ 0x97, 0x03, 0x02, 0xFE, 0x98, 0x03, 0x04, 0x03, 0x02, 0xFE, 0x99, 0x03, 0x02, 0xFE, 0x9A, 0x03, @@ -3698,10 +3698,10 @@ namespace Js /* 00008E90 */ 0x00, 0x14, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x02, 0x00, 0xFE, /* 00008EA0 */ 0x96, 0xC4, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x0D, 0x01, 0x08, 0x00, 0x2B, 0x00, 0x42, /* 00008EB0 */ 0x00, 0xF6, 0x00, 0x06, 0x00, 0x3C, 0x00, 0x16, 0x00, 0x48, 0x00, 0x52, 0x00, 0x86, 0x00, 0x08, -/* 00008EC0 */ 0x00, 0x31, 0x00, 0x60, 0x00, 0xC6, 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0x3F, 0x6E, 0x05, 0x0A, +/* 00008EC0 */ 0x00, 0x31, 0x00, 0x60, 0x00, 0xC6, 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0xBF, 0xDC, 0x0A, 0x04, /* 00008ED0 */ 0x00, 0xFF, 0x01, 0xFE, 0x79, 0x03, 0xFE, 0xF3, 0x03, 0x0C, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x37, /* 00008EE0 */ 0x00, 0xFE, 0x4E, 0xC2, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x4E, 0xC2, 0xEF, 0xEF, -/* 00008EF0 */ 0x03, 0x05, 0x07, 0x0E, 0x0B, 0x03, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00008EF0 */ 0x01, 0x03, 0x05, 0x07, 0x0E, 0x0B, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00008F00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00008F10 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x09, 0x03, 0x02, 0xFE, /* 00008F20 */ 0xB7, 0x02, 0x02, 0xFE, 0x5F, 0x03, 0x34, 0x2C, 0x07, 0x05, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, @@ -3709,7 +3709,7 @@ namespace Js /* 00008F40 */ 0x00, 0x07, 0x00, 0x00, 0x98, 0x07, 0x07, 0x05, 0x00, 0x00, 0x47, 0x00, 0x07, 0x0F, 0x03, 0x00, /* 00008F50 */ 0x07, 0x47, 0x00, 0x04, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x8A, /* 00008F60 */ 0xC2, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x31, 0x00, 0x21, 0x00, -/* 00008F70 */ 0x45, 0x00, 0x00, 0xBF, 0x7E, 0x31, 0x82, 0x07, 0xFF, 0x03, 0xFE, 0x78, 0x03, 0xFE, 0xB3, 0x03, +/* 00008F70 */ 0x45, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x84, 0x07, 0xFF, 0x03, 0xFE, 0x78, 0x03, 0xFE, 0xB3, 0x03, /* 00008F80 */ 0x0C, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x35, 0x00, 0xFE, 0x96, 0xB6, 0x01, 0xFF, 0x00, 0x10, 0x01, /* 00008F90 */ 0x00, 0x02, 0x02, 0xFE, 0x96, 0xB6, 0xFE, 0xC7, 0x09, 0xFE, 0xC7, 0x09, 0x02, 0x06, 0x17, 0x1B, /* 00008FA0 */ 0x05, 0xCC, 0xCA, 0x03, 0x0D, 0x02, 0x07, 0x05, 0x05, 0x05, 0x05, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, @@ -3797,10 +3797,10 @@ namespace Js /* 000094C0 */ 0x58, 0x00, 0x3A, 0x00, 0x60, 0x00, 0x14, 0x00, 0x39, 0x00, 0x37, 0x00, 0x7A, 0x00, 0x13, 0x00, /* 000094D0 */ 0x28, 0x00, 0x37, 0x00, 0x5C, 0x00, 0x13, 0x00, 0x31, 0x00, 0x14, 0x00, 0x41, 0x00, 0x3A, 0x00, /* 000094E0 */ 0x63, 0x00, 0x14, 0x00, 0x40, 0x00, 0x37, 0x00, 0x7D, 0x00, 0x44, 0x00, 0x42, 0x01, 0x72, 0x00, -/* 000094F0 */ 0x73, 0x00, 0x00, 0xF7, 0x94, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x0A, 0x00, 0xFF, 0x01, 0xFF, 0xFF, +/* 000094F0 */ 0x73, 0x00, 0x00, 0xF7, 0x94, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x00, 0xFF, 0x01, 0xFF, 0xFF, /* 00009500 */ 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0x03, 0x55, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x36, 0x00, 0xFE, 0xEC, -/* 00009510 */ 0xBE, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xEC, 0xBE, 0xB0, 0xB0, 0x04, 0x03, 0x05, -/* 00009520 */ 0x05, 0x10, 0x10, 0x04, 0x01, 0x01, 0x04, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00009510 */ 0xBE, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xEC, 0xBE, 0xB0, 0xB0, 0x41, 0x04, 0x03, +/* 00009520 */ 0x05, 0x05, 0x10, 0x10, 0x04, 0x01, 0x01, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00009530 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00009540 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x56, 0x8F, 0x01, 0x00, 0x00, 0x00, /* 00009550 */ 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x98, 0x05, 0x05, 0x03, 0x00, 0x00, 0x0F, 0x03, 0x00, @@ -3809,10 +3809,10 @@ namespace Js /* 00009580 */ 0x02, 0x00, 0x5C, 0x01, 0x06, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x03, /* 00009590 */ 0x00, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x03, 0xEE, 0x04, 0xFF, 0x05, 0x00, 0x00, 0xA8, 0x00, 0x24, /* 000095A0 */ 0x00, 0x00, 0x00, 0x00, 0xFE, 0x12, 0xBF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x2D, 0x00, -/* 000095B0 */ 0x3B, 0x00, 0x5C, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x27, 0xFF, 0x01, 0xFE, 0x77, 0x03, 0xFE, +/* 000095B0 */ 0x3B, 0x00, 0x5C, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x27, 0xFF, 0x01, 0xFE, 0x77, 0x03, 0xFE, /* 000095C0 */ 0x82, 0x03, 0x0C, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x34, 0x00, 0xFE, 0xDC, 0xAC, 0xFF, 0x00, 0x10, -/* 000095D0 */ 0x01, 0x00, 0x04, 0x04, 0xFE, 0xDC, 0xAC, 0xFE, 0x1F, 0x09, 0xFE, 0x1F, 0x09, 0x07, 0x15, 0x1A, -/* 000095E0 */ 0x05, 0x93, 0x8D, 0x03, 0x08, 0x03, 0x01, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, +/* 000095D0 */ 0x01, 0x00, 0x04, 0x04, 0xFE, 0xDC, 0xAC, 0xFE, 0x1F, 0x09, 0xFE, 0x1F, 0x09, 0x01, 0x07, 0x15, +/* 000095E0 */ 0x1A, 0x05, 0x93, 0x8D, 0x03, 0x08, 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, /* 000095F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, /* 00009600 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x08, /* 00009610 */ 0x02, 0xFE, 0x7E, 0x03, 0x02, 0xFE, 0x7F, 0x03, 0x09, 0x02, 0xFE, 0x80, 0x03, 0x02, 0xFE, 0x81, @@ -3880,7 +3880,7 @@ namespace Js /* 000099F0 */ 0x3A, 0x00, 0x10, 0x00, 0x46, 0x00, 0x2A, 0x00, 0x79, 0x00, 0x03, 0x00, 0x3C, 0x00, 0x17, 0x00, /* 00009A00 */ 0x58, 0x00, 0x40, 0x00, 0xCF, 0x00, 0x40, 0x00, 0xD0, 0x00, 0x40, 0x00, 0xDD, 0x00, 0x17, 0x00, /* 00009A10 */ 0x58, 0x00, 0x40, 0x00, 0xCF, 0x00, 0x40, 0x00, 0xD1, 0x00, 0x40, 0x00, 0xE0, 0x00, 0x08, 0x00, -/* 00009A20 */ 0x1D, 0x00, 0x00, 0xBF, 0x7E, 0x31, 0x82, 0xA7, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, +/* 00009A20 */ 0x1D, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x84, 0xA7, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, /* 00009A30 */ 0x90, 0x02, 0x18, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x2B, 0x00, 0xFE, 0x40, 0x7A, 0x06, 0xFF, 0x00, /* 00009A40 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x40, 0x7A, 0xFE, 0xA1, 0x31, 0xFE, 0xA1, 0x31, 0x01, 0x0D, /* 00009A50 */ 0x22, 0x28, 0x09, 0xA6, 0xA6, 0x01, 0x0C, 0x01, 0x09, 0x07, 0x07, 0x07, 0x07, 0x05, 0x02, 0x25, @@ -3969,11 +3969,11 @@ namespace Js /* 00009F80 */ 0x54, 0x00, 0x54, 0x00, 0x9D, 0x00, 0x37, 0x00, 0x23, 0x01, 0x61, 0x00, 0x9A, 0x00, 0x3E, 0x00, /* 00009F90 */ 0x49, 0x00, 0x5C, 0x00, 0xA0, 0x00, 0x66, 0x00, 0xD8, 0x04, 0x7E, 0x00, 0x25, 0x03, 0x0F, 0x00, /* 00009FA0 */ 0x88, 0x00, 0x07, 0x00, 0x17, 0x00, 0x00, 0xE1, 0xA9, 0x00, 0x00, 0x14, 0xA8, 0x00, 0x00, 0x62, -/* 00009FB0 */ 0xA5, 0x00, 0x00, 0x9E, 0xA3, 0x00, 0x00, 0xFF, 0xA0, 0x00, 0x00, 0xBF, 0x9F, 0x00, 0x00, 0x3F, -/* 00009FC0 */ 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x69, 0x03, 0x39, 0xFF, +/* 00009FB0 */ 0xA5, 0x00, 0x00, 0x9E, 0xA3, 0x00, 0x00, 0xFF, 0xA0, 0x00, 0x00, 0xBF, 0x9F, 0x00, 0x00, 0xBF, +/* 00009FC0 */ 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x69, 0x03, 0x39, 0xFF, /* 00009FD0 */ 0xA0, 0x41, 0x11, 0x00, 0x32, 0x00, 0xFE, 0x8F, 0xA8, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, -/* 00009FE0 */ 0xFE, 0x8F, 0xA8, 0xFE, 0x61, 0x02, 0xFE, 0x61, 0x02, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, -/* 00009FF0 */ 0x03, 0x01, 0x09, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00009FE0 */ 0xFE, 0x8F, 0xA8, 0xFE, 0x61, 0x02, 0xFE, 0x61, 0x02, 0x09, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, +/* 00009FF0 */ 0x04, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A000 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A010 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x59, 0x03, /* 0000A020 */ 0x02, 0xFE, 0xC2, 0x02, 0xAA, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, @@ -3990,10 +3990,10 @@ namespace Js /* 0000A0D0 */ 0x00, 0xFE, 0x31, 0x02, 0xFE, 0xFD, 0x01, 0xFE, 0x35, 0x02, 0xFE, 0x42, 0x02, 0x00, 0xFE, 0xB6, /* 0000A0E0 */ 0xA8, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x2A, 0x00, 0x87, 0x00, 0x26, 0x00, /* 0000A0F0 */ 0x4C, 0x00, 0x15, 0x00, 0x6A, 0x00, 0x2A, 0x00, 0x87, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0xBF, -/* 0000A100 */ 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x03, 0xFE, 0x22, 0x03, 0xFE, 0x53, 0x03, 0x1B, 0xFF, 0xA0, 0x41, +/* 0000A100 */ 0xFD, 0x22, 0x84, 0x07, 0xFF, 0x03, 0xFE, 0x22, 0x03, 0xFE, 0x53, 0x03, 0x1B, 0xFF, 0xA0, 0x41, /* 0000A110 */ 0x03, 0x00, 0x30, 0x00, 0xFE, 0xA2, 0xA3, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, -/* 0000A120 */ 0xA2, 0xA3, 0xFE, 0x1A, 0x04, 0xFE, 0x1A, 0x04, 0x02, 0x06, 0x07, 0x0B, 0x05, 0x40, 0x40, 0x04, -/* 0000A130 */ 0x06, 0x07, 0x08, 0x03, 0x03, 0x03, 0x03, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, +/* 0000A120 */ 0xA2, 0xA3, 0xFE, 0x1A, 0x04, 0xFE, 0x1A, 0x04, 0x08, 0x02, 0x06, 0x07, 0x0B, 0x05, 0x40, 0x40, +/* 0000A130 */ 0x04, 0x06, 0x07, 0x03, 0x03, 0x03, 0x03, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, /* 0000A140 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, /* 0000A150 */ 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x5A, 0x03, 0x02, 0xFE, 0xC2, 0x02, 0x03, 0x04, 0xFE, 0x48, /* 0000A160 */ 0x01, 0x5B, 0x07, 0xB4, 0x07, 0x07, 0x2C, 0x0B, 0x07, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x2A, @@ -4020,10 +4020,10 @@ namespace Js /* 0000A2B0 */ 0x01, 0xFE, 0x35, 0x02, 0xFE, 0x5B, 0x03, 0xFE, 0xE7, 0x01, 0x00, 0xFE, 0xD8, 0xA3, 0x09, 0x05, /* 0000A2C0 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x2A, 0x00, 0x8E, 0x00, 0x29, 0x00, 0x4C, 0x00, 0x25, /* 0000A2D0 */ 0x00, 0x6A, 0x00, 0x2A, 0x00, 0x90, 0x00, 0x28, 0x00, 0x49, 0x00, 0x3F, 0x00, 0x4A, 0x01, 0x2D, -/* 0000A2E0 */ 0x00, 0x3F, 0x00, 0x00, 0xE8, 0xA2, 0x00, 0x00, 0x3F, 0x6E, 0x0D, 0x0A, 0x00, 0xFF, 0x01, 0xFF, +/* 0000A2E0 */ 0x00, 0x3F, 0x00, 0x00, 0xE8, 0xA2, 0x00, 0x00, 0xBF, 0xDC, 0x1A, 0x04, 0x00, 0xFF, 0x01, 0xFF, /* 0000A2F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x5E, 0x03, 0x48, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x31, 0x00, 0xFE, -/* 0000A300 */ 0x62, 0xA6, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x62, 0xA6, 0xFC, 0xFC, 0x05, 0x04, -/* 0000A310 */ 0x06, 0x0D, 0x0D, 0x05, 0x01, 0x01, 0x02, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000A300 */ 0x62, 0xA6, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x62, 0xA6, 0xFC, 0xFC, 0x41, 0x05, +/* 0000A310 */ 0x04, 0x06, 0x0D, 0x0D, 0x05, 0x01, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A320 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A330 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x5C, 0x03, 0x02, 0xFE, 0x09, /* 0000A340 */ 0x03, 0x48, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x2F, 0x07, @@ -4031,10 +4031,10 @@ namespace Js /* 0000A360 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, /* 0000A370 */ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x2F, 0x08, 0x02, 0x04, 0x98, 0x07, 0x07, 0x08, 0x00, 0x00, /* 0000A380 */ 0x9D, 0x07, 0x06, 0x04, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x93, 0xA6, -/* 0000A390 */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x5B, 0x00, 0x2A, 0x00, 0x6F, 0x00, 0x00, 0x3F, 0x7E, -/* 0000A3A0 */ 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0x50, 0x03, 0xFE, 0x37, 0x03, 0x10, 0xFF, 0xA3, 0x41, 0x01, +/* 0000A390 */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x5B, 0x00, 0x2A, 0x00, 0x6F, 0x00, 0x00, 0xBF, 0xFC, +/* 0000A3A0 */ 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0x50, 0x03, 0xFE, 0x37, 0x03, 0x10, 0xFF, 0xA3, 0x41, 0x01, /* 0000A3B0 */ 0x00, 0x2F, 0x00, 0xFE, 0xAA, 0x9C, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xAA, 0x9C, -/* 0000A3C0 */ 0xFE, 0xF1, 0x02, 0xFE, 0xF1, 0x02, 0x08, 0x07, 0x0B, 0x07, 0x3D, 0x39, 0x04, 0x06, 0x03, 0x09, +/* 0000A3C0 */ 0xFE, 0xF1, 0x02, 0xFE, 0xF1, 0x02, 0x09, 0x08, 0x07, 0x0B, 0x07, 0x3D, 0x39, 0x04, 0x06, 0x03, /* 0000A3D0 */ 0x05, 0x05, 0x05, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A3E0 */ 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A3F0 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x59, 0x03, 0x02, 0xFE, 0xC2, @@ -4060,10 +4060,10 @@ namespace Js /* 0000A530 */ 0xFE, 0x31, 0x02, 0xFE, 0xFD, 0x01, 0xFE, 0x35, 0x02, 0xFE, 0xF7, 0x01, 0x00, 0xFE, 0xD4, 0x9C, /* 0000A540 */ 0x08, 0x05, 0x00, 0x00, 0x00, 0x26, 0x00, 0x31, 0x00, 0x0B, 0x00, 0x39, 0x00, 0x2A, 0x00, 0x7F, /* 0000A550 */ 0x00, 0x26, 0x00, 0x48, 0x00, 0x15, 0x00, 0x66, 0x00, 0x2A, 0x00, 0xD8, 0x00, 0x5A, 0x00, 0x57, -/* 0000A560 */ 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xC2, 0x02, 0xFE, 0x15, 0x03, 0x10, +/* 0000A560 */ 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xC2, 0x02, 0xFE, 0x15, 0x03, 0x10, /* 0000A570 */ 0xFF, 0xA1, 0x41, 0x21, 0x00, 0x2E, 0x00, 0xFE, 0xEB, 0x96, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, -/* 0000A580 */ 0x01, 0xFE, 0xEB, 0x96, 0xFE, 0x64, 0x05, 0xFE, 0x64, 0x05, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, -/* 0000A590 */ 0x04, 0x04, 0x09, 0x09, 0x0B, 0x07, 0x06, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000A580 */ 0x01, 0xFE, 0xEB, 0x96, 0xFE, 0x64, 0x05, 0xFE, 0x64, 0x05, 0x0B, 0x0A, 0x08, 0x0F, 0x05, 0x67, +/* 0000A590 */ 0x5E, 0x04, 0x04, 0x09, 0x09, 0x07, 0x06, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A5A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A5B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, /* 0000A5C0 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0xFE, 0xC2, 0x02, 0xFE, @@ -4103,10 +4103,10 @@ namespace Js /* 0000A7E0 */ 0x00, 0x44, 0x00, 0x20, 0x00, 0x59, 0x00, 0x26, 0x00, 0x3A, 0x00, 0x22, 0x00, 0x39, 0x00, 0x25, /* 0000A7F0 */ 0x00, 0x9F, 0x00, 0x26, 0x00, 0x49, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x25, 0x00, 0x40, 0x00, 0x26, /* 0000A800 */ 0x00, 0x5B, 0x00, 0x23, 0x00, 0x4F, 0x00, 0x42, 0x00, 0x66, 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x08, -/* 0000A810 */ 0x00, 0x1D, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x0F, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000A810 */ 0x00, 0x1D, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x0F, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A820 */ 0xFE, 0x07, 0x03, 0x62, 0xFF, 0xA0, 0x41, 0x31, 0x00, 0x2D, 0x00, 0xFE, 0x36, 0x94, 0xFF, 0x00, -/* 0000A830 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x36, 0x94, 0xFE, 0x73, 0x02, 0xFE, 0x73, 0x02, 0x09, 0x09, -/* 0000A840 */ 0x0E, 0x07, 0x40, 0x3C, 0x03, 0x02, 0x06, 0x06, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, +/* 0000A830 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x36, 0x94, 0xFE, 0x73, 0x02, 0xFE, 0x73, 0x02, 0x0B, 0x09, +/* 0000A840 */ 0x09, 0x0E, 0x07, 0x40, 0x3C, 0x03, 0x02, 0x06, 0x06, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, /* 0000A850 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, /* 0000A860 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, /* 0000A870 */ 0x02, 0xFE, 0x05, 0x03, 0x02, 0xFE, 0x43, 0x03, 0x02, 0xFE, 0x42, 0x03, 0x04, 0x01, 0x00, 0x00, @@ -4132,10 +4132,10 @@ namespace Js /* 0000A9B0 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x31, 0x02, 0xFE, 0x26, 0x02, 0xFE, 0xF7, 0x01, 0x00, /* 0000A9C0 */ 0xFE, 0x59, 0x94, 0x07, 0x07, 0x00, 0x00, 0x00, 0x23, 0x00, 0x58, 0x00, 0x2A, 0x00, 0x7B, 0x00, /* 0000A9D0 */ 0x25, 0x00, 0x3F, 0x00, 0x2F, 0x00, 0x58, 0x00, 0x26, 0x00, 0x8F, 0x00, 0x5A, 0x00, 0x56, 0x00, -/* 0000A9E0 */ 0x00, 0x3F, 0x7E, 0x21, 0x8B, 0x87, 0xFF, 0x01, 0xFE, 0x52, 0x03, 0xFE, 0x94, 0x02, 0x0C, 0xFF, +/* 0000A9E0 */ 0x00, 0xBF, 0xFC, 0x42, 0x86, 0x87, 0xFF, 0x01, 0xFE, 0x52, 0x03, 0xFE, 0x94, 0x02, 0x0C, 0xFF, /* 0000A9F0 */ 0xB3, 0x41, 0x01, 0x00, 0x2C, 0x00, 0xFE, 0x9C, 0x7A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, -/* 0000AA00 */ 0xFE, 0x9C, 0x7A, 0xFE, 0x34, 0x19, 0xFE, 0x34, 0x19, 0x18, 0x23, 0x37, 0x07, 0xFE, 0x83, 0x01, -/* 0000AA10 */ 0xFE, 0x5E, 0x01, 0x03, 0x04, 0x22, 0x10, 0x45, 0x1E, 0x1E, 0x1E, 0x1E, 0x01, 0xFF, 0xFF, 0xFF, +/* 0000AA00 */ 0xFE, 0x9C, 0x7A, 0xFE, 0x34, 0x19, 0xFE, 0x34, 0x19, 0x45, 0x18, 0x23, 0x37, 0x07, 0xFE, 0x83, +/* 0000AA10 */ 0x01, 0xFE, 0x5E, 0x01, 0x03, 0x04, 0x22, 0x10, 0x1E, 0x1E, 0x1E, 0x1E, 0x01, 0xFF, 0xFF, 0xFF, /* 0000AA20 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x36, 0xFF, 0xFF, 0xFF, /* 0000AA30 */ 0xFF, 0xFF, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, /* 0000AA40 */ 0x27, 0x03, 0x04, 0x02, 0xFE, 0xC2, 0x02, 0x08, 0x02, 0xFE, 0x09, 0x03, 0x03, 0x02, 0xFE, 0x16, @@ -4273,7 +4273,7 @@ namespace Js /* 0000B280 */ 0x00, 0x04, 0x00, 0x4D, 0x00, 0x04, 0x00, 0x4F, 0x00, 0x04, 0x00, 0x51, 0x00, 0x0A, 0x00, 0x43, /* 0000B290 */ 0x00, 0x04, 0x00, 0x59, 0x00, 0x04, 0x00, 0x68, 0x00, 0x04, 0x00, 0x41, 0x00, 0x07, 0x00, 0xAD, /* 0000B2A0 */ 0x00, 0x25, 0x00, 0x4E, 0x00, 0x01, 0x00, 0x21, 0x00, 0x1B, 0x00, 0x6F, 0x01, 0x1D, 0x00, 0x4D, -/* 0000B2B0 */ 0x00, 0x35, 0x00, 0x7F, 0x00, 0x06, 0x00, 0x3C, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x82, 0xA7, 0xFF, +/* 0000B2B0 */ 0x00, 0x35, 0x00, 0x7F, 0x00, 0x06, 0x00, 0x3C, 0x00, 0x00, 0x3F, 0xFC, 0x22, 0x84, 0xA7, 0xFF, /* 0000B2C0 */ 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xAB, 0x01, 0x14, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x23, /* 0000B2D0 */ 0x00, 0xFE, 0xA2, 0x49, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xA2, 0x49, 0xFE, /* 0000B2E0 */ 0x43, 0x30, 0xFE, 0x43, 0x30, 0x0B, 0x17, 0x1B, 0x09, 0x99, 0x99, 0x01, 0x0C, 0x09, 0x07, 0x07, @@ -4357,10 +4357,10 @@ namespace Js /* 0000B7C0 */ 0x00, 0x3E, 0x00, 0x47, 0x00, 0x5C, 0x00, 0x98, 0x00, 0x66, 0x00, 0xBD, 0x05, 0x7E, 0x00, 0x12, /* 0000B7D0 */ 0x03, 0x0F, 0x00, 0x80, 0x00, 0x07, 0x00, 0x17, 0x00, 0x00, 0xE0, 0xC1, 0x00, 0x00, 0xBF, 0xBF, /* 0000B7E0 */ 0x00, 0x00, 0x0D, 0xBD, 0x00, 0x00, 0x23, 0xBB, 0x00, 0x00, 0x32, 0xB9, 0x00, 0x00, 0xF2, 0xB7, -/* 0000B7F0 */ 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7A, +/* 0000B7F0 */ 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7A, /* 0000B800 */ 0x02, 0x3A, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x2A, 0x00, 0xFE, 0xAC, 0x76, 0xFF, 0x00, 0x10, 0x01, -/* 0000B810 */ 0x00, 0x01, 0x01, 0xFE, 0xAC, 0x76, 0xFE, 0x50, 0x02, 0xFE, 0x50, 0x02, 0x05, 0x05, 0x08, 0x04, -/* 0000B820 */ 0x25, 0x24, 0x03, 0x03, 0x01, 0x09, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000B810 */ 0x00, 0x01, 0x01, 0xFE, 0xAC, 0x76, 0xFE, 0x50, 0x02, 0xFE, 0x50, 0x02, 0x09, 0x05, 0x05, 0x08, +/* 0000B820 */ 0x04, 0x25, 0x24, 0x03, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000B830 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000B840 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, /* 0000B850 */ 0xFE, 0x40, 0x03, 0x02, 0xFE, 0xBE, 0x02, 0xAA, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x2C, 0x08, 0x05, @@ -4377,10 +4377,10 @@ namespace Js /* 0000B900 */ 0x24, 0x00, 0x00, 0x00, 0xFE, 0x31, 0x02, 0xFE, 0xFD, 0x01, 0xFE, 0x40, 0x02, 0xFE, 0x41, 0x02, /* 0000B910 */ 0x00, 0xFE, 0xD3, 0x76, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x2A, 0x00, 0x80, /* 0000B920 */ 0x00, 0x26, 0x00, 0x4C, 0x00, 0x15, 0x00, 0x66, 0x00, 0x2A, 0x00, 0x80, 0x00, 0x09, 0x00, 0x39, -/* 0000B930 */ 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x27, 0xFF, 0x01, 0xFE, 0x22, 0x03, 0xFE, 0x64, 0x02, 0x1B, +/* 0000B930 */ 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x27, 0xFF, 0x01, 0xFE, 0x22, 0x03, 0xFE, 0x64, 0x02, 0x1B, /* 0000B940 */ 0xFF, 0xA0, 0x41, 0x03, 0x00, 0x29, 0x00, 0xFE, 0xD8, 0x70, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, -/* 0000B950 */ 0x01, 0xFE, 0xD8, 0x70, 0xFE, 0x03, 0x05, 0xFE, 0x03, 0x05, 0x05, 0x0D, 0x10, 0x04, 0x33, 0x32, -/* 0000B960 */ 0x03, 0x03, 0x01, 0x09, 0x11, 0x11, 0x11, 0x11, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000B950 */ 0x01, 0xFE, 0xD8, 0x70, 0xFE, 0x03, 0x05, 0xFE, 0x03, 0x05, 0x09, 0x05, 0x0D, 0x10, 0x04, 0x33, +/* 0000B960 */ 0x32, 0x03, 0x03, 0x01, 0x11, 0x11, 0x11, 0x11, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000B970 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000B980 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, /* 0000B990 */ 0x41, 0x03, 0x02, 0xFE, 0xBE, 0x02, 0x02, 0xFE, 0xF2, 0x02, 0x02, 0xFE, 0x28, 0x03, 0x02, 0xFE, @@ -4408,10 +4408,10 @@ namespace Js /* 0000BAF0 */ 0x3F, 0x02, 0xFE, 0x3A, 0x03, 0xFE, 0x3E, 0x02, 0xFE, 0xEB, 0x01, 0xFE, 0x3D, 0x02, 0xFE, 0x31, /* 0000BB00 */ 0x03, 0x00, 0xFE, 0x0E, 0x71, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x2A, 0x00, /* 0000BB10 */ 0x86, 0x00, 0x26, 0x00, 0x4C, 0x00, 0x15, 0x00, 0x66, 0x00, 0x2A, 0x00, 0x88, 0x00, 0x4A, 0x00, -/* 0000BB20 */ 0xCF, 0x02, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0x23, 0x03, 0xFE, 0x4C, 0x02, +/* 0000BB20 */ 0xCF, 0x02, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0x23, 0x03, 0xFE, 0x4C, 0x02, /* 0000BB30 */ 0x10, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x28, 0x00, 0xFE, 0x63, 0x6B, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000BB40 */ 0x03, 0x03, 0xFE, 0x63, 0x6B, 0xFE, 0x01, 0x03, 0xFE, 0x01, 0x03, 0x09, 0x06, 0x0B, 0x0B, 0x44, -/* 0000BB50 */ 0x41, 0x03, 0x07, 0x03, 0x09, 0x08, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000BB40 */ 0x03, 0x03, 0xFE, 0x63, 0x6B, 0xFE, 0x01, 0x03, 0xFE, 0x01, 0x03, 0x09, 0x09, 0x06, 0x0B, 0x0B, +/* 0000BB50 */ 0x44, 0x41, 0x03, 0x07, 0x03, 0x08, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000BB60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000BB70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, /* 0000BB80 */ 0x40, 0x03, 0x02, 0xFE, 0xBE, 0x02, 0x04, 0xFE, 0x3F, 0x01, 0x5B, 0x08, 0xB4, 0x08, 0x08, 0x2C, @@ -4438,10 +4438,10 @@ namespace Js /* 0000BCD0 */ 0x01, 0xFE, 0x40, 0x02, 0xFE, 0xF2, 0x01, 0xFE, 0x39, 0x02, 0xFE, 0x3B, 0x02, 0xFE, 0x3C, 0x02, /* 0000BCE0 */ 0xFE, 0x3E, 0x02, 0x00, 0xFE, 0x91, 0x6B, 0x09, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x39, 0x00, /* 0000BCF0 */ 0x2A, 0x00, 0x78, 0x00, 0x26, 0x00, 0x48, 0x00, 0x15, 0x00, 0x62, 0x00, 0x2A, 0x00, 0x78, 0x00, -/* 0000BD00 */ 0x1E, 0x00, 0x24, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x62, 0x00, 0xB5, 0x00, 0x00, 0x3F, 0x7E, 0x15, -/* 0000BD10 */ 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xBE, 0x02, 0xFE, 0x28, 0x02, 0x10, 0xFF, 0xA1, 0x41, 0x21, 0x00, +/* 0000BD00 */ 0x1E, 0x00, 0x24, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x62, 0x00, 0xB5, 0x00, 0x00, 0xBF, 0xFC, 0x2A, +/* 0000BD10 */ 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xBE, 0x02, 0xFE, 0x28, 0x02, 0x10, 0xFF, 0xA1, 0x41, 0x21, 0x00, /* 0000BD20 */ 0x27, 0x00, 0xFE, 0x3A, 0x65, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x3A, 0x65, 0xFE, -/* 0000BD30 */ 0x84, 0x05, 0xFE, 0x84, 0x05, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x03, 0x04, 0x09, 0x09, 0x0B, +/* 0000BD30 */ 0x84, 0x05, 0xFE, 0x84, 0x05, 0x0B, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x03, 0x04, 0x09, 0x09, /* 0000BD40 */ 0x07, 0x06, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000BD50 */ 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000BD60 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, @@ -4481,11 +4481,11 @@ namespace Js /* 0000BF80 */ 0x2D, 0x00, 0x0D, 0x00, 0x1B, 0x00, 0x09, 0x00, 0x2F, 0x00, 0x18, 0x00, 0x44, 0x00, 0x20, 0x00, /* 0000BF90 */ 0x55, 0x00, 0x26, 0x00, 0x38, 0x00, 0x22, 0x00, 0x39, 0x00, 0x25, 0x00, 0x9B, 0x00, 0x26, 0x00, /* 0000BFA0 */ 0x49, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x25, 0x00, 0x40, 0x00, 0x26, 0x00, 0x5B, 0x00, 0x23, 0x00, -/* 0000BFB0 */ 0x79, 0x00, 0x42, 0x00, 0x69, 0x00, 0x0B, 0x00, 0x40, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0x3F, -/* 0000BFC0 */ 0x7E, 0x15, 0x8A, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x16, 0x02, 0x61, 0xFF, +/* 0000BFB0 */ 0x79, 0x00, 0x42, 0x00, 0x69, 0x00, 0x0B, 0x00, 0x40, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0xBF, +/* 0000BFC0 */ 0xFC, 0x2A, 0x84, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x16, 0x02, 0x61, 0xFF, /* 0000BFD0 */ 0xA0, 0x41, 0x31, 0x00, 0x26, 0x00, 0xFE, 0x19, 0x61, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, -/* 0000BFE0 */ 0xFE, 0x19, 0x61, 0xFE, 0xDD, 0x03, 0xFE, 0xDD, 0x03, 0x0A, 0x08, 0x0E, 0x0B, 0x4F, 0x4B, 0x02, -/* 0000BFF0 */ 0x03, 0x08, 0x05, 0x0B, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000BFE0 */ 0xFE, 0x19, 0x61, 0xFE, 0xDD, 0x03, 0xFE, 0xDD, 0x03, 0x0B, 0x0A, 0x08, 0x0E, 0x0B, 0x4F, 0x4B, +/* 0000BFF0 */ 0x02, 0x03, 0x08, 0x05, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000C000 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000C010 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, /* 0000C020 */ 0xFE, 0x1D, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x66, @@ -4516,10 +4516,10 @@ namespace Js /* 0000C1B0 */ 0x3C, 0x61, 0x0B, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x2E, 0x00, 0x12, 0x00, 0x44, 0x00, 0x28, /* 0000C1C0 */ 0x00, 0x77, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x20, 0x00, 0xF1, 0x00, 0x1E, 0x00, 0x31, 0x00, 0x1E, /* 0000C1D0 */ 0x00, 0x2E, 0x00, 0x23, 0x00, 0x46, 0x00, 0x2F, 0x00, 0x52, 0x00, 0x62, 0x00, 0xBA, 0x00, 0x00, -/* 0000C1E0 */ 0xBF, 0x7E, 0x25, 0x8B, 0x87, 0xFF, 0x03, 0xFE, 0x26, 0x03, 0xFE, 0xAF, 0x01, 0x0C, 0xFF, 0xB3, +/* 0000C1E0 */ 0xBF, 0xFD, 0x4A, 0x86, 0x87, 0xFF, 0x03, 0xFE, 0x26, 0x03, 0xFE, 0xAF, 0x01, 0x0C, 0xFF, 0xB3, /* 0000C1F0 */ 0x41, 0x01, 0x00, 0x24, 0x00, 0xFE, 0xFE, 0x49, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, -/* 0000C200 */ 0xFE, 0xFE, 0x49, 0xFE, 0xB6, 0x16, 0xFE, 0xB6, 0x16, 0x03, 0x15, 0x24, 0x35, 0x08, 0xFE, 0x0B, -/* 0000C210 */ 0x01, 0xFA, 0x02, 0x02, 0x05, 0x12, 0x0F, 0x44, 0x14, 0x14, 0x14, 0x14, 0x01, 0x32, 0xFF, 0xFF, +/* 0000C200 */ 0xFE, 0xFE, 0x49, 0xFE, 0xB6, 0x16, 0xFE, 0xB6, 0x16, 0x44, 0x03, 0x15, 0x24, 0x35, 0x08, 0xFE, +/* 0000C210 */ 0x0B, 0x01, 0xFA, 0x02, 0x02, 0x05, 0x12, 0x0F, 0x14, 0x14, 0x14, 0x14, 0x01, 0x32, 0xFF, 0xFF, /* 0000C220 */ 0xFF, 0xFF, 0xFF, 0x33, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x35, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000C230 */ 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x27, 0x03, 0x04, 0x02, 0xFE, 0xBE, 0x02, 0x08, /* 0000C240 */ 0x02, 0xFE, 0x09, 0x03, 0x03, 0x02, 0xFE, 0x16, 0x03, 0x02, 0xFE, 0x04, 0x03, 0x02, 0xFE, 0xFB, @@ -4620,10 +4620,10 @@ namespace Js /* 0000C830 */ 0x00, 0x1B, 0x00, 0x06, 0x00, 0x56, 0x00, 0x04, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x4E, 0x00, 0x04, /* 0000C840 */ 0x00, 0x49, 0x00, 0x04, 0x00, 0x2B, 0x00, 0x04, 0x00, 0x37, 0x00, 0x04, 0x00, 0x43, 0x00, 0x0C, /* 0000C850 */ 0x00, 0x33, 0x00, 0x0C, 0x00, 0x2F, 0x00, 0x0C, 0x00, 0x33, 0x00, 0x06, 0x00, 0x34, 0x00, 0x00, -/* 0000C860 */ 0x64, 0xC8, 0x00, 0x00, 0x3F, 0x7E, 0x35, 0x8A, 0x67, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000C860 */ 0x64, 0xC8, 0x00, 0x00, 0xBF, 0xFC, 0x6A, 0x84, 0x67, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000C870 */ 0xFE, 0xD1, 0x01, 0x57, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x25, 0x00, 0xFE, 0xE3, 0x51, 0xFF, 0x00, -/* 0000C880 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xE3, 0x51, 0xFE, 0xDB, 0x04, 0xFE, 0xDB, 0x04, 0x09, 0x15, -/* 0000C890 */ 0x1A, 0x0B, 0x5E, 0x59, 0x03, 0x03, 0x05, 0x01, 0x08, 0x41, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, +/* 0000C880 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xE3, 0x51, 0xFE, 0xDB, 0x04, 0xFE, 0xDB, 0x04, 0x41, 0x09, +/* 0000C890 */ 0x15, 0x1A, 0x0B, 0x5E, 0x59, 0x03, 0x03, 0x05, 0x01, 0x08, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, /* 0000C8A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, /* 0000C8B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 0000C8C0 */ 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0xFE, 0xB7, 0x02, 0x02, @@ -4664,10 +4664,10 @@ namespace Js /* 0000CAF0 */ 0xFA, 0x02, 0x00, 0xFE, 0x10, 0x52, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x83, 0x00, 0x09, /* 0000CB00 */ 0x00, 0x2D, 0x00, 0x22, 0x00, 0x4D, 0x00, 0x1E, 0x00, 0x4C, 0x00, 0x7C, 0x00, 0xA0, 0x00, 0x1E, /* 0000CB10 */ 0x00, 0x4A, 0x00, 0x0A, 0x00, 0x3C, 0x00, 0x5E, 0x00, 0xAB, 0x00, 0x0D, 0x00, 0x4F, 0x00, 0x32, -/* 0000CB20 */ 0x00, 0x01, 0x01, 0x0C, 0x00, 0x43, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x47, 0xFF, 0x01, 0xFE, +/* 0000CB20 */ 0x00, 0x01, 0x01, 0x0C, 0x00, 0x43, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x47, 0xFF, 0x01, 0xFE, /* 0000CB30 */ 0xEE, 0x02, 0xFE, 0x9A, 0x01, 0x1E, 0xFF, 0xA0, 0x41, 0x01, 0x00, 0x22, 0x00, 0xFE, 0x41, 0x47, /* 0000CB40 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x41, 0x47, 0xFE, 0x12, 0x02, 0xFE, 0x12, 0x02, -/* 0000CB50 */ 0x0A, 0x05, 0x0B, 0x06, 0x29, 0x22, 0x01, 0x04, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, +/* 0000CB50 */ 0x01, 0x0A, 0x05, 0x0B, 0x06, 0x29, 0x22, 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, /* 0000CB60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, /* 0000CB70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 0000CB80 */ 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0xFE, 0x1A, 0x03, 0xB2, @@ -4686,7 +4686,7 @@ namespace Js /* 0000CC50 */ 0xFE, 0x58, 0x47, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x60, 0x00, 0x09, 0x00, 0x20, 0x00, /* 0000CC60 */ 0x09, 0x00, 0x23, 0x00, 0x15, 0x00, 0x51, 0x00, 0x14, 0x00, 0x41, 0x00, 0x06, 0x00, 0x1C, 0x00, /* 0000CC70 */ 0x09, 0x00, 0x33, 0x00, 0x0A, 0x00, 0x29, 0x00, 0x08, 0x00, 0x39, 0x00, 0x08, 0x00, 0x14, 0x00, -/* 0000CC80 */ 0x00, 0xBF, 0x7E, 0x11, 0x02, 0x00, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x88, 0x01, +/* 0000CC80 */ 0x00, 0x3F, 0xFD, 0x22, 0x04, 0x00, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x88, 0x01, /* 0000CC90 */ 0x31, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x1F, 0x00, 0xFE, 0x63, 0x44, 0x01, 0xFF, 0x00, 0x10, 0x01, /* 0000CCA0 */ 0x00, 0x01, 0x01, 0xFE, 0x63, 0x44, 0xFE, 0xB8, 0x02, 0xFE, 0xB8, 0x02, 0x01, 0x06, 0x04, 0x07, /* 0000CCB0 */ 0x08, 0x1C, 0x1C, 0x01, 0x03, 0x06, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x06, 0xFF, 0xFF, @@ -4702,10 +4702,10 @@ namespace Js /* 0000CD50 */ 0xFF, 0x07, 0x01, 0x00, 0x93, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x09, 0x02, 0x00, 0xA8, /* 0000CD60 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x18, 0x03, 0x00, 0xFE, 0x7A, 0x44, 0x04, 0x00, 0x00, 0x00, /* 0000CD70 */ 0x00, 0x28, 0x00, 0x30, 0x00, 0x5A, 0x00, 0x5A, 0x02, 0x0D, 0x00, 0x16, 0x00, 0x00, 0x82, 0xCD, -/* 0000CD80 */ 0x00, 0x00, 0xBF, 0x7E, 0x1D, 0x0A, 0x00, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x8A, +/* 0000CD80 */ 0x00, 0x00, 0xBF, 0xFD, 0x3A, 0x04, 0x00, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x8A, /* 0000CD90 */ 0x01, 0x6B, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x20, 0x00, 0xFE, 0x0D, 0x45, 0x01, 0xFF, 0x00, 0x10, -/* 0000CDA0 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x0D, 0x45, 0xFE, 0xEB, 0x01, 0xFE, 0xEB, 0x01, 0x02, 0x07, 0x04, -/* 0000CDB0 */ 0x08, 0x08, 0x20, 0x20, 0x02, 0x01, 0x01, 0x03, 0x08, 0x40, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000CDA0 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x0D, 0x45, 0xFE, 0xEB, 0x01, 0xFE, 0xEB, 0x01, 0x40, 0x02, 0x07, +/* 0000CDB0 */ 0x04, 0x08, 0x08, 0x20, 0x20, 0x02, 0x01, 0x01, 0x03, 0x08, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000CDC0 */ 0x06, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000CDD0 */ 0xFF, 0x00, 0x00, 0x03, 0x04, 0xB4, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x08, /* 0000CDE0 */ 0x00, 0x00, 0x98, 0x08, 0x08, 0x04, 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, 0x08, 0x8F, 0x02, @@ -4721,9 +4721,9 @@ namespace Js /* 0000CE80 */ 0x9D, 0x09, 0x08, 0x04, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x73, 0x01, 0xFE, /* 0000CE90 */ 0x19, 0x03, 0x00, 0xFE, 0x2E, 0x45, 0x05, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x43, 0x00, 0x28, /* 0000CEA0 */ 0x00, 0x37, 0x00, 0x56, 0x00, 0x28, 0x01, 0x1C, 0x00, 0x27, 0x00, 0x00, 0xB0, 0xCE, 0x00, 0x00, -/* 0000CEB0 */ 0x3F, 0x6E, 0x0D, 0x0A, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x8E, 0x01, 0x56, +/* 0000CEB0 */ 0xBF, 0xDC, 0x1A, 0x04, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x8E, 0x01, 0x56, /* 0000CEC0 */ 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x21, 0x00, 0xFE, 0xF2, 0x45, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, -/* 0000CED0 */ 0x02, 0xFE, 0xF2, 0x45, 0xCC, 0xCC, 0x04, 0x03, 0x06, 0x0A, 0x09, 0x03, 0x01, 0x01, 0x02, 0x41, +/* 0000CED0 */ 0x02, 0xFE, 0xF2, 0x45, 0xCC, 0xCC, 0x41, 0x04, 0x03, 0x06, 0x0A, 0x09, 0x03, 0x01, 0x01, 0x02, /* 0000CEE0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, /* 0000CEF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 0000CF00 */ 0x00, 0x02, 0xFE, 0xB7, 0x02, 0x33, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, @@ -4731,10 +4731,10 @@ namespace Js /* 0000CF20 */ 0x09, 0x12, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x9D, /* 0000CF30 */ 0x03, 0x06, 0x04, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x19, 0x46, 0x04, /* 0000CF40 */ 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x34, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x14, 0x00, 0x42, 0x00, -/* 0000CF50 */ 0x00, 0x3F, 0x7E, 0x15, 0x0A, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x67, 0x01, +/* 0000CF50 */ 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x67, 0x01, /* 0000CF60 */ 0x8D, 0xFF, 0xA2, 0x41, 0x31, 0x00, 0x1E, 0x00, 0xFE, 0xFA, 0x3B, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000CF70 */ 0x02, 0x02, 0xFE, 0xFA, 0x3B, 0xD0, 0xD0, 0x07, 0x06, 0x0B, 0x06, 0x19, 0x16, 0x01, 0x02, 0x01, -/* 0000CF80 */ 0x02, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000CF70 */ 0x02, 0x02, 0xFE, 0xFA, 0x3B, 0xD0, 0xD0, 0x0B, 0x07, 0x06, 0x0B, 0x06, 0x19, 0x16, 0x01, 0x02, +/* 0000CF80 */ 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000CF90 */ 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000CFA0 */ 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x5F, /* 0000CFB0 */ 0x5B, 0x09, 0xB4, 0x09, 0x09, 0xAE, 0x07, 0xA7, 0x0B, 0x07, 0x00, 0x00, 0x12, 0x03, 0x00, 0x0B, @@ -4744,10 +4744,10 @@ namespace Js /* 0000CFF0 */ 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x06, 0x5C, /* 0000D000 */ 0x04, 0x08, 0xEE, 0x05, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, /* 0000D010 */ 0x00, 0x00, 0xFE, 0x18, 0x3C, 0x03, 0x07, 0x00, 0x00, 0x00, 0x21, 0x00, 0x4A, 0x00, 0x35, 0x00, -/* 0000D020 */ 0x67, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x0A, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, +/* 0000D020 */ 0x67, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, /* 0000D030 */ 0x5B, 0x01, 0x89, 0xFF, 0xA2, 0x41, 0x31, 0x00, 0x1D, 0x00, 0xFE, 0x55, 0x38, 0xFF, 0x00, 0x10, -/* 0000D040 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x55, 0x38, 0xCE, 0xCE, 0x07, 0x06, 0x0B, 0x06, 0x19, 0x16, 0x01, -/* 0000D050 */ 0x02, 0x01, 0x02, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000D040 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x55, 0x38, 0xCE, 0xCE, 0x0B, 0x07, 0x06, 0x0B, 0x06, 0x19, 0x16, +/* 0000D050 */ 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D060 */ 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D070 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, /* 0000D080 */ 0x04, 0x5F, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0xAE, 0x07, 0xA7, 0x0B, 0x07, 0x00, 0x00, 0x12, 0x03, @@ -4757,10 +4757,10 @@ namespace Js /* 0000D0C0 */ 0x01, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x5C, 0x02, 0x0C, 0x5C, 0x03, /* 0000D0D0 */ 0x06, 0x5C, 0x04, 0x08, 0xEE, 0x05, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, /* 0000D0E0 */ 0x00, 0x00, 0x00, 0x00, 0xFE, 0x73, 0x38, 0x03, 0x07, 0x00, 0x00, 0x00, 0x21, 0x00, 0x4A, 0x00, -/* 0000D0F0 */ 0x35, 0x00, 0x65, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x0A, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000D0F0 */ 0x35, 0x00, 0x65, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D100 */ 0xFF, 0xFE, 0x4F, 0x01, 0x81, 0xFF, 0xA2, 0x41, 0x31, 0x00, 0x1C, 0x00, 0xFE, 0xC0, 0x34, 0xFF, -/* 0000D110 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xC0, 0x34, 0xCA, 0xCA, 0x07, 0x06, 0x0B, 0x06, 0x19, -/* 0000D120 */ 0x16, 0x01, 0x02, 0x01, 0x02, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000D110 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xC0, 0x34, 0xCA, 0xCA, 0x0B, 0x07, 0x06, 0x0B, 0x06, +/* 0000D120 */ 0x19, 0x16, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D130 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D140 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, /* 0000D150 */ 0x00, 0x00, 0x04, 0x5F, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0xAE, 0x07, 0xA7, 0x0B, 0x07, 0x00, 0x00, @@ -4770,10 +4770,10 @@ namespace Js /* 0000D190 */ 0x09, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x5C, 0x02, 0x0C, /* 0000D1A0 */ 0x5C, 0x03, 0x06, 0x5C, 0x04, 0x08, 0xEE, 0x05, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, /* 0000D1B0 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xDE, 0x34, 0x03, 0x07, 0x00, 0x00, 0x00, 0x21, 0x00, -/* 0000D1C0 */ 0x4A, 0x00, 0x35, 0x00, 0x61, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xA6, +/* 0000D1C0 */ 0x4A, 0x00, 0x35, 0x00, 0x61, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xA6, /* 0000D1D0 */ 0x02, 0xFE, 0x33, 0x01, 0x1D, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x1B, 0x00, 0xFE, 0x5D, 0x2F, 0xFF, -/* 0000D1E0 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x5D, 0x2F, 0xFE, 0x7E, 0x03, 0xFE, 0x7E, 0x03, 0x08, -/* 0000D1F0 */ 0x08, 0x0C, 0x0A, 0x51, 0x4E, 0x01, 0x09, 0x07, 0x01, 0x05, 0x05, 0x05, 0x05, 0xFF, 0xFF, 0xFF, +/* 0000D1E0 */ 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x5D, 0x2F, 0xFE, 0x7E, 0x03, 0xFE, 0x7E, 0x03, 0x01, +/* 0000D1F0 */ 0x08, 0x08, 0x0C, 0x0A, 0x51, 0x4E, 0x01, 0x09, 0x07, 0x05, 0x05, 0x05, 0x05, 0xFF, 0xFF, 0xFF, /* 0000D200 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, /* 0000D210 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x02, /* 0000D220 */ 0xFE, 0x09, 0x03, 0x02, 0xFE, 0xFB, 0x02, 0x02, 0xFE, 0x15, 0x03, 0x02, 0xFE, 0x16, 0x03, 0x02, @@ -4806,10 +4806,10 @@ namespace Js /* 0000D3D0 */ 0xFE, 0xF3, 0x01, 0x00, 0xFE, 0x9A, 0x2F, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x36, 0x00, /* 0000D3E0 */ 0x0B, 0x00, 0x33, 0x00, 0x07, 0x00, 0x30, 0x00, 0x0B, 0x00, 0x37, 0x00, 0x26, 0x00, 0x39, 0x00, /* 0000D3F0 */ 0x10, 0x00, 0x4B, 0x00, 0x48, 0x00, 0x9B, 0x00, 0x13, 0x00, 0x4D, 0x00, 0x6E, 0x00, 0x95, 0x00, -/* 0000D400 */ 0x4E, 0x00, 0x6F, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xE5, 0x02, 0xFE, +/* 0000D400 */ 0x4E, 0x00, 0x6F, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xE5, 0x02, 0xFE, /* 0000D410 */ 0x25, 0x01, 0x24, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x1A, 0x00, 0xFE, 0x60, 0x2D, 0xFF, 0x00, 0x10, -/* 0000D420 */ 0x01, 0x00, 0x05, 0x05, 0xFE, 0x60, 0x2D, 0xFE, 0xB2, 0x01, 0xFE, 0xB2, 0x01, 0x08, 0x05, 0x0B, -/* 0000D430 */ 0x04, 0x28, 0x27, 0x01, 0x04, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000D420 */ 0x01, 0x00, 0x05, 0x05, 0xFE, 0x60, 0x2D, 0xFE, 0xB2, 0x01, 0xFE, 0xB2, 0x01, 0x01, 0x08, 0x05, +/* 0000D430 */ 0x0B, 0x04, 0x28, 0x27, 0x01, 0x04, 0x02, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D440 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D450 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0xFE, 0xA2, /* 0000D460 */ 0x02, 0x04, 0xB9, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, 0x0B, 0x14, 0x03, 0x00, @@ -4826,7 +4826,7 @@ namespace Js /* 0000D510 */ 0x03, 0x00, 0x0B, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x22, /* 0000D520 */ 0x02, 0xFE, 0xFD, 0x01, 0xFE, 0x2B, 0x02, 0x00, 0xFE, 0x9B, 0x2D, 0x07, 0x00, 0x00, 0x00, 0x00, /* 0000D530 */ 0x12, 0x00, 0x38, 0x00, 0x23, 0x00, 0x43, 0x00, 0x26, 0x00, 0x39, 0x00, 0x16, 0x00, 0x4D, 0x00, -/* 0000D540 */ 0x23, 0x00, 0x43, 0x00, 0x23, 0x00, 0x32, 0x00, 0x00, 0xBF, 0x7E, 0x31, 0x82, 0x27, 0xFF, 0x03, +/* 0000D540 */ 0x23, 0x00, 0x43, 0x00, 0x23, 0x00, 0x32, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x84, 0x27, 0xFF, 0x03, /* 0000D550 */ 0xFE, 0xC8, 0x02, 0xFE, 0x12, 0x01, 0x04, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x18, 0x00, 0xFE, 0xB8, /* 0000D560 */ 0x29, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xB8, 0x29, 0xFE, 0x80, 0x03, 0xFE, /* 0000D570 */ 0x80, 0x03, 0x04, 0x09, 0x0A, 0x10, 0x05, 0x20, 0x20, 0x01, 0x02, 0x01, 0x05, 0x03, 0x03, 0x03, @@ -4849,10 +4849,10 @@ namespace Js /* 0000D680 */ 0x01, 0xFE, 0x7D, 0x01, 0xFE, 0x7C, 0x01, 0xFE, 0x11, 0x03, 0xFE, 0x12, 0x03, 0xFE, 0x13, 0x03, /* 0000D690 */ 0xFE, 0x14, 0x03, 0x00, 0xFE, 0x0C, 0x2A, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x1A, 0x00, /* 0000D6A0 */ 0x06, 0x00, 0x18, 0x00, 0x33, 0x00, 0x7C, 0x02, 0x4C, 0x00, 0x69, 0x00, 0x0D, 0x00, 0x14, 0x00, -/* 0000D6B0 */ 0x00, 0xB5, 0xD6, 0x00, 0x00, 0x3F, 0x7E, 0x01, 0x8B, 0xA7, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000D6B0 */ 0x00, 0xB5, 0xD6, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x86, 0xA7, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D6C0 */ 0xFF, 0xFE, 0x15, 0x01, 0x41, 0xFF, 0xB2, 0x41, 0x11, 0x00, 0x19, 0x00, 0xFE, 0x77, 0x2A, 0xFF, -/* 0000D6D0 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x77, 0x2A, 0xFE, 0x37, 0x02, 0xFE, 0x37, 0x02, 0x08, -/* 0000D6E0 */ 0x0B, 0x0F, 0x06, 0x30, 0x2F, 0x02, 0x03, 0x07, 0x45, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0xFF, +/* 0000D6D0 */ 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x77, 0x2A, 0xFE, 0x37, 0x02, 0xFE, 0x37, 0x02, 0x45, +/* 0000D6E0 */ 0x08, 0x0B, 0x0F, 0x06, 0x30, 0x2F, 0x02, 0x03, 0x07, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0xFF, /* 0000D6F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, /* 0000D700 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x02, 0xFE, 0xA5, /* 0000D710 */ 0x02, 0x02, 0xFE, 0xBF, 0x02, 0x09, 0x02, 0xFE, 0xC1, 0x02, 0x02, 0xFE, 0xC0, 0x02, 0x08, 0x03, @@ -4876,7 +4876,7 @@ namespace Js /* 0000D830 */ 0x7B, 0x01, 0x00, 0x00, 0x00, 0xFE, 0xE9, 0x01, 0xFE, 0x7E, 0x01, 0xFE, 0x7D, 0x01, 0xFE, 0x7C, /* 0000D840 */ 0x01, 0xFE, 0x7B, 0x01, 0x00, 0xFE, 0xAF, 0x2A, 0x07, 0x05, 0x00, 0x00, 0x00, 0x41, 0x00, 0x5F, /* 0000D850 */ 0x00, 0x0B, 0x00, 0x2C, 0x00, 0x5A, 0x00, 0x8E, 0x00, 0x20, 0x00, 0x35, 0x00, 0x01, 0x00, 0x1E, -/* 0000D860 */ 0x00, 0x1E, 0x00, 0x92, 0x00, 0x00, 0xBF, 0x7E, 0x35, 0x82, 0x07, 0xFF, 0x03, 0xFE, 0xC7, 0x02, +/* 0000D860 */ 0x00, 0x1E, 0x00, 0x92, 0x00, 0x00, 0x3F, 0xFD, 0x6A, 0x84, 0x07, 0xFF, 0x03, 0xFE, 0xC7, 0x02, /* 0000D870 */ 0xED, 0x04, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x16, 0x00, 0xFE, 0x5B, 0x25, 0x01, 0xFF, 0x00, 0x10, /* 0000D880 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x5B, 0x25, 0xFE, 0x55, 0x04, 0xFE, 0x55, 0x04, 0x01, 0x08, 0x05, /* 0000D890 */ 0x0A, 0x05, 0x29, 0x26, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x07, 0xFF, 0xFF, @@ -4897,10 +4897,10 @@ namespace Js /* 0000D980 */ 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x0D, 0x03, 0x00, 0xFE, 0x8F, 0x25, 0x0A, 0x00, 0x00, 0x00, 0x00, /* 0000D990 */ 0x0B, 0x00, 0x33, 0x00, 0x08, 0x00, 0x21, 0x00, 0x0B, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x2B, 0x00, /* 0000D9A0 */ 0x26, 0x00, 0x2F, 0x00, 0x2B, 0x00, 0x71, 0x00, 0x0B, 0x00, 0x1A, 0x00, 0x27, 0x00, 0xA5, 0x02, -/* 0000D9B0 */ 0x0D, 0x00, 0x12, 0x00, 0x00, 0xB9, 0xD9, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, +/* 0000D9B0 */ 0x0D, 0x00, 0x12, 0x00, 0x00, 0xB9, 0xD9, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, /* 0000D9C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x22, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x17, 0x00, 0xFE, 0x12, /* 0000D9D0 */ 0x27, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x12, 0x27, 0xFE, 0x7C, 0x02, 0xFE, 0x7C, -/* 0000D9E0 */ 0x02, 0x06, 0x08, 0x0B, 0x06, 0x49, 0x47, 0x02, 0x08, 0x07, 0x41, 0x05, 0x05, 0x05, 0x05, 0xFF, +/* 0000D9E0 */ 0x02, 0x41, 0x06, 0x08, 0x0B, 0x06, 0x49, 0x47, 0x02, 0x08, 0x07, 0x05, 0x05, 0x05, 0x05, 0xFF, /* 0000D9F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, /* 0000DA00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, /* 0000DA10 */ 0x02, 0xFE, 0x04, 0x03, 0x02, 0xFE, 0x0E, 0x03, 0x03, 0x02, 0xFE, 0x0F, 0x03, 0x04, 0x01, 0xFF, @@ -4932,9 +4932,9 @@ namespace Js /* 0000DBB0 */ 0xFE, 0x2A, 0x02, 0xFE, 0xF1, 0x01, 0x00, 0xFE, 0x33, 0x27, 0x09, 0x00, 0x00, 0x00, 0x00, 0x1E, /* 0000DBC0 */ 0x00, 0x66, 0x00, 0x25, 0x00, 0x4A, 0x00, 0x26, 0x00, 0x34, 0x00, 0x2A, 0x00, 0x3F, 0x00, 0x3E, /* 0000DBD0 */ 0x00, 0x4E, 0x00, 0x26, 0x00, 0x39, 0x00, 0x4B, 0x00, 0x66, 0x00, 0x3B, 0x00, 0x4A, 0x00, 0x00, -/* 0000DBE0 */ 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xC6, 0x02, 0xE6, 0x04, 0xFF, 0xA3, 0x41, 0x01, +/* 0000DBE0 */ 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xC6, 0x02, 0xE6, 0x04, 0xFF, 0xA3, 0x41, 0x01, /* 0000DBF0 */ 0x00, 0x15, 0x00, 0xFE, 0x35, 0x24, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x35, 0x24, -/* 0000DC00 */ 0xA6, 0xA6, 0x05, 0x03, 0x05, 0x04, 0x14, 0x13, 0x01, 0x02, 0x03, 0x01, 0x02, 0x02, 0x02, 0x02, +/* 0000DC00 */ 0xA6, 0xA6, 0x01, 0x05, 0x03, 0x05, 0x04, 0x14, 0x13, 0x01, 0x02, 0x03, 0x02, 0x02, 0x02, 0x02, /* 0000DC10 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, /* 0000DC20 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 0000DC30 */ 0x00, 0x03, 0x63, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x6D, @@ -4945,10 +4945,10 @@ namespace Js /* 0000DC80 */ 0x07, 0xF2, 0x03, 0x05, 0x05, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x05, 0x02, 0x09, /* 0000DC90 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x25, 0x02, 0xFE, 0x01, 0x02, 0x00, 0xFE, /* 0000DCA0 */ 0x68, 0x24, 0x03, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x2B, 0x00, 0x3B, 0x00, 0x47, 0x00, 0x00, -/* 0000DCB0 */ 0x3F, 0x7E, 0x15, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xC5, 0x02, 0xD6, 0x04, 0xFF, 0xA3, 0x41, 0x01, +/* 0000DCB0 */ 0xBF, 0xFC, 0x2A, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xC5, 0x02, 0xD6, 0x04, 0xFF, 0xA3, 0x41, 0x01, /* 0000DCC0 */ 0x00, 0x14, 0x00, 0xFE, 0xDE, 0x21, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0xDE, 0x21, -/* 0000DCD0 */ 0xFE, 0x4F, 0x02, 0xFE, 0x4F, 0x02, 0x0B, 0x07, 0x0F, 0x08, 0x3B, 0x38, 0x01, 0x01, 0x06, 0x05, -/* 0000DCE0 */ 0x01, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000DCD0 */ 0xFE, 0x4F, 0x02, 0xFE, 0x4F, 0x02, 0x01, 0x0B, 0x07, 0x0F, 0x08, 0x3B, 0x38, 0x01, 0x01, 0x06, +/* 0000DCE0 */ 0x05, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000DCF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000DD00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x09, 0x03, 0x04, 0x02, 0xFE, 0x0A, 0x03, 0x02, /* 0000DD10 */ 0xFE, 0x0B, 0x03, 0x02, 0xFE, 0x0C, 0x03, 0xFE, 0x10, 0x01, 0xA8, 0x0D, 0x98, 0x0F, 0x07, 0x08, @@ -4971,10 +4971,10 @@ namespace Js /* 0000DE20 */ 0x47, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x26, 0x02, 0xFE, /* 0000DE30 */ 0x27, 0x02, 0x22, 0x00, 0xFE, 0x31, 0x22, 0x08, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x2D, 0x00, /* 0000DE40 */ 0x0B, 0x00, 0x34, 0x00, 0x26, 0x00, 0x41, 0x00, 0x32, 0x00, 0x66, 0x00, 0x6F, 0x00, 0x90, 0x00, -/* 0000DE50 */ 0x29, 0x00, 0x42, 0x00, 0x08, 0x00, 0x21, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x07, 0xFF, 0x01, +/* 0000DE50 */ 0x29, 0x00, 0x42, 0x00, 0x08, 0x00, 0x21, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x07, 0xFF, 0x01, /* 0000DE60 */ 0xFE, 0xC4, 0x02, 0xBC, 0x04, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x13, 0x00, 0xFE, 0xA7, 0x1E, 0xFF, -/* 0000DE70 */ 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0xA7, 0x1E, 0xFE, 0x2F, 0x03, 0xFE, 0x2F, 0x03, 0x0B, -/* 0000DE80 */ 0x0A, 0x11, 0x0A, 0x50, 0x4A, 0x01, 0x01, 0x08, 0x06, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, +/* 0000DE70 */ 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0xA7, 0x1E, 0xFE, 0x2F, 0x03, 0xFE, 0x2F, 0x03, 0x01, +/* 0000DE80 */ 0x0B, 0x0A, 0x11, 0x0A, 0x50, 0x4A, 0x01, 0x01, 0x08, 0x06, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, /* 0000DE90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0xFF, 0xFF, /* 0000DEA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, /* 0000DEB0 */ 0xFE, 0x03, 0x03, 0x02, 0xFE, 0x04, 0x03, 0x02, 0xFE, 0x05, 0x03, 0x04, 0x01, 0xFF, 0xFF, 0xFF, @@ -5007,7 +5007,7 @@ namespace Js /* 0000E060 */ 0x00, 0xFE, 0xF0, 0x1E, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x2A, 0x00, 0x0A, 0x00, 0x28, /* 0000E070 */ 0x00, 0x08, 0x00, 0x2A, 0x00, 0x26, 0x00, 0x48, 0x00, 0x08, 0x00, 0x29, 0x00, 0x26, 0x00, 0x40, /* 0000E080 */ 0x00, 0x08, 0x00, 0x29, 0x00, 0x26, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x6C, 0x00, 0x96, 0x00, 0xA9, -/* 0000E090 */ 0x00, 0x06, 0x00, 0x24, 0x00, 0x08, 0x00, 0x16, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x82, 0x27, 0xFF, +/* 0000E090 */ 0x00, 0x06, 0x00, 0x24, 0x00, 0x08, 0x00, 0x16, 0x00, 0x00, 0x3F, 0xFC, 0x22, 0x84, 0x27, 0xFF, /* 0000E0A0 */ 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0x14, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x0C, 0x00, 0xFE, /* 0000E0B0 */ 0x1B, 0x19, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x1B, 0x19, 0xFE, 0x0A, 0x05, /* 0000E0C0 */ 0xFE, 0x0A, 0x05, 0x04, 0x0A, 0x0B, 0x04, 0x1D, 0x1D, 0x01, 0x01, 0x01, 0x06, 0x06, 0x06, 0x06, @@ -5029,10 +5029,10 @@ namespace Js /* 0000E1C0 */ 0xFE, 0xFD, 0x02, 0xFE, 0x25, 0x02, 0xFE, 0x26, 0x02, 0xFE, 0x24, 0x02, 0xFE, 0x29, 0x02, 0xFE, /* 0000E1D0 */ 0x02, 0x03, 0x00, 0xFE, 0x32, 0x19, 0x02, 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 0xF2, 0x04, 0x00, /* 0000E1E0 */ 0xED, 0xE5, 0x00, 0x00, 0x57, 0xE5, 0x00, 0x00, 0xC1, 0xE4, 0x00, 0x00, 0x2B, 0xE4, 0x00, 0x00, -/* 0000E1F0 */ 0xDA, 0xE2, 0x00, 0x00, 0xF8, 0xE1, 0x00, 0x00, 0x3F, 0xFE, 0x11, 0x0E, 0x00, 0xFF, 0x01, 0xFE, +/* 0000E1F0 */ 0xDA, 0xE2, 0x00, 0x00, 0xF8, 0xE1, 0x00, 0x00, 0xBF, 0xFC, 0x23, 0x0C, 0x00, 0xFF, 0x01, 0xFE, /* 0000E200 */ 0x02, 0x03, 0xAC, 0x19, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x12, 0x00, 0xFE, 0xCF, 0x1C, 0xFF, 0x00, -/* 0000E210 */ 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0xCF, 0x1C, 0xFE, 0x3D, 0x01, 0xFE, 0x3D, 0x01, 0x05, 0x04, -/* 0000E220 */ 0x07, 0x05, 0x1C, 0x1A, 0x19, 0x01, 0x02, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000E210 */ 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0xCF, 0x1C, 0xFE, 0x3D, 0x01, 0xFE, 0x3D, 0x01, 0x01, 0x05, +/* 0000E220 */ 0x04, 0x07, 0x05, 0x1C, 0x1A, 0x19, 0x01, 0x02, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E230 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E240 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x6A, 0x00, 0x04, 0x08, 0x6E, /* 0000E250 */ 0xEB, 0x00, 0xEC, 0x00, 0x0F, 0x03, 0x00, 0x04, 0x09, 0x5D, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, @@ -5043,10 +5043,10 @@ namespace Js /* 0000E2A0 */ 0x07, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x04, 0xEE, 0x02, 0x07, 0x07, /* 0000E2B0 */ 0x01, 0x00, 0x47, 0x04, 0x07, 0x09, 0x9A, 0xFF, 0xED, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, /* 0000E2C0 */ 0x00, 0xFE, 0x26, 0x1D, 0x05, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1A, 0x00, 0x34, 0x00, 0x55, -/* 0000E2D0 */ 0x00, 0x08, 0x00, 0x39, 0x00, 0x25, 0x00, 0x3D, 0x00, 0x00, 0x3F, 0x7E, 0x51, 0x8A, 0x07, 0xFF, +/* 0000E2D0 */ 0x00, 0x08, 0x00, 0x39, 0x00, 0x25, 0x00, 0x3D, 0x00, 0x00, 0xBF, 0xFC, 0xA2, 0x84, 0x07, 0xFF, /* 0000E2E0 */ 0x01, 0xFE, 0x01, 0x03, 0xA3, 0x16, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x11, 0x00, 0xFE, 0xAF, 0x1B, /* 0000E2F0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xAF, 0x1B, 0xFE, 0x02, 0x01, 0xFE, 0x02, 0x01, -/* 0000E300 */ 0x09, 0x06, 0x0A, 0x07, 0x2A, 0x25, 0x01, 0x05, 0x01, 0x04, 0x01, 0x02, 0x02, 0x02, 0x02, 0xFF, +/* 0000E300 */ 0x01, 0x09, 0x06, 0x0A, 0x07, 0x2A, 0x25, 0x01, 0x05, 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0xFF, /* 0000E310 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, /* 0000E320 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, /* 0000E330 */ 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0x00, @@ -5064,38 +5064,38 @@ namespace Js /* 0000E3F0 */ 0x01, 0x0C, 0xF2, 0x02, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, 0x08, 0x0A, 0x47, /* 0000E400 */ 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1A, 0x28, 0x00, 0xFE, 0xCF, /* 0000E410 */ 0x1B, 0x06, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x2A, 0x00, 0x03, 0x00, 0x1A, 0x00, 0x44, 0x00, -/* 0000E420 */ 0x39, 0x00, 0x59, 0x00, 0x4B, 0x00, 0x08, 0x00, 0x19, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x0A, 0x00, +/* 0000E420 */ 0x39, 0x00, 0x59, 0x00, 0x4B, 0x00, 0x08, 0x00, 0x19, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, /* 0000E430 */ 0xFF, 0x01, 0xFE, 0x00, 0x03, 0x9F, 0x1E, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x10, 0x00, 0xFE, 0x35, -/* 0000E440 */ 0x1B, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x35, 0x1B, 0x5F, 0x5F, 0x03, 0x03, 0x05, -/* 0000E450 */ 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000E440 */ 0x1B, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x35, 0x1B, 0x5F, 0x5F, 0x01, 0x03, 0x03, +/* 0000E450 */ 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E460 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E470 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x37, 0xA8, 0x05, 0x15, 0x03, 0x00, 0x03, /* 0000E480 */ 0x05, 0x09, 0x21, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, /* 0000E490 */ 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, 0x00, 0x47, /* 0000E4A0 */ 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, /* 0000E4B0 */ 0x00, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x1B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x3E, 0x00, -/* 0000E4C0 */ 0x00, 0x3F, 0x7E, 0x11, 0x0A, 0x00, 0xFF, 0x01, 0xFE, 0xFF, 0x02, 0x9B, 0x16, 0xFF, 0xA2, 0x41, +/* 0000E4C0 */ 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFF, 0x01, 0xFE, 0xFF, 0x02, 0x9B, 0x16, 0xFF, 0xA2, 0x41, /* 0000E4D0 */ 0x01, 0x00, 0x0F, 0x00, 0xFE, 0xBA, 0x1A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xBA, -/* 0000E4E0 */ 0x1A, 0x58, 0x58, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, +/* 0000E4E0 */ 0x1A, 0x58, 0x58, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, /* 0000E4F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, /* 0000E500 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x37, /* 0000E510 */ 0xA8, 0x05, 0x14, 0x03, 0x00, 0x03, 0x05, 0x09, 0x08, 0x00, 0xA9, 0x05, 0x47, 0x00, 0x05, 0x09, /* 0000E520 */ 0x1E, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x07, 0x02, /* 0000E530 */ 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, 0x00, 0x47, 0x00, 0x05, /* 0000E540 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xDA, 0x1A, 0x02, 0x00, 0x00, -/* 0000E550 */ 0x00, 0x00, 0x35, 0x00, 0x37, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x0A, 0x00, 0xFF, 0x01, 0xFE, 0xFE, +/* 0000E550 */ 0x00, 0x00, 0x35, 0x00, 0x37, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFF, 0x01, 0xFE, 0xFE, /* 0000E560 */ 0x02, 0x96, 0x16, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x0E, 0x00, 0xFE, 0x3F, 0x1A, 0xFF, 0x00, 0x10, -/* 0000E570 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x3F, 0x1A, 0x5E, 0x5E, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, +/* 0000E570 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0x3F, 0x1A, 0x5E, 0x5E, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, /* 0000E580 */ 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E590 */ 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E5A0 */ 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x37, 0xA8, 0x05, 0x15, 0x03, 0x00, 0x03, 0x05, 0x09, 0x21, 0x00, /* 0000E5B0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, /* 0000E5C0 */ 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, 0x00, 0x47, 0x00, 0x05, 0x09, 0x05, /* 0000E5D0 */ 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, -/* 0000E5E0 */ 0xFE, 0x5F, 0x1A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x3D, 0x00, 0x00, 0x3F, 0x7E, 0x11, -/* 0000E5F0 */ 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xFD, 0x02, 0x8F, 0x16, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x0D, 0x00, -/* 0000E600 */ 0xFE, 0x5F, 0x19, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x5F, 0x19, 0xC5, 0xC5, 0x04, -/* 0000E610 */ 0x04, 0x06, 0x03, 0x17, 0x15, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, +/* 0000E5E0 */ 0xFE, 0x5F, 0x1A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x3D, 0x00, 0x00, 0xBF, 0xFC, 0x22, +/* 0000E5F0 */ 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xFD, 0x02, 0x8F, 0x16, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x0D, 0x00, +/* 0000E600 */ 0xFE, 0x5F, 0x19, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x5F, 0x19, 0xC5, 0xC5, 0x01, +/* 0000E610 */ 0x04, 0x04, 0x06, 0x03, 0x17, 0x15, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, /* 0000E620 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, /* 0000E630 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, /* 0000E640 */ 0x5F, 0x14, 0x03, 0x00, 0x04, 0x02, 0x09, 0x20, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, @@ -5105,10 +5105,10 @@ namespace Js /* 0000E680 */ 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0xEE, 0x02, 0x06, 0x06, 0x01, 0x00, 0x47, 0x00, /* 0000E690 */ 0x06, 0x09, 0x05, 0x00, 0xA8, 0x06, 0x47, 0x00, 0x06, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, /* 0000E6A0 */ 0x00, 0x00, 0xFE, 0x1F, 0x02, 0x00, 0xFE, 0x7F, 0x19, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, -/* 0000E6B0 */ 0x27, 0x00, 0x20, 0x00, 0x40, 0x00, 0x35, 0x00, 0x3D, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x47, +/* 0000E6B0 */ 0x27, 0x00, 0x20, 0x00, 0x40, 0x00, 0x35, 0x00, 0x3D, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x47, /* 0000E6C0 */ 0xFF, 0x01, 0xFE, 0xE2, 0x02, 0x89, 0x20, 0xFF, 0xA0, 0x41, 0x01, 0x00, 0x0B, 0x00, 0xFE, 0x95, -/* 0000E6D0 */ 0x18, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x95, 0x18, 0x6D, 0x6D, 0x05, 0x03, 0x04, -/* 0000E6E0 */ 0x06, 0x12, 0x12, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0xFF, 0xFF, 0xFF, +/* 0000E6D0 */ 0x18, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x95, 0x18, 0x6D, 0x6D, 0x01, 0x05, 0x03, +/* 0000E6E0 */ 0x04, 0x06, 0x12, 0x12, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, 0xFF, 0xFF, 0xFF, /* 0000E6F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, /* 0000E700 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, /* 0000E710 */ 0x00, 0x00, 0x00, 0x56, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, @@ -5118,10 +5118,10 @@ namespace Js /* 0000E750 */ 0x5C, 0x02, 0x06, 0xF2, 0x03, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x04, /* 0000E760 */ 0x02, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x02, 0xFE, /* 0000E770 */ 0xF5, 0x01, 0x00, 0x09, 0xFE, 0xFC, 0x02, 0x00, 0xFE, 0xAC, 0x18, 0x02, 0x00, 0x00, 0x00, 0x00, -/* 0000E780 */ 0x54, 0x00, 0x55, 0x00, 0x00, 0x3F, 0xFE, 0x15, 0x8E, 0x07, 0xFF, 0x01, 0xFE, 0xE1, 0x02, 0x79, +/* 0000E780 */ 0x54, 0x00, 0x55, 0x00, 0x00, 0xBF, 0xFC, 0x2B, 0x8C, 0x07, 0xFF, 0x01, 0xFE, 0xE1, 0x02, 0x79, /* 0000E790 */ 0x19, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x0A, 0x00, 0xFE, 0xC9, 0x15, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000E7A0 */ 0x05, 0x05, 0xFE, 0xC9, 0x15, 0xFE, 0xA8, 0x02, 0xFE, 0xA8, 0x02, 0x0C, 0x06, 0x10, 0x06, 0x42, -/* 0000E7B0 */ 0x37, 0x18, 0x01, 0x01, 0x04, 0x04, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000E7A0 */ 0x05, 0x05, 0xFE, 0xC9, 0x15, 0xFE, 0xA8, 0x02, 0xFE, 0xA8, 0x02, 0x01, 0x0C, 0x06, 0x10, 0x06, +/* 0000E7B0 */ 0x42, 0x37, 0x18, 0x01, 0x01, 0x04, 0x04, 0x01, 0x02, 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E7C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E7D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x7A, 0xD1, 0x00, 0x02, /* 0000E7E0 */ 0xFE, 0xFB, 0x02, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xFE, 0xFE, @@ -5144,8 +5144,8 @@ namespace Js /* 0000E8F0 */ 0x00, 0xFE, 0xF3, 0x01, 0xFE, 0xE9, 0x01, 0x00, 0xFE, 0x19, 0x16, 0x0C, 0x04, 0x00, 0x00, 0x00, /* 0000E900 */ 0x30, 0x00, 0x62, 0x00, 0x1E, 0x00, 0x36, 0x00, 0x0F, 0x00, 0x34, 0x00, 0x16, 0x00, 0x3A, 0x00, /* 0000E910 */ 0x07, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x20, 0x00, 0x2D, 0x00, 0x6A, 0x00, 0x0E, 0x00, 0x36, 0x00, -/* 0000E920 */ 0x08, 0x00, 0x4C, 0xFF, 0x08, 0x00, 0xE8, 0x00, 0x2B, 0x00, 0x52, 0x00, 0x00, 0xBF, 0x7E, 0x35, -/* 0000E930 */ 0x82, 0xE7, 0xFF, 0x03, 0xFE, 0xE0, 0x02, 0x5A, 0x1E, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x07, 0x00, +/* 0000E920 */ 0x08, 0x00, 0x4C, 0xFF, 0x08, 0x00, 0xE8, 0x00, 0x2B, 0x00, 0x52, 0x00, 0x00, 0x3F, 0xFD, 0x6A, +/* 0000E930 */ 0x84, 0xE7, 0xFF, 0x03, 0xFE, 0xE0, 0x02, 0x5A, 0x1E, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x07, 0x00, /* 0000E940 */ 0xFE, 0xD8, 0x0E, 0x02, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0xD8, 0x0E, 0xFE, 0xD4, /* 0000E950 */ 0x06, 0xFE, 0xD4, 0x06, 0x03, 0x10, 0x0C, 0x15, 0x09, 0x62, 0x5B, 0x01, 0x01, 0x08, 0x01, 0x09, /* 0000E960 */ 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0x01, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x13, 0x14, 0xFF, @@ -5189,11 +5189,11 @@ namespace Js /* 0000EBC0 */ 0x0D, 0xFE, 0xF9, 0x02, 0x00, 0xFE, 0x1D, 0x0F, 0x0B, 0x0C, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x37, /* 0000EBD0 */ 0x00, 0x07, 0x00, 0x1C, 0x00, 0x33, 0x00, 0x3F, 0x02, 0x3D, 0x00, 0x4A, 0x00, 0x1D, 0x00, 0x39, /* 0000EBE0 */ 0x00, 0x12, 0x00, 0x51, 0x00, 0x0B, 0x00, 0x20, 0x00, 0x33, 0x00, 0xBF, 0x01, 0x0B, 0x00, 0x2A, -/* 0000EBF0 */ 0x00, 0xBA, 0x00, 0x1F, 0x01, 0x00, 0x3A, 0xED, 0x00, 0x00, 0xFE, 0xEB, 0x00, 0x00, 0x3F, 0x7E, -/* 0000EC00 */ 0x15, 0x8A, 0x47, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x3D, 0xFF, 0xA2, 0x41, 0x11, +/* 0000EBF0 */ 0x00, 0xBA, 0x00, 0x1F, 0x01, 0x00, 0x3A, 0xED, 0x00, 0x00, 0xFE, 0xEB, 0x00, 0x00, 0xBF, 0xFC, +/* 0000EC00 */ 0x2A, 0x84, 0x47, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x3D, 0xFF, 0xA2, 0x41, 0x11, /* 0000EC10 */ 0x00, 0x09, 0x00, 0xFE, 0xD4, 0x12, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xD4, 0x12, -/* 0000EC20 */ 0xFE, 0x7D, 0x01, 0xFE, 0x7D, 0x01, 0x07, 0x05, 0x09, 0x05, 0x22, 0x20, 0x02, 0x01, 0x03, 0x06, -/* 0000EC30 */ 0x41, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000EC20 */ 0xFE, 0x7D, 0x01, 0xFE, 0x7D, 0x01, 0x41, 0x07, 0x05, 0x09, 0x05, 0x22, 0x20, 0x02, 0x01, 0x03, +/* 0000EC30 */ 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EC40 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EC50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x01, 0xFF, 0xFF, /* 0000EC60 */ 0xFF, 0xFF, 0xB3, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x6D, @@ -5209,10 +5209,10 @@ namespace Js /* 0000ED00 */ 0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x05, 0xEE, 0x04, 0xFF, 0x09, /* 0000ED10 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x02, 0x00, 0x0E, 0xFE, 0xFA, 0x02, /* 0000ED20 */ 0x00, 0xFE, 0xF9, 0x12, 0x05, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x7B, 0x00, 0x09, 0x00, 0x25, -/* 0000ED30 */ 0x00, 0x41, 0x00, 0x60, 0x00, 0x3B, 0x00, 0x57, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x0A, 0x00, 0xFF, +/* 0000ED30 */ 0x00, 0x41, 0x00, 0x60, 0x00, 0x3B, 0x00, 0x57, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFF, /* 0000ED40 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5D, 0x3D, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x08, 0x00, 0xFE, -/* 0000ED50 */ 0xA1, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xA1, 0x0F, 0x61, 0x61, 0x04, 0x05, -/* 0000ED60 */ 0x07, 0x06, 0x0F, 0x0F, 0x02, 0x01, 0x03, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000ED50 */ 0xA1, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xA1, 0x0F, 0x61, 0x61, 0x41, 0x04, +/* 0000ED60 */ 0x05, 0x07, 0x06, 0x0F, 0x0F, 0x02, 0x01, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000ED70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000ED80 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0xF4, 0x02, 0x02, 0xFE, 0xB7, /* 0000ED90 */ 0x02, 0x04, 0x50, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x07, @@ -5221,9 +5221,9 @@ namespace Js /* 0000EDC0 */ 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x02, 0x05, 0x5C, 0x03, 0x08, 0x5D, 0x04, 0x03, 0x00, 0x00, 0xEE, /* 0000EDD0 */ 0x05, 0x07, 0x07, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0xA8, /* 0000EDE0 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xB5, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, -/* 0000EDF0 */ 0x4C, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xF1, 0x02, 0x52, 0x1F, 0xFF, +/* 0000EDF0 */ 0x4C, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xF1, 0x02, 0x52, 0x1F, 0xFF, /* 0000EE00 */ 0xA2, 0x41, 0x01, 0x00, 0x06, 0x00, 0xFE, 0xA2, 0x0D, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, -/* 0000EE10 */ 0xFE, 0xA2, 0x0D, 0xFE, 0x14, 0x01, 0xFE, 0x14, 0x01, 0x06, 0x02, 0x06, 0x03, 0x15, 0x12, 0x01, +/* 0000EE10 */ 0xFE, 0xA2, 0x0D, 0xFE, 0x14, 0x01, 0xFE, 0x14, 0x01, 0x01, 0x06, 0x02, 0x06, 0x03, 0x15, 0x12, /* 0000EE20 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EE30 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EE40 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x4E, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, @@ -5233,29 +5233,29 @@ namespace Js /* 0000EE80 */ 0x14, 0x03, 0x00, 0x03, 0x04, 0x09, 0x05, 0x00, 0xA8, 0x00, 0x09, 0x08, 0x00, 0x47, 0x00, 0x04, /* 0000EE90 */ 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0xF4, 0x01, 0x00, 0xFE, 0xCE, 0x0D, /* 0000EEA0 */ 0x07, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x47, 0x00, 0x08, 0x00, 0x1E, 0x00, 0x09, 0x00, 0x25, -/* 0000EEB0 */ 0x00, 0x08, 0x00, 0x26, 0x00, 0x05, 0x00, 0x1B, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0x3F, 0x7E, -/* 0000EEC0 */ 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xDF, 0x02, 0x4E, 0x1C, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x05, +/* 0000EEB0 */ 0x00, 0x08, 0x00, 0x26, 0x00, 0x05, 0x00, 0x1B, 0x00, 0x08, 0x00, 0x1C, 0x00, 0x00, 0xBF, 0xFC, +/* 0000EEC0 */ 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xDF, 0x02, 0x4E, 0x1C, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x05, /* 0000EED0 */ 0x00, 0xFE, 0x2B, 0x0D, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x2B, 0x0D, 0x53, 0x53, -/* 0000EEE0 */ 0x05, 0x02, 0x05, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, +/* 0000EEE0 */ 0x01, 0x05, 0x02, 0x05, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, /* 0000EEF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, /* 0000EF00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x2D, /* 0000EF10 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x6D, 0x05, 0x06, 0x00, /* 0000EF20 */ 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x02, 0xF2, 0x03, 0x00, 0x05, /* 0000EF30 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, /* 0000EF40 */ 0x6F, 0x02, 0x00, 0xFE, 0x49, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x34, 0x00, 0x00, -/* 0000EF50 */ 0x3F, 0x6E, 0x01, 0x88, 0x07, 0xFF, 0x01, 0xFE, 0xDE, 0x02, 0x48, 0x1C, 0xFF, 0xA2, 0x41, 0x01, +/* 0000EF50 */ 0xBF, 0xDC, 0x02, 0x80, 0x07, 0xFF, 0x01, 0xFE, 0xDE, 0x02, 0x48, 0x1C, 0xFF, 0xA2, 0x41, 0x01, /* 0000EF60 */ 0x00, 0x04, 0x00, 0xFE, 0x8B, 0x0C, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x8B, 0x0C, -/* 0000EF70 */ 0x7F, 0x7F, 0x02, 0x04, 0x05, 0x0A, 0x0A, 0x01, 0x41, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, +/* 0000EF70 */ 0x7F, 0x7F, 0x41, 0x02, 0x04, 0x05, 0x0A, 0x0A, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, /* 0000EF80 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EF90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EFA0 */ 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xF9, 0x7F, 0xFD, 0xDF, 0xC1, 0x05, 0x00, 0x00, 0x40, 0xFE, /* 0000EFB0 */ 0x7F, 0xFD, 0xDF, 0xC1, 0x1E, 0x62, 0x05, 0x04, 0x00, 0x14, 0x0F, 0x00, 0x05, 0x02, 0x09, 0x00, /* 0000EFC0 */ 0x00, 0x62, 0x05, 0x04, 0x00, 0x14, 0x03, 0x00, 0x05, 0x03, 0x09, 0x02, 0x00, 0x23, 0x04, 0xA8, /* 0000EFD0 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x07, 0x01, 0x00, 0xFE, 0xA4, 0x0C, 0x03, 0x00, 0x00, 0x00, -/* 0000EFE0 */ 0x00, 0x18, 0x00, 0x4B, 0x00, 0x04, 0x00, 0x1A, 0x00, 0x00, 0x3F, 0xFE, 0x15, 0x0C, 0x00, 0xFF, +/* 0000EFE0 */ 0x00, 0x18, 0x00, 0x4B, 0x00, 0x04, 0x00, 0x1A, 0x00, 0x00, 0xBF, 0xFC, 0x2B, 0x08, 0x00, 0xFF, /* 0000EFF0 */ 0x01, 0xFE, 0xF0, 0x02, 0x3E, 0x12, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x03, 0x00, 0xFE, 0x5B, 0x0B, -/* 0000F000 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x5B, 0x0B, 0xA9, 0xA9, 0x06, 0x05, 0x09, 0x03, -/* 0000F010 */ 0x11, 0x0F, 0x0D, 0x01, 0x01, 0x01, 0x01, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000F000 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x5B, 0x0B, 0xA9, 0xA9, 0x41, 0x06, 0x05, 0x09, +/* 0000F010 */ 0x03, 0x11, 0x0F, 0x0D, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000F020 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000F030 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x2F, 0x00, 0x01, /* 0000F040 */ 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x33, 0x47, 0x08, 0x02, 0xEB, 0x00, @@ -5263,10 +5263,10 @@ namespace Js /* 0000F060 */ 0x5C, 0x00, 0x03, 0x98, 0x0A, 0x05, 0x08, 0x00, 0x00, 0x5C, 0x01, 0x0A, 0xEE, 0x02, 0xFF, 0x09, /* 0000F070 */ 0x00, 0x00, 0x28, 0x08, 0x08, 0x09, 0xD8, 0xFF, 0xED, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, /* 0000F080 */ 0x00, 0xFE, 0x83, 0x0B, 0x05, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x23, 0x00, 0x08, 0x00, 0x21, -/* 0000F090 */ 0x00, 0x18, 0x00, 0x21, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x0A, 0x00, 0xFF, +/* 0000F090 */ 0x00, 0x18, 0x00, 0x21, 0x00, 0x0A, 0x00, 0x1B, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFF, /* 0000F0A0 */ 0x01, 0xFE, 0xD3, 0x02, 0x28, 0x1F, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x02, 0x00, 0xFE, 0x22, 0x07, -/* 0000F0B0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x22, 0x07, 0x73, 0x73, 0x06, 0x04, 0x08, 0x09, -/* 0000F0C0 */ 0x10, 0x10, 0x01, 0x02, 0x02, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000F0B0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0x22, 0x07, 0x73, 0x73, 0x41, 0x06, 0x04, 0x08, +/* 0000F0C0 */ 0x09, 0x10, 0x10, 0x01, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000F0D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000F0E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x45, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x14, /* 0000F0F0 */ 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0x5C, diff --git a/lib/Runtime/Library/InJavascript/Intl.js.bc.64b.h b/lib/Runtime/Library/InJavascript/Intl.js.bc.64b.h index 06283716832..4e4da8455ce 100644 --- a/lib/Runtime/Library/InJavascript/Intl.js.bc.64b.h +++ b/lib/Runtime/Library/InJavascript/Intl.js.bc.64b.h @@ -2732,18 +2732,18 @@ namespace Js /* 00005230 */ 0x00, 0x3B, 0x1A, 0x01, 0x00, 0x6D, 0x1A, 0x01, 0x00, 0x6D, 0x1A, 0x01, 0x00, 0x8D, 0x1A, 0x01, /* 00005240 */ 0x00, 0x8D, 0x1A, 0x01, 0x00, 0x0A, 0x1B, 0x01, 0x00, 0x0A, 0x1B, 0x01, 0x00, 0x8F, 0x1B, 0x01, /* 00005250 */ 0x00, 0x8F, 0x1B, 0x01, 0x00, 0x18, 0x1C, 0x01, 0x00, 0x18, 0x1C, 0x01, 0x00, 0x1F, 0x1C, 0x01, -/* 00005260 */ 0x00, 0x1F, 0x1C, 0x01, 0x00, 0x24, 0x1C, 0x01, 0x00, 0x24, 0x1C, 0x01, 0x00, 0x44, 0x39, 0x6E, -/* 00005270 */ 0x00, 0x08, 0x00, 0x7F, 0x02, 0xFE, 0x99, 0x02, 0xFE, 0xA8, 0x41, 0x00, 0x00, 0xFE, 0x75, 0x01, +/* 00005260 */ 0x00, 0x1F, 0x1C, 0x01, 0x00, 0x24, 0x1C, 0x01, 0x00, 0x24, 0x1C, 0x01, 0x00, 0x44, 0xB9, 0xDC, +/* 00005270 */ 0x00, 0x00, 0x00, 0x7F, 0x02, 0xFE, 0x99, 0x02, 0xFE, 0xA8, 0x41, 0x00, 0x00, 0xFE, 0x75, 0x01, /* 00005280 */ 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0xFE, 0x75, 0x01, 0xFF, 0xAF, 0x1A, 0x01, 0x00, 0xFF, 0xAF, -/* 00005290 */ 0x1A, 0x01, 0x00, 0x01, 0x04, 0x04, 0x05, 0x05, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00005290 */ 0x1A, 0x01, 0x00, 0x40, 0x01, 0x04, 0x04, 0x05, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 000052A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 000052B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x9A, 0x02, 0x07, 0x0C, /* 000052C0 */ 0xA8, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFA, 0x04, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 000052D0 */ 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0xDA, 0x52, 0x00, 0x00, 0xBF, 0x7E, 0x10, 0x8A, 0x27, 0xFF, +/* 000052D0 */ 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0xDA, 0x52, 0x00, 0x00, 0xBF, 0xFD, 0x20, 0x84, 0x27, 0xFF, /* 000052E0 */ 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x01, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x01, 0x00, 0xFE, /* 000052F0 */ 0x97, 0x01, 0x18, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x97, 0x01, 0xFF, 0x89, 0x1A, -/* 00005300 */ 0x01, 0x00, 0xFF, 0x89, 0x1A, 0x01, 0x00, 0x39, 0x13, 0x2F, 0x3E, 0x09, 0xFE, 0xAC, 0x01, 0xFE, -/* 00005310 */ 0xA7, 0x01, 0x21, 0x10, 0x40, 0x3D, 0x3C, 0x3D, 0x3D, 0x12, 0x3B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00005300 */ 0x01, 0x00, 0xFF, 0x89, 0x1A, 0x01, 0x00, 0x40, 0x39, 0x13, 0x2F, 0x3E, 0x09, 0xFE, 0xAC, 0x01, +/* 00005310 */ 0xFE, 0xA7, 0x01, 0x21, 0x10, 0x3D, 0x3C, 0x3D, 0x3D, 0x12, 0x3B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00005320 */ 0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00005330 */ 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x9B, 0x02, 0x02, 0xFE, 0x9C, 0x02, 0x02, 0xFE, 0x9D, 0x02, 0x02, /* 00005340 */ 0xFE, 0x9E, 0x02, 0x03, 0x04, 0x02, 0xFE, 0x9F, 0x02, 0x02, 0xFE, 0xA0, 0x02, 0x02, 0xFE, 0xA1, @@ -2970,7 +2970,7 @@ namespace Js /* 00006110 */ 0x00, 0xB3, 0xDC, 0x00, 0x00, 0xE3, 0xDB, 0x00, 0x00, 0x69, 0xD8, 0x00, 0x00, 0x4C, 0xD5, 0x00, /* 00006120 */ 0x00, 0x08, 0xD4, 0x00, 0x00, 0xCA, 0xD1, 0x00, 0x00, 0xF8, 0xD0, 0x00, 0x00, 0x26, 0xD0, 0x00, /* 00006130 */ 0x00, 0x54, 0xCF, 0x00, 0x00, 0x84, 0xCC, 0x00, 0x00, 0x28, 0xCB, 0x00, 0x00, 0xBA, 0xB2, 0x00, -/* 00006140 */ 0x00, 0x23, 0x9A, 0x00, 0x00, 0x49, 0x61, 0x00, 0x00, 0xBF, 0x7E, 0x31, 0x82, 0xA7, 0xFF, 0x03, +/* 00006140 */ 0x00, 0x23, 0x9A, 0x00, 0x00, 0x49, 0x61, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x84, 0xA7, 0xFF, 0x03, /* 00006150 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0x03, 0x1A, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x33, 0x00, /* 00006160 */ 0xFE, 0x84, 0xAC, 0x0E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x84, 0xAC, 0xFE, 0xAF, /* 00006170 */ 0x6D, 0xFE, 0xAF, 0x6D, 0x01, 0x13, 0x2F, 0x3B, 0x09, 0xD9, 0xD9, 0x01, 0x10, 0x01, 0x09, 0x11, @@ -3092,11 +3092,11 @@ namespace Js /* 000068B0 */ 0x17, 0x00, 0x00, 0xB5, 0x95, 0x00, 0x00, 0x73, 0x8F, 0x00, 0x00, 0xCC, 0x8E, 0x00, 0x00, 0x86, /* 000068C0 */ 0x8C, 0x00, 0x00, 0x7B, 0x8A, 0x00, 0x00, 0xD2, 0x85, 0x00, 0x00, 0x24, 0x7C, 0x00, 0x00, 0xA4, /* 000068D0 */ 0x79, 0x00, 0x00, 0x28, 0x77, 0x00, 0x00, 0xAC, 0x74, 0x00, 0x00, 0xF4, 0x71, 0x00, 0x00, 0x4A, -/* 000068E0 */ 0x6F, 0x00, 0x00, 0x04, 0x6E, 0x00, 0x00, 0xEB, 0x68, 0x00, 0x00, 0xBF, 0x7E, 0x11, 0x8A, 0x27, +/* 000068E0 */ 0x6F, 0x00, 0x00, 0x04, 0x6E, 0x00, 0x00, 0xEB, 0x68, 0x00, 0x00, 0xBF, 0xFD, 0x22, 0x84, 0x27, /* 000068F0 */ 0xFF, 0x03, 0xFE, 0x22, 0x03, 0xFE, 0x4D, 0x05, 0x1B, 0xFF, 0xA0, 0x41, 0x03, 0x00, 0x42, 0x00, /* 00006900 */ 0xFF, 0x7D, 0x10, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x7D, 0x10, -/* 00006910 */ 0x01, 0x00, 0xFE, 0x0D, 0x08, 0xFE, 0x0D, 0x08, 0x03, 0x07, 0x15, 0x19, 0x09, 0x7A, 0x7A, 0x04, -/* 00006920 */ 0x08, 0x09, 0x08, 0x20, 0x20, 0x20, 0x20, 0x01, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x17, 0x18, +/* 00006910 */ 0x01, 0x00, 0xFE, 0x0D, 0x08, 0xFE, 0x0D, 0x08, 0x08, 0x03, 0x07, 0x15, 0x19, 0x09, 0x7A, 0x7A, +/* 00006920 */ 0x04, 0x08, 0x09, 0x20, 0x20, 0x20, 0x20, 0x01, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x17, 0x18, /* 00006930 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 00006940 */ 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0xB9, 0x03, 0x02, 0xFE, 0xC3, 0x02, 0x02, 0xFE, 0xF2, /* 00006950 */ 0x02, 0x02, 0xFE, 0xBA, 0x03, 0x02, 0xFE, 0x46, 0x03, 0x02, 0xFE, 0xAD, 0x03, 0x02, 0xFE, 0xB1, @@ -3157,11 +3157,11 @@ namespace Js /* 00006CC0 */ 0xFE, 0x5B, 0x03, 0xFE, 0xBB, 0x03, 0xFE, 0xC5, 0x01, 0x00, 0xFF, 0xB3, 0x10, 0x01, 0x00, 0x0A, /* 00006CD0 */ 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x2A, 0x00, 0x92, 0x00, 0x29, 0x00, 0x4C, 0x00, /* 00006CE0 */ 0x25, 0x00, 0x6C, 0x00, 0x2A, 0x00, 0x92, 0x00, 0x13, 0x01, 0xDE, 0x03, 0x28, 0x00, 0x3F, 0x00, -/* 00006CF0 */ 0x61, 0x00, 0x5B, 0x01, 0x3B, 0x00, 0x45, 0x00, 0x00, 0xFD, 0x6C, 0x00, 0x00, 0x3F, 0x7E, 0x1D, -/* 00006D00 */ 0x0A, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x66, 0x05, 0x60, 0xFF, 0xA2, 0x41, +/* 00006CF0 */ 0x61, 0x00, 0x5B, 0x01, 0x3B, 0x00, 0x45, 0x00, 0x00, 0xFD, 0x6C, 0x00, 0x00, 0xBF, 0xFC, 0x3A, +/* 00006D00 */ 0x04, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x66, 0x05, 0x60, 0xFF, 0xA2, 0x41, /* 00006D10 */ 0x11, 0x00, 0x43, 0x00, 0xFF, 0x31, 0x17, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 00006D20 */ 0xFF, 0x31, 0x17, 0x01, 0x00, 0xE9, 0xE9, 0x04, 0x05, 0x07, 0x05, 0x1A, 0x1A, 0x05, 0x02, 0x01, -/* 00006D30 */ 0x01, 0x05, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00006D20 */ 0xFF, 0x31, 0x17, 0x01, 0x00, 0xE9, 0xE9, 0x41, 0x04, 0x05, 0x07, 0x05, 0x1A, 0x1A, 0x05, 0x02, +/* 00006D30 */ 0x01, 0x01, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00006D40 */ 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00006D50 */ 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0xAD, 0x03, 0x02, 0xFE, 0x5C, 0x03, 0x04, 0x90, 0x8F, 0x01, /* 00006D60 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x98, 0x07, 0x07, 0x05, 0x00, 0x00, @@ -3174,10 +3174,10 @@ namespace Js /* 00006DD0 */ 0x04, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x98, 0x08, /* 00006DE0 */ 0x08, 0x05, 0x01, 0x00, 0x9D, 0x08, 0x07, 0x05, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, /* 00006DF0 */ 0x00, 0xFF, 0x60, 0x17, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x84, 0x00, 0x26, -/* 00006E00 */ 0x00, 0x35, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00006E00 */ 0x00, 0x35, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00006E10 */ 0xFE, 0x3E, 0x05, 0x39, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x41, 0x00, 0xFF, 0x61, 0x0D, 0x01, 0x00, /* 00006E20 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x61, 0x0D, 0x01, 0x00, 0xFE, 0x6B, 0x02, 0xFE, -/* 00006E30 */ 0x6B, 0x02, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, 0x03, 0x01, 0x09, 0x04, 0x04, 0x04, 0x04, +/* 00006E30 */ 0x6B, 0x02, 0x09, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, /* 00006E40 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, /* 00006E50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 00006E60 */ 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0xB8, 0x03, 0x02, 0xFE, 0xC3, 0x02, 0xAA, 0x5B, 0x05, @@ -3194,11 +3194,11 @@ namespace Js /* 00006F10 */ 0x03, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x31, 0x02, 0xFE, 0xFD, 0x01, /* 00006F20 */ 0xFE, 0x36, 0x02, 0xFE, 0x42, 0x02, 0x00, 0xFF, 0x88, 0x0D, 0x01, 0x00, 0x07, 0x05, 0x00, 0x00, /* 00006F30 */ 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x2A, 0x00, 0x8B, 0x00, 0x26, 0x00, 0x4C, 0x00, 0x15, 0x00, 0x6C, -/* 00006F40 */ 0x00, 0x2A, 0x00, 0x8B, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x07, 0xFF, +/* 00006F40 */ 0x00, 0x2A, 0x00, 0x8B, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x07, 0xFF, /* 00006F50 */ 0x01, 0xFE, 0x50, 0x03, 0xFE, 0x22, 0x05, 0x10, 0xFF, 0xA1, 0x41, 0x21, 0x00, 0x40, 0x00, 0xFF, /* 00006F60 */ 0xE3, 0x06, 0x01, 0x00, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0xE3, 0x06, 0x01, 0x00, -/* 00006F70 */ 0xFE, 0xCA, 0x03, 0xFE, 0xCA, 0x03, 0x0A, 0x09, 0x0D, 0x0A, 0x61, 0x60, 0x04, 0x04, 0x0C, 0x06, -/* 00006F80 */ 0x0B, 0x06, 0x06, 0x06, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00006F70 */ 0xFE, 0xCA, 0x03, 0xFE, 0xCA, 0x03, 0x0B, 0x0A, 0x09, 0x0D, 0x0A, 0x61, 0x60, 0x04, 0x04, 0x0C, +/* 00006F80 */ 0x06, 0x06, 0x06, 0x06, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00006F90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00006FA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0xB8, 0x03, 0x02, /* 00006FB0 */ 0xFE, 0xC3, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFE, 0xEB, @@ -3237,10 +3237,10 @@ namespace Js /* 000071C0 */ 0x00, 0xFF, 0x0E, 0x07, 0x01, 0x00, 0x0B, 0x07, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x39, 0x00, 0x2A, /* 000071D0 */ 0x00, 0x81, 0x00, 0x26, 0x00, 0x48, 0x00, 0x15, 0x00, 0x68, 0x00, 0x2A, 0x00, 0x83, 0x00, 0x0D, /* 000071E0 */ 0x00, 0x36, 0x00, 0x50, 0x00, 0x53, 0x00, 0x20, 0x00, 0x51, 0x00, 0x6D, 0x00, 0x85, 0x00, 0x5E, -/* 000071F0 */ 0x00, 0x52, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xC3, 0x02, 0xFE, 0x02, +/* 000071F0 */ 0x00, 0x52, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xC3, 0x02, 0xFE, 0x02, /* 00007200 */ 0x05, 0x10, 0xFF, 0xA1, 0x41, 0x21, 0x00, 0x3F, 0x00, 0xFF, 0x1B, 0x01, 0x01, 0x00, 0xFF, 0x00, /* 00007210 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFF, 0x1B, 0x01, 0x01, 0x00, 0xFE, 0x69, 0x05, 0xFE, 0x69, 0x05, -/* 00007220 */ 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x04, 0x04, 0x09, 0x09, 0x0B, 0x07, 0x06, 0x07, 0x07, 0xFF, +/* 00007220 */ 0x0B, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x04, 0x04, 0x09, 0x09, 0x07, 0x06, 0x07, 0x07, 0xFF, /* 00007230 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, /* 00007240 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, /* 00007250 */ 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, @@ -3280,10 +3280,10 @@ namespace Js /* 00007470 */ 0x00, 0x1B, 0x00, 0x09, 0x00, 0x2D, 0x00, 0x18, 0x00, 0x44, 0x00, 0x20, 0x00, 0x5B, 0x00, 0x26, /* 00007480 */ 0x00, 0x38, 0x00, 0x22, 0x00, 0x39, 0x00, 0x25, 0x00, 0xA1, 0x00, 0x26, 0x00, 0x49, 0x00, 0x0A, /* 00007490 */ 0x00, 0x3B, 0x00, 0x25, 0x00, 0x40, 0x00, 0x26, 0x00, 0x5B, 0x00, 0x23, 0x00, 0x51, 0x00, 0x42, -/* 000074A0 */ 0x00, 0x67, 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, +/* 000074A0 */ 0x00, 0x67, 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, /* 000074B0 */ 0x0F, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xF5, 0x04, 0x64, 0xFF, 0xA0, 0x41, 0x31, /* 000074C0 */ 0x00, 0x3E, 0x00, 0xFE, 0x21, 0xFE, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x21, 0xFE, -/* 000074D0 */ 0xFE, 0xBA, 0x02, 0xFE, 0xBA, 0x02, 0x0A, 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, +/* 000074D0 */ 0xFE, 0xBA, 0x02, 0xFE, 0xBA, 0x02, 0x0B, 0x0A, 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, /* 000074E0 */ 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 000074F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00007500 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x72, 0x03, @@ -3320,10 +3320,10 @@ namespace Js /* 000076F0 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x31, 0x02, 0xFE, 0xFB, 0x01, 0xFE, 0x26, 0x02, 0x00, 0xFE, /* 00007700 */ 0x40, 0xFE, 0x09, 0x07, 0x00, 0x00, 0x00, 0x23, 0x00, 0x50, 0x00, 0x2A, 0x00, 0x71, 0x00, 0x45, /* 00007710 */ 0x00, 0x54, 0x00, 0x44, 0x00, 0x3D, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x25, 0x00, 0x3B, 0x00, 0x56, -/* 00007720 */ 0x00, 0x77, 0x00, 0x69, 0x00, 0x5B, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x0F, 0xFF, 0x01, 0xFF, +/* 00007720 */ 0x00, 0x77, 0x00, 0x69, 0x00, 0x5B, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x0F, 0xFF, 0x01, 0xFF, /* 00007730 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xE8, 0x04, 0x64, 0xFF, 0xA0, 0x41, 0x31, 0x00, 0x3D, 0x00, 0xFE, /* 00007740 */ 0xF9, 0xFA, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xF9, 0xFA, 0xFE, 0xBA, 0x02, 0xFE, -/* 00007750 */ 0xBA, 0x02, 0x0A, 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, 0x0B, 0x03, 0x03, 0x03, +/* 00007750 */ 0xBA, 0x02, 0x0B, 0x0A, 0x0B, 0x10, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, 0x03, 0x03, 0x03, /* 00007760 */ 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00007770 */ 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00007780 */ 0xFF, 0x00, 0x00, 0x03, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x71, 0x03, 0x02, 0xFE, 0x5D, 0x03, @@ -3360,10 +3360,10 @@ namespace Js /* 00007970 */ 0x00, 0xFE, 0x31, 0x02, 0xFE, 0xFB, 0x01, 0xFE, 0x26, 0x02, 0x00, 0xFE, 0x18, 0xFB, 0x09, 0x07, /* 00007980 */ 0x00, 0x00, 0x00, 0x23, 0x00, 0x50, 0x00, 0x2A, 0x00, 0x71, 0x00, 0x45, 0x00, 0x54, 0x00, 0x44, /* 00007990 */ 0x00, 0x3D, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x25, 0x00, 0x3B, 0x00, 0x56, 0x00, 0x77, 0x00, 0x69, -/* 000079A0 */ 0x00, 0x5B, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x0F, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 000079A0 */ 0x00, 0x5B, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x0F, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 000079B0 */ 0xFE, 0xDB, 0x04, 0x60, 0xFF, 0xA0, 0x41, 0x31, 0x00, 0x3C, 0x00, 0xFE, 0xD7, 0xF7, 0xFF, 0x00, -/* 000079C0 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xD7, 0xF7, 0xFE, 0xB4, 0x02, 0xFE, 0xB4, 0x02, 0x0A, 0x0C, -/* 000079D0 */ 0x11, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, +/* 000079C0 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xD7, 0xF7, 0xFE, 0xB4, 0x02, 0xFE, 0xB4, 0x02, 0x0B, 0x0A, +/* 000079D0 */ 0x0C, 0x11, 0x0A, 0x5D, 0x5A, 0x03, 0x02, 0x0B, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, /* 000079E0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0xFF, 0xFF, /* 000079F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, /* 00007A00 */ 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x70, 0x03, 0x02, 0xFE, 0x5D, 0x03, 0x04, 0x02, 0xFE, 0xB7, @@ -3400,10 +3400,10 @@ namespace Js /* 00007BF0 */ 0x00, 0xFE, 0x31, 0x02, 0xFE, 0xFB, 0x01, 0xFE, 0x26, 0x02, 0x00, 0xFE, 0xF6, 0xF7, 0x09, 0x07, /* 00007C00 */ 0x00, 0x00, 0x00, 0x23, 0x00, 0x50, 0x00, 0x2A, 0x00, 0x6D, 0x00, 0x45, 0x00, 0x54, 0x00, 0x44, /* 00007C10 */ 0x00, 0x3D, 0x00, 0x06, 0x00, 0x3B, 0x00, 0x25, 0x00, 0x3B, 0x00, 0x56, 0x00, 0x75, 0x00, 0x69, -/* 00007C20 */ 0x00, 0x5B, 0x00, 0x00, 0x3F, 0x7E, 0x25, 0x8B, 0xA7, 0xFF, 0x01, 0xFE, 0x7D, 0x03, 0xFE, 0x58, +/* 00007C20 */ 0x00, 0x5B, 0x00, 0x00, 0xBF, 0xFC, 0x4A, 0x86, 0xA7, 0xFF, 0x01, 0xFE, 0x7D, 0x03, 0xFE, 0x58, /* 00007C30 */ 0x04, 0x0C, 0xFF, 0xB3, 0x41, 0x01, 0x00, 0x3B, 0x00, 0xFE, 0x61, 0xDB, 0xFF, 0x00, 0x10, 0x01, -/* 00007C40 */ 0x00, 0x04, 0x04, 0xFE, 0x61, 0xDB, 0xFE, 0x04, 0x1C, 0xFE, 0x04, 0x1C, 0x1C, 0x29, 0x41, 0x07, -/* 00007C50 */ 0xFE, 0xAA, 0x01, 0xFE, 0x8A, 0x01, 0x03, 0x01, 0x0C, 0x22, 0x0E, 0x45, 0x2B, 0x2B, 0x2B, 0x2B, +/* 00007C40 */ 0x00, 0x04, 0x04, 0xFE, 0x61, 0xDB, 0xFE, 0x04, 0x1C, 0xFE, 0x04, 0x1C, 0x45, 0x1C, 0x29, 0x41, +/* 00007C50 */ 0x07, 0xFE, 0xAA, 0x01, 0xFE, 0x8A, 0x01, 0x03, 0x01, 0x0C, 0x22, 0x0E, 0x2B, 0x2B, 0x2B, 0x2B, /* 00007C60 */ 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00007C70 */ 0xFF, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, /* 00007C80 */ 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x27, 0x03, 0x04, 0x02, 0xFE, 0xC3, 0x02, 0x08, 0x02, 0xFE, 0x7F, @@ -3555,10 +3555,10 @@ namespace Js /* 000085A0 */ 0x00, 0x04, 0x00, 0x38, 0x00, 0x07, 0x00, 0x5C, 0x00, 0x34, 0x00, 0xE3, 0x00, 0x28, 0x00, 0x48, /* 000085B0 */ 0x00, 0x01, 0x00, 0x4C, 0x00, 0x1B, 0x00, 0x7C, 0x01, 0x1D, 0x00, 0x7B, 0x00, 0x25, 0x00, 0x68, /* 000085C0 */ 0x00, 0x35, 0x00, 0x83, 0x00, 0x0E, 0x00, 0x40, 0x00, 0x0C, 0x00, 0x6F, 0x00, 0x06, 0x00, 0x40, -/* 000085D0 */ 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x47, 0xFF, 0x01, 0xFE, 0x7C, 0x03, 0xFE, 0x1E, 0x04, 0x0C, +/* 000085D0 */ 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x47, 0xFF, 0x01, 0xFE, 0x7C, 0x03, 0xFE, 0x1E, 0x04, 0x0C, /* 000085E0 */ 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x3A, 0x00, 0xFE, 0xEB, 0xCD, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, -/* 000085F0 */ 0x03, 0xFE, 0xEB, 0xCD, 0xFE, 0x66, 0x0D, 0xFE, 0x66, 0x0D, 0x07, 0x12, 0x16, 0x06, 0xC8, 0xBB, -/* 00008600 */ 0x03, 0x02, 0x10, 0x07, 0x01, 0x0A, 0x0A, 0x0A, 0x0A, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 000085F0 */ 0x03, 0xFE, 0xEB, 0xCD, 0xFE, 0x66, 0x0D, 0xFE, 0x66, 0x0D, 0x01, 0x07, 0x12, 0x16, 0x06, 0xC8, +/* 00008600 */ 0xBB, 0x03, 0x02, 0x10, 0x07, 0x0A, 0x0A, 0x0A, 0x0A, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00008610 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00008620 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0xA7, 0x03, 0x04, /* 00008630 */ 0x02, 0xFE, 0x8D, 0x03, 0x03, 0x02, 0xFE, 0xA8, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFE, @@ -3629,10 +3629,10 @@ namespace Js /* 00008A40 */ 0x91, 0x00, 0x2F, 0x00, 0x77, 0x00, 0x0E, 0x00, 0x41, 0x00, 0x2C, 0x00, 0x8E, 0x00, 0x0E, 0x00, /* 00008A50 */ 0x3F, 0x00, 0x2C, 0x00, 0x8A, 0x00, 0x0E, 0x00, 0x40, 0x00, 0x2C, 0x00, 0x8C, 0x00, 0x0E, 0x00, /* 00008A60 */ 0x42, 0x00, 0x2C, 0x00, 0x90, 0x00, 0x0E, 0x00, 0x42, 0x00, 0x2C, 0x00, 0x90, 0x00, 0x0E, 0x00, -/* 00008A70 */ 0x48, 0x00, 0x2C, 0x00, 0x8F, 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x07, +/* 00008A70 */ 0x48, 0x00, 0x2C, 0x00, 0x8F, 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x07, /* 00008A80 */ 0xFF, 0x01, 0xFE, 0x7B, 0x03, 0xFE, 0x0C, 0x04, 0x0C, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x39, 0x00, /* 00008A90 */ 0xFE, 0xF7, 0xC8, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xF7, 0xC8, 0xFE, 0x81, 0x04, -/* 00008AA0 */ 0xFE, 0x81, 0x04, 0x09, 0x11, 0x16, 0x07, 0x43, 0x40, 0x03, 0x05, 0x06, 0x06, 0x01, 0x01, 0x01, +/* 00008AA0 */ 0xFE, 0x81, 0x04, 0x01, 0x09, 0x11, 0x16, 0x07, 0x43, 0x40, 0x03, 0x05, 0x06, 0x06, 0x01, 0x01, /* 00008AB0 */ 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00008AC0 */ 0xFF, 0x15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00008AD0 */ 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x97, 0x03, 0x02, 0xFE, 0xA2, 0x03, 0x04, 0x03, 0x02, 0xFE, 0xA3, @@ -3662,10 +3662,10 @@ namespace Js /* 00008C50 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x02, 0x00, 0xFE, 0xAC, 0xC9, 0x0A, 0x00, 0x00, 0x00, /* 00008C60 */ 0x00, 0x49, 0x00, 0x90, 0x00, 0x08, 0x00, 0x2B, 0x00, 0x42, 0x00, 0x01, 0x01, 0x06, 0x00, 0x3C, /* 00008C70 */ 0x00, 0x08, 0x00, 0x6E, 0x00, 0x47, 0x00, 0x82, 0x00, 0x0E, 0x00, 0x33, 0x00, 0x44, 0x00, 0x8D, -/* 00008C80 */ 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0x7A, 0x03, +/* 00008C80 */ 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0x7A, 0x03, /* 00008C90 */ 0xFE, 0xFC, 0x03, 0x0C, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x38, 0x00, 0xFE, 0xBE, 0xC3, 0xFF, 0x00, -/* 00008CA0 */ 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xBE, 0xC3, 0xFE, 0x2B, 0x05, 0xFE, 0x2B, 0x05, 0x09, 0x14, -/* 00008CB0 */ 0x19, 0x07, 0x50, 0x4B, 0x03, 0x05, 0x06, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, +/* 00008CA0 */ 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xBE, 0xC3, 0xFE, 0x2B, 0x05, 0xFE, 0x2B, 0x05, 0x01, 0x09, +/* 00008CB0 */ 0x14, 0x19, 0x07, 0x50, 0x4B, 0x03, 0x05, 0x06, 0x06, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, /* 00008CC0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x18, 0xFF, 0xFF, 0xFF, /* 00008CD0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, /* 00008CE0 */ 0x97, 0x03, 0x02, 0xFE, 0x98, 0x03, 0x04, 0x03, 0x02, 0xFE, 0x99, 0x03, 0x02, 0xFE, 0x9A, 0x03, @@ -3698,10 +3698,10 @@ namespace Js /* 00008E90 */ 0x00, 0x14, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x02, 0x00, 0xFE, /* 00008EA0 */ 0x96, 0xC4, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x0D, 0x01, 0x08, 0x00, 0x2B, 0x00, 0x42, /* 00008EB0 */ 0x00, 0xF6, 0x00, 0x06, 0x00, 0x3C, 0x00, 0x16, 0x00, 0x48, 0x00, 0x52, 0x00, 0x86, 0x00, 0x08, -/* 00008EC0 */ 0x00, 0x31, 0x00, 0x60, 0x00, 0xC6, 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0x3F, 0x6E, 0x05, 0x0A, +/* 00008EC0 */ 0x00, 0x31, 0x00, 0x60, 0x00, 0xC6, 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0xBF, 0xDC, 0x0A, 0x04, /* 00008ED0 */ 0x00, 0xFF, 0x01, 0xFE, 0x79, 0x03, 0xFE, 0xF3, 0x03, 0x0C, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x37, /* 00008EE0 */ 0x00, 0xFE, 0x4E, 0xC2, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x4E, 0xC2, 0xEF, 0xEF, -/* 00008EF0 */ 0x03, 0x05, 0x07, 0x0E, 0x0B, 0x03, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00008EF0 */ 0x01, 0x03, 0x05, 0x07, 0x0E, 0x0B, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00008F00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00008F10 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x09, 0x03, 0x02, 0xFE, /* 00008F20 */ 0xB7, 0x02, 0x02, 0xFE, 0x5F, 0x03, 0x34, 0x2C, 0x07, 0x05, 0x14, 0x03, 0x00, 0x07, 0x02, 0x09, @@ -3709,7 +3709,7 @@ namespace Js /* 00008F40 */ 0x00, 0x07, 0x00, 0x00, 0x98, 0x07, 0x07, 0x05, 0x00, 0x00, 0x47, 0x00, 0x07, 0x0F, 0x03, 0x00, /* 00008F50 */ 0x07, 0x47, 0x00, 0x04, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x8A, /* 00008F60 */ 0xC2, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3C, 0x00, 0x06, 0x00, 0x31, 0x00, 0x21, 0x00, -/* 00008F70 */ 0x45, 0x00, 0x00, 0xBF, 0x7E, 0x31, 0x82, 0x07, 0xFF, 0x03, 0xFE, 0x78, 0x03, 0xFE, 0xB3, 0x03, +/* 00008F70 */ 0x45, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x84, 0x07, 0xFF, 0x03, 0xFE, 0x78, 0x03, 0xFE, 0xB3, 0x03, /* 00008F80 */ 0x0C, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x35, 0x00, 0xFE, 0x96, 0xB6, 0x01, 0xFF, 0x00, 0x10, 0x01, /* 00008F90 */ 0x00, 0x02, 0x02, 0xFE, 0x96, 0xB6, 0xFE, 0xC7, 0x09, 0xFE, 0xC7, 0x09, 0x02, 0x06, 0x17, 0x1B, /* 00008FA0 */ 0x05, 0xCC, 0xCA, 0x03, 0x0D, 0x02, 0x07, 0x05, 0x05, 0x05, 0x05, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, @@ -3797,10 +3797,10 @@ namespace Js /* 000094C0 */ 0x58, 0x00, 0x3A, 0x00, 0x60, 0x00, 0x14, 0x00, 0x39, 0x00, 0x37, 0x00, 0x7A, 0x00, 0x13, 0x00, /* 000094D0 */ 0x28, 0x00, 0x37, 0x00, 0x5C, 0x00, 0x13, 0x00, 0x31, 0x00, 0x14, 0x00, 0x41, 0x00, 0x3A, 0x00, /* 000094E0 */ 0x63, 0x00, 0x14, 0x00, 0x40, 0x00, 0x37, 0x00, 0x7D, 0x00, 0x44, 0x00, 0x42, 0x01, 0x72, 0x00, -/* 000094F0 */ 0x73, 0x00, 0x00, 0xF7, 0x94, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x0A, 0x00, 0xFF, 0x01, 0xFF, 0xFF, +/* 000094F0 */ 0x73, 0x00, 0x00, 0xF7, 0x94, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x00, 0xFF, 0x01, 0xFF, 0xFF, /* 00009500 */ 0xFF, 0xFF, 0xFF, 0xFE, 0xDD, 0x03, 0x55, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x36, 0x00, 0xFE, 0xEC, -/* 00009510 */ 0xBE, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xEC, 0xBE, 0xB0, 0xB0, 0x04, 0x03, 0x05, -/* 00009520 */ 0x05, 0x10, 0x10, 0x04, 0x01, 0x01, 0x04, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00009510 */ 0xBE, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xEC, 0xBE, 0xB0, 0xB0, 0x41, 0x04, 0x03, +/* 00009520 */ 0x05, 0x05, 0x10, 0x10, 0x04, 0x01, 0x01, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00009530 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 00009540 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x56, 0x8F, 0x01, 0x00, 0x00, 0x00, /* 00009550 */ 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x98, 0x05, 0x05, 0x03, 0x00, 0x00, 0x0F, 0x03, 0x00, @@ -3809,10 +3809,10 @@ namespace Js /* 00009580 */ 0x02, 0x00, 0x5C, 0x01, 0x06, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x03, /* 00009590 */ 0x00, 0x5C, 0x02, 0x06, 0x5C, 0x03, 0x03, 0xEE, 0x04, 0xFF, 0x05, 0x00, 0x00, 0xA8, 0x00, 0x24, /* 000095A0 */ 0x00, 0x00, 0x00, 0x00, 0xFE, 0x12, 0xBF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x2D, 0x00, -/* 000095B0 */ 0x3B, 0x00, 0x5C, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x27, 0xFF, 0x01, 0xFE, 0x77, 0x03, 0xFE, +/* 000095B0 */ 0x3B, 0x00, 0x5C, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x27, 0xFF, 0x01, 0xFE, 0x77, 0x03, 0xFE, /* 000095C0 */ 0x82, 0x03, 0x0C, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x34, 0x00, 0xFE, 0xDC, 0xAC, 0xFF, 0x00, 0x10, -/* 000095D0 */ 0x01, 0x00, 0x04, 0x04, 0xFE, 0xDC, 0xAC, 0xFE, 0x1F, 0x09, 0xFE, 0x1F, 0x09, 0x07, 0x15, 0x1A, -/* 000095E0 */ 0x05, 0x93, 0x8D, 0x03, 0x08, 0x03, 0x01, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, +/* 000095D0 */ 0x01, 0x00, 0x04, 0x04, 0xFE, 0xDC, 0xAC, 0xFE, 0x1F, 0x09, 0xFE, 0x1F, 0x09, 0x01, 0x07, 0x15, +/* 000095E0 */ 0x1A, 0x05, 0x93, 0x8D, 0x03, 0x08, 0x03, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, /* 000095F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, /* 00009600 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0x08, /* 00009610 */ 0x02, 0xFE, 0x7E, 0x03, 0x02, 0xFE, 0x7F, 0x03, 0x09, 0x02, 0xFE, 0x80, 0x03, 0x02, 0xFE, 0x81, @@ -3880,7 +3880,7 @@ namespace Js /* 000099F0 */ 0x3A, 0x00, 0x10, 0x00, 0x46, 0x00, 0x2A, 0x00, 0x79, 0x00, 0x03, 0x00, 0x3C, 0x00, 0x17, 0x00, /* 00009A00 */ 0x58, 0x00, 0x40, 0x00, 0xCF, 0x00, 0x40, 0x00, 0xD0, 0x00, 0x40, 0x00, 0xDD, 0x00, 0x17, 0x00, /* 00009A10 */ 0x58, 0x00, 0x40, 0x00, 0xCF, 0x00, 0x40, 0x00, 0xD1, 0x00, 0x40, 0x00, 0xE0, 0x00, 0x08, 0x00, -/* 00009A20 */ 0x1D, 0x00, 0x00, 0xBF, 0x7E, 0x31, 0x82, 0xA7, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, +/* 00009A20 */ 0x1D, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x84, 0xA7, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, /* 00009A30 */ 0x90, 0x02, 0x18, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x2B, 0x00, 0xFE, 0x40, 0x7A, 0x06, 0xFF, 0x00, /* 00009A40 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x40, 0x7A, 0xFE, 0xA1, 0x31, 0xFE, 0xA1, 0x31, 0x01, 0x0D, /* 00009A50 */ 0x22, 0x28, 0x09, 0xA6, 0xA6, 0x01, 0x0C, 0x01, 0x09, 0x07, 0x07, 0x07, 0x07, 0x05, 0x02, 0x25, @@ -3969,11 +3969,11 @@ namespace Js /* 00009F80 */ 0x54, 0x00, 0x54, 0x00, 0x9D, 0x00, 0x37, 0x00, 0x23, 0x01, 0x61, 0x00, 0x9A, 0x00, 0x3E, 0x00, /* 00009F90 */ 0x49, 0x00, 0x5C, 0x00, 0xA0, 0x00, 0x66, 0x00, 0xD8, 0x04, 0x7E, 0x00, 0x25, 0x03, 0x0F, 0x00, /* 00009FA0 */ 0x88, 0x00, 0x07, 0x00, 0x17, 0x00, 0x00, 0xE1, 0xA9, 0x00, 0x00, 0x14, 0xA8, 0x00, 0x00, 0x62, -/* 00009FB0 */ 0xA5, 0x00, 0x00, 0x9E, 0xA3, 0x00, 0x00, 0xFF, 0xA0, 0x00, 0x00, 0xBF, 0x9F, 0x00, 0x00, 0x3F, -/* 00009FC0 */ 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x69, 0x03, 0x39, 0xFF, +/* 00009FB0 */ 0xA5, 0x00, 0x00, 0x9E, 0xA3, 0x00, 0x00, 0xFF, 0xA0, 0x00, 0x00, 0xBF, 0x9F, 0x00, 0x00, 0xBF, +/* 00009FC0 */ 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x69, 0x03, 0x39, 0xFF, /* 00009FD0 */ 0xA0, 0x41, 0x11, 0x00, 0x32, 0x00, 0xFE, 0x8F, 0xA8, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, -/* 00009FE0 */ 0xFE, 0x8F, 0xA8, 0xFE, 0x61, 0x02, 0xFE, 0x61, 0x02, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, 0x04, -/* 00009FF0 */ 0x03, 0x01, 0x09, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 00009FE0 */ 0xFE, 0x8F, 0xA8, 0xFE, 0x61, 0x02, 0xFE, 0x61, 0x02, 0x09, 0x05, 0x05, 0x08, 0x04, 0x25, 0x24, +/* 00009FF0 */ 0x04, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A000 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A010 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x59, 0x03, /* 0000A020 */ 0x02, 0xFE, 0xC2, 0x02, 0xAA, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x2C, 0x08, 0x05, 0x15, 0x03, 0x00, @@ -3990,10 +3990,10 @@ namespace Js /* 0000A0D0 */ 0x00, 0xFE, 0x31, 0x02, 0xFE, 0xFD, 0x01, 0xFE, 0x35, 0x02, 0xFE, 0x42, 0x02, 0x00, 0xFE, 0xB6, /* 0000A0E0 */ 0xA8, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x2A, 0x00, 0x87, 0x00, 0x26, 0x00, /* 0000A0F0 */ 0x4C, 0x00, 0x15, 0x00, 0x6A, 0x00, 0x2A, 0x00, 0x87, 0x00, 0x09, 0x00, 0x38, 0x00, 0x00, 0xBF, -/* 0000A100 */ 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x03, 0xFE, 0x22, 0x03, 0xFE, 0x53, 0x03, 0x1B, 0xFF, 0xA0, 0x41, +/* 0000A100 */ 0xFD, 0x22, 0x84, 0x07, 0xFF, 0x03, 0xFE, 0x22, 0x03, 0xFE, 0x53, 0x03, 0x1B, 0xFF, 0xA0, 0x41, /* 0000A110 */ 0x03, 0x00, 0x30, 0x00, 0xFE, 0xA2, 0xA3, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, -/* 0000A120 */ 0xA2, 0xA3, 0xFE, 0x1A, 0x04, 0xFE, 0x1A, 0x04, 0x02, 0x06, 0x07, 0x0B, 0x05, 0x40, 0x40, 0x04, -/* 0000A130 */ 0x06, 0x07, 0x08, 0x03, 0x03, 0x03, 0x03, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, +/* 0000A120 */ 0xA2, 0xA3, 0xFE, 0x1A, 0x04, 0xFE, 0x1A, 0x04, 0x08, 0x02, 0x06, 0x07, 0x0B, 0x05, 0x40, 0x40, +/* 0000A130 */ 0x04, 0x06, 0x07, 0x03, 0x03, 0x03, 0x03, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, /* 0000A140 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, /* 0000A150 */ 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x5A, 0x03, 0x02, 0xFE, 0xC2, 0x02, 0x03, 0x04, 0xFE, 0x48, /* 0000A160 */ 0x01, 0x5B, 0x07, 0xB4, 0x07, 0x07, 0x2C, 0x0B, 0x07, 0x15, 0x03, 0x00, 0x0B, 0x02, 0x09, 0x2A, @@ -4020,10 +4020,10 @@ namespace Js /* 0000A2B0 */ 0x01, 0xFE, 0x35, 0x02, 0xFE, 0x5B, 0x03, 0xFE, 0xE7, 0x01, 0x00, 0xFE, 0xD8, 0xA3, 0x09, 0x05, /* 0000A2C0 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x2A, 0x00, 0x8E, 0x00, 0x29, 0x00, 0x4C, 0x00, 0x25, /* 0000A2D0 */ 0x00, 0x6A, 0x00, 0x2A, 0x00, 0x90, 0x00, 0x28, 0x00, 0x49, 0x00, 0x3F, 0x00, 0x4A, 0x01, 0x2D, -/* 0000A2E0 */ 0x00, 0x3F, 0x00, 0x00, 0xE8, 0xA2, 0x00, 0x00, 0x3F, 0x6E, 0x0D, 0x0A, 0x00, 0xFF, 0x01, 0xFF, +/* 0000A2E0 */ 0x00, 0x3F, 0x00, 0x00, 0xE8, 0xA2, 0x00, 0x00, 0xBF, 0xDC, 0x1A, 0x04, 0x00, 0xFF, 0x01, 0xFF, /* 0000A2F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x5E, 0x03, 0x48, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x31, 0x00, 0xFE, -/* 0000A300 */ 0x62, 0xA6, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x62, 0xA6, 0xFC, 0xFC, 0x05, 0x04, -/* 0000A310 */ 0x06, 0x0D, 0x0D, 0x05, 0x01, 0x01, 0x02, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000A300 */ 0x62, 0xA6, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x62, 0xA6, 0xFC, 0xFC, 0x41, 0x05, +/* 0000A310 */ 0x04, 0x06, 0x0D, 0x0D, 0x05, 0x01, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A320 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A330 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x5C, 0x03, 0x02, 0xFE, 0x09, /* 0000A340 */ 0x03, 0x48, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x2F, 0x07, @@ -4031,10 +4031,10 @@ namespace Js /* 0000A360 */ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, /* 0000A370 */ 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x2F, 0x08, 0x02, 0x04, 0x98, 0x07, 0x07, 0x08, 0x00, 0x00, /* 0000A380 */ 0x9D, 0x07, 0x06, 0x04, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x93, 0xA6, -/* 0000A390 */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x5B, 0x00, 0x2A, 0x00, 0x6F, 0x00, 0x00, 0x3F, 0x7E, -/* 0000A3A0 */ 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0x50, 0x03, 0xFE, 0x37, 0x03, 0x10, 0xFF, 0xA3, 0x41, 0x01, +/* 0000A390 */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x5B, 0x00, 0x2A, 0x00, 0x6F, 0x00, 0x00, 0xBF, 0xFC, +/* 0000A3A0 */ 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0x50, 0x03, 0xFE, 0x37, 0x03, 0x10, 0xFF, 0xA3, 0x41, 0x01, /* 0000A3B0 */ 0x00, 0x2F, 0x00, 0xFE, 0xAA, 0x9C, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xAA, 0x9C, -/* 0000A3C0 */ 0xFE, 0xF1, 0x02, 0xFE, 0xF1, 0x02, 0x08, 0x07, 0x0B, 0x07, 0x3D, 0x39, 0x04, 0x06, 0x03, 0x09, +/* 0000A3C0 */ 0xFE, 0xF1, 0x02, 0xFE, 0xF1, 0x02, 0x09, 0x08, 0x07, 0x0B, 0x07, 0x3D, 0x39, 0x04, 0x06, 0x03, /* 0000A3D0 */ 0x05, 0x05, 0x05, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A3E0 */ 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A3F0 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x59, 0x03, 0x02, 0xFE, 0xC2, @@ -4060,10 +4060,10 @@ namespace Js /* 0000A530 */ 0xFE, 0x31, 0x02, 0xFE, 0xFD, 0x01, 0xFE, 0x35, 0x02, 0xFE, 0xF7, 0x01, 0x00, 0xFE, 0xD4, 0x9C, /* 0000A540 */ 0x08, 0x05, 0x00, 0x00, 0x00, 0x26, 0x00, 0x31, 0x00, 0x0B, 0x00, 0x39, 0x00, 0x2A, 0x00, 0x7F, /* 0000A550 */ 0x00, 0x26, 0x00, 0x48, 0x00, 0x15, 0x00, 0x66, 0x00, 0x2A, 0x00, 0xD8, 0x00, 0x5A, 0x00, 0x57, -/* 0000A560 */ 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xC2, 0x02, 0xFE, 0x15, 0x03, 0x10, +/* 0000A560 */ 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xC2, 0x02, 0xFE, 0x15, 0x03, 0x10, /* 0000A570 */ 0xFF, 0xA1, 0x41, 0x21, 0x00, 0x2E, 0x00, 0xFE, 0xEB, 0x96, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, -/* 0000A580 */ 0x01, 0xFE, 0xEB, 0x96, 0xFE, 0x64, 0x05, 0xFE, 0x64, 0x05, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, -/* 0000A590 */ 0x04, 0x04, 0x09, 0x09, 0x0B, 0x07, 0x06, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000A580 */ 0x01, 0xFE, 0xEB, 0x96, 0xFE, 0x64, 0x05, 0xFE, 0x64, 0x05, 0x0B, 0x0A, 0x08, 0x0F, 0x05, 0x67, +/* 0000A590 */ 0x5E, 0x04, 0x04, 0x09, 0x09, 0x07, 0x06, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A5A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A5B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, /* 0000A5C0 */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x04, 0x02, 0xFE, 0xC2, 0x02, 0xFE, @@ -4103,10 +4103,10 @@ namespace Js /* 0000A7E0 */ 0x00, 0x44, 0x00, 0x20, 0x00, 0x59, 0x00, 0x26, 0x00, 0x3A, 0x00, 0x22, 0x00, 0x39, 0x00, 0x25, /* 0000A7F0 */ 0x00, 0x9F, 0x00, 0x26, 0x00, 0x49, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x25, 0x00, 0x40, 0x00, 0x26, /* 0000A800 */ 0x00, 0x5B, 0x00, 0x23, 0x00, 0x4F, 0x00, 0x42, 0x00, 0x66, 0x00, 0x0B, 0x00, 0x3F, 0x00, 0x08, -/* 0000A810 */ 0x00, 0x1D, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x0F, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000A810 */ 0x00, 0x1D, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x0F, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000A820 */ 0xFE, 0x07, 0x03, 0x62, 0xFF, 0xA0, 0x41, 0x31, 0x00, 0x2D, 0x00, 0xFE, 0x36, 0x94, 0xFF, 0x00, -/* 0000A830 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x36, 0x94, 0xFE, 0x73, 0x02, 0xFE, 0x73, 0x02, 0x09, 0x09, -/* 0000A840 */ 0x0E, 0x07, 0x40, 0x3C, 0x03, 0x02, 0x06, 0x06, 0x0B, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, +/* 0000A830 */ 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x36, 0x94, 0xFE, 0x73, 0x02, 0xFE, 0x73, 0x02, 0x0B, 0x09, +/* 0000A840 */ 0x09, 0x0E, 0x07, 0x40, 0x3C, 0x03, 0x02, 0x06, 0x06, 0x03, 0x03, 0x03, 0x03, 0x01, 0xFF, 0xFF, /* 0000A850 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, /* 0000A860 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, /* 0000A870 */ 0x02, 0xFE, 0x05, 0x03, 0x02, 0xFE, 0x43, 0x03, 0x02, 0xFE, 0x42, 0x03, 0x04, 0x01, 0x00, 0x00, @@ -4132,10 +4132,10 @@ namespace Js /* 0000A9B0 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x31, 0x02, 0xFE, 0x26, 0x02, 0xFE, 0xF7, 0x01, 0x00, /* 0000A9C0 */ 0xFE, 0x59, 0x94, 0x07, 0x07, 0x00, 0x00, 0x00, 0x23, 0x00, 0x58, 0x00, 0x2A, 0x00, 0x7B, 0x00, /* 0000A9D0 */ 0x25, 0x00, 0x3F, 0x00, 0x2F, 0x00, 0x58, 0x00, 0x26, 0x00, 0x8F, 0x00, 0x5A, 0x00, 0x56, 0x00, -/* 0000A9E0 */ 0x00, 0x3F, 0x7E, 0x21, 0x8B, 0x87, 0xFF, 0x01, 0xFE, 0x52, 0x03, 0xFE, 0x94, 0x02, 0x0C, 0xFF, +/* 0000A9E0 */ 0x00, 0xBF, 0xFC, 0x42, 0x86, 0x87, 0xFF, 0x01, 0xFE, 0x52, 0x03, 0xFE, 0x94, 0x02, 0x0C, 0xFF, /* 0000A9F0 */ 0xB3, 0x41, 0x01, 0x00, 0x2C, 0x00, 0xFE, 0x9C, 0x7A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, -/* 0000AA00 */ 0xFE, 0x9C, 0x7A, 0xFE, 0x34, 0x19, 0xFE, 0x34, 0x19, 0x18, 0x23, 0x37, 0x07, 0xFE, 0x83, 0x01, -/* 0000AA10 */ 0xFE, 0x5E, 0x01, 0x03, 0x04, 0x22, 0x10, 0x45, 0x1E, 0x1E, 0x1E, 0x1E, 0x01, 0xFF, 0xFF, 0xFF, +/* 0000AA00 */ 0xFE, 0x9C, 0x7A, 0xFE, 0x34, 0x19, 0xFE, 0x34, 0x19, 0x45, 0x18, 0x23, 0x37, 0x07, 0xFE, 0x83, +/* 0000AA10 */ 0x01, 0xFE, 0x5E, 0x01, 0x03, 0x04, 0x22, 0x10, 0x1E, 0x1E, 0x1E, 0x1E, 0x01, 0xFF, 0xFF, 0xFF, /* 0000AA20 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x36, 0xFF, 0xFF, 0xFF, /* 0000AA30 */ 0xFF, 0xFF, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, /* 0000AA40 */ 0x27, 0x03, 0x04, 0x02, 0xFE, 0xC2, 0x02, 0x08, 0x02, 0xFE, 0x09, 0x03, 0x03, 0x02, 0xFE, 0x16, @@ -4273,7 +4273,7 @@ namespace Js /* 0000B280 */ 0x00, 0x04, 0x00, 0x4D, 0x00, 0x04, 0x00, 0x4F, 0x00, 0x04, 0x00, 0x51, 0x00, 0x0A, 0x00, 0x43, /* 0000B290 */ 0x00, 0x04, 0x00, 0x59, 0x00, 0x04, 0x00, 0x68, 0x00, 0x04, 0x00, 0x41, 0x00, 0x07, 0x00, 0xAD, /* 0000B2A0 */ 0x00, 0x25, 0x00, 0x4E, 0x00, 0x01, 0x00, 0x21, 0x00, 0x1B, 0x00, 0x6F, 0x01, 0x1D, 0x00, 0x4D, -/* 0000B2B0 */ 0x00, 0x35, 0x00, 0x7F, 0x00, 0x06, 0x00, 0x3C, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x82, 0xA7, 0xFF, +/* 0000B2B0 */ 0x00, 0x35, 0x00, 0x7F, 0x00, 0x06, 0x00, 0x3C, 0x00, 0x00, 0x3F, 0xFC, 0x22, 0x84, 0xA7, 0xFF, /* 0000B2C0 */ 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xAB, 0x01, 0x14, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x23, /* 0000B2D0 */ 0x00, 0xFE, 0xA2, 0x49, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0xA2, 0x49, 0xFE, /* 0000B2E0 */ 0x43, 0x30, 0xFE, 0x43, 0x30, 0x0B, 0x17, 0x1B, 0x09, 0x99, 0x99, 0x01, 0x0C, 0x09, 0x07, 0x07, @@ -4357,10 +4357,10 @@ namespace Js /* 0000B7C0 */ 0x00, 0x3E, 0x00, 0x47, 0x00, 0x5C, 0x00, 0x98, 0x00, 0x66, 0x00, 0xBD, 0x05, 0x7E, 0x00, 0x12, /* 0000B7D0 */ 0x03, 0x0F, 0x00, 0x80, 0x00, 0x07, 0x00, 0x17, 0x00, 0x00, 0xE0, 0xC1, 0x00, 0x00, 0xBF, 0xBF, /* 0000B7E0 */ 0x00, 0x00, 0x0D, 0xBD, 0x00, 0x00, 0x23, 0xBB, 0x00, 0x00, 0x32, 0xB9, 0x00, 0x00, 0xF2, 0xB7, -/* 0000B7F0 */ 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7A, +/* 0000B7F0 */ 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x7A, /* 0000B800 */ 0x02, 0x3A, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x2A, 0x00, 0xFE, 0xAC, 0x76, 0xFF, 0x00, 0x10, 0x01, -/* 0000B810 */ 0x00, 0x01, 0x01, 0xFE, 0xAC, 0x76, 0xFE, 0x50, 0x02, 0xFE, 0x50, 0x02, 0x05, 0x05, 0x08, 0x04, -/* 0000B820 */ 0x25, 0x24, 0x03, 0x03, 0x01, 0x09, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000B810 */ 0x00, 0x01, 0x01, 0xFE, 0xAC, 0x76, 0xFE, 0x50, 0x02, 0xFE, 0x50, 0x02, 0x09, 0x05, 0x05, 0x08, +/* 0000B820 */ 0x04, 0x25, 0x24, 0x03, 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000B830 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000B840 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, /* 0000B850 */ 0xFE, 0x40, 0x03, 0x02, 0xFE, 0xBE, 0x02, 0xAA, 0x5B, 0x05, 0xB4, 0x05, 0x05, 0x2C, 0x08, 0x05, @@ -4377,10 +4377,10 @@ namespace Js /* 0000B900 */ 0x24, 0x00, 0x00, 0x00, 0xFE, 0x31, 0x02, 0xFE, 0xFD, 0x01, 0xFE, 0x40, 0x02, 0xFE, 0x41, 0x02, /* 0000B910 */ 0x00, 0xFE, 0xD3, 0x76, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x2A, 0x00, 0x80, /* 0000B920 */ 0x00, 0x26, 0x00, 0x4C, 0x00, 0x15, 0x00, 0x66, 0x00, 0x2A, 0x00, 0x80, 0x00, 0x09, 0x00, 0x39, -/* 0000B930 */ 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x27, 0xFF, 0x01, 0xFE, 0x22, 0x03, 0xFE, 0x64, 0x02, 0x1B, +/* 0000B930 */ 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x27, 0xFF, 0x01, 0xFE, 0x22, 0x03, 0xFE, 0x64, 0x02, 0x1B, /* 0000B940 */ 0xFF, 0xA0, 0x41, 0x03, 0x00, 0x29, 0x00, 0xFE, 0xD8, 0x70, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, -/* 0000B950 */ 0x01, 0xFE, 0xD8, 0x70, 0xFE, 0x03, 0x05, 0xFE, 0x03, 0x05, 0x05, 0x0D, 0x10, 0x04, 0x33, 0x32, -/* 0000B960 */ 0x03, 0x03, 0x01, 0x09, 0x11, 0x11, 0x11, 0x11, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000B950 */ 0x01, 0xFE, 0xD8, 0x70, 0xFE, 0x03, 0x05, 0xFE, 0x03, 0x05, 0x09, 0x05, 0x0D, 0x10, 0x04, 0x33, +/* 0000B960 */ 0x32, 0x03, 0x03, 0x01, 0x11, 0x11, 0x11, 0x11, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000B970 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000B980 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, /* 0000B990 */ 0x41, 0x03, 0x02, 0xFE, 0xBE, 0x02, 0x02, 0xFE, 0xF2, 0x02, 0x02, 0xFE, 0x28, 0x03, 0x02, 0xFE, @@ -4408,10 +4408,10 @@ namespace Js /* 0000BAF0 */ 0x3F, 0x02, 0xFE, 0x3A, 0x03, 0xFE, 0x3E, 0x02, 0xFE, 0xEB, 0x01, 0xFE, 0x3D, 0x02, 0xFE, 0x31, /* 0000BB00 */ 0x03, 0x00, 0xFE, 0x0E, 0x71, 0x07, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x3D, 0x00, 0x2A, 0x00, /* 0000BB10 */ 0x86, 0x00, 0x26, 0x00, 0x4C, 0x00, 0x15, 0x00, 0x66, 0x00, 0x2A, 0x00, 0x88, 0x00, 0x4A, 0x00, -/* 0000BB20 */ 0xCF, 0x02, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0x23, 0x03, 0xFE, 0x4C, 0x02, +/* 0000BB20 */ 0xCF, 0x02, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0x23, 0x03, 0xFE, 0x4C, 0x02, /* 0000BB30 */ 0x10, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x28, 0x00, 0xFE, 0x63, 0x6B, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000BB40 */ 0x03, 0x03, 0xFE, 0x63, 0x6B, 0xFE, 0x01, 0x03, 0xFE, 0x01, 0x03, 0x09, 0x06, 0x0B, 0x0B, 0x44, -/* 0000BB50 */ 0x41, 0x03, 0x07, 0x03, 0x09, 0x08, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000BB40 */ 0x03, 0x03, 0xFE, 0x63, 0x6B, 0xFE, 0x01, 0x03, 0xFE, 0x01, 0x03, 0x09, 0x09, 0x06, 0x0B, 0x0B, +/* 0000BB50 */ 0x44, 0x41, 0x03, 0x07, 0x03, 0x08, 0x08, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000BB60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000BB70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, /* 0000BB80 */ 0x40, 0x03, 0x02, 0xFE, 0xBE, 0x02, 0x04, 0xFE, 0x3F, 0x01, 0x5B, 0x08, 0xB4, 0x08, 0x08, 0x2C, @@ -4438,10 +4438,10 @@ namespace Js /* 0000BCD0 */ 0x01, 0xFE, 0x40, 0x02, 0xFE, 0xF2, 0x01, 0xFE, 0x39, 0x02, 0xFE, 0x3B, 0x02, 0xFE, 0x3C, 0x02, /* 0000BCE0 */ 0xFE, 0x3E, 0x02, 0x00, 0xFE, 0x91, 0x6B, 0x09, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x39, 0x00, /* 0000BCF0 */ 0x2A, 0x00, 0x78, 0x00, 0x26, 0x00, 0x48, 0x00, 0x15, 0x00, 0x62, 0x00, 0x2A, 0x00, 0x78, 0x00, -/* 0000BD00 */ 0x1E, 0x00, 0x24, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x62, 0x00, 0xB5, 0x00, 0x00, 0x3F, 0x7E, 0x15, -/* 0000BD10 */ 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xBE, 0x02, 0xFE, 0x28, 0x02, 0x10, 0xFF, 0xA1, 0x41, 0x21, 0x00, +/* 0000BD00 */ 0x1E, 0x00, 0x24, 0x00, 0x1E, 0x00, 0x26, 0x00, 0x62, 0x00, 0xB5, 0x00, 0x00, 0xBF, 0xFC, 0x2A, +/* 0000BD10 */ 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xBE, 0x02, 0xFE, 0x28, 0x02, 0x10, 0xFF, 0xA1, 0x41, 0x21, 0x00, /* 0000BD20 */ 0x27, 0x00, 0xFE, 0x3A, 0x65, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x3A, 0x65, 0xFE, -/* 0000BD30 */ 0x84, 0x05, 0xFE, 0x84, 0x05, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x03, 0x04, 0x09, 0x09, 0x0B, +/* 0000BD30 */ 0x84, 0x05, 0xFE, 0x84, 0x05, 0x0B, 0x0A, 0x08, 0x0F, 0x05, 0x67, 0x5E, 0x03, 0x04, 0x09, 0x09, /* 0000BD40 */ 0x07, 0x06, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000BD50 */ 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000BD60 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, @@ -4481,11 +4481,11 @@ namespace Js /* 0000BF80 */ 0x2D, 0x00, 0x0D, 0x00, 0x1B, 0x00, 0x09, 0x00, 0x2F, 0x00, 0x18, 0x00, 0x44, 0x00, 0x20, 0x00, /* 0000BF90 */ 0x55, 0x00, 0x26, 0x00, 0x38, 0x00, 0x22, 0x00, 0x39, 0x00, 0x25, 0x00, 0x9B, 0x00, 0x26, 0x00, /* 0000BFA0 */ 0x49, 0x00, 0x0A, 0x00, 0x3B, 0x00, 0x25, 0x00, 0x40, 0x00, 0x26, 0x00, 0x5B, 0x00, 0x23, 0x00, -/* 0000BFB0 */ 0x79, 0x00, 0x42, 0x00, 0x69, 0x00, 0x0B, 0x00, 0x40, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0x3F, -/* 0000BFC0 */ 0x7E, 0x15, 0x8A, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x16, 0x02, 0x61, 0xFF, +/* 0000BFB0 */ 0x79, 0x00, 0x42, 0x00, 0x69, 0x00, 0x0B, 0x00, 0x40, 0x00, 0x08, 0x00, 0x1D, 0x00, 0x00, 0xBF, +/* 0000BFC0 */ 0xFC, 0x2A, 0x84, 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x16, 0x02, 0x61, 0xFF, /* 0000BFD0 */ 0xA0, 0x41, 0x31, 0x00, 0x26, 0x00, 0xFE, 0x19, 0x61, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, -/* 0000BFE0 */ 0xFE, 0x19, 0x61, 0xFE, 0xDD, 0x03, 0xFE, 0xDD, 0x03, 0x0A, 0x08, 0x0E, 0x0B, 0x4F, 0x4B, 0x02, -/* 0000BFF0 */ 0x03, 0x08, 0x05, 0x0B, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000BFE0 */ 0xFE, 0x19, 0x61, 0xFE, 0xDD, 0x03, 0xFE, 0xDD, 0x03, 0x0B, 0x0A, 0x08, 0x0E, 0x0B, 0x4F, 0x4B, +/* 0000BFF0 */ 0x02, 0x03, 0x08, 0x05, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000C000 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000C010 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, /* 0000C020 */ 0xFE, 0x1D, 0x03, 0x04, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x66, @@ -4516,10 +4516,10 @@ namespace Js /* 0000C1B0 */ 0x3C, 0x61, 0x0B, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x2E, 0x00, 0x12, 0x00, 0x44, 0x00, 0x28, /* 0000C1C0 */ 0x00, 0x77, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x20, 0x00, 0xF1, 0x00, 0x1E, 0x00, 0x31, 0x00, 0x1E, /* 0000C1D0 */ 0x00, 0x2E, 0x00, 0x23, 0x00, 0x46, 0x00, 0x2F, 0x00, 0x52, 0x00, 0x62, 0x00, 0xBA, 0x00, 0x00, -/* 0000C1E0 */ 0xBF, 0x7E, 0x25, 0x8B, 0x87, 0xFF, 0x03, 0xFE, 0x26, 0x03, 0xFE, 0xAF, 0x01, 0x0C, 0xFF, 0xB3, +/* 0000C1E0 */ 0xBF, 0xFD, 0x4A, 0x86, 0x87, 0xFF, 0x03, 0xFE, 0x26, 0x03, 0xFE, 0xAF, 0x01, 0x0C, 0xFF, 0xB3, /* 0000C1F0 */ 0x41, 0x01, 0x00, 0x24, 0x00, 0xFE, 0xFE, 0x49, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, -/* 0000C200 */ 0xFE, 0xFE, 0x49, 0xFE, 0xB6, 0x16, 0xFE, 0xB6, 0x16, 0x03, 0x15, 0x24, 0x35, 0x08, 0xFE, 0x0B, -/* 0000C210 */ 0x01, 0xFA, 0x02, 0x02, 0x05, 0x12, 0x0F, 0x44, 0x14, 0x14, 0x14, 0x14, 0x01, 0x32, 0xFF, 0xFF, +/* 0000C200 */ 0xFE, 0xFE, 0x49, 0xFE, 0xB6, 0x16, 0xFE, 0xB6, 0x16, 0x44, 0x03, 0x15, 0x24, 0x35, 0x08, 0xFE, +/* 0000C210 */ 0x0B, 0x01, 0xFA, 0x02, 0x02, 0x05, 0x12, 0x0F, 0x14, 0x14, 0x14, 0x14, 0x01, 0x32, 0xFF, 0xFF, /* 0000C220 */ 0xFF, 0xFF, 0xFF, 0x33, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x35, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000C230 */ 0x00, 0x00, 0x02, 0xFE, 0x0E, 0x03, 0x02, 0xFE, 0x27, 0x03, 0x04, 0x02, 0xFE, 0xBE, 0x02, 0x08, /* 0000C240 */ 0x02, 0xFE, 0x09, 0x03, 0x03, 0x02, 0xFE, 0x16, 0x03, 0x02, 0xFE, 0x04, 0x03, 0x02, 0xFE, 0xFB, @@ -4620,10 +4620,10 @@ namespace Js /* 0000C830 */ 0x00, 0x1B, 0x00, 0x06, 0x00, 0x56, 0x00, 0x04, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x4E, 0x00, 0x04, /* 0000C840 */ 0x00, 0x49, 0x00, 0x04, 0x00, 0x2B, 0x00, 0x04, 0x00, 0x37, 0x00, 0x04, 0x00, 0x43, 0x00, 0x0C, /* 0000C850 */ 0x00, 0x33, 0x00, 0x0C, 0x00, 0x2F, 0x00, 0x0C, 0x00, 0x33, 0x00, 0x06, 0x00, 0x34, 0x00, 0x00, -/* 0000C860 */ 0x64, 0xC8, 0x00, 0x00, 0x3F, 0x7E, 0x35, 0x8A, 0x67, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000C860 */ 0x64, 0xC8, 0x00, 0x00, 0xBF, 0xFC, 0x6A, 0x84, 0x67, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000C870 */ 0xFE, 0xD1, 0x01, 0x57, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x25, 0x00, 0xFE, 0xE3, 0x51, 0xFF, 0x00, -/* 0000C880 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xE3, 0x51, 0xFE, 0xDB, 0x04, 0xFE, 0xDB, 0x04, 0x09, 0x15, -/* 0000C890 */ 0x1A, 0x0B, 0x5E, 0x59, 0x03, 0x03, 0x05, 0x01, 0x08, 0x41, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, +/* 0000C880 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xE3, 0x51, 0xFE, 0xDB, 0x04, 0xFE, 0xDB, 0x04, 0x41, 0x09, +/* 0000C890 */ 0x15, 0x1A, 0x0B, 0x5E, 0x59, 0x03, 0x03, 0x05, 0x01, 0x08, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, /* 0000C8A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x19, /* 0000C8B0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 0000C8C0 */ 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0xFE, 0xB7, 0x02, 0x02, @@ -4664,10 +4664,10 @@ namespace Js /* 0000CAF0 */ 0xFA, 0x02, 0x00, 0xFE, 0x10, 0x52, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x83, 0x00, 0x09, /* 0000CB00 */ 0x00, 0x2D, 0x00, 0x22, 0x00, 0x4D, 0x00, 0x1E, 0x00, 0x4C, 0x00, 0x7C, 0x00, 0xA0, 0x00, 0x1E, /* 0000CB10 */ 0x00, 0x4A, 0x00, 0x0A, 0x00, 0x3C, 0x00, 0x5E, 0x00, 0xAB, 0x00, 0x0D, 0x00, 0x4F, 0x00, 0x32, -/* 0000CB20 */ 0x00, 0x01, 0x01, 0x0C, 0x00, 0x43, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x47, 0xFF, 0x01, 0xFE, +/* 0000CB20 */ 0x00, 0x01, 0x01, 0x0C, 0x00, 0x43, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x47, 0xFF, 0x01, 0xFE, /* 0000CB30 */ 0xEE, 0x02, 0xFE, 0x9A, 0x01, 0x1E, 0xFF, 0xA0, 0x41, 0x01, 0x00, 0x22, 0x00, 0xFE, 0x41, 0x47, /* 0000CB40 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x41, 0x47, 0xFE, 0x12, 0x02, 0xFE, 0x12, 0x02, -/* 0000CB50 */ 0x0A, 0x05, 0x0B, 0x06, 0x2A, 0x23, 0x01, 0x04, 0x02, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, +/* 0000CB50 */ 0x01, 0x0A, 0x05, 0x0B, 0x06, 0x2A, 0x23, 0x01, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, /* 0000CB60 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, /* 0000CB70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 0000CB80 */ 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0xFE, 0x1A, 0x03, 0xB5, @@ -4686,7 +4686,7 @@ namespace Js /* 0000CC50 */ 0x1B, 0x03, 0x00, 0xFE, 0x58, 0x47, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x60, 0x00, 0x09, /* 0000CC60 */ 0x00, 0x20, 0x00, 0x09, 0x00, 0x23, 0x00, 0x15, 0x00, 0x51, 0x00, 0x14, 0x00, 0x41, 0x00, 0x06, /* 0000CC70 */ 0x00, 0x1C, 0x00, 0x09, 0x00, 0x33, 0x00, 0x0A, 0x00, 0x29, 0x00, 0x0B, 0x00, 0x39, 0x00, 0x08, -/* 0000CC80 */ 0x00, 0x14, 0x00, 0x00, 0xBF, 0x7E, 0x11, 0x02, 0x00, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000CC80 */ 0x00, 0x14, 0x00, 0x00, 0x3F, 0xFD, 0x22, 0x04, 0x00, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000CC90 */ 0xFE, 0x88, 0x01, 0x31, 0xFF, 0xA0, 0x41, 0x11, 0x00, 0x1F, 0x00, 0xFE, 0x63, 0x44, 0x01, 0xFF, /* 0000CCA0 */ 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x63, 0x44, 0xFE, 0xB8, 0x02, 0xFE, 0xB8, 0x02, 0x01, /* 0000CCB0 */ 0x06, 0x04, 0x07, 0x08, 0x1C, 0x1C, 0x01, 0x03, 0x06, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, @@ -4702,10 +4702,10 @@ namespace Js /* 0000CD50 */ 0x08, 0xEE, 0x04, 0xFF, 0x07, 0x01, 0x00, 0x93, 0x02, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x09, /* 0000CD60 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x18, 0x03, 0x00, 0xFE, 0x7A, 0x44, 0x04, /* 0000CD70 */ 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x30, 0x00, 0x5A, 0x00, 0x5A, 0x02, 0x0D, 0x00, 0x16, 0x00, -/* 0000CD80 */ 0x00, 0x85, 0xCD, 0x00, 0x00, 0xBF, 0x7E, 0x1D, 0x0A, 0x00, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000CD80 */ 0x00, 0x85, 0xCD, 0x00, 0x00, 0xBF, 0xFD, 0x3A, 0x04, 0x00, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000CD90 */ 0xFF, 0xFE, 0x8A, 0x01, 0x6B, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x20, 0x00, 0xFE, 0x0D, 0x45, 0x01, /* 0000CDA0 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x0D, 0x45, 0xFE, 0xEB, 0x01, 0xFE, 0xEB, 0x01, -/* 0000CDB0 */ 0x02, 0x07, 0x04, 0x08, 0x08, 0x20, 0x20, 0x02, 0x01, 0x01, 0x03, 0x08, 0x40, 0x05, 0xFF, 0xFF, +/* 0000CDB0 */ 0x40, 0x02, 0x07, 0x04, 0x08, 0x08, 0x20, 0x20, 0x02, 0x01, 0x01, 0x03, 0x08, 0x05, 0xFF, 0xFF, /* 0000CDC0 */ 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000CDD0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x04, 0xB4, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x37, 0x00, /* 0000CDE0 */ 0x00, 0x00, 0x08, 0x00, 0x00, 0x98, 0x08, 0x08, 0x04, 0x00, 0x00, 0x96, 0x02, 0x00, 0x00, 0x00, @@ -4721,20 +4721,20 @@ namespace Js /* 0000CE80 */ 0x09, 0x07, 0x00, 0x9D, 0x09, 0x08, 0x04, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, /* 0000CE90 */ 0x73, 0x01, 0xFE, 0x19, 0x03, 0x00, 0xFE, 0x2E, 0x45, 0x05, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, /* 0000CEA0 */ 0x43, 0x00, 0x28, 0x00, 0x37, 0x00, 0x56, 0x00, 0x28, 0x01, 0x1C, 0x00, 0x27, 0x00, 0x00, 0xB3, -/* 0000CEB0 */ 0xCE, 0x00, 0x00, 0x3F, 0x6E, 0x0D, 0x0A, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, +/* 0000CEB0 */ 0xCE, 0x00, 0x00, 0xBF, 0xDC, 0x1A, 0x04, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, /* 0000CEC0 */ 0x8E, 0x01, 0x56, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x21, 0x00, 0xFE, 0xF2, 0x45, 0xFF, 0x00, 0x10, -/* 0000CED0 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0xF2, 0x45, 0xCC, 0xCC, 0x04, 0x03, 0x06, 0x0A, 0x09, 0x03, 0x01, -/* 0000CEE0 */ 0x01, 0x02, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000CED0 */ 0x01, 0x00, 0x02, 0x02, 0xFE, 0xF2, 0x45, 0xCC, 0xCC, 0x41, 0x04, 0x03, 0x06, 0x0A, 0x09, 0x03, +/* 0000CEE0 */ 0x01, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000CEF0 */ 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000CF00 */ 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0xB7, 0x02, 0x33, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, /* 0000CF10 */ 0x00, 0x00, 0x06, 0x00, 0x00, 0x98, 0x06, 0x06, 0x03, 0x00, 0x00, 0x47, 0x04, 0x06, 0x15, 0x03, /* 0000CF20 */ 0x00, 0x04, 0x02, 0x09, 0x12, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, /* 0000CF30 */ 0x01, 0x00, 0x9D, 0x03, 0x06, 0x04, 0x00, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, /* 0000CF40 */ 0x19, 0x46, 0x04, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x34, 0x00, 0x08, 0x00, 0x2E, 0x00, 0x14, -/* 0000CF50 */ 0x00, 0x42, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x0A, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000CF50 */ 0x00, 0x42, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000CF60 */ 0xFE, 0x67, 0x01, 0x8D, 0xFF, 0xA2, 0x41, 0x31, 0x00, 0x1E, 0x00, 0xFE, 0xFA, 0x3B, 0xFF, 0x00, -/* 0000CF70 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xFA, 0x3B, 0xD0, 0xD0, 0x07, 0x06, 0x0B, 0x06, 0x19, 0x16, -/* 0000CF80 */ 0x01, 0x02, 0x01, 0x02, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000CF70 */ 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xFA, 0x3B, 0xD0, 0xD0, 0x0B, 0x07, 0x06, 0x0B, 0x06, 0x19, +/* 0000CF80 */ 0x16, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000CF90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000CFA0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, /* 0000CFB0 */ 0x00, 0x04, 0x5F, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0xAE, 0x07, 0xA7, 0x0B, 0x07, 0x00, 0x00, 0x12, @@ -4744,10 +4744,10 @@ namespace Js /* 0000CFF0 */ 0x8F, 0x01, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x5C, 0x02, 0x0C, 0x5C, /* 0000D000 */ 0x03, 0x06, 0x5C, 0x04, 0x08, 0xEE, 0x05, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, /* 0000D010 */ 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x18, 0x3C, 0x03, 0x07, 0x00, 0x00, 0x00, 0x21, 0x00, 0x4A, -/* 0000D020 */ 0x00, 0x35, 0x00, 0x67, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x0A, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, +/* 0000D020 */ 0x00, 0x35, 0x00, 0x67, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, /* 0000D030 */ 0xFF, 0xFF, 0xFE, 0x5B, 0x01, 0x89, 0xFF, 0xA2, 0x41, 0x31, 0x00, 0x1D, 0x00, 0xFE, 0x55, 0x38, -/* 0000D040 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x55, 0x38, 0xCE, 0xCE, 0x07, 0x06, 0x0B, 0x06, -/* 0000D050 */ 0x19, 0x16, 0x01, 0x02, 0x01, 0x02, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000D040 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x55, 0x38, 0xCE, 0xCE, 0x0B, 0x07, 0x06, 0x0B, +/* 0000D050 */ 0x06, 0x19, 0x16, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D060 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D070 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, /* 0000D080 */ 0x00, 0x00, 0x00, 0x04, 0x5F, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0xAE, 0x07, 0xA7, 0x0B, 0x07, 0x00, @@ -4757,10 +4757,10 @@ namespace Js /* 0000D0C0 */ 0x01, 0x09, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, 0x5C, 0x02, /* 0000D0D0 */ 0x0C, 0x5C, 0x03, 0x06, 0x5C, 0x04, 0x08, 0xEE, 0x05, 0x00, 0x0B, 0x00, 0x00, 0x09, 0x02, 0x00, /* 0000D0E0 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x73, 0x38, 0x03, 0x07, 0x00, 0x00, 0x00, 0x21, -/* 0000D0F0 */ 0x00, 0x4A, 0x00, 0x35, 0x00, 0x65, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x0A, 0x00, 0xFF, 0x01, 0xFF, +/* 0000D0F0 */ 0x00, 0x4A, 0x00, 0x35, 0x00, 0x65, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x04, 0x00, 0xFF, 0x01, 0xFF, /* 0000D100 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x4F, 0x01, 0x81, 0xFF, 0xA2, 0x41, 0x31, 0x00, 0x1C, 0x00, 0xFE, -/* 0000D110 */ 0xC0, 0x34, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xC0, 0x34, 0xCA, 0xCA, 0x07, 0x06, -/* 0000D120 */ 0x0B, 0x06, 0x19, 0x16, 0x01, 0x02, 0x01, 0x02, 0x0B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000D110 */ 0xC0, 0x34, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xC0, 0x34, 0xCA, 0xCA, 0x0B, 0x07, +/* 0000D120 */ 0x06, 0x0B, 0x06, 0x19, 0x16, 0x01, 0x02, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D130 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D140 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x01, 0x02, 0x00, 0x00, 0x00, /* 0000D150 */ 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, 0x5F, 0x5B, 0x09, 0xB4, 0x09, 0x09, 0xAE, 0x07, 0xA7, 0x0B, @@ -4770,10 +4770,10 @@ namespace Js /* 0000D190 */ 0x05, 0x5C, 0x01, 0x09, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x0C, 0x01, 0x00, /* 0000D1A0 */ 0x5C, 0x02, 0x0C, 0x5C, 0x03, 0x06, 0x5C, 0x04, 0x08, 0xEE, 0x05, 0x00, 0x0B, 0x00, 0x00, 0x09, /* 0000D1B0 */ 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xDE, 0x34, 0x03, 0x07, 0x00, 0x00, -/* 0000D1C0 */ 0x00, 0x21, 0x00, 0x4A, 0x00, 0x35, 0x00, 0x61, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, +/* 0000D1C0 */ 0x00, 0x21, 0x00, 0x4A, 0x00, 0x35, 0x00, 0x61, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, /* 0000D1D0 */ 0x01, 0xFE, 0xA6, 0x02, 0xFE, 0x33, 0x01, 0x1D, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x1B, 0x00, 0xFE, /* 0000D1E0 */ 0x5D, 0x2F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x5D, 0x2F, 0xFE, 0x7E, 0x03, 0xFE, -/* 0000D1F0 */ 0x7E, 0x03, 0x08, 0x08, 0x0C, 0x0A, 0x51, 0x4E, 0x01, 0x09, 0x07, 0x01, 0x05, 0x05, 0x05, 0x05, +/* 0000D1F0 */ 0x7E, 0x03, 0x01, 0x08, 0x08, 0x0C, 0x0A, 0x51, 0x4E, 0x01, 0x09, 0x07, 0x05, 0x05, 0x05, 0x05, /* 0000D200 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, /* 0000D210 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 0000D220 */ 0x00, 0x04, 0x02, 0xFE, 0x09, 0x03, 0x02, 0xFE, 0xFB, 0x02, 0x02, 0xFE, 0x15, 0x03, 0x02, 0xFE, @@ -4806,10 +4806,10 @@ namespace Js /* 0000D3D0 */ 0xFE, 0xF1, 0x01, 0xFE, 0xF3, 0x01, 0x00, 0xFE, 0x9A, 0x2F, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x1E, /* 0000D3E0 */ 0x00, 0x36, 0x00, 0x0B, 0x00, 0x33, 0x00, 0x07, 0x00, 0x30, 0x00, 0x0B, 0x00, 0x37, 0x00, 0x26, /* 0000D3F0 */ 0x00, 0x39, 0x00, 0x10, 0x00, 0x4B, 0x00, 0x48, 0x00, 0x9B, 0x00, 0x13, 0x00, 0x4D, 0x00, 0x6E, -/* 0000D400 */ 0x00, 0x95, 0x00, 0x4E, 0x00, 0x6F, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, +/* 0000D400 */ 0x00, 0x95, 0x00, 0x4E, 0x00, 0x6F, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, /* 0000D410 */ 0xE5, 0x02, 0xFE, 0x25, 0x01, 0x24, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x1A, 0x00, 0xFE, 0x60, 0x2D, /* 0000D420 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0x60, 0x2D, 0xFE, 0xB2, 0x01, 0xFE, 0xB2, 0x01, -/* 0000D430 */ 0x08, 0x05, 0x0B, 0x04, 0x28, 0x27, 0x01, 0x04, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, +/* 0000D430 */ 0x01, 0x08, 0x05, 0x0B, 0x04, 0x28, 0x27, 0x01, 0x04, 0x02, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, /* 0000D440 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, /* 0000D450 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x03, /* 0000D460 */ 0x02, 0xFE, 0xA2, 0x02, 0x04, 0xB9, 0x14, 0x0D, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0xA8, 0x0B, @@ -4826,7 +4826,7 @@ namespace Js /* 0000D510 */ 0x02, 0x08, 0xEE, 0x03, 0x00, 0x0B, 0x03, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, /* 0000D520 */ 0x00, 0xFE, 0x22, 0x02, 0xFE, 0xFD, 0x01, 0xFE, 0x2B, 0x02, 0x00, 0xFE, 0x9B, 0x2D, 0x07, 0x00, /* 0000D530 */ 0x00, 0x00, 0x00, 0x12, 0x00, 0x38, 0x00, 0x23, 0x00, 0x43, 0x00, 0x26, 0x00, 0x39, 0x00, 0x16, -/* 0000D540 */ 0x00, 0x4D, 0x00, 0x23, 0x00, 0x43, 0x00, 0x23, 0x00, 0x32, 0x00, 0x00, 0xBF, 0x7E, 0x31, 0x82, +/* 0000D540 */ 0x00, 0x4D, 0x00, 0x23, 0x00, 0x43, 0x00, 0x23, 0x00, 0x32, 0x00, 0x00, 0x3F, 0xFD, 0x62, 0x84, /* 0000D550 */ 0x27, 0xFF, 0x03, 0xFE, 0xC8, 0x02, 0xFE, 0x12, 0x01, 0x04, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x18, /* 0000D560 */ 0x00, 0xFE, 0xB8, 0x29, 0x01, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x04, 0x04, 0xFE, 0xB8, 0x29, 0xFE, /* 0000D570 */ 0x80, 0x03, 0xFE, 0x80, 0x03, 0x04, 0x09, 0x0A, 0x10, 0x05, 0x20, 0x20, 0x01, 0x02, 0x01, 0x05, @@ -4849,10 +4849,10 @@ namespace Js /* 0000D680 */ 0x00, 0xFE, 0x7E, 0x01, 0xFE, 0x7D, 0x01, 0xFE, 0x7C, 0x01, 0xFE, 0x11, 0x03, 0xFE, 0x12, 0x03, /* 0000D690 */ 0xFE, 0x13, 0x03, 0xFE, 0x14, 0x03, 0x00, 0xFE, 0x0C, 0x2A, 0x06, 0x0C, 0x00, 0x00, 0x00, 0x0B, /* 0000D6A0 */ 0x00, 0x1A, 0x00, 0x06, 0x00, 0x18, 0x00, 0x33, 0x00, 0x7C, 0x02, 0x4C, 0x00, 0x69, 0x00, 0x0D, -/* 0000D6B0 */ 0x00, 0x14, 0x00, 0x00, 0xB8, 0xD6, 0x00, 0x00, 0x3F, 0x7E, 0x01, 0x8B, 0xA7, 0xFF, 0x01, 0xFF, +/* 0000D6B0 */ 0x00, 0x14, 0x00, 0x00, 0xB8, 0xD6, 0x00, 0x00, 0xBF, 0xFC, 0x02, 0x86, 0xA7, 0xFF, 0x01, 0xFF, /* 0000D6C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x15, 0x01, 0x41, 0xFF, 0xB2, 0x41, 0x11, 0x00, 0x19, 0x00, 0xFE, /* 0000D6D0 */ 0x77, 0x2A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x77, 0x2A, 0xFE, 0x37, 0x02, 0xFE, -/* 0000D6E0 */ 0x37, 0x02, 0x08, 0x0B, 0x0F, 0x06, 0x30, 0x2F, 0x02, 0x03, 0x07, 0x45, 0x05, 0x05, 0x05, 0x05, +/* 0000D6E0 */ 0x37, 0x02, 0x45, 0x08, 0x0B, 0x0F, 0x06, 0x30, 0x2F, 0x02, 0x03, 0x07, 0x05, 0x05, 0x05, 0x05, /* 0000D6F0 */ 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000D700 */ 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, /* 0000D710 */ 0x02, 0xFE, 0xA5, 0x02, 0x02, 0xFE, 0xBF, 0x02, 0x09, 0x02, 0xFE, 0xC1, 0x02, 0x02, 0xFE, 0xC0, @@ -4876,7 +4876,7 @@ namespace Js /* 0000D830 */ 0x01, 0x00, 0x00, 0x7B, 0x01, 0x00, 0x00, 0x00, 0xFE, 0xE9, 0x01, 0xFE, 0x7E, 0x01, 0xFE, 0x7D, /* 0000D840 */ 0x01, 0xFE, 0x7C, 0x01, 0xFE, 0x7B, 0x01, 0x00, 0xFE, 0xAF, 0x2A, 0x07, 0x05, 0x00, 0x00, 0x00, /* 0000D850 */ 0x41, 0x00, 0x5F, 0x00, 0x0B, 0x00, 0x2C, 0x00, 0x5A, 0x00, 0x8E, 0x00, 0x20, 0x00, 0x35, 0x00, -/* 0000D860 */ 0x01, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x92, 0x00, 0x00, 0xBF, 0x7E, 0x35, 0x82, 0x07, 0xFF, 0x03, +/* 0000D860 */ 0x01, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x92, 0x00, 0x00, 0x3F, 0xFD, 0x6A, 0x84, 0x07, 0xFF, 0x03, /* 0000D870 */ 0xFE, 0xC7, 0x02, 0xED, 0x04, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x16, 0x00, 0xFE, 0x5B, 0x25, 0x01, /* 0000D880 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x5B, 0x25, 0xFE, 0x55, 0x04, 0xFE, 0x55, 0x04, /* 0000D890 */ 0x01, 0x08, 0x05, 0x0A, 0x05, 0x29, 0x26, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, @@ -4897,10 +4897,10 @@ namespace Js /* 0000D980 */ 0x00, 0xFE, 0xFD, 0x02, 0xFE, 0x29, 0x02, 0xFE, 0x0D, 0x03, 0x00, 0xFE, 0x8F, 0x25, 0x0A, 0x00, /* 0000D990 */ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x33, 0x00, 0x08, 0x00, 0x21, 0x00, 0x0B, 0x00, 0x30, 0x00, 0x0C, /* 0000D9A0 */ 0x00, 0x2B, 0x00, 0x26, 0x00, 0x2F, 0x00, 0x2B, 0x00, 0x71, 0x00, 0x0B, 0x00, 0x1A, 0x00, 0x27, -/* 0000D9B0 */ 0x00, 0xA5, 0x02, 0x0D, 0x00, 0x12, 0x00, 0x00, 0xBC, 0xD9, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, +/* 0000D9B0 */ 0x00, 0xA5, 0x02, 0x0D, 0x00, 0x12, 0x00, 0x00, 0xBC, 0xD9, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, /* 0000D9C0 */ 0x07, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x22, 0xFF, 0xA2, 0x41, 0x11, 0x00, 0x17, /* 0000D9D0 */ 0x00, 0xFE, 0x12, 0x27, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x12, 0x27, 0xFE, 0x7C, -/* 0000D9E0 */ 0x02, 0xFE, 0x7C, 0x02, 0x06, 0x08, 0x0B, 0x06, 0x49, 0x47, 0x02, 0x08, 0x07, 0x41, 0x05, 0x05, +/* 0000D9E0 */ 0x02, 0xFE, 0x7C, 0x02, 0x41, 0x06, 0x08, 0x0B, 0x06, 0x49, 0x47, 0x02, 0x08, 0x07, 0x05, 0x05, /* 0000D9F0 */ 0x05, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000DA00 */ 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000DA10 */ 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x04, 0x03, 0x02, 0xFE, 0x0E, 0x03, 0x03, 0x02, 0xFE, 0x0F, 0x03, @@ -4932,9 +4932,9 @@ namespace Js /* 0000DBB0 */ 0xFE, 0xF0, 0x01, 0xFE, 0x2A, 0x02, 0xFE, 0xF1, 0x01, 0x00, 0xFE, 0x33, 0x27, 0x09, 0x00, 0x00, /* 0000DBC0 */ 0x00, 0x00, 0x1E, 0x00, 0x66, 0x00, 0x25, 0x00, 0x4A, 0x00, 0x26, 0x00, 0x34, 0x00, 0x2A, 0x00, /* 0000DBD0 */ 0x3F, 0x00, 0x3E, 0x00, 0x4E, 0x00, 0x26, 0x00, 0x39, 0x00, 0x4B, 0x00, 0x66, 0x00, 0x3B, 0x00, -/* 0000DBE0 */ 0x4A, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xC6, 0x02, 0xE6, 0x04, 0xFF, +/* 0000DBE0 */ 0x4A, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xC6, 0x02, 0xE6, 0x04, 0xFF, /* 0000DBF0 */ 0xA3, 0x41, 0x01, 0x00, 0x15, 0x00, 0xFE, 0x35, 0x24, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 0000DC00 */ 0xFE, 0x35, 0x24, 0xA6, 0xA6, 0x05, 0x03, 0x05, 0x04, 0x14, 0x13, 0x01, 0x02, 0x03, 0x01, 0x02, +/* 0000DC00 */ 0xFE, 0x35, 0x24, 0xA6, 0xA6, 0x01, 0x05, 0x03, 0x05, 0x04, 0x14, 0x13, 0x01, 0x02, 0x03, 0x02, /* 0000DC10 */ 0x02, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000DC20 */ 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000DC30 */ 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x63, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x06, @@ -4945,10 +4945,10 @@ namespace Js /* 0000DC80 */ 0x00, 0x5C, 0x02, 0x07, 0xF2, 0x03, 0x05, 0x05, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, /* 0000DC90 */ 0x05, 0x02, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x25, 0x02, 0xFE, 0x01, /* 0000DCA0 */ 0x02, 0x00, 0xFE, 0x68, 0x24, 0x03, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x2B, 0x00, 0x3B, 0x00, -/* 0000DCB0 */ 0x47, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xC5, 0x02, 0xD6, 0x04, 0xFF, +/* 0000DCB0 */ 0x47, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xC5, 0x02, 0xD6, 0x04, 0xFF, /* 0000DCC0 */ 0xA3, 0x41, 0x01, 0x00, 0x14, 0x00, 0xFE, 0xDE, 0x21, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, -/* 0000DCD0 */ 0xFE, 0xDE, 0x21, 0xFE, 0x4F, 0x02, 0xFE, 0x4F, 0x02, 0x0B, 0x07, 0x0F, 0x08, 0x3B, 0x38, 0x01, -/* 0000DCE0 */ 0x01, 0x06, 0x05, 0x01, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000DCD0 */ 0xFE, 0xDE, 0x21, 0xFE, 0x4F, 0x02, 0xFE, 0x4F, 0x02, 0x01, 0x0B, 0x07, 0x0F, 0x08, 0x3B, 0x38, +/* 0000DCE0 */ 0x01, 0x01, 0x06, 0x05, 0x03, 0x03, 0x03, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000DCF0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000DD00 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0x09, 0x03, 0x04, 0x02, 0xFE, /* 0000DD10 */ 0x0A, 0x03, 0x02, 0xFE, 0x0B, 0x03, 0x02, 0xFE, 0x0C, 0x03, 0xFE, 0x10, 0x01, 0xA8, 0x0D, 0x98, @@ -4971,10 +4971,10 @@ namespace Js /* 0000DE20 */ 0x09, 0x06, 0x00, 0x47, 0x00, 0x0B, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, /* 0000DE30 */ 0x26, 0x02, 0xFE, 0x27, 0x02, 0x22, 0x00, 0xFE, 0x31, 0x22, 0x08, 0x02, 0x00, 0x00, 0x00, 0x09, /* 0000DE40 */ 0x00, 0x2D, 0x00, 0x0B, 0x00, 0x34, 0x00, 0x26, 0x00, 0x41, 0x00, 0x32, 0x00, 0x66, 0x00, 0x6F, -/* 0000DE50 */ 0x00, 0x90, 0x00, 0x29, 0x00, 0x42, 0x00, 0x08, 0x00, 0x21, 0x00, 0x00, 0x3F, 0x7E, 0x15, 0x8A, +/* 0000DE50 */ 0x00, 0x90, 0x00, 0x29, 0x00, 0x42, 0x00, 0x08, 0x00, 0x21, 0x00, 0x00, 0xBF, 0xFC, 0x2A, 0x84, /* 0000DE60 */ 0x07, 0xFF, 0x01, 0xFE, 0xC4, 0x02, 0xBC, 0x04, 0xFF, 0xA3, 0x41, 0x01, 0x00, 0x13, 0x00, 0xFE, /* 0000DE70 */ 0xA7, 0x1E, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x06, 0x06, 0xFE, 0xA7, 0x1E, 0xFE, 0x2F, 0x03, 0xFE, -/* 0000DE80 */ 0x2F, 0x03, 0x0B, 0x0A, 0x11, 0x0A, 0x50, 0x4A, 0x01, 0x01, 0x08, 0x06, 0x01, 0x04, 0x04, 0x04, +/* 0000DE80 */ 0x2F, 0x03, 0x01, 0x0B, 0x0A, 0x11, 0x0A, 0x50, 0x4A, 0x01, 0x01, 0x08, 0x06, 0x04, 0x04, 0x04, /* 0000DE90 */ 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000DEA0 */ 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000DEB0 */ 0x00, 0x00, 0x02, 0xFE, 0x03, 0x03, 0x02, 0xFE, 0x04, 0x03, 0x02, 0xFE, 0x05, 0x03, 0x04, 0x01, @@ -5007,8 +5007,8 @@ namespace Js /* 0000E060 */ 0xFE, 0x27, 0x02, 0x00, 0xFE, 0xF0, 0x1E, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x2A, 0x00, /* 0000E070 */ 0x0A, 0x00, 0x28, 0x00, 0x08, 0x00, 0x2A, 0x00, 0x26, 0x00, 0x48, 0x00, 0x08, 0x00, 0x29, 0x00, /* 0000E080 */ 0x26, 0x00, 0x40, 0x00, 0x08, 0x00, 0x29, 0x00, 0x26, 0x00, 0x40, 0x00, 0x3F, 0x00, 0x6C, 0x00, -/* 0000E090 */ 0x96, 0x00, 0xA9, 0x00, 0x06, 0x00, 0x24, 0x00, 0x08, 0x00, 0x16, 0x00, 0x00, 0x3F, 0x7E, 0x11, -/* 0000E0A0 */ 0x82, 0x27, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0x14, 0xFF, 0xA0, 0x41, 0x11, 0x00, +/* 0000E090 */ 0x96, 0x00, 0xA9, 0x00, 0x06, 0x00, 0x24, 0x00, 0x08, 0x00, 0x16, 0x00, 0x00, 0x3F, 0xFC, 0x22, +/* 0000E0A0 */ 0x84, 0x27, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8D, 0x14, 0xFF, 0xA0, 0x41, 0x11, 0x00, /* 0000E0B0 */ 0x0C, 0x00, 0xFE, 0x1B, 0x19, 0x06, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x1B, 0x19, /* 0000E0C0 */ 0xFE, 0x0A, 0x05, 0xFE, 0x0A, 0x05, 0x04, 0x0A, 0x0B, 0x04, 0x1D, 0x1D, 0x01, 0x01, 0x01, 0x06, /* 0000E0D0 */ 0x06, 0x06, 0x06, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, @@ -5029,10 +5029,10 @@ namespace Js /* 0000E1C0 */ 0x00, 0x00, 0x00, 0xFE, 0xFD, 0x02, 0xFE, 0x25, 0x02, 0xFE, 0x26, 0x02, 0xFE, 0x24, 0x02, 0xFE, /* 0000E1D0 */ 0x29, 0x02, 0xFE, 0x02, 0x03, 0x00, 0xFE, 0x32, 0x19, 0x02, 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, /* 0000E1E0 */ 0xF2, 0x04, 0x00, 0xF0, 0xE5, 0x00, 0x00, 0x5A, 0xE5, 0x00, 0x00, 0xC4, 0xE4, 0x00, 0x00, 0x2E, -/* 0000E1F0 */ 0xE4, 0x00, 0x00, 0xDD, 0xE2, 0x00, 0x00, 0xFB, 0xE1, 0x00, 0x00, 0x3F, 0xFE, 0x11, 0x0E, 0x00, +/* 0000E1F0 */ 0xE4, 0x00, 0x00, 0xDD, 0xE2, 0x00, 0x00, 0xFB, 0xE1, 0x00, 0x00, 0xBF, 0xFC, 0x23, 0x0C, 0x00, /* 0000E200 */ 0xFF, 0x01, 0xFE, 0x02, 0x03, 0xAC, 0x19, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x12, 0x00, 0xFE, 0xCF, /* 0000E210 */ 0x1C, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0xCF, 0x1C, 0xFE, 0x3D, 0x01, 0xFE, 0x3D, -/* 0000E220 */ 0x01, 0x05, 0x04, 0x07, 0x05, 0x1C, 0x1A, 0x19, 0x01, 0x02, 0x03, 0x01, 0x01, 0xFF, 0xFF, 0xFF, +/* 0000E220 */ 0x01, 0x01, 0x05, 0x04, 0x07, 0x05, 0x1C, 0x1A, 0x19, 0x01, 0x02, 0x03, 0x01, 0xFF, 0xFF, 0xFF, /* 0000E230 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, /* 0000E240 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x6A, 0x00, /* 0000E250 */ 0x04, 0x08, 0x6E, 0xEB, 0x00, 0xEC, 0x00, 0x0F, 0x03, 0x00, 0x04, 0x09, 0x5D, 0x00, 0x8F, 0x01, @@ -5043,10 +5043,10 @@ namespace Js /* 0000E2A0 */ 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x04, 0xEE, /* 0000E2B0 */ 0x02, 0x07, 0x07, 0x01, 0x00, 0x47, 0x04, 0x07, 0x09, 0x9A, 0xFF, 0xED, 0x00, 0xA8, 0x00, 0x24, /* 0000E2C0 */ 0x00, 0x00, 0x00, 0x00, 0xFE, 0x26, 0x1D, 0x05, 0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x1A, 0x00, -/* 0000E2D0 */ 0x34, 0x00, 0x55, 0x00, 0x08, 0x00, 0x39, 0x00, 0x25, 0x00, 0x3D, 0x00, 0x00, 0x3F, 0x7E, 0x51, -/* 0000E2E0 */ 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0x01, 0x03, 0xA3, 0x16, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x11, 0x00, +/* 0000E2D0 */ 0x34, 0x00, 0x55, 0x00, 0x08, 0x00, 0x39, 0x00, 0x25, 0x00, 0x3D, 0x00, 0x00, 0xBF, 0xFC, 0xA2, +/* 0000E2E0 */ 0x84, 0x07, 0xFF, 0x01, 0xFE, 0x01, 0x03, 0xA3, 0x16, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x11, 0x00, /* 0000E2F0 */ 0xFE, 0xAF, 0x1B, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xAF, 0x1B, 0xFE, 0x02, 0x01, -/* 0000E300 */ 0xFE, 0x02, 0x01, 0x09, 0x06, 0x0A, 0x07, 0x2A, 0x25, 0x01, 0x05, 0x01, 0x04, 0x01, 0x02, 0x02, +/* 0000E300 */ 0xFE, 0x02, 0x01, 0x01, 0x09, 0x06, 0x0A, 0x07, 0x2A, 0x25, 0x01, 0x05, 0x01, 0x04, 0x02, 0x02, /* 0000E310 */ 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E320 */ 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E330 */ 0xFF, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x20, @@ -5064,38 +5064,38 @@ namespace Js /* 0000E3F0 */ 0x00, 0x00, 0x5C, 0x01, 0x0C, 0xF2, 0x02, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x47, /* 0000E400 */ 0x08, 0x0A, 0x47, 0x00, 0x08, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1A, 0x28, /* 0000E410 */ 0x00, 0xFE, 0xCF, 0x1B, 0x06, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x2A, 0x00, 0x03, 0x00, 0x1A, -/* 0000E420 */ 0x00, 0x44, 0x00, 0x39, 0x00, 0x59, 0x00, 0x4B, 0x00, 0x08, 0x00, 0x19, 0x00, 0x00, 0x3F, 0x7E, -/* 0000E430 */ 0x11, 0x0A, 0x00, 0xFF, 0x01, 0xFE, 0x00, 0x03, 0x9F, 0x1E, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x10, +/* 0000E420 */ 0x00, 0x44, 0x00, 0x39, 0x00, 0x59, 0x00, 0x4B, 0x00, 0x08, 0x00, 0x19, 0x00, 0x00, 0xBF, 0xFC, +/* 0000E430 */ 0x22, 0x04, 0x00, 0xFF, 0x01, 0xFE, 0x00, 0x03, 0x9F, 0x1E, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x10, /* 0000E440 */ 0x00, 0xFE, 0x35, 0x1B, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x35, 0x1B, 0x5F, 0x5F, -/* 0000E450 */ 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000E450 */ 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E460 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E470 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x37, 0xA8, 0x05, 0x15, /* 0000E480 */ 0x03, 0x00, 0x03, 0x05, 0x09, 0x21, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, /* 0000E490 */ 0x05, 0x00, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, /* 0000E4A0 */ 0x00, 0x00, 0x47, 0x00, 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, /* 0000E4B0 */ 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x55, 0x1B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, -/* 0000E4C0 */ 0x00, 0x3E, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x0A, 0x00, 0xFF, 0x01, 0xFE, 0xFF, 0x02, 0x9B, 0x16, +/* 0000E4C0 */ 0x00, 0x3E, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFF, 0x01, 0xFE, 0xFF, 0x02, 0x9B, 0x16, /* 0000E4D0 */ 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x0F, 0x00, 0xFE, 0xBA, 0x1A, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, -/* 0000E4E0 */ 0x02, 0xFE, 0xBA, 0x1A, 0x58, 0x58, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0x01, +/* 0000E4E0 */ 0x02, 0xFE, 0xBA, 0x1A, 0x58, 0x58, 0x01, 0x03, 0x03, 0x05, 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, /* 0000E4F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, /* 0000E500 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 0000E510 */ 0x00, 0x04, 0x37, 0xA8, 0x05, 0x14, 0x03, 0x00, 0x03, 0x05, 0x09, 0x08, 0x00, 0xA9, 0x05, 0x47, /* 0000E520 */ 0x00, 0x05, 0x09, 0x1E, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x05, 0x00, /* 0000E530 */ 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, 0x00, /* 0000E540 */ 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xDA, 0x1A, -/* 0000E550 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x37, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x0A, 0x00, 0xFF, +/* 0000E550 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x37, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFF, /* 0000E560 */ 0x01, 0xFE, 0xFE, 0x02, 0x96, 0x16, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x0E, 0x00, 0xFE, 0x3F, 0x1A, -/* 0000E570 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x3F, 0x1A, 0x5E, 0x5E, 0x03, 0x03, 0x05, 0x03, -/* 0000E580 */ 0x10, 0x0E, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000E570 */ 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x3F, 0x1A, 0x5E, 0x5E, 0x01, 0x03, 0x03, 0x05, +/* 0000E580 */ 0x03, 0x10, 0x0E, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E590 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000E5A0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x04, 0x37, 0xA8, 0x05, 0x15, 0x03, 0x00, 0x03, 0x05, /* 0000E5B0 */ 0x09, 0x21, 0x00, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x07, /* 0000E5C0 */ 0x02, 0x00, 0x5C, 0x00, 0x02, 0x5C, 0x01, 0x03, 0xEE, 0x02, 0x05, 0x05, 0x00, 0x00, 0x47, 0x00, /* 0000E5D0 */ 0x05, 0x09, 0x05, 0x00, 0xA8, 0x05, 0x47, 0x00, 0x05, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, /* 0000E5E0 */ 0x00, 0x00, 0x00, 0xFE, 0x5F, 0x1A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x3D, 0x00, 0x00, -/* 0000E5F0 */ 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xFD, 0x02, 0x8F, 0x16, 0xFF, 0xA2, 0x41, 0x01, +/* 0000E5F0 */ 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xFD, 0x02, 0x8F, 0x16, 0xFF, 0xA2, 0x41, 0x01, /* 0000E600 */ 0x00, 0x0D, 0x00, 0xFE, 0x5F, 0x19, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0x5F, 0x19, -/* 0000E610 */ 0xC5, 0xC5, 0x04, 0x04, 0x06, 0x03, 0x17, 0x15, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, +/* 0000E610 */ 0xC5, 0xC5, 0x01, 0x04, 0x04, 0x06, 0x03, 0x17, 0x15, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, /* 0000E620 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, /* 0000E630 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 0000E640 */ 0x00, 0x03, 0x04, 0x5F, 0x14, 0x03, 0x00, 0x04, 0x02, 0x09, 0x20, 0x00, 0x8F, 0x01, 0x00, 0x00, @@ -5105,10 +5105,10 @@ namespace Js /* 0000E680 */ 0x01, 0x00, 0x07, 0x02, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0xEE, 0x02, 0x06, 0x06, 0x01, /* 0000E690 */ 0x00, 0x47, 0x00, 0x06, 0x09, 0x05, 0x00, 0xA8, 0x06, 0x47, 0x00, 0x06, 0x09, 0x02, 0x00, 0xA8, /* 0000E6A0 */ 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x1F, 0x02, 0x00, 0xFE, 0x7F, 0x19, 0x04, 0x00, 0x00, 0x00, -/* 0000E6B0 */ 0x00, 0x08, 0x00, 0x27, 0x00, 0x20, 0x00, 0x40, 0x00, 0x35, 0x00, 0x3D, 0x00, 0x00, 0x3F, 0x7E, -/* 0000E6C0 */ 0x15, 0x8A, 0x47, 0xFF, 0x01, 0xFE, 0xE2, 0x02, 0x89, 0x20, 0xFF, 0xA0, 0x41, 0x01, 0x00, 0x0B, +/* 0000E6B0 */ 0x00, 0x08, 0x00, 0x27, 0x00, 0x20, 0x00, 0x40, 0x00, 0x35, 0x00, 0x3D, 0x00, 0x00, 0xBF, 0xFC, +/* 0000E6C0 */ 0x2A, 0x84, 0x47, 0xFF, 0x01, 0xFE, 0xE2, 0x02, 0x89, 0x20, 0xFF, 0xA0, 0x41, 0x01, 0x00, 0x0B, /* 0000E6D0 */ 0x00, 0xFE, 0x95, 0x18, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x01, 0x01, 0xFE, 0x95, 0x18, 0x6D, 0x6D, -/* 0000E6E0 */ 0x05, 0x03, 0x04, 0x06, 0x12, 0x12, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, +/* 0000E6E0 */ 0x01, 0x05, 0x03, 0x04, 0x06, 0x12, 0x12, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, 0x02, 0x01, /* 0000E6F0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, /* 0000E700 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, /* 0000E710 */ 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x56, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, @@ -5118,10 +5118,10 @@ namespace Js /* 0000E750 */ 0xE0, 0x06, 0x00, 0x5C, 0x02, 0x06, 0xF2, 0x03, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0000E760 */ 0x98, 0x00, 0x04, 0x02, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, /* 0000E770 */ 0x01, 0x02, 0xFE, 0xF5, 0x01, 0x00, 0x09, 0xFE, 0xFC, 0x02, 0x00, 0xFE, 0xAC, 0x18, 0x02, 0x00, -/* 0000E780 */ 0x00, 0x00, 0x00, 0x54, 0x00, 0x55, 0x00, 0x00, 0x3F, 0xFE, 0x15, 0x8E, 0x07, 0xFF, 0x01, 0xFE, +/* 0000E780 */ 0x00, 0x00, 0x00, 0x54, 0x00, 0x55, 0x00, 0x00, 0xBF, 0xFC, 0x2B, 0x8C, 0x07, 0xFF, 0x01, 0xFE, /* 0000E790 */ 0xE1, 0x02, 0x79, 0x19, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x0A, 0x00, 0xFE, 0xC9, 0x15, 0xFF, 0x00, -/* 0000E7A0 */ 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0xC9, 0x15, 0xFE, 0xA8, 0x02, 0xFE, 0xA8, 0x02, 0x0C, 0x06, -/* 0000E7B0 */ 0x10, 0x06, 0x42, 0x37, 0x18, 0x01, 0x01, 0x04, 0x04, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0xFF, +/* 0000E7A0 */ 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0xC9, 0x15, 0xFE, 0xA8, 0x02, 0xFE, 0xA8, 0x02, 0x01, 0x0C, +/* 0000E7B0 */ 0x06, 0x10, 0x06, 0x42, 0x37, 0x18, 0x01, 0x01, 0x04, 0x04, 0x01, 0x02, 0x02, 0x02, 0x02, 0xFF, /* 0000E7C0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, /* 0000E7D0 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x7A, /* 0000E7E0 */ 0xD1, 0x00, 0x02, 0xFE, 0xFB, 0x02, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, @@ -5145,7 +5145,7 @@ namespace Js /* 0000E900 */ 0x00, 0x00, 0x00, 0x30, 0x00, 0x62, 0x00, 0x1E, 0x00, 0x36, 0x00, 0x0F, 0x00, 0x34, 0x00, 0x16, /* 0000E910 */ 0x00, 0x3A, 0x00, 0x07, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x20, 0x00, 0x2D, 0x00, 0x6A, 0x00, 0x0E, /* 0000E920 */ 0x00, 0x36, 0x00, 0x08, 0x00, 0x4C, 0xFF, 0x08, 0x00, 0xE8, 0x00, 0x2B, 0x00, 0x52, 0x00, 0x00, -/* 0000E930 */ 0xBF, 0x7E, 0x35, 0x82, 0xE7, 0xFF, 0x03, 0xFE, 0xE0, 0x02, 0x5A, 0x1E, 0xFF, 0xA2, 0x41, 0x01, +/* 0000E930 */ 0x3F, 0xFD, 0x6A, 0x84, 0xE7, 0xFF, 0x03, 0xFE, 0xE0, 0x02, 0x5A, 0x1E, 0xFF, 0xA2, 0x41, 0x01, /* 0000E940 */ 0x00, 0x07, 0x00, 0xFE, 0xD8, 0x0E, 0x02, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x05, 0x05, 0xFE, 0xD8, /* 0000E950 */ 0x0E, 0xFE, 0xD4, 0x06, 0xFE, 0xD4, 0x06, 0x03, 0x10, 0x0C, 0x15, 0x09, 0x62, 0x5B, 0x01, 0x01, /* 0000E960 */ 0x08, 0x01, 0x09, 0x05, 0x05, 0x05, 0x05, 0x01, 0x01, 0x01, 0x12, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, @@ -5190,10 +5190,10 @@ namespace Js /* 0000EBD0 */ 0x2E, 0x00, 0x37, 0x00, 0x07, 0x00, 0x1C, 0x00, 0x33, 0x00, 0x3F, 0x02, 0x3D, 0x00, 0x4A, 0x00, /* 0000EBE0 */ 0x1D, 0x00, 0x39, 0x00, 0x12, 0x00, 0x51, 0x00, 0x0B, 0x00, 0x20, 0x00, 0x33, 0x00, 0xBF, 0x01, /* 0000EBF0 */ 0x0B, 0x00, 0x2A, 0x00, 0xBA, 0x00, 0x1F, 0x01, 0x00, 0x3D, 0xED, 0x00, 0x00, 0x01, 0xEC, 0x00, -/* 0000EC00 */ 0x00, 0x3F, 0x7E, 0x15, 0x8A, 0x47, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x3D, 0xFF, +/* 0000EC00 */ 0x00, 0xBF, 0xFC, 0x2A, 0x84, 0x47, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x3D, 0xFF, /* 0000EC10 */ 0xA2, 0x41, 0x11, 0x00, 0x09, 0x00, 0xFE, 0xD4, 0x12, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 0000EC20 */ 0xFE, 0xD4, 0x12, 0xFE, 0x7D, 0x01, 0xFE, 0x7D, 0x01, 0x07, 0x05, 0x09, 0x05, 0x22, 0x20, 0x02, -/* 0000EC30 */ 0x01, 0x03, 0x06, 0x41, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000EC20 */ 0xFE, 0xD4, 0x12, 0xFE, 0x7D, 0x01, 0xFE, 0x7D, 0x01, 0x41, 0x07, 0x05, 0x09, 0x05, 0x22, 0x20, +/* 0000EC30 */ 0x02, 0x01, 0x03, 0x06, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EC40 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EC50 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x04, /* 0000EC60 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xB3, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0A, @@ -5209,10 +5209,10 @@ namespace Js /* 0000ED00 */ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x5C, 0x02, 0x0A, 0x5C, 0x03, 0x05, 0xEE, /* 0000ED10 */ 0x04, 0xFF, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0x01, 0x02, 0x00, 0x0E, /* 0000ED20 */ 0xFE, 0xFA, 0x02, 0x00, 0xFE, 0xF9, 0x12, 0x05, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x7B, 0x00, -/* 0000ED30 */ 0x09, 0x00, 0x25, 0x00, 0x41, 0x00, 0x60, 0x00, 0x3B, 0x00, 0x57, 0x00, 0x00, 0x3F, 0x7E, 0x11, -/* 0000ED40 */ 0x0A, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5D, 0x3D, 0xFF, 0xA2, 0x41, 0x11, 0x00, +/* 0000ED30 */ 0x09, 0x00, 0x25, 0x00, 0x41, 0x00, 0x60, 0x00, 0x3B, 0x00, 0x57, 0x00, 0x00, 0xBF, 0xFC, 0x22, +/* 0000ED40 */ 0x04, 0x00, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x5D, 0x3D, 0xFF, 0xA2, 0x41, 0x11, 0x00, /* 0000ED50 */ 0x08, 0x00, 0xFE, 0xA1, 0x0F, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, 0xFE, 0xA1, 0x0F, 0x61, -/* 0000ED60 */ 0x61, 0x04, 0x05, 0x07, 0x06, 0x0F, 0x0F, 0x02, 0x01, 0x03, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000ED60 */ 0x61, 0x41, 0x04, 0x05, 0x07, 0x06, 0x0F, 0x0F, 0x02, 0x01, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000ED70 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x06, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000ED80 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0xFE, 0xF4, 0x02, /* 0000ED90 */ 0x02, 0xFE, 0xB7, 0x02, 0x04, 0x50, 0x8F, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x07, @@ -5221,10 +5221,10 @@ namespace Js /* 0000EDC0 */ 0x08, 0x02, 0x00, 0x5C, 0x02, 0x08, 0x2F, 0x08, 0x02, 0x05, 0x5C, 0x03, 0x08, 0x5D, 0x04, 0x03, /* 0000EDD0 */ 0x00, 0x00, 0xEE, 0x05, 0x07, 0x07, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, /* 0000EDE0 */ 0x00, 0x07, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xB5, 0x0F, 0x02, 0x00, 0x00, 0x00, -/* 0000EDF0 */ 0x00, 0x4E, 0x00, 0x4C, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xF1, 0x02, +/* 0000EDF0 */ 0x00, 0x4E, 0x00, 0x4C, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xF1, 0x02, /* 0000EE00 */ 0x52, 0x1F, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x06, 0x00, 0xFE, 0xA2, 0x0D, 0xFF, 0x00, 0x10, 0x01, -/* 0000EE10 */ 0x00, 0x03, 0x03, 0xFE, 0xA2, 0x0D, 0xFE, 0x14, 0x01, 0xFE, 0x14, 0x01, 0x06, 0x02, 0x06, 0x03, -/* 0000EE20 */ 0x15, 0x12, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000EE10 */ 0x00, 0x03, 0x03, 0xFE, 0xA2, 0x0D, 0xFE, 0x14, 0x01, 0xFE, 0x14, 0x01, 0x01, 0x06, 0x02, 0x06, +/* 0000EE20 */ 0x03, 0x15, 0x12, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EE30 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EE40 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x4E, 0x8F, 0x01, 0x00, 0x00, /* 0000EE50 */ 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x6D, 0x06, 0x07, 0x00, 0x07, 0x02, 0x00, 0x5C, @@ -5234,28 +5234,28 @@ namespace Js /* 0000EE90 */ 0x47, 0x00, 0x04, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0xFE, 0xF4, 0x01, 0x00, /* 0000EEA0 */ 0xFE, 0xCE, 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x47, 0x00, 0x08, 0x00, 0x1E, 0x00, /* 0000EEB0 */ 0x09, 0x00, 0x25, 0x00, 0x08, 0x00, 0x26, 0x00, 0x05, 0x00, 0x1B, 0x00, 0x08, 0x00, 0x1C, 0x00, -/* 0000EEC0 */ 0x00, 0x3F, 0x7E, 0x11, 0x8A, 0x07, 0xFF, 0x01, 0xFE, 0xDF, 0x02, 0x4E, 0x1C, 0xFF, 0xA2, 0x41, +/* 0000EEC0 */ 0x00, 0xBF, 0xFC, 0x22, 0x84, 0x07, 0xFF, 0x01, 0xFE, 0xDF, 0x02, 0x4E, 0x1C, 0xFF, 0xA2, 0x41, /* 0000EED0 */ 0x01, 0x00, 0x05, 0x00, 0xFE, 0x2B, 0x0D, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x03, 0x03, 0xFE, 0x2B, -/* 0000EEE0 */ 0x0D, 0x53, 0x53, 0x05, 0x02, 0x05, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +/* 0000EEE0 */ 0x0D, 0x53, 0x53, 0x01, 0x05, 0x02, 0x05, 0x04, 0x0B, 0x0B, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, /* 0000EEF0 */ 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EF00 */ 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EF10 */ 0x00, 0x00, 0x2D, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x6D, /* 0000EF20 */ 0x05, 0x06, 0x00, 0x07, 0x03, 0x00, 0x5C, 0x00, 0x06, 0x5C, 0x01, 0x03, 0x5C, 0x02, 0x02, 0xF2, /* 0000EF30 */ 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x02, 0x00, 0xA8, 0x00, 0x24, 0x00, /* 0000EF40 */ 0x00, 0x00, 0xFE, 0x6F, 0x02, 0x00, 0xFE, 0x49, 0x0D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, -/* 0000EF50 */ 0x34, 0x00, 0x00, 0x3F, 0x6E, 0x01, 0x88, 0x07, 0xFF, 0x01, 0xFE, 0xDE, 0x02, 0x48, 0x1C, 0xFF, +/* 0000EF50 */ 0x34, 0x00, 0x00, 0xBF, 0xDC, 0x02, 0x80, 0x07, 0xFF, 0x01, 0xFE, 0xDE, 0x02, 0x48, 0x1C, 0xFF, /* 0000EF60 */ 0xA2, 0x41, 0x01, 0x00, 0x04, 0x00, 0xFE, 0x8B, 0x0C, 0xFF, 0x00, 0x10, 0x01, 0x00, 0x02, 0x02, -/* 0000EF70 */ 0xFE, 0x8B, 0x0C, 0x7F, 0x7F, 0x02, 0x04, 0x05, 0x0A, 0x0A, 0x01, 0x41, 0x01, 0x01, 0x01, 0x01, +/* 0000EF70 */ 0xFE, 0x8B, 0x0C, 0x7F, 0x7F, 0x41, 0x02, 0x04, 0x05, 0x0A, 0x0A, 0x01, 0x01, 0x01, 0x01, 0x01, /* 0000EF80 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EF90 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000EFA0 */ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x1C, 0x00, 0x0A, 0x80, 0x01, 0x07, 0x00, 0x0A, 0x80, 0x1E, /* 0000EFB0 */ 0x62, 0x05, 0x04, 0x00, 0x14, 0x0F, 0x00, 0x05, 0x02, 0x09, 0x00, 0x00, 0x62, 0x05, 0x04, 0x00, /* 0000EFC0 */ 0x14, 0x03, 0x00, 0x05, 0x03, 0x09, 0x02, 0x00, 0x23, 0x04, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, /* 0000EFD0 */ 0xFE, 0x07, 0x01, 0x00, 0xFE, 0xA4, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x4B, 0x00, -/* 0000EFE0 */ 0x04, 0x00, 0x1A, 0x00, 0x00, 0x3F, 0xFE, 0x15, 0x0C, 0x00, 0xFF, 0x01, 0xFE, 0xF0, 0x02, 0x3E, +/* 0000EFE0 */ 0x04, 0x00, 0x1A, 0x00, 0x00, 0xBF, 0xFC, 0x2B, 0x08, 0x00, 0xFF, 0x01, 0xFE, 0xF0, 0x02, 0x3E, /* 0000EFF0 */ 0x12, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x03, 0x00, 0xFE, 0x5B, 0x0B, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000F000 */ 0x04, 0x04, 0xFE, 0x5B, 0x0B, 0xA9, 0xA9, 0x06, 0x05, 0x09, 0x03, 0x11, 0x0F, 0x0D, 0x01, 0x01, -/* 0000F010 */ 0x01, 0x01, 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000F000 */ 0x04, 0x04, 0xFE, 0x5B, 0x0B, 0xA9, 0xA9, 0x41, 0x06, 0x05, 0x09, 0x03, 0x11, 0x0F, 0x0D, 0x01, +/* 0000F010 */ 0x01, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000F020 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000F030 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x03, 0x2F, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x04, /* 0000F040 */ 0x01, 0x01, 0x00, 0x00, 0x00, 0x33, 0x47, 0x08, 0x02, 0xEB, 0x00, 0xEC, 0x00, 0x12, 0x03, 0x00, @@ -5263,10 +5263,10 @@ namespace Js /* 0000F060 */ 0x05, 0x08, 0x00, 0x00, 0x5C, 0x01, 0x0A, 0xEE, 0x02, 0xFF, 0x09, 0x00, 0x00, 0x28, 0x08, 0x08, /* 0000F070 */ 0x09, 0xD8, 0xFF, 0xED, 0x00, 0xA8, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x83, 0x0B, 0x05, /* 0000F080 */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x23, 0x00, 0x08, 0x00, 0x21, 0x00, 0x18, 0x00, 0x21, 0x00, -/* 0000F090 */ 0x0A, 0x00, 0x1B, 0x00, 0x00, 0x3F, 0x7E, 0x11, 0x0A, 0x00, 0xFF, 0x01, 0xFE, 0xD3, 0x02, 0x28, +/* 0000F090 */ 0x0A, 0x00, 0x1B, 0x00, 0x00, 0xBF, 0xFC, 0x22, 0x04, 0x00, 0xFF, 0x01, 0xFE, 0xD3, 0x02, 0x28, /* 0000F0A0 */ 0x1F, 0xFF, 0xA2, 0x41, 0x01, 0x00, 0x02, 0x00, 0xFE, 0x22, 0x07, 0xFF, 0x00, 0x10, 0x01, 0x00, -/* 0000F0B0 */ 0x04, 0x04, 0xFE, 0x22, 0x07, 0x73, 0x73, 0x06, 0x04, 0x08, 0x09, 0x10, 0x10, 0x01, 0x02, 0x02, -/* 0000F0C0 */ 0x41, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +/* 0000F0B0 */ 0x04, 0x04, 0xFE, 0x22, 0x07, 0x73, 0x73, 0x41, 0x06, 0x04, 0x08, 0x09, 0x10, 0x10, 0x01, 0x02, +/* 0000F0C0 */ 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000F0D0 */ 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0000F0E0 */ 0x00, 0x00, 0x03, 0x04, 0x45, 0x8F, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, /* 0000F0F0 */ 0x00, 0x07, 0x04, 0x00, 0x5C, 0x00, 0x03, 0x5C, 0x01, 0x04, 0x5C, 0x02, 0x05, 0x8F, 0x01, 0x00, diff --git a/lib/Runtime/Library/JavascriptFunction.cpp b/lib/Runtime/Library/JavascriptFunction.cpp index b9a1327fcfc..165307684a9 100644 --- a/lib/Runtime/Library/JavascriptFunction.cpp +++ b/lib/Runtime/Library/JavascriptFunction.cpp @@ -898,7 +898,7 @@ namespace Js Var functionResult; if (spreadIndices != nullptr) { - functionResult = CallSpreadFunction(functionObj, functionObj->GetEntryPoint(), newArgs, spreadIndices); + functionResult = CallSpreadFunction(functionObj, newArgs, spreadIndices); } else { @@ -941,7 +941,7 @@ namespace Js RUNTIME_ARGUMENTS(args, callInfo); - return JavascriptFunction::CallSpreadFunction(function, function->GetEntryPoint(), args, spreadIndices); + return JavascriptFunction::CallSpreadFunction(function, args, spreadIndices); } uint32 JavascriptFunction::GetSpreadSize(const Arguments args, const Js::AuxArray *spreadIndices, ScriptContext *scriptContext) @@ -1082,7 +1082,7 @@ namespace Js } } - Var JavascriptFunction::CallSpreadFunction(RecyclableObject* function, JavascriptMethod entryPoint, Arguments args, const Js::AuxArray *spreadIndices) + Var JavascriptFunction::CallSpreadFunction(RecyclableObject* function, Arguments args, const Js::AuxArray *spreadIndices) { ScriptContext* scriptContext = function->GetScriptContext(); @@ -1109,7 +1109,7 @@ namespace Js SpreadArgs(args, outArgs, spreadIndices, scriptContext); - return JavascriptFunction::CallFunction(function, entryPoint, outArgs); + return JavascriptFunction::CallFunction(function, function->GetEntryPoint(), outArgs); } Var JavascriptFunction::CallFunction(Arguments args) diff --git a/lib/Runtime/Library/JavascriptFunction.h b/lib/Runtime/Library/JavascriptFunction.h index c0f3a436e2d..60c847d196b 100644 --- a/lib/Runtime/Library/JavascriptFunction.h +++ b/lib/Runtime/Library/JavascriptFunction.h @@ -106,7 +106,7 @@ namespace Js #endif template static Var CallFunction(RecyclableObject* obj, JavascriptMethod entryPoint, Arguments args); - static Var CallSpreadFunction(RecyclableObject* obj, JavascriptMethod entryPoint, Arguments args, const Js::AuxArray *spreadIndices); + static Var CallSpreadFunction(RecyclableObject* obj, Arguments args, const Js::AuxArray *spreadIndices); static uint32 GetSpreadSize(const Arguments args, const Js::AuxArray *spreadIndices, ScriptContext *scriptContext); static void SpreadArgs(const Arguments args, Arguments& destArgs, const Js::AuxArray *spreadIndices, ScriptContext *scriptContext); static Var EntrySpreadCall(const Js::AuxArray *spreadIndices, RecyclableObject* function, CallInfo callInfo, ...); diff --git a/lib/Runtime/Library/JavascriptProxy.cpp b/lib/Runtime/Library/JavascriptProxy.cpp index c0ba53ca598..f413c8f0a96 100644 --- a/lib/Runtime/Library/JavascriptProxy.cpp +++ b/lib/Runtime/Library/JavascriptProxy.cpp @@ -1924,7 +1924,7 @@ namespace Js Var functionResult; if (spreadIndices != nullptr) { - functionResult = JavascriptFunction::CallSpreadFunction(this, this->GetEntryPoint(), args, spreadIndices); + functionResult = JavascriptFunction::CallSpreadFunction(this, args, spreadIndices); } else { diff --git a/lib/Runtime/Library/ScriptFunction.cpp b/lib/Runtime/Library/ScriptFunction.cpp index 20f9794fced..191a5d15f7e 100644 --- a/lib/Runtime/Library/ScriptFunction.cpp +++ b/lib/Runtime/Library/ScriptFunction.cpp @@ -703,7 +703,7 @@ namespace Js uint totalCacheCount = isInstInlineCacheStart + isInstInlineCacheCount; if (this->GetHasInlineCaches() && this->m_inlineCaches && this->hasOwnInlineCaches) { - Js::ScriptContext* scriptContext = this->GetFunctionBody()->GetScriptContext(); + Js::ScriptContext* scriptContext = this->GetParseableFunctionInfo()->GetScriptContext(); uint i = 0; uint unregisteredInlineCacheCount = 0; uint plainInlineCacheEnd = rootObjectLoadInlineCacheStart; diff --git a/lib/Runtime/Library/StackScriptFunction.cpp b/lib/Runtime/Library/StackScriptFunction.cpp index 9e027520def..fd7de11eeb7 100644 --- a/lib/Runtime/Library/StackScriptFunction.cpp +++ b/lib/Runtime/Library/StackScriptFunction.cpp @@ -76,8 +76,9 @@ namespace Js Assert(ThreadContext::IsOnStack(stackScriptFunction)); Assert(stackScriptFunction->boxedScriptFunction == nullptr); - FunctionBody * functionParent = stackScriptFunction->GetFunctionBody()->GetStackNestedFuncParentStrongRef(); - Assert(functionParent != nullptr); + FunctionInfo * functionInfoParent = stackScriptFunction->GetFunctionBody()->GetStackNestedFuncParentStrongRef(); + Assert(functionInfoParent != nullptr); + FunctionBody * functionParent = functionInfoParent->GetFunctionBody(); ScriptContext * scriptContext = stackScriptFunction->GetScriptContext(); ScriptFunction * boxedFunction; @@ -131,7 +132,8 @@ namespace Js nested->GetFunctionBody()->ClearStackNestedFuncParent(); } } - current = current->GetAndClearStackNestedFuncParent(); + FunctionInfo * functionInfo = current->GetAndClearStackNestedFuncParent(); + current = functionInfo ? functionInfo->GetFunctionBody() : nullptr; } while (current && current->DoStackNestedFunc()); } diff --git a/lib/Runtime/SerializableFunctionFields.h b/lib/Runtime/SerializableFunctionFields.h index 827719bf854..9e46664f00c 100644 --- a/lib/Runtime/SerializableFunctionFields.h +++ b/lib/Runtime/SerializableFunctionFields.h @@ -37,6 +37,7 @@ PROTECTED_FIELDS DECLARE_SERIALIZABLE_FIELD(charcount_t, m_cchLength, CharCount); // length of the function in code points (not bytes) DECLARE_SERIALIZABLE_FIELD(uint, m_cbLength, UInt32); // length of the function in bytes DECLARE_SERIALIZABLE_FIELD(uint, m_displayShortNameOffset, UInt32); // Offset into the display name where the short name is found + DECLARE_SERIALIZABLE_FIELD(FunctionBodyFlags, flags, FunctionBodyFlags); PUBLIC_FIELDS DECLARE_SERIALIZABLE_FIELD(UINT, scopeSlotArraySize, UInt32); @@ -67,7 +68,6 @@ PRIVATE_FIELDS DECLARE_SERIALIZABLE_FIELD(ProfileId, profiledReturnTypeCount, UInt16); DECLARE_SERIALIZABLE_FIELD(ProfileId, profiledSlotCount, UInt16); DECLARE_SERIALIZABLE_ACCESSOR_FIELD(uint, LoopCount, RegSlot); - DECLARE_SERIALIZABLE_FIELD(FunctionBodyFlags, flags, FunctionBodyFlags); DECLARE_SERIALIZABLE_FIELD(bool, m_hasFinally, Bool); DECLARE_SERIALIZABLE_FIELD(bool, hasScopeObject, Bool); DECLARE_SERIALIZABLE_FIELD(bool, hasCachedScopePropIds, Bool); From b6de595ab5fdd970b775c8a023825f0a8b73e1c5 Mon Sep 17 00:00:00 2001 From: Paul Leathers Date: Fri, 30 Sep 2016 16:19:22 -0700 Subject: [PATCH 3/6] Implement a basic heuristic for redeferral, based on experimental work that Rajat did a while back. The heuristic uses 5 constants: an initial delay, which is the number of GC's we perform before we start checking for redeferral candidates; the number of GC's to wait between redeferral checks while we're in the startup phase; the number of GC's that must have passed since a function was executed before we redefer it in the startup phase; and the same wait and inactivity constants for the main phase, to which we transition after the startup phase ends. Todo: emit jitted code to reset a function's inactivity count when the function is executed, and/or avoid redeferring a jitted function if we think it may be executed again. --- lib/Runtime/Base/FunctionBody.cpp | 17 +++- lib/Runtime/Base/FunctionBody.h | 21 ++++- lib/Runtime/Base/FunctionInfo.cpp | 2 +- lib/Runtime/Base/FunctionInfo.h | 4 + lib/Runtime/Base/ScriptContext.cpp | 15 ++- lib/Runtime/Base/ScriptContext.h | 3 +- lib/Runtime/Base/ThreadContext.cpp | 91 +++++++++++++++++-- lib/Runtime/Base/ThreadContext.h | 17 ++++ lib/Runtime/ByteCode/ByteCodeEmitter.cpp | 1 + .../Language/InterpreterStackFrame.cpp | 1 + 10 files changed, 157 insertions(+), 15 deletions(-) diff --git a/lib/Runtime/Base/FunctionBody.cpp b/lib/Runtime/Base/FunctionBody.cpp index e620203519c..41b9c35ebd0 100644 --- a/lib/Runtime/Base/FunctionBody.cpp +++ b/lib/Runtime/Base/FunctionBody.cpp @@ -496,7 +496,8 @@ namespace Js hasNestedLoop(false), recentlyBailedOutOfJittedLoopBody(false), m_isAsmJsScheduledForFullJIT(false), - m_asmJsTotalLoopCount(0) + m_asmJsTotalLoopCount(0), + inactiveCount(0) // // Even if the function does not require any locals, we must always have "R0" to propagate // a return value. By enabling this here, we avoid unnecessary conditionals during execution. @@ -529,6 +530,7 @@ namespace Js #endif { SetCountField(CounterFields::ConstantCount, 1); + SetInactiveCount(0); this->SetDefaultFunctionEntryPointInfo((FunctionEntryPointInfo*) this->GetDefaultEntryPointInfo(), DefaultEntryThunk); this->m_hasBeenParsed = true; @@ -573,11 +575,22 @@ namespace Js } } - void FunctionBody::RedeferFunction() + void FunctionBody::RedeferFunction(uint inactiveThreshold) { bool isJitCandidate = false; Assert(this->CanBeDeferred()); + if (!PHASE_FORCE(Js::RedeferralPhase, this) && !PHASE_STRESS(Js::RedeferralPhase, this)) + { + uint inactiveCount; + auto fn = [&](){ inactiveCount = 0xFFFFFFFF; }; + inactiveCount = UInt32Math::Mul(this->GetInactiveCount(), this->GetCompileCount(), fn); + if (inactiveCount < inactiveThreshold) + { + return; + } + } + // Make sure the function won't be jitted MapEntryPoints([&](int index, FunctionEntryPointInfo *entryPointInfo) { diff --git a/lib/Runtime/Base/FunctionBody.h b/lib/Runtime/Base/FunctionBody.h index 7f9ebd57846..4fcd730fbec 100644 --- a/lib/Runtime/Base/FunctionBody.h +++ b/lib/Runtime/Base/FunctionBody.h @@ -1356,6 +1356,8 @@ namespace Js void UpdateFunctionBodyImpl(FunctionBody* body); bool IsFunctionBody() const; + uint GetCompileCount() const; + void SetCompileCount(uint count); ProxyEntryPointInfo* GetDefaultEntryPointInfo() const; ScriptFunctionType * GetDeferredPrototypeType() const; ScriptFunctionType * EnsureDeferredPrototypeType(); @@ -1635,6 +1637,20 @@ namespace Js return GetFunctionInfo()->IsModule(); } + inline uint FunctionProxy::GetCompileCount() const + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + return GetFunctionInfo()->GetCompileCount(); + } + + inline void FunctionProxy::SetCompileCount(uint count) + { + Assert(GetFunctionInfo()); + Assert(GetFunctionInfo()->GetFunctionProxy() == this); + GetFunctionInfo()->SetCompileCount(count); + } + inline ParseableFunctionInfo* FunctionProxy::GetParseableFunctionInfo() const { Assert(!IsDeferredDeserializeFunction()); @@ -2362,6 +2378,7 @@ namespace Js NoWriteBarrierField committedProfiledIterations; NoWriteBarrierField m_depth; // Indicates how many times the function has been entered (so increases by one on each recursive call, decreases by one when we're done) + NoWriteBarrierField inactiveCount; uint32 interpretedCount; uint32 loopInterpreterLimit; @@ -2435,8 +2452,10 @@ namespace Js FunctionEntryPointInfo * GetEntryPointInfo(int index) const; FunctionEntryPointInfo * TryGetEntryPointInfo(int index) const; - void RedeferFunction(); + void RedeferFunction(uint inactiveThreshold); void UpdateActiveFunctionSet(BVSparse *pActiveFuncs) const; + uint GetInactiveCount() const { return inactiveCount; } + void SetInactiveCount(uint count) { inactiveCount = count; } Js::RootObjectBase * LoadRootObject() const; Js::RootObjectBase * GetRootObject() const; diff --git a/lib/Runtime/Base/FunctionInfo.cpp b/lib/Runtime/Base/FunctionInfo.cpp index a6c4cb45b7d..3259ebeda11 100644 --- a/lib/Runtime/Base/FunctionInfo.cpp +++ b/lib/Runtime/Base/FunctionInfo.cpp @@ -7,7 +7,7 @@ namespace Js { FunctionInfo::FunctionInfo(JavascriptMethod entryPoint, Attributes attributes, LocalFunctionId functionId, FunctionProxy* functionBodyImpl) - : originalEntryPoint(entryPoint), attributes(attributes), functionBodyImpl(functionBodyImpl), functionId(functionId) + : originalEntryPoint(entryPoint), attributes(attributes), functionBodyImpl(functionBodyImpl), functionId(functionId), compileCount(0) { #if !DYNAMIC_INTERPRETER_THUNK Assert(entryPoint != nullptr); diff --git a/lib/Runtime/Base/FunctionInfo.h b/lib/Runtime/Base/FunctionInfo.h index f5355e0524d..0b23984e70a 100644 --- a/lib/Runtime/Base/FunctionInfo.h +++ b/lib/Runtime/Base/FunctionInfo.h @@ -102,6 +102,9 @@ namespace Js LocalFunctionId GetLocalFunctionId() const { return functionId; } void SetLocalFunctionId(LocalFunctionId functionId) { this->functionId = functionId; } + uint GetCompileCount() const { return compileCount; } + void SetCompileCount(uint count) { compileCount = count; } + virtual void Finalize(bool isShutdown) override { } @@ -125,6 +128,7 @@ namespace Js // However, proxies are not allocated as write barrier memory currently so its fine to not set the write barrier for this field FunctionProxy * functionBodyImpl; // Implementation of the function- null if the function doesn't have a body LocalFunctionId functionId; // Per host source context (source file) function Id + uint compileCount; Attributes attributes; }; diff --git a/lib/Runtime/Base/ScriptContext.cpp b/lib/Runtime/Base/ScriptContext.cpp index f98eb056006..040eaeb1d11 100644 --- a/lib/Runtime/Base/ScriptContext.cpp +++ b/lib/Runtime/Base/ScriptContext.cpp @@ -1018,14 +1018,25 @@ namespace Js } #endif - void ScriptContext::RedeferFunctionBodies(ActiveFunctionSet *pActiveFuncs) + void ScriptContext::UpdateInactiveCounts() + { + Assert(!this->IsClosed()); + + auto fn = [&](FunctionBody *functionBody) { + functionBody->SetInactiveCount(UInt32Math::Add(functionBody->GetInactiveCount(), 1)); + }; + + this->MapFunction(fn); + } + + void ScriptContext::RedeferFunctionBodies(ActiveFunctionSet *pActiveFuncs, uint inactiveThreshold) { Assert(!this->IsClosed()); auto fn = [&](FunctionBody *functionBody) { if (functionBody->GetFunctionInfo()->GetFunctionProxy() == functionBody && functionBody->CanBeDeferred() && !pActiveFuncs->Test(functionBody->GetFunctionNumber()) && functionBody->GetByteCode() != nullptr && functionBody->GetCanDefer()) { - functionBody->RedeferFunction(); + functionBody->RedeferFunction(inactiveThreshold); } }; diff --git a/lib/Runtime/Base/ScriptContext.h b/lib/Runtime/Base/ScriptContext.h index 4088aac394a..2b07af027c2 100644 --- a/lib/Runtime/Base/ScriptContext.h +++ b/lib/Runtime/Base/ScriptContext.h @@ -425,7 +425,8 @@ namespace Js const ScriptContextBase* GetScriptContextBase() const { return static_cast(this); } - void RedeferFunctionBodies(ActiveFunctionSet *pActive); + void UpdateInactiveCounts(); + void RedeferFunctionBodies(ActiveFunctionSet *pActive, uint inactiveThreshold); bool DoUndeferGlobalFunctions() const; bool IsUndeclBlockVar(Var var) const { return this->javascriptLibrary->IsUndeclBlockVar(var); } diff --git a/lib/Runtime/Base/ThreadContext.cpp b/lib/Runtime/Base/ThreadContext.cpp index cd100935d74..9e064f158c3 100644 --- a/lib/Runtime/Base/ThreadContext.cpp +++ b/lib/Runtime/Base/ThreadContext.cpp @@ -188,6 +188,8 @@ ThreadContext::ThreadContext(AllocationPolicyManager * allocationPolicyManager, loopDepth(0), maxGlobalFunctionExecTime(0.0), isAllJITCodeInPreReservedRegion(true), + redeferralState(InitialRedeferralState), + gcSinceLastRedeferral(0), tridentLoadAddress(nullptr), debugManager(nullptr) #if ENABLE_TTD @@ -2429,29 +2431,102 @@ ThreadContext::PostCollectionCallBack() } } - HRESULT hr = S_OK; - BEGIN_TRANSLATE_OOM_TO_HRESULT + if (PHASE_ON1(Js::RedeferralPhase) && this->redeferralState != InitialRedeferralState) { - this->RedeferFunctionBodies(); + this->UpdateInactiveCounts(); + } + if (this->DoRedeferralOnGc()) + { + HRESULT hr = S_OK; + BEGIN_TRANSLATE_OOM_TO_HRESULT + { + this->RedeferFunctionBodies(); + } + END_TRANSLATE_OOM_TO_HRESULT(hr); + if (hr == S_OK) + { + gcSinceLastRedeferral = 0; + if (redeferralState == StartupRedeferralState) + { + redeferralState = MainRedeferralState; + } + } } - END_TRANSLATE_OOM_TO_HRESULT(hr); } } void -ThreadContext::RedeferFunctionBodies() +ThreadContext::UpdateInactiveCounts() +{ + Js::ScriptContext *scriptContext; + for (scriptContext = GetScriptContextList(); scriptContext; scriptContext = scriptContext->next) + { + if (scriptContext->IsClosed()) + { + continue; + } + scriptContext->UpdateInactiveCounts(); + } +} + +bool +ThreadContext::DoRedeferralOnGc() { - // TODO: Heuristic to decide whether we need/want to redefer now. if (!PHASE_ON1(Js::RedeferralPhase)) { - return; + return false; } + if (PHASE_FORCE1(Js::RedeferralPhase)) + { + return true; + } + + gcSinceLastRedeferral++; + Assert(gcSinceLastRedeferral != 0); + switch(redeferralState) + { + case InitialRedeferralState: + if (gcSinceLastRedeferral == InitialRedeferralDelay) + { + redeferralState = StartupRedeferralState; + } + return false; + + case StartupRedeferralState: + return (gcSinceLastRedeferral >= StartupRedeferralCheckInterval); + + case MainRedeferralState: + return (gcSinceLastRedeferral >= MainRedeferralCheckInterval); + + default: + Assert(0); + return false; + } +} + +void +ThreadContext::RedeferFunctionBodies() +{ // Collect the set of active functions. ActiveFunctionSet *pActiveFuncs = nullptr; pActiveFuncs = Anew(this->GetThreadAlloc(), ActiveFunctionSet, this->GetThreadAlloc()); this->GetActiveFunctions(pActiveFuncs); + uint inactiveThreshold = 0; + switch (redeferralState) + { + case StartupRedeferralState: + inactiveThreshold = StartupRedeferralInactiveThreshold; + break; + case MainRedeferralState: + inactiveThreshold = MainRedeferralInactiveThreshold; + break; + default: + Assert(PHASE_FORCE1(Js::RedeferralPhase) || PHASE_STRESS1(Js::RedeferralPhase)); + break; + } + Js::ScriptContext *scriptContext; for (scriptContext = GetScriptContextList(); scriptContext; scriptContext = scriptContext->next) { @@ -2459,7 +2534,7 @@ ThreadContext::RedeferFunctionBodies() { continue; } - scriptContext->RedeferFunctionBodies(pActiveFuncs); + scriptContext->RedeferFunctionBodies(pActiveFuncs, inactiveThreshold); } Adelete(this->GetThreadAlloc(), pActiveFuncs); diff --git a/lib/Runtime/Base/ThreadContext.h b/lib/Runtime/Base/ThreadContext.h index 6a446bbe7f7..432b85a0989 100644 --- a/lib/Runtime/Base/ThreadContext.h +++ b/lib/Runtime/Base/ThreadContext.h @@ -666,6 +666,21 @@ class ThreadContext sealed : uint functionCount; uint sourceInfoCount; + enum RedeferralState + { + InitialRedeferralState, + StartupRedeferralState, + MainRedeferralState + }; + RedeferralState redeferralState; + uint gcSinceLastRedeferral; + + static const uint InitialRedeferralDelay = 5; + static const uint StartupRedeferralCheckInterval = 10; + static const uint StartupRedeferralInactiveThreshold = 5; + static const uint MainRedeferralCheckInterval = 20; + static const uint MainRedeferralInactiveThreshold = 10; + Js::TypeId nextTypeId; uint32 polymorphicCacheState; Js::TypeId wellKnownHostTypeHTMLAllCollectionTypeId; @@ -1190,8 +1205,10 @@ class ThreadContext sealed : static size_t GetProcessCodeSize() { return processNativeCodeSize; } size_t GetSourceSize() { return sourceCodeSize; } + void UpdateInactiveCounts(); void RedeferFunctionBodies(); void GetActiveFunctions(ActiveFunctionSet * ppActive); + bool DoRedeferralOnGc(); Js::ScriptEntryExitRecord * GetScriptEntryExit() const { return entryExitRecord; } void RegisterCodeGenRecyclableData(Js::CodeGenRecyclableData *const codeGenRecyclableData); diff --git a/lib/Runtime/ByteCode/ByteCodeEmitter.cpp b/lib/Runtime/ByteCode/ByteCodeEmitter.cpp index fd5971c57a0..6727c29f4a9 100644 --- a/lib/Runtime/ByteCode/ByteCodeEmitter.cpp +++ b/lib/Runtime/ByteCode/ByteCodeEmitter.cpp @@ -3461,6 +3461,7 @@ void ByteCodeGenerator::EmitOneFunction(ParseNode *pnode) byteCodeFunction->SetInitialDefaultEntryPoint(); + byteCodeFunction->SetCompileCount(UInt32Math::Add(byteCodeFunction->GetCompileCount(), 1)); #ifdef ENABLE_DEBUG_CONFIG_OPTIONS if (byteCodeFunction->IsInDebugMode() != scriptContext->IsScriptContextInDebugMode()) // debug mode mismatch diff --git a/lib/Runtime/Language/InterpreterStackFrame.cpp b/lib/Runtime/Language/InterpreterStackFrame.cpp index 582e1b18317..26859706bfa 100644 --- a/lib/Runtime/Language/InterpreterStackFrame.cpp +++ b/lib/Runtime/Language/InterpreterStackFrame.cpp @@ -1733,6 +1733,7 @@ namespace Js Assert(threadContext->IsInScript()); FunctionBody* executeFunction = JavascriptFunction::FromVar(function)->GetFunctionBody(); + executeFunction->SetInactiveCount(0); #ifdef ENABLE_DEBUG_CONFIG_OPTIONS if (!isAsmJs && executeFunction->IsInDebugMode() != functionScriptContext->IsScriptContextInDebugMode()) // debug mode mismatch { From 850bdc52ee9ff5241908342153d1cb09d2282211 Mon Sep 17 00:00:00 2001 From: Paul Leathers Date: Thu, 6 Oct 2016 11:53:09 -0700 Subject: [PATCH 4/6] a --- lib/Backend/Lower.cpp | 45 +++++----- lib/Backend/Lower.h | 6 +- lib/Parser/Parse.cpp | 2 +- lib/Parser/ptree.h | 2 + lib/Runtime/Base/FunctionBody.cpp | 89 ++++++++----------- lib/Runtime/Base/FunctionBody.h | 25 +++--- lib/Runtime/ByteCode/ByteCodeDumper.cpp | 6 +- lib/Runtime/ByteCode/ByteCodeEmitter.cpp | 8 +- lib/Runtime/ByteCode/ByteCodeGenerator.cpp | 55 +++++++++--- lib/Runtime/ByteCode/ByteCodeGenerator.h | 2 +- lib/Runtime/ByteCode/ByteCodeSerializer.cpp | 2 +- lib/Runtime/ByteCode/FuncInfo.h | 2 +- lib/Runtime/ByteCode/ScopeInfo.cpp | 12 ++- lib/Runtime/ByteCode/ScopeInfo.h | 5 +- lib/Runtime/Debug/TTEvents.cpp | 4 +- lib/Runtime/Debug/TTRuntmeInfoTracker.cpp | 2 +- lib/Runtime/Debug/TTSnapValues.cpp | 2 +- .../Language/InterpreterStackFrame.cpp | 14 +-- lib/Runtime/Language/JavascriptOperators.cpp | 2 +- .../IntlEngineInterfaceExtensionObject.cpp | 2 +- .../Library/JavascriptGeneratorFunction.cpp | 4 +- .../Library/JavascriptGeneratorFunction.h | 2 +- lib/Runtime/Library/ScriptFunction.cpp | 6 +- lib/Runtime/Library/ScriptFunction.h | 2 +- lib/Runtime/Library/StackScriptFunction.cpp | 12 +-- lib/Runtime/Library/StackScriptFunction.h | 2 +- 26 files changed, 179 insertions(+), 136 deletions(-) diff --git a/lib/Backend/Lower.cpp b/lib/Backend/Lower.cpp index c335a7e1f3e..cf629d80e4b 100644 --- a/lib/Backend/Lower.cpp +++ b/lib/Backend/Lower.cpp @@ -5393,7 +5393,7 @@ Lowerer::LoadFunctionBodyAsArgument(IR::Instr *instr, IR::IntConstOpnd * functio // At which point the deferred function proxy may be collect. // Just pass it the address where we will find the function proxy/body - Js::FunctionProxyPtrPtr proxyRef = instr->m_func->GetJnFunction()->GetNestedFuncReference((uint)functionBodySlotOpnd->GetValue()); + Js::FunctionInfoPtrPtr proxyRef = instr->m_func->GetJnFunction()->GetNestedFuncReference((uint)functionBodySlotOpnd->GetValue()); AssertMsg(proxyRef, "Expected FunctionProxy for index of NewScFunc or NewScGenFunc opnd"); AssertMsg(*proxyRef, "Expected FunctionProxy for index of NewScFunc or NewScGenFunc opnd"); @@ -6083,7 +6083,7 @@ Lowerer::LowerIsInst(IR::Instr * isInstInstr, IR::JnHelperMethod helperMethod) } void -Lowerer::GenerateStackScriptFunctionInit(StackSym * stackSym, Js::FunctionProxyPtrPtr nestedProxy) +Lowerer::GenerateStackScriptFunctionInit(StackSym * stackSym, Js::FunctionInfoPtrPtr nestedInfo) { Func * func = this->m_func; Assert(func->HasAnyStackNestedFunc()); @@ -6097,7 +6097,7 @@ Lowerer::GenerateStackScriptFunctionInit(StackSym * stackSym, Js::FunctionProxyP // Currently we don't initialize the environment until we actually allocate the function, we also // walk the list of stack function when we need to box them. so we should use initialize it to NullFrameDisplay - GenerateStackScriptFunctionInit(addressOpnd, nestedProxy, + GenerateStackScriptFunctionInit(addressOpnd, nestedInfo, IR::AddrOpnd::New((Js::Var)&Js::NullFrameDisplay, IR::AddrOpndKindDynamicMisc, func), insertBeforeInstr); // Establish the next link @@ -6107,26 +6107,29 @@ Lowerer::GenerateStackScriptFunctionInit(StackSym * stackSym, Js::FunctionProxyP void Lowerer::GenerateScriptFunctionInit(IR::RegOpnd * regOpnd, IR::Opnd * vtableAddressOpnd, - Js::FunctionProxyPtrPtr nestedProxy, IR::Opnd * envOpnd, IR::Instr * insertBeforeInstr, bool isZeroed) + Js::FunctionInfoPtrPtr nestedInfo, IR::Opnd * envOpnd, IR::Instr * insertBeforeInstr, bool isZeroed) { Func * func = this->m_func; IR::Opnd * functionProxyOpnd; - Js::FunctionProxy * functionProxy = *nestedProxy; + Js::FunctionInfo * functionInfo = *nestedInfo; IR::Opnd * typeOpnd = nullptr; + IR::Opnd * functionInfoOpnd = nullptr; bool doCheckTypeOpnd = true; - if (functionProxy->IsDeferred()) + if (functionInfo->IsDeferred()) { + functionInfoOpnd = IR::RegOpnd::New(TyMachPtr, func); + InsertMove(functionInfoOpnd, IR::MemRefOpnd::New((Js::FunctionInfo**) nestedInfo, TyMachPtr, func), insertBeforeInstr); functionProxyOpnd = IR::RegOpnd::New(TyMachPtr, func); - InsertMove(functionProxyOpnd, IR::MemRefOpnd::New((Js::FunctionProxy**) nestedProxy, TyMachPtr, func), insertBeforeInstr); + InsertMove(functionProxyOpnd, IR::IndirOpnd::New(functionInfoOpnd->AsRegOpnd(), Js::FunctionInfo::GetFunctionBodyImplOffset(), TyVar, func), insertBeforeInstr); typeOpnd = IR::RegOpnd::New(TyMachPtr, func); InsertMove(typeOpnd, IR::IndirOpnd::New(functionProxyOpnd->AsRegOpnd(), Js::FunctionProxy::GetOffsetOfDeferredPrototypeType(), TyMachPtr, func), insertBeforeInstr); } else { - Js::FunctionBody * functionBody = functionProxy->GetFunctionBody(); + Js::FunctionBody * functionBody = functionInfo->GetFunctionBody(); functionProxyOpnd = CreateFunctionBodyOpnd(functionBody); - Js::ScriptFunctionType * type = functionProxy->GetDeferredPrototypeType(); + Js::ScriptFunctionType * type = functionInfo->GetFunctionProxy()->GetDeferredPrototypeType(); if (type != nullptr) { typeOpnd = IR::AddrOpnd::New(type, IR::AddrOpndKindDynamicType, func); @@ -6164,14 +6167,16 @@ Lowerer::GenerateScriptFunctionInit(IR::RegOpnd * regOpnd, IR::Opnd * vtableAddr GenerateMemInit(regOpnd, Js::ScriptFunction::GetOffsetOfConstructorCache(), LoadLibraryValueOpnd(insertBeforeInstr, LibraryValue::ValueConstructorCacheDefaultInstance), insertBeforeInstr, isZeroed); - IR::Opnd *functionInfoOpnd; - if (functionProxyOpnd->IsRegOpnd()) + if (!functionInfoOpnd) { - functionInfoOpnd = IR::IndirOpnd::New(functionProxyOpnd->AsRegOpnd(), Js::FunctionProxy::GetOffsetOfFunctionInfo(), TyMachReg, func); - } - else - { - functionInfoOpnd = IR::MemRefOpnd::New((BYTE*)functionProxyOpnd->AsAddrOpnd()->m_address + Js::FunctionProxy::GetOffsetOfFunctionInfo(), TyMachReg, func); + if (functionProxyOpnd->IsRegOpnd()) + { + functionInfoOpnd = IR::IndirOpnd::New(functionProxyOpnd->AsRegOpnd(), Js::FunctionProxy::GetOffsetOfFunctionInfo(), TyMachReg, func); + } + else + { + functionInfoOpnd = IR::MemRefOpnd::New((BYTE*)functionProxyOpnd->AsAddrOpnd()->m_address + Js::FunctionProxy::GetOffsetOfFunctionInfo(), TyMachReg, func); + } } GenerateMemInit(regOpnd, Js::ScriptFunction::GetOffsetOfFunctionInfo(), functionInfoOpnd, insertBeforeInstr, isZeroed); GenerateMemInit(regOpnd, Js::ScriptFunction::GetOffsetOfEnvironment(), envOpnd, insertBeforeInstr, isZeroed); @@ -6180,12 +6185,12 @@ Lowerer::GenerateScriptFunctionInit(IR::RegOpnd * regOpnd, IR::Opnd * vtableAddr } void -Lowerer::GenerateStackScriptFunctionInit(IR::RegOpnd * regOpnd, Js::FunctionProxyPtrPtr nestedProxy, IR::Opnd * envOpnd, IR::Instr * insertBeforeInstr) +Lowerer::GenerateStackScriptFunctionInit(IR::RegOpnd * regOpnd, Js::FunctionInfoPtrPtr nestedInfo, IR::Opnd * envOpnd, IR::Instr * insertBeforeInstr) { Func * func = this->m_func; GenerateScriptFunctionInit(regOpnd, LoadVTableValueOpnd(insertBeforeInstr, VTableValue::VtableStackScriptFunction), - nestedProxy, envOpnd, insertBeforeInstr); + nestedInfo, envOpnd, insertBeforeInstr); InsertMove(IR::IndirOpnd::New(regOpnd, Js::StackScriptFunction::GetOffsetOfBoxedScriptFunction(), TyMachPtr, func), IR::AddrOpnd::NewNull(func), insertBeforeInstr); } @@ -6238,7 +6243,7 @@ Lowerer::GenerateNewStackScFunc(IR::Instr * newScFuncInstr, IR::RegOpnd ** ppEnv IR::IntConstOpnd::New(Js::FunctionBody::Flags_StackNestedFunc, TyInt8, func, true), Js::OpCode::BrEq_A, labelNoStackFunc, newScFuncInstr); - Js::FunctionProxyPtrPtr nestedProxy = func->GetJnFunction()->GetNestedFuncReference(index); + Js::FunctionInfoPtrPtr nestedInfo = func->GetJnFunction()->GetNestedFuncReference(index); IR::Instr * instrAssignDst; IR::RegOpnd * envOpnd = *ppEnvOpnd; if (!func->IsLoopBody()) @@ -6247,7 +6252,7 @@ Lowerer::GenerateNewStackScFunc(IR::Instr * newScFuncInstr, IR::RegOpnd ** ppEnv StackSym * stackSym = StackSym::New(TyMisc, func); // ScriptFunction and it's next pointer this->m_func->StackAllocate(stackSym, sizeof(Js::StackScriptFunction) + sizeof(Js::StackScriptFunction *)); - GenerateStackScriptFunctionInit(stackSym, nestedProxy); + GenerateStackScriptFunctionInit(stackSym, nestedInfo); InsertMove(IR::SymOpnd::New(stackSym, Js::ScriptFunction::GetOffsetOfEnvironment(), TyMachPtr, func), envOpnd, diff --git a/lib/Backend/Lower.h b/lib/Backend/Lower.h index dff437718ec..96b609cf33d 100644 --- a/lib/Backend/Lower.h +++ b/lib/Backend/Lower.h @@ -144,10 +144,10 @@ class Lowerer void EnsureZeroLastStackFunctionNext(); void AllocStackClosure(); IR::Instr * GenerateNewStackScFunc(IR::Instr * newScFuncInstr, IR::RegOpnd ** ppEnvOpnd); - void GenerateStackScriptFunctionInit(StackSym * stackSym, Js::FunctionProxyPtrPtr nestedProxy); + void GenerateStackScriptFunctionInit(StackSym * stackSym, Js::FunctionInfoPtrPtr nestedInfo); void GenerateScriptFunctionInit(IR::RegOpnd * regOpnd, IR::Opnd * vtableAddressOpnd, - Js::FunctionProxyPtrPtr nestedProxy, IR::Opnd * envOpnd, IR::Instr * insertBeforeInstr, bool isZeroed = false); - void GenerateStackScriptFunctionInit(IR::RegOpnd * regOpnd, Js::FunctionProxyPtrPtr nestedProxy, IR::Opnd * envOpnd, IR::Instr * insertBeforeInstr); + Js::FunctionInfoPtrPtr nestedProxy, IR::Opnd * envOpnd, IR::Instr * insertBeforeInstr, bool isZeroed = false); + void GenerateStackScriptFunctionInit(IR::RegOpnd * regOpnd, Js::FunctionInfoPtrPtr nestedProxy, IR::Opnd * envOpnd, IR::Instr * insertBeforeInstr); IR::Instr * LowerProfiledStFld(IR::JitProfilingInstr * instr, Js::PropertyOperationFlags flags); IR::Instr * LowerStFld(IR::Instr * stFldInstr, IR::JnHelperMethod helperMethod, IR::JnHelperMethod polymorphicHelperMethod, bool withInlineCache, IR::LabelInstr *ppBailOutLabel = nullptr, bool isHelper = false, bool withPutFlags = false, Js::PropertyOperationFlags flags = Js::PropertyOperation_None); IR::Instr * LowerScopedStFld(IR::Instr * stFldInstr, IR::JnHelperMethod helperMethod, bool withInlineCache, diff --git a/lib/Parser/Parse.cpp b/lib/Parser/Parse.cpp index 79520701103..ae3ad05b232 100644 --- a/lib/Parser/Parse.cpp +++ b/lib/Parser/Parse.cpp @@ -4892,7 +4892,7 @@ bool Parser::ParseFncDeclHelper(ParseNodePtr pnodeFnc, LPCOLESTR pNameHint, usho && !fModule ); - pnodeFnc->sxFnc.SetCanBeDeferred(isTopLevelDeferredFunc && !pnodeFnc->sxFnc.IsGenerator()); + pnodeFnc->sxFnc.SetCanBeDeferred(isTopLevelDeferredFunc && PnFnc::CanBeRedeferred(pnodeFnc->sxFnc.fncFlags)); isTopLevelDeferredFunc = isTopLevelDeferredFunc && !isDeferredFnc; if (!fLambda && diff --git a/lib/Parser/ptree.h b/lib/Parser/ptree.h index b3c2821ce76..a4d39a45bfe 100644 --- a/lib/Parser/ptree.h +++ b/lib/Parser/ptree.h @@ -250,6 +250,8 @@ struct PnFnc static const int32 MaxStackClosureAST = 800000; + static bool CanBeRedeferred(unsigned int flags) { return !(flags & (kFunctionIsGenerator | kFunctionIsAsync)); } + private: void SetFlags(uint flags, bool set) { diff --git a/lib/Runtime/Base/FunctionBody.cpp b/lib/Runtime/Base/FunctionBody.cpp index 41b9c35ebd0..776e2ec2037 100644 --- a/lib/Runtime/Base/FunctionBody.cpp +++ b/lib/Runtime/Base/FunctionBody.cpp @@ -73,7 +73,6 @@ namespace Js m_isPublicLibraryCode(false), m_scriptContext(scriptContext), m_utf8SourceInfo(utf8SourceInfo), - m_referenceInParentFunction(nullptr), m_functionNumber(functionNumber), m_defaultEntryPointInfo(nullptr) { @@ -611,12 +610,6 @@ namespace Js ParseableFunctionInfo * parseableFunctionInfo = Js::ParseableFunctionInfo::NewDeferredFunctionFromFunctionBody(this); - if (this->m_referenceInParentFunction) - { - Assert(*this->m_referenceInParentFunction == this); - *m_referenceInParentFunction = parseableFunctionInfo; - } - FunctionInfo * functionInfo = this->GetFunctionInfo(); this->MapFunctionObjectTypes([&](DynamicType* type) @@ -1130,7 +1123,6 @@ namespace Js CopyDeferParseField(m_grfscr); other->SetScopeInfo(this->GetScopeInfo()); CopyDeferParseField(m_utf8SourceHasBeenSet); - CopyDeferParseField(m_referenceInParentFunction); #if DBG CopyDeferParseField(deferredParseNextFunctionId); CopyDeferParseField(scopeObjectSize); @@ -1152,6 +1144,7 @@ namespace Js CopyDeferParseField(m_cbStartOffset); CopyDeferParseField(m_cbLength); + this->CopyNestedArray(other); #undef CopyDeferParseField } @@ -1161,19 +1154,20 @@ namespace Js other->CopySourceInfo(this); } - void FunctionProxy::SetReferenceInParentFunction(FunctionProxyPtrPtr reference) + void ParseableFunctionInfo::CopyNestedArray(ParseableFunctionInfo * other) { - // No need to tag the reference because the first field of the nested array - // is count, so the reference here won't be same as address of the parent nested - // array (even for index 0) - this->m_referenceInParentFunction = reference; - } + NestedArray * thisNestedArray = this->GetNestedArray(); + NestedArray * otherNestedArray = other->GetNestedArray(); + if (thisNestedArray == nullptr) + { + Assert(otherNestedArray == nullptr); + return; + } + Assert(otherNestedArray->nestedCount == thisNestedArray->nestedCount); - void FunctionProxy::UpdateReferenceInParentFunction(FunctionProxy* newFunctionInfo) - { - if (this->m_referenceInParentFunction) + for (uint i = 0; i < thisNestedArray->nestedCount; i++) { - *m_referenceInParentFunction = newFunctionInfo; + otherNestedArray->functionInfoArray[i] = thisNestedArray->functionInfoArray[i]; } } @@ -1312,8 +1306,6 @@ namespace Js ,m_wasEverAsmjsMode(proxy->m_wasEverAsmjsMode) #endif { - proxy->Copy(this); - FunctionInfo * functionInfo = proxy->GetFunctionInfo(); this->functionInfo = functionInfo; @@ -1328,6 +1320,8 @@ namespace Js nestedArray = nullptr; } + proxy->Copy(this); + SetBoundPropertyRecords(proxy->GetBoundPropertyRecords()); SetDisplayName(proxy->GetDisplayName(), proxy->GetDisplayNameLength(), proxy->GetShortDisplayNameOffset()); } @@ -1388,8 +1382,8 @@ namespace Js // Initialize nested function array, update back pointers for (uint i = 0; i < nestedCount; i++) { - FunctionProxy * nestedProxy = functionBody->GetNestedFunc(i); - info->SetNestedFunc(nestedProxy, i, 0); + FunctionInfo * nestedInfo = functionBody->GetNestedFunc(i); + info->SetNestedFunc(nestedInfo, i, 0); } // Update function objects @@ -1567,23 +1561,21 @@ namespace Js this->SetDeferredStubs(BuildDeferredStubTree(pnodeFnc, recycler)); } - FunctionProxyArray ParseableFunctionInfo::GetNestedFuncArray() + FunctionInfoArray ParseableFunctionInfo::GetNestedFuncArray() { Assert(GetNestedArray() != nullptr); - return GetNestedArray()->functionProxyArray; + return GetNestedArray()->functionInfoArray; } - void ParseableFunctionInfo::SetNestedFunc(FunctionProxy* nestedFunc, uint index, uint32 flags) + void ParseableFunctionInfo::SetNestedFunc(FunctionInfo* nestedFunc, uint index, uint32 flags) { AssertMsg(index < this->GetNestedCount(), "Trying to write past the nested func array"); - FunctionProxyArray nested = this->GetNestedFuncArray(); + FunctionInfoArray nested = this->GetNestedFuncArray(); nested[index] = nestedFunc; if (nestedFunc) { - nestedFunc->SetReferenceInParentFunction(GetNestedFuncReference(index)); - if (!this->GetSourceContextInfo()->IsDynamic() && nestedFunc->IsDeferredParseFunction() && nestedFunc->GetParseableFunctionInfo()->GetIsDeclaration() && this->GetIsTopLevel() && !(flags & fscrEvalCode)) { this->GetUtf8SourceInfo()->TrackDeferredFunction(nestedFunc->GetLocalFunctionId(), nestedFunc->GetParseableFunctionInfo()); @@ -1592,27 +1584,32 @@ namespace Js } - FunctionProxy* ParseableFunctionInfo::GetNestedFunc(uint index) + FunctionInfo* ParseableFunctionInfo::GetNestedFunc(uint index) { return *(GetNestedFuncReference(index)); } - FunctionProxyPtrPtr ParseableFunctionInfo::GetNestedFuncReference(uint index) + FunctionProxy* ParseableFunctionInfo::GetNestedFunctionProxy(uint index) + { + FunctionInfo *info = GetNestedFunc(index); + return info ? info->GetFunctionProxy() : nullptr; + } + + FunctionInfoPtrPtr ParseableFunctionInfo::GetNestedFuncReference(uint index) { AssertMsg(index < this->GetNestedCount(), "Trying to write past the nested func array"); - FunctionProxyArray nested = this->GetNestedFuncArray(); + FunctionInfoArray nested = this->GetNestedFuncArray(); return &nested[index]; } ParseableFunctionInfo* ParseableFunctionInfo::GetNestedFunctionForExecution(uint index) { - FunctionProxy* currentNestedFunction = this->GetNestedFunc(index); + FunctionInfo* currentNestedFunction = this->GetNestedFunc(index); Assert(currentNestedFunction); if (currentNestedFunction->IsDeferredDeserializeFunction()) { - currentNestedFunction = currentNestedFunction->EnsureDeserialized(); - this->SetNestedFunc(currentNestedFunction, index, 0u); + currentNestedFunction->GetFunctionProxy()->EnsureDeserialized(); } return currentNestedFunction->GetParseableFunctionInfo(); @@ -1627,19 +1624,6 @@ namespace Js functionInfo->SetFunctionProxy(body); body->SetFunctionInfo(functionInfo); body->SetAttributes((FunctionInfo::Attributes)(functionInfo->GetAttributes() & ~(FunctionInfo::Attributes::DeferredParse | FunctionInfo::Attributes::DeferredDeserialize))); - this->UpdateReferenceInParentFunction(body); - } - - void ParseableFunctionInfo::ClearNestedFunctionParentFunctionReference() - { - this->ForEachNestedFunc([](FunctionProxy* proxy, uint32 index) - { - if (proxy) - { - proxy->SetReferenceInParentFunction(nullptr); - } - return true; - }); } // @@ -3584,8 +3568,13 @@ namespace Js void FunctionBody::SetStackNestedFuncParent(FunctionInfo * parentFunctionInfo) { FunctionBody * parentFunctionBody = parentFunctionInfo->GetFunctionBody(); - Assert(this->GetStackNestedFuncParent() == nullptr); - Assert(CanDoStackNestedFunc()); + RecyclerWeakReference* parent = this->GetStackNestedFuncParent(); + if (parent != nullptr) + { + Assert(parent->Get() == parentFunctionInfo); + return; + } +// Assert(CanDoStackNestedFunc()); Assert(parentFunctionBody->DoStackNestedFunc()); this->SetAuxPtr(AuxPointerType::StackNestedFuncParent, this->GetScriptContext()->GetRecycler()->CreateWeakReferenceHandle(parentFunctionInfo)); @@ -7135,7 +7124,7 @@ namespace Js #endif this->Cleanup(isShutdown); this->CleanupSourceInfo(isShutdown); - this->ClearNestedFunctionParentFunctionReference(); +// this->ClearNestedFunctionParentFunctionReference(); this->CleanupFunctionProxyCounters(); } diff --git a/lib/Runtime/Base/FunctionBody.h b/lib/Runtime/Base/FunctionBody.h index 4fcd730fbec..92d98794aa8 100644 --- a/lib/Runtime/Base/FunctionBody.h +++ b/lib/Runtime/Base/FunctionBody.h @@ -1215,8 +1215,8 @@ namespace Js class FunctionProxy; - typedef FunctionProxy** FunctionProxyArray; - typedef FunctionProxy** FunctionProxyPtrPtr; + typedef FunctionInfo** FunctionInfoArray; + typedef FunctionInfo** FunctionInfoPtrPtr; // // FunctionProxy represents a user defined function @@ -1341,8 +1341,6 @@ namespace Js ScriptContext* GetScriptContext() const; Utf8SourceInfo* GetUtf8SourceInfo() const { return this->m_utf8SourceInfo; } void SetUtf8SourceInfo(Utf8SourceInfo* utf8SourceInfo) { m_utf8SourceInfo = utf8SourceInfo; } - void SetReferenceInParentFunction(FunctionProxyPtrPtr reference); - void UpdateReferenceInParentFunction(FunctionProxy* newFunctionInfo); bool IsInDebugMode() const { return this->m_utf8SourceInfo->IsInDebugMode(); } DWORD_PTR GetSecondaryHostSourceContext() const; @@ -1434,7 +1432,7 @@ namespace Js NoWriteBarrierPtr m_scriptContext; // Memory context for this function body WriteBarrierPtr m_utf8SourceInfo; // WriteBarrier-TODO: Consider changing this to NoWriteBarrierPtr, and skip tagging- also, tagging is likely unnecessary since that pointer in question is likely not resolvable - FunctionProxyPtrPtr m_referenceInParentFunction; // Reference to nested function reference to this function in the parent function body (tagged to not be actual reference) +// FunctionProxyPtrPtr m_referenceInParentFunction; // Reference to nested function reference to this function in the parent function body (tagged to not be actual reference) WriteBarrierPtr deferredPrototypeType; WriteBarrierPtr m_defaultEntryPointInfo; // The default entry point info for the function proxy @@ -1712,7 +1710,7 @@ namespace Js { NestedArray(uint32 count) :nestedCount(count) {} uint32 nestedCount; - FunctionProxy* functionProxyArray[0]; + FunctionInfo* functionInfoArray[0]; }; template void ForEachNestedFunc(Fn fn) @@ -1722,7 +1720,7 @@ namespace Js { for (uint i = 0; i < nestedArray->nestedCount; i++) { - if (!fn(nestedArray->functionProxyArray[i], i)) + if (!fn(nestedArray->functionInfoArray[i]->GetFunctionProxy(), i)) { break; } @@ -1923,8 +1921,9 @@ namespace Js } void SetSourceInfo(uint sourceIndex, ParseNodePtr node, bool isEval, bool isDynamicFunction); - void Copy(ParseableFunctionInfo * proxy); + void Copy(ParseableFunctionInfo * other); void Copy(FunctionBody* other); + void CopyNestedArray(ParseableFunctionInfo * other); const char16* GetExternalDisplayName() const; @@ -1954,12 +1953,12 @@ namespace Js this->SetAuxPtr(AuxPointerType::CachedSourceString, sourceString); } - FunctionProxyArray GetNestedFuncArray(); - FunctionProxy* GetNestedFunc(uint index); - FunctionProxyPtrPtr GetNestedFuncReference(uint index); + FunctionInfoArray GetNestedFuncArray(); + FunctionInfo* GetNestedFunc(uint index); + FunctionInfoPtrPtr GetNestedFuncReference(uint index); + FunctionProxy* GetNestedFunctionProxy(uint index); ParseableFunctionInfo* GetNestedFunctionForExecution(uint index); - void SetNestedFunc(FunctionProxy* nestedFunc, uint index, uint32 flags); - void ClearNestedFunctionParentFunctionReference(); + void SetNestedFunc(FunctionInfo* nestedFunc, uint index, uint32 flags); void BuildDeferredStubs(ParseNode *pnodeFnc); DeferredFunctionStub *GetDeferredStubs() const { return static_cast(this->GetAuxPtr(AuxPointerType::DeferredStubs)); } void SetDeferredStubs(DeferredFunctionStub *stub) { this->SetAuxPtr(AuxPointerType::DeferredStubs, stub); } diff --git a/lib/Runtime/ByteCode/ByteCodeDumper.cpp b/lib/Runtime/ByteCode/ByteCodeDumper.cpp index 9d6f2deb33b..e3b7aac9aab 100644 --- a/lib/Runtime/ByteCode/ByteCodeDumper.cpp +++ b/lib/Runtime/ByteCode/ByteCodeDumper.cpp @@ -21,7 +21,7 @@ namespace Js ByteCodeDumper::Dump(dumpFunction); for (uint i = 0; i < dumpFunction->GetNestedCount(); i ++) { - dumpFunction->GetNestedFunc(i)->EnsureDeserialized(); + dumpFunction->GetNestedFunctionForExecution(i); ByteCodeDumper::DumpRecursively(dumpFunction->GetNestedFunc(i)->GetFunctionBody()); } } @@ -812,7 +812,7 @@ namespace Js case OpCode::NewInnerScFunc: case OpCode::NewInnerScGenFunc: { - FunctionProxy* pfuncActual = dumpFunction->GetNestedFunc((uint)data->SlotIndex); + FunctionProxy* pfuncActual = dumpFunction->GetNestedFunctionProxy((uint)data->SlotIndex); Output::Print(_u(" R%d = env:R%d, %s()"), data->Value, data->Instance, pfuncActual->EnsureDeserialized()->GetDisplayName()); break; @@ -862,7 +862,7 @@ namespace Js case OpCode::NewStackScFunc: case OpCode::NewScGenFunc: { - FunctionProxy* pfuncActual = dumpFunction->GetNestedFunc((uint)data->SlotIndex); + FunctionProxy* pfuncActual = dumpFunction->GetNestedFunctionProxy((uint)data->SlotIndex); Output::Print(_u(" R%d = %s()"), data->Value, pfuncActual->EnsureDeserialized()->GetDisplayName()); break; diff --git a/lib/Runtime/ByteCode/ByteCodeEmitter.cpp b/lib/Runtime/ByteCode/ByteCodeEmitter.cpp index 6727c29f4a9..3b4b2d43936 100644 --- a/lib/Runtime/ByteCode/ByteCodeEmitter.cpp +++ b/lib/Runtime/ByteCode/ByteCodeEmitter.cpp @@ -2998,6 +2998,12 @@ void ByteCodeGenerator::EmitOneFunction(ParseNode *pnode) // so they have pointers to the stub sub-trees they need.) byteCodeFunction->SetDeferredStubs(nullptr); + if (byteCodeFunction->GetByteCode() != nullptr) + { + // Previously compiled function nested within a re-deferred and re-compiled function. + return; + } + try { // Bug : 301517 @@ -3225,7 +3231,7 @@ void ByteCodeGenerator::EmitOneFunction(ParseNode *pnode) uint nestedCount = byteCodeFunction->GetNestedCount(); for (uint i = 0; i < nestedCount; i++) { - Js::FunctionProxy * nested = byteCodeFunction->GetNestedFunc(i); + Js::FunctionProxy * nested = byteCodeFunction->GetNestedFunctionProxy(i); if (nested->IsFunctionBody()) { nested->GetFunctionBody()->SetStackNestedFuncParent(byteCodeFunction->GetFunctionInfo()); diff --git a/lib/Runtime/ByteCode/ByteCodeGenerator.cpp b/lib/Runtime/ByteCode/ByteCodeGenerator.cpp index 490db5e4a02..510dec756d8 100644 --- a/lib/Runtime/ByteCode/ByteCodeGenerator.cpp +++ b/lib/Runtime/ByteCode/ByteCodeGenerator.cpp @@ -1163,7 +1163,7 @@ ParseNode* VisitBlock(ParseNode *pnode, ByteCodeGenerator* byteCodeGenerator, Pr return pnodeLastVal; } -FuncInfo * ByteCodeGenerator::StartBindFunction(const char16 *name, uint nameLength, uint shortNameOffset, bool* pfuncExprWithName, ParseNode *pnode) +FuncInfo * ByteCodeGenerator::StartBindFunction(const char16 *name, uint nameLength, uint shortNameOffset, bool* pfuncExprWithName, ParseNode *pnode, Js::ParseableFunctionInfo * reuseNestedFunc) { bool funcExprWithName; union @@ -1281,13 +1281,21 @@ FuncInfo * ByteCodeGenerator::StartBindFunction(const char16 *name, uint nameLen { ENTER_PINNED_SCOPE(Js::PropertyRecordList, propertyRecordList); propertyRecordList = EnsurePropertyRecordList(); - parsedFunctionBody = Js::FunctionBody::NewFromRecycler(scriptContext, name, nameLength, shortNameOffset, pnode->sxFnc.nestedCount, m_utf8SourceInfo, - m_utf8SourceInfo->GetSrcInfo()->sourceContextInfo->sourceContextId, functionId, propertyRecordList - , attributes + if (reuseNestedFunc) + { + Assert(reuseNestedFunc->IsFunctionBody()); + parsedFunctionBody = reuseNestedFunc->GetFunctionBody(); + } + else + { + parsedFunctionBody = Js::FunctionBody::NewFromRecycler(scriptContext, name, nameLength, shortNameOffset, pnode->sxFnc.nestedCount, m_utf8SourceInfo, + m_utf8SourceInfo->GetSrcInfo()->sourceContextInfo->sourceContextId, functionId, propertyRecordList + , attributes #ifdef PERF_COUNTERS - , false /* is function from deferred deserialized proxy */ + , false /* is function from deferred deserialized proxy */ #endif - ); + ); + } LEAVE_PINNED_SCOPE(); } else @@ -1300,7 +1308,14 @@ FuncInfo * ByteCodeGenerator::StartBindFunction(const char16 *name, uint nameLen propertyRecordList = EnsurePropertyRecordList(); } - parseableFunctionInfo = Js::ParseableFunctionInfo::New(scriptContext, pnode->sxFnc.nestedCount, functionId, m_utf8SourceInfo, name, nameLength, shortNameOffset, propertyRecordList, attributes); + if (reuseNestedFunc) + { + parseableFunctionInfo = reuseNestedFunc; + } + else + { + parseableFunctionInfo = Js::ParseableFunctionInfo::New(scriptContext, pnode->sxFnc.nestedCount, functionId, m_utf8SourceInfo, name, nameLength, shortNameOffset, propertyRecordList, attributes); + } LEAVE_PINNED_SCOPE(); } @@ -2258,7 +2273,7 @@ void VisitFncDecls(ParseNode *fns, Fn action) } } -FuncInfo* PreVisitFunction(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator) +FuncInfo* PreVisitFunction(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerator, Js::ParseableFunctionInfo *reuseNestedFunc) { // Do binding of function name(s), initialize function scope, propagate function-wide properties from // the parent (if any). @@ -2312,7 +2327,7 @@ FuncInfo* PreVisitFunction(ParseNode* pnode, ByteCodeGenerator* byteCodeGenerato } Assert(pnode->sxFnc.funcInfo == nullptr); - FuncInfo* funcInfo = pnode->sxFnc.funcInfo = byteCodeGenerator->StartBindFunction(funcName, funcNameLength, functionNameOffset, &funcExprWithName, pnode); + FuncInfo* funcInfo = pnode->sxFnc.funcInfo = byteCodeGenerator->StartBindFunction(funcName, funcNameLength, functionNameOffset, &funcExprWithName, pnode, reuseNestedFunc); funcInfo->byteCodeFunction->SetIsNamedFunctionExpression(funcExprWithName); funcInfo->byteCodeFunction->SetIsNameIdentifierRef(pnode->sxFnc.isNameIdentifierRef); if (fIsRoot) @@ -3128,7 +3143,7 @@ void VisitNestedScopes(ParseNode* pnodeScopeList, ParseNode* pnodeParent, ByteCo // If the current function is not parsed yet, its function body is not generated yet. // Reset pCurrentFunction to null so that it will not be able re-use anything. - Js::FunctionProxy* proxy = pLastReuseFunc->GetNestedFunc((*pIndex)); + Js::FunctionProxy* proxy = pLastReuseFunc->GetNestedFunctionProxy((*pIndex)); if (proxy && proxy->IsFunctionBody()) { byteCodeGenerator->pCurrentFunction = proxy->GetFunctionBody(); @@ -3145,7 +3160,19 @@ void VisitNestedScopes(ParseNode* pnodeScopeList, ParseNode* pnodeParent, ByteCo byteCodeGenerator->pCurrentFunction = nullptr; } } - PreVisitFunction(pnodeScope, byteCodeGenerator); + + Js::ParseableFunctionInfo::NestedArray * parentNestedArray = parentFunc->GetNestedArray(); + Js::ParseableFunctionInfo* reuseNestedFunc = nullptr; + if (parentNestedArray) + { + Assert(*pIndex < parentNestedArray->nestedCount); + Js::FunctionInfo * info = parentNestedArray->functionInfoArray[*pIndex]; + if (info) + { + reuseNestedFunc = info->GetParseableFunctionInfo(); + } + } + PreVisitFunction(pnodeScope, byteCodeGenerator, reuseNestedFunc); FuncInfo *funcInfo = pnodeScope->sxFnc.funcInfo; parentFuncInfo->OnStartVisitFunction(pnodeScope); @@ -3157,7 +3184,7 @@ void VisitNestedScopes(ParseNode* pnodeScopeList, ParseNode* pnodeParent, ByteCo // Patch current non-parsed function's FunctionBodyImpl with the new generated function body. // So that the function object (pointing to the old function body) can able to get to the new one. - Js::FunctionProxy* proxy = pLastReuseFunc->GetNestedFunc((*pIndex)); + Js::FunctionProxy* proxy = pLastReuseFunc->GetNestedFunctionProxy((*pIndex)); if (proxy && !proxy->IsFunctionBody()) { proxy->UpdateFunctionBodyImpl(funcInfo->byteCodeFunction->GetFunctionBody()); @@ -3233,6 +3260,7 @@ void VisitNestedScopes(ParseNode* pnodeScopeList, ParseNode* pnodeParent, ByteCo EndVisitBlock(pnodeScope->sxFnc.pnodeBodyScope, byteCodeGenerator); EndVisitBlock(pnodeScope->sxFnc.pnodeScopes, byteCodeGenerator); } +#if 0 else if (pnodeScope->sxFnc.nestedCount) { // The nested function is deferred but has its own nested functions. @@ -3241,6 +3269,7 @@ void VisitNestedScopes(ParseNode* pnodeScopeList, ParseNode* pnodeParent, ByteCo memset(funcInfo->byteCodeFunction->GetNestedFuncArray(), 0, pnodeScope->sxFnc.nestedCount * sizeof(Js::FunctionBody*)); } +#endif if (!pnodeScope->sxFnc.pnodeBody) { @@ -3252,7 +3281,7 @@ void VisitNestedScopes(ParseNode* pnodeScopeList, ParseNode* pnodeParent, ByteCo if (!parentFuncInfo->IsFakeGlobalFunction(byteCodeGenerator->GetFlags())) { pnodeScope->sxFnc.nestedIndex = *pIndex; - parentFunc->SetNestedFunc(funcInfo->byteCodeFunction, (*pIndex)++, byteCodeGenerator->GetFlags()); + parentFunc->SetNestedFunc(funcInfo->byteCodeFunction->GetFunctionInfo(), (*pIndex)++, byteCodeGenerator->GetFlags()); } Assert(parentFunc); diff --git a/lib/Runtime/ByteCode/ByteCodeGenerator.h b/lib/Runtime/ByteCode/ByteCodeGenerator.h index 8125c0e5140..913f0073222 100644 --- a/lib/Runtime/ByteCode/ByteCodeGenerator.h +++ b/lib/Runtime/ByteCode/ByteCodeGenerator.h @@ -224,7 +224,7 @@ class ByteCodeGenerator void AssignPropertyIds(Js::ParseableFunctionInfo* functionInfo); void MapCacheIdsToPropertyIds(FuncInfo *funcInfo); void MapReferencedPropertyIds(FuncInfo *funcInfo); - FuncInfo *StartBindFunction(const char16 *name, uint nameLength, uint shortNameOffset, bool* pfuncExprWithName, ParseNode *pnode); + FuncInfo *StartBindFunction(const char16 *name, uint nameLength, uint shortNameOffset, bool* pfuncExprWithName, ParseNode *pnode, Js::ParseableFunctionInfo * reuseNestedFunc); void EndBindFunction(bool funcExprWithName); void StartBindCatch(ParseNode *pnode); diff --git a/lib/Runtime/ByteCode/ByteCodeSerializer.cpp b/lib/Runtime/ByteCode/ByteCodeSerializer.cpp index 0438b420c80..8ce8818e5e1 100644 --- a/lib/Runtime/ByteCode/ByteCodeSerializer.cpp +++ b/lib/Runtime/ByteCode/ByteCodeSerializer.cpp @@ -4013,7 +4013,7 @@ class ByteCodeBufferReader return hr; } - (*function)->SetNestedFunc(nestedFunction, i, 0u); + (*function)->SetNestedFunc(nestedFunction->GetFunctionInfo(), i, 0u); } } } diff --git a/lib/Runtime/ByteCode/FuncInfo.h b/lib/Runtime/ByteCode/FuncInfo.h index c7783267eb5..3e2c35442da 100644 --- a/lib/Runtime/ByteCode/FuncInfo.h +++ b/lib/Runtime/ByteCode/FuncInfo.h @@ -429,7 +429,7 @@ class FuncInfo Js::FunctionBody* GetParsedFunctionBody() const { AssertMsg(this->byteCodeFunction->IsFunctionParsed(), "Function must be parsed in order to call this method"); - Assert(!IsDeferred()); + Assert(!IsDeferred() || this->byteCodeFunction->GetFunctionBody()->GetByteCode() != nullptr); return this->byteCodeFunction->GetFunctionBody(); } diff --git a/lib/Runtime/ByteCode/ScopeInfo.cpp b/lib/Runtime/ByteCode/ScopeInfo.cpp index 7d4e5eb1c2c..27909aa0bd1 100644 --- a/lib/Runtime/ByteCode/ScopeInfo.cpp +++ b/lib/Runtime/ByteCode/ScopeInfo.cpp @@ -130,7 +130,9 @@ namespace Js TRACE_BYTECODE(_u("\nSave ScopeInfo: %s parent: %s\n\n"), funcBody->GetDisplayName(), parent->GetDisplayName()); - funcBody->SetScopeInfo(FromParent(parent)); + ScopeInfo *info = FromParent(parent); + info->parentOnly = true; + funcBody->SetScopeInfo(info); } // @@ -181,6 +183,14 @@ namespace Js // We will have to implement encoding block scope info to enable, which will also // enable defer parsing function that are in block scopes. + if (funcInfo->byteCodeFunction && + funcInfo->byteCodeFunction->GetScopeInfo() != nullptr && + !funcInfo->byteCodeFunction->GetScopeInfo()->IsParentInfoOnly()) + { + // No need to regenerate scope info if we re-compile an enclosing function + return; + } + Scope* currentScope = byteCodeGenerator->GetCurrentScope(); Assert(currentScope == funcInfo->GetBodyScope()); if (funcInfo->IsDeferred()) diff --git a/lib/Runtime/ByteCode/ScopeInfo.h b/lib/Runtime/ByteCode/ScopeInfo.h index 7a99a790b36..e71cf106e7c 100644 --- a/lib/Runtime/ByteCode/ScopeInfo.h +++ b/lib/Runtime/ByteCode/ScopeInfo.h @@ -46,6 +46,7 @@ namespace Js { BYTE areNamesCached : 1; BYTE canMergeWithBodyScope : 1; BYTE hasLocalInClosure : 1; + BYTE parentOnly : 1; Scope *scope; int scopeId; @@ -54,10 +55,12 @@ namespace Js { private: ScopeInfo(FunctionInfo * parent, int symbolCount) - : parent(parent), funcExprScopeInfo(nullptr), paramScopeInfo(nullptr), symbolCount(symbolCount), scope(nullptr), areNamesCached(false), canMergeWithBodyScope(true), hasLocalInClosure(false) + : parent(parent), funcExprScopeInfo(nullptr), paramScopeInfo(nullptr), symbolCount(symbolCount), scope(nullptr), areNamesCached(false), canMergeWithBodyScope(true), hasLocalInClosure(false), parentOnly(false) { } + bool IsParentInfoOnly() const { return parentOnly; } + void SetFuncExprScopeInfo(ScopeInfo* funcExprScopeInfo) { this->funcExprScopeInfo = funcExprScopeInfo; diff --git a/lib/Runtime/Debug/TTEvents.cpp b/lib/Runtime/Debug/TTEvents.cpp index 62a61f7e63d..263ddc5c033 100644 --- a/lib/Runtime/Debug/TTEvents.cpp +++ b/lib/Runtime/Debug/TTEvents.cpp @@ -273,7 +273,7 @@ namespace TTD { for(uint32 i = 0; i < resBody->GetNestedCount(); ++i) { - Js::ParseableFunctionInfo* ipfi = resBody->GetNestedFunc(i)->EnsureDeserialized(); + Js::ParseableFunctionInfo* ipfi = resBody->GetNestedFunctionForExecution(i); Js::FunctionBody* ifb = JsSupport::ForceAndGetFunctionBody(ipfi); if(this->m_functionLine == ifb->GetLineNumber() && this->m_functionColumn == ifb->GetColumnNumber()) @@ -288,7 +288,7 @@ namespace TTD uint32 endColumn = UINT32_MAX; if(i + 1 < resBody->GetNestedCount()) { - Js::ParseableFunctionInfo* ipfinext = resBody->GetNestedFunc(i + 1)->EnsureDeserialized(); + Js::ParseableFunctionInfo* ipfinext = resBody->GetNestedFunctionForExecution(i + 1); Js::FunctionBody* ifbnext = JsSupport::ForceAndGetFunctionBody(ipfinext); endLine = ifbnext->GetLineNumber(); diff --git a/lib/Runtime/Debug/TTRuntmeInfoTracker.cpp b/lib/Runtime/Debug/TTRuntmeInfoTracker.cpp index 0393949e843..1f20d38a182 100644 --- a/lib/Runtime/Debug/TTRuntmeInfoTracker.cpp +++ b/lib/Runtime/Debug/TTRuntmeInfoTracker.cpp @@ -245,7 +245,7 @@ namespace TTD for(uint32 i = 0; i < body->GetNestedCount(); ++i) { - Js::ParseableFunctionInfo* pfiMid = body->GetNestedFunc(i)->EnsureDeserialized(); + Js::ParseableFunctionInfo* pfiMid = body->GetNestedFunctionForExecution(i); Js::FunctionBody* currfb = TTD::JsSupport::ForceAndGetFunctionBody(pfiMid); this->ProcessFunctionBodyOnLoad(currfb, body); diff --git a/lib/Runtime/Debug/TTSnapValues.cpp b/lib/Runtime/Debug/TTSnapValues.cpp index 41008c40180..e67305d8b81 100644 --- a/lib/Runtime/Debug/TTSnapValues.cpp +++ b/lib/Runtime/Debug/TTSnapValues.cpp @@ -1453,7 +1453,7 @@ namespace TTD while(imin < imax) { int imid = (imin + imax) / 2; - Js::ParseableFunctionInfo* pfiMid = parentBody->GetNestedFunc(imid)->EnsureDeserialized(); + Js::ParseableFunctionInfo* pfiMid = parentBody->GetNestedFunctionForExecution(imid); Js::FunctionBody* currfb = JsSupport::ForceAndGetFunctionBody(pfiMid); int32 cmpval = 0; diff --git a/lib/Runtime/Language/InterpreterStackFrame.cpp b/lib/Runtime/Language/InterpreterStackFrame.cpp index 26859706bfa..f32d5f4ecf2 100644 --- a/lib/Runtime/Language/InterpreterStackFrame.cpp +++ b/lib/Runtime/Language/InterpreterStackFrame.cpp @@ -501,7 +501,7 @@ { \ PROCESS_READ_LAYOUT(name, ElementSlot, suffix); \ SetReg(playout->Value, \ - func((FrameDisplay*)GetNonVarReg(playout->Instance), reinterpret_cast(this->m_functionBody->GetNestedFuncReference(playout->SlotIndex)))); \ + func((FrameDisplay*)GetNonVarReg(playout->Instance), this->m_functionBody->GetNestedFuncReference(playout->SlotIndex))); \ break; \ } @@ -512,7 +512,7 @@ { \ PROCESS_READ_LAYOUT(name, ElementSlotI1, suffix); \ SetReg(playout->Value, \ - func(this->GetFrameDisplayForNestedFunc(), reinterpret_cast(this->m_functionBody->GetNestedFuncReference(playout->SlotIndex)))); \ + func(this->GetFrameDisplayForNestedFunc(), this->m_functionBody->GetNestedFuncReference(playout->SlotIndex))); \ break; \ } @@ -2638,9 +2638,9 @@ namespace Js const auto& modFunc = info->GetFunction(i); // TODO: add more runtime checks here - auto proxy = m_functionBody->GetNestedFuncReference(i); + FunctionInfoPtrPtr functionInfo = m_functionBody->GetNestedFuncReference(i); - AsmJsScriptFunction* scriptFuncObj = (AsmJsScriptFunction*)ScriptFunction::OP_NewScFunc(pDisplay, (FunctionProxy**)proxy); + AsmJsScriptFunction* scriptFuncObj = (AsmJsScriptFunction*)ScriptFunction::OP_NewScFunc(pDisplay, functionInfo); localModuleFunctions[modFunc.location] = scriptFuncObj; if (i == 0 && info->GetUsesChangeHeap()) { @@ -7205,7 +7205,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) FrameDisplay *frameDisplay = this->GetFrameDisplayForNestedFunc(); SetRegAllowStackVarEnableOnly(playout->Value, StackScriptFunction::OP_NewStackScFunc(frameDisplay, - reinterpret_cast(this->m_functionBody->GetNestedFuncReference(funcIndex)), + this->m_functionBody->GetNestedFuncReference(funcIndex), this->GetStackNestedFunction(funcIndex))); } @@ -7216,7 +7216,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) FrameDisplay *frameDisplay = (FrameDisplay*)GetNonVarReg(playout->Instance); SetRegAllowStackVarEnableOnly(playout->Value, StackScriptFunction::OP_NewStackScFunc(frameDisplay, - reinterpret_cast(this->m_functionBody->GetNestedFuncReference(funcIndex)), + this->m_functionBody->GetNestedFuncReference(funcIndex), this->GetStackNestedFunction(funcIndex))); } @@ -7364,7 +7364,7 @@ const byte * InterpreterStackFrame::OP_ProfiledLoopBodyStart(const byte * ip) for (uint i = 0; i < nestedCount; i++) { StackScriptFunction * stackScriptFunction = scriptFunctions + i; - FunctionProxy* nestedProxy = functionBody->GetNestedFunc(i); + FunctionProxy* nestedProxy = functionBody->GetNestedFunctionProxy(i); ScriptFunctionType* type = nestedProxy->EnsureDeferredPrototypeType(); new (stackScriptFunction)StackScriptFunction(nestedProxy, type); } diff --git a/lib/Runtime/Language/JavascriptOperators.cpp b/lib/Runtime/Language/JavascriptOperators.cpp index 993c6e9db0e..2692db6143c 100644 --- a/lib/Runtime/Language/JavascriptOperators.cpp +++ b/lib/Runtime/Language/JavascriptOperators.cpp @@ -5564,7 +5564,7 @@ namespace Js uint nestedIndex = entry->nestedIndex; uint scopeSlot = entry->scopeSlot; - FunctionProxy * proxy = funcParent->GetFunctionBody()->GetNestedFunc(nestedIndex); + FunctionProxy * proxy = funcParent->GetFunctionBody()->GetNestedFunctionProxy(nestedIndex); ScriptFunction *func = scriptContext->GetLibrary()->CreateScriptFunction(proxy); diff --git a/lib/Runtime/Library/IntlEngineInterfaceExtensionObject.cpp b/lib/Runtime/Library/IntlEngineInterfaceExtensionObject.cpp index dabd5b95a7d..7449fca0d77 100644 --- a/lib/Runtime/Library/IntlEngineInterfaceExtensionObject.cpp +++ b/lib/Runtime/Library/IntlEngineInterfaceExtensionObject.cpp @@ -414,7 +414,7 @@ namespace Js break; } - Js::ScriptFunction *function = scriptContext->GetLibrary()->CreateScriptFunction(intlByteCode->GetNestedFunc(0)->EnsureDeserialized()); + Js::ScriptFunction *function = scriptContext->GetLibrary()->CreateScriptFunction(intlByteCode->GetNestedFunctionForExecution(0)); // If we are profiling, we need to register the script to the profiler callback, so the script compiled event will be sent. if (scriptContext->IsProfiling()) diff --git a/lib/Runtime/Library/JavascriptGeneratorFunction.cpp b/lib/Runtime/Library/JavascriptGeneratorFunction.cpp index 3e9cb47dda1..e7609b396b3 100644 --- a/lib/Runtime/Library/JavascriptGeneratorFunction.cpp +++ b/lib/Runtime/Library/JavascriptGeneratorFunction.cpp @@ -82,9 +82,9 @@ namespace Js return static_cast(var); } - JavascriptGeneratorFunction* JavascriptGeneratorFunction::OP_NewScGenFunc(FrameDisplay *environment, FunctionProxy** proxyRef) + JavascriptGeneratorFunction* JavascriptGeneratorFunction::OP_NewScGenFunc(FrameDisplay *environment, FunctionInfoPtrPtr infoRef) { - FunctionProxy* functionProxy = *proxyRef; + FunctionProxy* functionProxy = (*infoRef)->GetFunctionProxy(); ScriptContext* scriptContext = functionProxy->GetScriptContext(); bool hasSuperReference = functionProxy->HasSuperReference(); diff --git a/lib/Runtime/Library/JavascriptGeneratorFunction.h b/lib/Runtime/Library/JavascriptGeneratorFunction.h index 3a5da929d27..76626f6fca4 100644 --- a/lib/Runtime/Library/JavascriptGeneratorFunction.h +++ b/lib/Runtime/Library/JavascriptGeneratorFunction.h @@ -33,7 +33,7 @@ namespace Js static JavascriptGeneratorFunction* FromVar(Var var); static bool Is(Var var); - static JavascriptGeneratorFunction* OP_NewScGenFunc(FrameDisplay* environment, FunctionProxy** proxyRef); + static JavascriptGeneratorFunction* OP_NewScGenFunc(FrameDisplay* environment, FunctionInfoPtrPtr infoRef); static Var EntryGeneratorFunctionImplementation(RecyclableObject* function, CallInfo callInfo, ...); static Var EntryAsyncFunctionImplementation(RecyclableObject* function, CallInfo callInfo, ...); static DWORD GetOffsetOfScriptFunction() { return offsetof(JavascriptGeneratorFunction, scriptFunction); } diff --git a/lib/Runtime/Library/ScriptFunction.cpp b/lib/Runtime/Library/ScriptFunction.cpp index 191a5d15f7e..d67a23644f2 100644 --- a/lib/Runtime/Library/ScriptFunction.cpp +++ b/lib/Runtime/Library/ScriptFunction.cpp @@ -60,10 +60,10 @@ namespace Js #endif } - ScriptFunction * ScriptFunction::OP_NewScFunc(FrameDisplay *environment, FunctionProxy** proxyRef) + ScriptFunction * ScriptFunction::OP_NewScFunc(FrameDisplay *environment, FunctionInfoPtrPtr infoRef) { - AssertMsg(proxyRef!= nullptr, "BYTE-CODE VERIFY: Must specify a valid function to create"); - FunctionProxy* functionProxy = (*proxyRef); + AssertMsg(infoRef!= nullptr, "BYTE-CODE VERIFY: Must specify a valid function to create"); + FunctionProxy* functionProxy = (*infoRef)->GetFunctionProxy(); AssertMsg(functionProxy!= nullptr, "BYTE-CODE VERIFY: Must specify a valid function to create"); ScriptContext* scriptContext = functionProxy->GetScriptContext(); diff --git a/lib/Runtime/Library/ScriptFunction.h b/lib/Runtime/Library/ScriptFunction.h index d16b71a5c54..7489db3ed66 100644 --- a/lib/Runtime/Library/ScriptFunction.h +++ b/lib/Runtime/Library/ScriptFunction.h @@ -47,7 +47,7 @@ namespace Js ScriptFunction(FunctionProxy * proxy, ScriptFunctionType* deferredPrototypeType); static bool Is(Var func); static ScriptFunction * FromVar(Var func); - static ScriptFunction * OP_NewScFunc(FrameDisplay *environment, FunctionProxy** proxyRef); + static ScriptFunction * OP_NewScFunc(FrameDisplay *environment, FunctionInfoPtrPtr infoRef); ProxyEntryPointInfo* GetEntryPointInfo() const; FunctionEntryPointInfo* GetFunctionEntryPointInfo() const diff --git a/lib/Runtime/Library/StackScriptFunction.cpp b/lib/Runtime/Library/StackScriptFunction.cpp index fd7de11eeb7..5b848ebf4ce 100644 --- a/lib/Runtime/Library/StackScriptFunction.cpp +++ b/lib/Runtime/Library/StackScriptFunction.cpp @@ -125,7 +125,7 @@ namespace Js for (uint i = 0; i < current->GetNestedCount(); i++) { - FunctionProxy * nested = current->GetNestedFunc(i); + FunctionProxy * nested = current->GetNestedFunctionProxy(i); functionObjectToBox.Add(nested); if (nested->IsFunctionBody()) { @@ -729,14 +729,14 @@ namespace Js Output::Flush(); } - FunctionProxy * functionBody = stackFunction->GetFunctionProxy(); - boxedFunction = ScriptFunction::OP_NewScFunc(boxedFrameDisplay, &functionBody); + FunctionInfo * functionInfo = stackFunction->GetFunctionInfo(); + boxedFunction = ScriptFunction::OP_NewScFunc(boxedFrameDisplay, &functionInfo); stackFunction->boxedScriptFunction = boxedFunction; stackFunction->SetEnvironment(boxedFrameDisplay); return boxedFunction; } - ScriptFunction * StackScriptFunction::OP_NewStackScFunc(FrameDisplay *environment, FunctionProxy** proxyRef, ScriptFunction * stackFunction) + ScriptFunction * StackScriptFunction::OP_NewStackScFunc(FrameDisplay *environment, FunctionInfoPtrPtr infoRef, ScriptFunction * stackFunction) { if (stackFunction) { @@ -744,7 +744,7 @@ namespace Js char16 debugStringBuffer[MAX_FUNCTION_BODY_DEBUG_STRING_SIZE]; #endif - FunctionProxy* functionProxy = (*proxyRef); + FunctionProxy* functionProxy = (*infoRef)->GetFunctionProxy(); AssertMsg(functionProxy != nullptr, "BYTE-CODE VERIFY: Must specify a valid function to create"); Assert(stackFunction->GetFunctionInfo()->GetFunctionProxy() == functionProxy); Assert(!functionProxy->IsFunctionBody() || functionProxy->GetFunctionBody()->GetStackNestedFuncParentStrongRef() != nullptr); @@ -758,7 +758,7 @@ namespace Js functionProxy->GetDebugNumberSet(debugStringBuffer), stackFunction); return stackFunction; } - return ScriptFunction::OP_NewScFunc(environment, proxyRef); + return ScriptFunction::OP_NewScFunc(environment, infoRef); } #if ENABLE_TTD diff --git a/lib/Runtime/Library/StackScriptFunction.h b/lib/Runtime/Library/StackScriptFunction.h index 154cabf65b5..f31c344cd0c 100644 --- a/lib/Runtime/Library/StackScriptFunction.h +++ b/lib/Runtime/Library/StackScriptFunction.h @@ -16,7 +16,7 @@ namespace Js static JavascriptFunction * EnsureBoxed(BOX_PARAM(JavascriptFunction * function, void * returnAddress, char16 const * reason)); static void Box(FunctionBody * functionBody, ScriptFunction ** functionRef); - static ScriptFunction * OP_NewStackScFunc(FrameDisplay *environment, FunctionProxy** proxyRef, ScriptFunction * stackFunction); + static ScriptFunction * OP_NewStackScFunc(FrameDisplay *environment, FunctionInfoPtrPtr infoRef, ScriptFunction * stackFunction); static uint32 GetOffsetOfBoxedScriptFunction() { return offsetof(StackScriptFunction, boxedScriptFunction); } static JavascriptFunction * GetCurrentFunctionObject(JavascriptFunction * function); From 92cb608db0c9a1ba5d5fca52a0c4482bf91fca6c Mon Sep 17 00:00:00 2001 From: Paul Leathers Date: Thu, 13 Oct 2016 11:08:48 -0700 Subject: [PATCH 5/6] Functional improvements and fixes for redeferral. 1) Re-use existing FunctionBody/ParseableFunctionInfo's in the case where we re-compile a function that encloses already-compiled functions. This is necessary to avoid having multiple FunctionInfo structures around for a single FunctionBody, not all of which get updated when things change. It also reduces the cost of re-compiling. 2) Change the FunctionBody's nested function array to hold FunctionInfo's instead of FunctionProxy's. This fixes a class of functional issues involving the need to update the nested array as nested functions are un-deferred and re-deferred. The FunctionInfo pointers don't change and thus don't need updating. 3) Eliminate the m_referenceInParentFunction member of FunctionProxy, which was there to enable the nested array updates that we no longer need. 4) Re-use ScopeInfo in the case where a parent of the current function has been re-deferred. --- lib/Runtime/Base/FunctionBody.cpp | 4 +++- lib/Runtime/Base/FunctionBody.h | 1 - lib/Runtime/ByteCode/ByteCodeGenerator.cpp | 10 ---------- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/lib/Runtime/Base/FunctionBody.cpp b/lib/Runtime/Base/FunctionBody.cpp index 776e2ec2037..2aabe760476 100644 --- a/lib/Runtime/Base/FunctionBody.cpp +++ b/lib/Runtime/Base/FunctionBody.cpp @@ -3574,6 +3574,9 @@ namespace Js Assert(parent->Get() == parentFunctionInfo); return; } +// Redeferral invalidates this assertion, as we may be recompiling with a different view of nested functions and +// thus making different stack-nested-function decisions. I'm inclined to allow this, since things that have been +// re-deferred will likely not be executed again, so it makes sense to exclude them from our analysis. // Assert(CanDoStackNestedFunc()); Assert(parentFunctionBody->DoStackNestedFunc()); @@ -7124,7 +7127,6 @@ namespace Js #endif this->Cleanup(isShutdown); this->CleanupSourceInfo(isShutdown); -// this->ClearNestedFunctionParentFunctionReference(); this->CleanupFunctionProxyCounters(); } diff --git a/lib/Runtime/Base/FunctionBody.h b/lib/Runtime/Base/FunctionBody.h index 92d98794aa8..e0e60ea9a07 100644 --- a/lib/Runtime/Base/FunctionBody.h +++ b/lib/Runtime/Base/FunctionBody.h @@ -1432,7 +1432,6 @@ namespace Js NoWriteBarrierPtr m_scriptContext; // Memory context for this function body WriteBarrierPtr m_utf8SourceInfo; // WriteBarrier-TODO: Consider changing this to NoWriteBarrierPtr, and skip tagging- also, tagging is likely unnecessary since that pointer in question is likely not resolvable -// FunctionProxyPtrPtr m_referenceInParentFunction; // Reference to nested function reference to this function in the parent function body (tagged to not be actual reference) WriteBarrierPtr deferredPrototypeType; WriteBarrierPtr m_defaultEntryPointInfo; // The default entry point info for the function proxy diff --git a/lib/Runtime/ByteCode/ByteCodeGenerator.cpp b/lib/Runtime/ByteCode/ByteCodeGenerator.cpp index 510dec756d8..d82c48b1b01 100644 --- a/lib/Runtime/ByteCode/ByteCodeGenerator.cpp +++ b/lib/Runtime/ByteCode/ByteCodeGenerator.cpp @@ -3260,16 +3260,6 @@ void VisitNestedScopes(ParseNode* pnodeScopeList, ParseNode* pnodeParent, ByteCo EndVisitBlock(pnodeScope->sxFnc.pnodeBodyScope, byteCodeGenerator); EndVisitBlock(pnodeScope->sxFnc.pnodeScopes, byteCodeGenerator); } -#if 0 - else if (pnodeScope->sxFnc.nestedCount) - { - // The nested function is deferred but has its own nested functions. - // Make sure we at least zero-initialize its array in case, for instance, we get cloned - // before the function is called and the array filled in. - - memset(funcInfo->byteCodeFunction->GetNestedFuncArray(), 0, pnodeScope->sxFnc.nestedCount * sizeof(Js::FunctionBody*)); - } -#endif if (!pnodeScope->sxFnc.pnodeBody) { From 870ed16d7efee4823a127f2f20762d84bf2c6f21 Mon Sep 17 00:00:00 2001 From: Paul Leathers Date: Wed, 19 Oct 2016 15:16:58 -0700 Subject: [PATCH 6/6] Revise redeferral heuristic to track execution of full-jitted functions without generating new code. We make use of the per-entry-point calls count for jitted entry points as well as the interpreted count for the FunctionBody. --- lib/Backend/BailOut.cpp | 10 +- lib/Backend/BailOut.h | 2 +- lib/Backend/Func.cpp | 2 +- lib/Backend/Func.h | 2 +- lib/Backend/Lower.cpp | 71 +++++-- lib/Backend/Lower.h | 3 +- lib/Backend/LowerMDShared.cpp | 78 -------- lib/Backend/LowerMDShared.h | 2 - lib/Backend/arm/LowerMD.cpp | 129 ------------- lib/Backend/arm/LowerMD.h | 4 - lib/Backend/arm64/LowerMD.h | 4 - lib/Runtime/Base/FunctionBody.cpp | 36 +++- lib/Runtime/Base/FunctionBody.h | 17 +- lib/Runtime/Base/ScriptContext.cpp | 37 ++-- lib/Runtime/Base/ScriptContext.h | 1 - lib/Runtime/Base/ThreadContext.cpp | 182 ++++++++++++------ lib/Runtime/Base/ThreadContext.h | 12 +- .../Language/InterpreterStackFrame.cpp | 1 - .../Language/i386/AsmJsJitTemplate.cpp | 6 +- 19 files changed, 266 insertions(+), 333 deletions(-) diff --git a/lib/Backend/BailOut.cpp b/lib/Backend/BailOut.cpp index bcbac96dddd..19aacc566c4 100644 --- a/lib/Backend/BailOut.cpp +++ b/lib/Backend/BailOut.cpp @@ -1748,7 +1748,7 @@ void BailOutRecord::ScheduleFunctionCodeGen(Js::ScriptFunction * function, Js::S bailOutRecordNotConst->bailOutCount++; Js::FunctionEntryPointInfo *entryPointInfo = function->GetFunctionEntryPointInfo(); - uint8 callsCount = entryPointInfo->callsCount; + uint32 callsCount = entryPointInfo->callsCount; RejitReason rejitReason = RejitReason::None; bool reThunk = false; @@ -2297,11 +2297,7 @@ void BailOutRecord::ScheduleLoopBodyCodeGen(Js::ScriptFunction * function, Js::S entryPointInfo->totalJittedLoopIterations += entryPointInfo->jittedLoopIterationsSinceLastBailout; entryPointInfo->jittedLoopIterationsSinceLastBailout = 0; - if (entryPointInfo->totalJittedLoopIterations > UINT8_MAX) - { - entryPointInfo->totalJittedLoopIterations = UINT8_MAX; - } - uint8 totalJittedLoopIterations = (uint8)entryPointInfo->totalJittedLoopIterations; + uint32 totalJittedLoopIterations = (uint8)entryPointInfo->totalJittedLoopIterations; totalJittedLoopIterations = totalJittedLoopIterations <= Js::LoopEntryPointInfo::GetDecrLoopCountPerBailout() ? 0 : totalJittedLoopIterations - Js::LoopEntryPointInfo::GetDecrLoopCountPerBailout(); CheckPreemptiveRejit(executeFunction, bailOutKind, bailOutRecordNotConst, totalJittedLoopIterations, interpreterFrame->GetCurrentLoopNum()); @@ -2583,7 +2579,7 @@ void BailOutRecord::ScheduleLoopBodyCodeGen(Js::ScriptFunction * function, Js::S } } -void BailOutRecord::CheckPreemptiveRejit(Js::FunctionBody* executeFunction, IR::BailOutKind bailOutKind, BailOutRecord* bailoutRecord, uint8& callsOrIterationsCount, int loopNumber) +void BailOutRecord::CheckPreemptiveRejit(Js::FunctionBody* executeFunction, IR::BailOutKind bailOutKind, BailOutRecord* bailoutRecord, uint32& callsOrIterationsCount, int loopNumber) { if (bailOutKind == IR::BailOutOnNoProfile && executeFunction->IncrementBailOnMisingProfileCount() > CONFIG_FLAG(BailOnNoProfileLimit)) { diff --git a/lib/Backend/BailOut.h b/lib/Backend/BailOut.h index c600dc9fba9..6640e3087c3 100644 --- a/lib/Backend/BailOut.h +++ b/lib/Backend/BailOut.h @@ -237,7 +237,7 @@ class BailOutRecord static void ScheduleFunctionCodeGen(Js::ScriptFunction * function, Js::ScriptFunction * innerMostInlinee, BailOutRecord const * bailOutRecord, IR::BailOutKind bailOutKind, Js::ImplicitCallFlags savedImplicitCallFlags, void * returnAddress); static void ScheduleLoopBodyCodeGen(Js::ScriptFunction * function, Js::ScriptFunction * innerMostInlinee, BailOutRecord const * bailOutRecord, IR::BailOutKind bailOutKind); - static void CheckPreemptiveRejit(Js::FunctionBody* executeFunction, IR::BailOutKind bailOutKind, BailOutRecord* bailoutRecord, uint8& callsOrIterationsCount, int loopNumber); + static void CheckPreemptiveRejit(Js::FunctionBody* executeFunction, IR::BailOutKind bailOutKind, BailOutRecord* bailoutRecord, uint32& callsOrIterationsCount, int loopNumber); void RestoreValues(IR::BailOutKind bailOutKind, Js::JavascriptCallStackLayout * layout, Js::InterpreterStackFrame * newInstance, Js::ScriptContext * scriptContext, bool fromLoopBody, Js::Var * registerSaves, BailOutReturnValue * returnValue, Js::Var* pArgumentsObject, Js::Var branchValue = nullptr, void* returnAddress = nullptr, bool useStartCall = true, void * argoutRestoreAddress = nullptr) const; void RestoreValues(IR::BailOutKind bailOutKind, Js::JavascriptCallStackLayout * layout, uint count, __in_ecount_opt(count) int * offsets, int argOutSlotId, diff --git a/lib/Backend/Func.cpp b/lib/Backend/Func.cpp index 6cb4ed39fe9..22c82451b33 100644 --- a/lib/Backend/Func.cpp +++ b/lib/Backend/Func.cpp @@ -1268,7 +1268,7 @@ Func::CreateInlineeStackSym() return stackSym; } -uint8 * +uint32 * Func::GetCallsCountAddress() const { Assert(this->m_workItem->Type() == JsFunctionType); diff --git a/lib/Backend/Func.h b/lib/Backend/Func.h index 8225f766c01..6bda2bd45a1 100644 --- a/lib/Backend/Func.h +++ b/lib/Backend/Func.h @@ -317,7 +317,7 @@ static const unsigned __int64 c_debugFillPattern8 = 0xcececececececece; StackSym *GetLocalFrameDisplaySym() const { return m_localFrameDisplaySym; } void SetLocalFrameDisplaySym(StackSym *sym) { m_localFrameDisplaySym = sym; } - uint8 *GetCallsCountAddress() const; + uint32 *GetCallsCountAddress() const; uint *GetJittedLoopIterationsSinceLastBailoutAddress() const; void EnsurePinnedTypeRefs(); diff --git a/lib/Backend/Lower.cpp b/lib/Backend/Lower.cpp index cf629d80e4b..dd5af086dfd 100644 --- a/lib/Backend/Lower.cpp +++ b/lib/Backend/Lower.cpp @@ -14205,22 +14205,65 @@ IR::Instr *Lowerer::InsertConvertFloat64ToFloat32( return instr; } -void Lowerer::InsertIncUInt8PreventOverflow( +void Lowerer::InsertDecUInt32PreventOverflow( IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr, IR::Instr * *const onOverflowInsertBeforeInstrRef) { - LowererMD::InsertIncUInt8PreventOverflow(dst, src, insertBeforeInstr, onOverflowInsertBeforeInstrRef); -} + Assert(dst); + Assert(dst->GetType() == TyUint32); + Assert(src); + Assert(src->GetType() == TyUint32); + Assert(insertBeforeInstr); -void Lowerer::InsertDecUInt8PreventOverflow( - IR::Opnd *const dst, - IR::Opnd *const src, - IR::Instr *const insertBeforeInstr, - IR::Instr * *const onOverflowInsertBeforeInstrRef) -{ - LowererMD::InsertDecUInt8PreventOverflow(dst, src, insertBeforeInstr, onOverflowInsertBeforeInstrRef); + Func *const func = insertBeforeInstr->m_func; + + // Generate: + // subs temp, src, 1 + // bcs $overflow + // mov dst, temp + // b $continue + // $overflow: + // mov dst, 0 + // $continue: + + IR::LabelInstr *const overflowLabel = Lowerer::InsertLabel(false, insertBeforeInstr); + + // subs temp, src, 1 + IR::RegOpnd *const tempOpnd = IR::RegOpnd::New(StackSym::New(TyUint32, func), TyUint32, func); + const IR::AutoReuseOpnd autoReuseTempOpnd(tempOpnd, func); + Lowerer::InsertSub(true, tempOpnd, src, IR::IntConstOpnd::New(1, TyUint32, func, true), overflowLabel); + + // bcs $overflow + Lowerer::InsertBranch(Js::OpCode::BrLt_A, true, overflowLabel, overflowLabel); + + // mov dst, temp + Lowerer::InsertMove(dst, tempOpnd, overflowLabel); + + const bool dstEqualsSrc = dst->IsEqual(src); + if(!dstEqualsSrc || onOverflowInsertBeforeInstrRef) + { + // b $continue + // $overflow: + // mov dst, 0 + // $continue: + IR::LabelInstr *const continueLabel = Lowerer::InsertLabel(false, insertBeforeInstr); + Lowerer::InsertBranch(Js::OpCode::Br, continueLabel, overflowLabel); + if(!dstEqualsSrc) + { + Lowerer::InsertMove(dst, IR::IntConstOpnd::New(0, TyUint32, func, true), continueLabel); + } + + if(onOverflowInsertBeforeInstrRef) + { + *onOverflowInsertBeforeInstrRef = continueLabel; + } + } + else + { + // $overflow: + } } void Lowerer::InsertFloatCheckForZeroOrNanBranch( @@ -21541,18 +21584,16 @@ void Lowerer::LowerFunctionBodyCallCountChange(IR::Instr *const insertBeforeInst IR::AddrOpnd::New(func->GetCallsCountAddress(), IR::AddrOpndKindDynamicMisc, func, true), insertBeforeInstr); - IR::IndirOpnd *const countOpnd = IR::IndirOpnd::New(countAddressOpnd, 0, TyUint8, func); + IR::IndirOpnd *const countOpnd = IR::IndirOpnd::New(countAddressOpnd, 0, TyUint32, func); const IR::AutoReuseOpnd autoReuseCountOpnd(countOpnd, func); if(!isSimpleJit) { - // InsertIncUint8PreventOverflow [countAddress] - InsertIncUInt8PreventOverflow(countOpnd, countOpnd, insertBeforeInstr); + InsertAdd(false, countOpnd, countOpnd, IR::IntConstOpnd::New(1, TyUint32, func), insertBeforeInstr); return; } - // InsertDecUint8PreventOverflow [countAddress] IR::Instr *onOverflowInsertBeforeInstr; - InsertDecUInt8PreventOverflow( + InsertDecUInt32PreventOverflow( countOpnd, countOpnd, insertBeforeInstr, diff --git a/lib/Backend/Lower.h b/lib/Backend/Lower.h index 96b609cf33d..a971b45e7db 100644 --- a/lib/Backend/Lower.h +++ b/lib/Backend/Lower.h @@ -327,8 +327,7 @@ class Lowerer static IR::Instr * InsertConvertFloat64ToFloat32(IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr); public: - static void InsertIncUInt8PreventOverflow(IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr, IR::Instr * *const onOverflowInsertBeforeInstrRef = nullptr); - static void InsertDecUInt8PreventOverflow(IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr, IR::Instr * *const onOverflowInsertBeforeInstrRef = nullptr); + static void InsertDecUInt32PreventOverflow(IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr, IR::Instr * *const onOverflowInsertBeforeInstrRef = nullptr); void InsertFloatCheckForZeroOrNanBranch(IR::Opnd *const src, const bool branchOnZeroOrNan, IR::LabelInstr *const target, IR::LabelInstr *const fallthroughLabel, IR::Instr *const insertBeforeInstr); public: diff --git a/lib/Backend/LowerMDShared.cpp b/lib/Backend/LowerMDShared.cpp index 52045cf5576..df810898342 100644 --- a/lib/Backend/LowerMDShared.cpp +++ b/lib/Backend/LowerMDShared.cpp @@ -4692,84 +4692,6 @@ LowererMD::GenerateStFldFromLocalInlineCache( instrStFld->InsertBefore(instr); } -void LowererMD::InsertIncUInt8PreventOverflow( - IR::Opnd *const dst, - IR::Opnd *const src, - IR::Instr *const insertBeforeInstr, - IR::Instr * *const onOverflowInsertBeforeInstrRef) -{ - Assert(dst); - Assert(dst->GetType() == TyUint8); - Assert(src); - Assert(src->GetType() == TyUint8); - Assert(insertBeforeInstr); - - Func *const func = insertBeforeInstr->m_func; - - // Generate: - // cmp src, static_cast(-1) - // jeq $done - // dst = add src, 1 - // $noOverflow: - - IR::LabelInstr *const noOverflowLabel = Lowerer::InsertLabel(false, insertBeforeInstr); - - Lowerer::InsertCompareBranch(src, IR::IntConstOpnd::New(static_cast(-1), TyUint8, func, true), - Js::OpCode::BrEq_A, noOverflowLabel, noOverflowLabel); - - // inc dst, src - Lowerer::InsertAdd(true, dst, src, IR::IntConstOpnd::New(1, TyUint8, func, true), noOverflowLabel); - - - // $done: - - if(onOverflowInsertBeforeInstrRef) - { - *onOverflowInsertBeforeInstrRef = noOverflowLabel; - } -} - -void LowererMD::InsertDecUInt8PreventOverflow( - IR::Opnd *const dst, - IR::Opnd *const src, - IR::Instr *const insertBeforeInstr, - IR::Instr * *const onOverflowInsertBeforeInstrRef) -{ - Assert(dst); - Assert(dst->GetType() == TyUint8); - Assert(src); - Assert(src->GetType() == TyUint8); - Assert(insertBeforeInstr); - - Func *const func = insertBeforeInstr->m_func; - - // Generate: - // sub dst, src, 1 - // jnc $noOverflow - // mov dst, 0 - // $noOverflow: - - IR::LabelInstr *const noOverflowLabel = Lowerer::InsertLabel(false, insertBeforeInstr); - - // sub dst, src, 1 - IR::Instr *const instr = IR::Instr::New(Js::OpCode::SUB, dst, src, IR::IntConstOpnd::New(1, TyUint8, func, true), func); - noOverflowLabel->InsertBefore(instr); - MakeDstEquSrc1(instr); - - // jnc $noOverflow - Lowerer::InsertBranch(Js::OpCode::BrGe_A, true, noOverflowLabel, noOverflowLabel); - - // mov dst, 0 - Lowerer::InsertMove(dst, IR::IntConstOpnd::New(0, TyUint8, func, true), noOverflowLabel); - - // $noOverflow: - - if(onOverflowInsertBeforeInstrRef) - { - *onOverflowInsertBeforeInstrRef = noOverflowLabel; - } -} - //---------------------------------------------------------------------------- // // LowererMD::GenerateFastScopedLdFld diff --git a/lib/Backend/LowerMDShared.h b/lib/Backend/LowerMDShared.h index 545d96494cf..9e797d28687 100644 --- a/lib/Backend/LowerMDShared.h +++ b/lib/Backend/LowerMDShared.h @@ -304,8 +304,6 @@ class LowererMD } public: - static void InsertIncUInt8PreventOverflow(IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr, IR::Instr * *const onOverflowInsertBeforeInstrRef = nullptr); - static void InsertDecUInt8PreventOverflow(IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr, IR::Instr * *const onOverflowInsertBeforeInstrRef = nullptr); #ifdef ENABLE_SIMDJS void Simd128InitOpcodeMap(); diff --git a/lib/Backend/arm/LowerMD.cpp b/lib/Backend/arm/LowerMD.cpp index 97d0c2d8eb8..18fe939a499 100644 --- a/lib/Backend/arm/LowerMD.cpp +++ b/lib/Backend/arm/LowerMD.cpp @@ -452,135 +452,6 @@ LowererMD::GenerateFunctionObjectTest(IR::Instr * callInstr, IR::RegOpnd *funct } } -void LowererMD::InsertIncUInt8PreventOverflow( - IR::Opnd *const dst, - IR::Opnd *const src, - IR::Instr *const insertBeforeInstr, - IR::Instr * *const onOverflowInsertBeforeInstrRef) -{ - Assert(dst); - Assert(dst->GetType() == TyUint8); - Assert(src); - Assert(src->GetType() == TyUint8); - Assert(insertBeforeInstr); - - Func *const func = insertBeforeInstr->m_func; - - // Generate: - // add temp, src, 1 - // tst temp, static_cast(-1) - // beq $overflow - // mov dst, temp - // b $continue - // $overflow: - // mov dst, static_cast(-1) - // $continue: - - IR::LabelInstr *const overflowLabel = Lowerer::InsertLabel(false, insertBeforeInstr); - - // add temp, src, 1 - IR::RegOpnd *const tempOpnd = IR::RegOpnd::New(StackSym::New(TyUint8, func), TyUint8, func); - const IR::AutoReuseOpnd autoReuseTempOpnd(tempOpnd, func); - Lowerer::InsertAdd(false, tempOpnd, src, IR::IntConstOpnd::New(1, TyUint8, func, true), overflowLabel); - - // tst temp, 0xff - // beq $overflow - Lowerer::InsertTestBranch( - tempOpnd, - IR::IntConstOpnd::New(static_cast(-1), TyUint8, func, true), - Js::OpCode::BrEq_A, - overflowLabel, - overflowLabel); - - // mov dst, temp - Lowerer::InsertMove(dst, tempOpnd, overflowLabel); - - const bool dstEqualsSrc = dst->IsEqual(src); - if(!dstEqualsSrc || onOverflowInsertBeforeInstrRef) - { - // b $continue - // $overflow: - // mov dst, static_cast(-1) - // $continue: - IR::LabelInstr *const continueLabel = Lowerer::InsertLabel(false, insertBeforeInstr); - Lowerer::InsertBranch(Js::OpCode::Br, continueLabel, overflowLabel); - if(!dstEqualsSrc) - { - Lowerer::InsertMove(dst, IR::IntConstOpnd::New(static_cast(-1), TyUint8, func, true), continueLabel); - } - - if(onOverflowInsertBeforeInstrRef) - { - *onOverflowInsertBeforeInstrRef = continueLabel; - } - } - else - { - // $overflow: - } -} - -void LowererMD::InsertDecUInt8PreventOverflow( - IR::Opnd *const dst, - IR::Opnd *const src, - IR::Instr *const insertBeforeInstr, - IR::Instr * *const onOverflowInsertBeforeInstrRef) -{ - Assert(dst); - Assert(dst->GetType() == TyUint8); - Assert(src); - Assert(src->GetType() == TyUint8); - Assert(insertBeforeInstr); - - Func *const func = insertBeforeInstr->m_func; - - // Generate: - // subs temp, src, 1 - // bcs $overflow - // mov dst, temp - // b $continue - // $overflow: - // mov dst, 0 - // $continue: - - IR::LabelInstr *const overflowLabel = Lowerer::InsertLabel(false, insertBeforeInstr); - - // subs temp, src, 1 - IR::RegOpnd *const tempOpnd = IR::RegOpnd::New(StackSym::New(TyUint8, func), TyUint8, func); - const IR::AutoReuseOpnd autoReuseTempOpnd(tempOpnd, func); - Lowerer::InsertSub(true, tempOpnd, src, IR::IntConstOpnd::New(1, TyUint8, func, true), overflowLabel); - - // bcs $overflow - Lowerer::InsertBranch(Js::OpCode::BrLt_A, true, overflowLabel, overflowLabel); - - // mov dst, temp - Lowerer::InsertMove(dst, tempOpnd, overflowLabel); - - const bool dstEqualsSrc = dst->IsEqual(src); - if(!dstEqualsSrc || onOverflowInsertBeforeInstrRef) - { - // b $continue - // $overflow: - // mov dst, 0 - // $continue: - IR::LabelInstr *const continueLabel = Lowerer::InsertLabel(false, insertBeforeInstr); - Lowerer::InsertBranch(Js::OpCode::Br, continueLabel, overflowLabel); - if(!dstEqualsSrc) - { - Lowerer::InsertMove(dst, IR::IntConstOpnd::New(0, TyUint8, func, true), continueLabel); - } - - if(onOverflowInsertBeforeInstrRef) - { - *onOverflowInsertBeforeInstrRef = continueLabel; - } - } - else - { - // $overflow: - } -} - IR::Instr* LowererMD::GeneratePreCall(IR::Instr * callInstr, IR::Opnd *functionObjOpnd) { diff --git a/lib/Backend/arm/LowerMD.h b/lib/Backend/arm/LowerMD.h index d9a2f730052..5d484406bea 100644 --- a/lib/Backend/arm/LowerMD.h +++ b/lib/Backend/arm/LowerMD.h @@ -268,10 +268,6 @@ class LowererMD void LowerInlineSpreadArgOutLoop(IR::Instr *callInstr, IR::RegOpnd *indexOpnd, IR::RegOpnd *arrayElementsStartOpnd); -public: - static void InsertIncUInt8PreventOverflow(IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr, IR::Instr * *const onOverflowInsertBeforeInstrRef = nullptr); - static void InsertDecUInt8PreventOverflow(IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr, IR::Instr * *const onOverflowInsertBeforeInstrRef = nullptr); - private: void GenerateFlagInlineCacheCheckForGetterSetter( IR::Instr * insertBeforeInstr, diff --git a/lib/Backend/arm64/LowerMD.h b/lib/Backend/arm64/LowerMD.h index 7aa565f3d3a..dd62ae91294 100644 --- a/lib/Backend/arm64/LowerMD.h +++ b/lib/Backend/arm64/LowerMD.h @@ -262,8 +262,4 @@ class LowererMD void ResetHelperArgsCount() { __debugbreak(); } void LowerInlineSpreadArgOutLoop(IR::Instr *callInstr, IR::RegOpnd *indexOpnd, IR::RegOpnd *arrayElementsStartOpnd) { __debugbreak(); } - -public: - static void InsertIncUInt8PreventOverflow(IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr, IR::Instr * *const onOverflowInsertBeforeInstrRef = nullptr) { __debugbreak(); } - static void InsertDecUInt8PreventOverflow(IR::Opnd *const dst, IR::Opnd *const src, IR::Instr *const insertBeforeInstr, IR::Instr * *const onOverflowInsertBeforeInstrRef = nullptr) { __debugbreak(); } }; diff --git a/lib/Runtime/Base/FunctionBody.cpp b/lib/Runtime/Base/FunctionBody.cpp index 2aabe760476..bbb28954200 100644 --- a/lib/Runtime/Base/FunctionBody.cpp +++ b/lib/Runtime/Base/FunctionBody.cpp @@ -439,6 +439,7 @@ namespace Js m_argUsedForBranch(0), m_envDepth((uint16)-1), interpretedCount(0), + lastInterpretedCount(0), loopInterpreterLimit(CONFIG_FLAG(LoopInterpretCount)), savedPolymorphicCacheState(0), debuggerScopeIndex(0), @@ -495,8 +496,7 @@ namespace Js hasNestedLoop(false), recentlyBailedOutOfJittedLoopBody(false), m_isAsmJsScheduledForFullJIT(false), - m_asmJsTotalLoopCount(0), - inactiveCount(0) + m_asmJsTotalLoopCount(0) // // Even if the function does not require any locals, we must always have "R0" to propagate // a return value. By enabling this here, we avoid unnecessary conditionals during execution. @@ -529,7 +529,6 @@ namespace Js #endif { SetCountField(CounterFields::ConstantCount, 1); - SetInactiveCount(0); this->SetDefaultFunctionEntryPointInfo((FunctionEntryPointInfo*) this->GetDefaultEntryPointInfo(), DefaultEntryThunk); this->m_hasBeenParsed = true; @@ -554,6 +553,21 @@ namespace Js InitDisableInlineSpread(); } + bool FunctionBody::InterpretedSinceCallCountCollection() const + { + return this->interpretedCount != this->lastInterpretedCount; + } + + void FunctionBody::CollectInterpretedCounts() + { + this->lastInterpretedCount = this->interpretedCount; + } + + void FunctionBody::IncrInactiveCount(uint increment) + { + this->inactiveCount = UInt32Math::Add(this->inactiveCount, increment); + } + void FunctionBody::UpdateActiveFunctionSet(BVSparse *pActiveFuncs) const { if (pActiveFuncs->TestAndSet(this->GetFunctionNumber())) @@ -6578,7 +6592,7 @@ namespace Js if(GetDefaultFunctionEntryPointInfo() == simpleJitEntryPointInfo) { Assert(GetExecutionMode() == ExecutionMode::SimpleJit); - const int newSimpleJitCallCount = max(0, simpleJitEntryPointInfo->callsCount + limitScale); + const int newSimpleJitCallCount = max(0, (int)simpleJitEntryPointInfo->callsCount + limitScale); Assert(static_cast(static_cast(newSimpleJitCallCount)) == newSimpleJitCallCount); SetSimpleJitCallCount(static_cast(newSimpleJitCallCount)); } @@ -6716,11 +6730,11 @@ namespace Js } // Simple JIT counts down and transitions on overflow - const uint8 callCount = simpleJitEntryPointInfo->callsCount; + const uint32 callCount = simpleJitEntryPointInfo->callsCount; Assert(simpleJitLimit == 0 ? callCount == 0 : simpleJitLimit > callCount); return callCount == 0 ? static_cast(simpleJitLimit) : - static_cast(simpleJitLimit) - callCount - 1; + static_cast(simpleJitLimit) - static_cast(callCount) - 1; } void FunctionBody::ResetSimpleJitLimitAndCallCount() @@ -8792,6 +8806,16 @@ namespace Js } #endif + bool FunctionEntryPointInfo::ExecutedSinceCallCountCollection() const + { + return this->callsCount != this->lastCallsCount; + } + + void FunctionEntryPointInfo::CollectCallCounts() + { + this->lastCallsCount = this->callsCount; + } + void FunctionEntryPointInfo::ReleasePendingWorkItem() { // Do this outside of Cleanup since cleanup can be called from the background thread diff --git a/lib/Runtime/Base/FunctionBody.h b/lib/Runtime/Base/FunctionBody.h index e0e60ea9a07..9f9e8829d56 100644 --- a/lib/Runtime/Base/FunctionBody.h +++ b/lib/Runtime/Base/FunctionBody.h @@ -986,8 +986,8 @@ namespace Js int32 localVarChangedOffset; uint entryPointIndex; - uint8 callsCount; - uint8 lastCallsCount; + uint32 callsCount; + uint32 lastCallsCount; bool nativeEntryPointProcessed; private: @@ -1007,6 +1007,9 @@ namespace Js //End AsmJS Support #endif + bool ExecutedSinceCallCountCollection() const; + void CollectCallCounts(); + virtual FunctionBody *GetFunctionBody() const override; #if ENABLE_NATIVE_CODEGEN ExecutionMode GetJitMode() const; @@ -1016,9 +1019,9 @@ namespace Js virtual void Expire() override; virtual void EnterExpirableCollectMode() override; virtual void ResetOnNativeCodeInstallFailure() override; - static const uint8 GetDecrCallCountPerBailout() + static const uint32 GetDecrCallCountPerBailout() { - return (uint8)CONFIG_FLAG(CallsToBailoutsRatioForRejit) + 1; + return (uint32)CONFIG_FLAG(CallsToBailoutsRatioForRejit) + 1; } #endif @@ -2379,6 +2382,7 @@ namespace Js NoWriteBarrierField inactiveCount; uint32 interpretedCount; + uint32 lastInterpretedCount; uint32 loopInterpreterLimit; uint32 debuggerScopeIndex; uint32 savedPolymorphicCacheState; @@ -2454,6 +2458,9 @@ namespace Js void UpdateActiveFunctionSet(BVSparse *pActiveFuncs) const; uint GetInactiveCount() const { return inactiveCount; } void SetInactiveCount(uint count) { inactiveCount = count; } + void IncrInactiveCount(uint increment); + bool InterpretedSinceCallCountCollection() const; + void CollectInterpretedCounts(); Js::RootObjectBase * LoadRootObject() const; Js::RootObjectBase * GetRootObject() const; @@ -2585,7 +2592,7 @@ namespace Js return (void*)&m_uScriptId; } - uint8 *GetCallsCountAddress(EntryPointInfo* info) const + uint32 *GetCallsCountAddress(EntryPointInfo* info) const { FunctionEntryPointInfo* entryPoint = (FunctionEntryPointInfo*) info; return &entryPoint->callsCount; diff --git a/lib/Runtime/Base/ScriptContext.cpp b/lib/Runtime/Base/ScriptContext.cpp index 040eaeb1d11..991a3fbcc33 100644 --- a/lib/Runtime/Base/ScriptContext.cpp +++ b/lib/Runtime/Base/ScriptContext.cpp @@ -1018,25 +1018,36 @@ namespace Js } #endif - void ScriptContext::UpdateInactiveCounts() - { - Assert(!this->IsClosed()); - - auto fn = [&](FunctionBody *functionBody) { - functionBody->SetInactiveCount(UInt32Math::Add(functionBody->GetInactiveCount(), 1)); - }; - - this->MapFunction(fn); - } - void ScriptContext::RedeferFunctionBodies(ActiveFunctionSet *pActiveFuncs, uint inactiveThreshold) { Assert(!this->IsClosed()); auto fn = [&](FunctionBody *functionBody) { - if (functionBody->GetFunctionInfo()->GetFunctionProxy() == functionBody && functionBody->CanBeDeferred() && !pActiveFuncs->Test(functionBody->GetFunctionNumber()) && functionBody->GetByteCode() != nullptr && functionBody->GetCanDefer()) + bool exec = functionBody->InterpretedSinceCallCountCollection(); + functionBody->CollectInterpretedCounts(); + functionBody->MapEntryPoints([&](int index, FunctionEntryPointInfo *entryPointInfo) { + if (!entryPointInfo->IsCleanedUp() && entryPointInfo->ExecutedSinceCallCountCollection()) + { + exec = true; + } + entryPointInfo->CollectCallCounts(); + }); + if (exec) + { + functionBody->SetInactiveCount(0); + } + else { - functionBody->RedeferFunction(inactiveThreshold); + functionBody->IncrInactiveCount(inactiveThreshold); + } + + if (pActiveFuncs) + { + Assert(this->GetThreadContext()->DoRedeferFunctionBodies()); + if (functionBody->GetFunctionInfo()->GetFunctionProxy() == functionBody && functionBody->CanBeDeferred() && !pActiveFuncs->Test(functionBody->GetFunctionNumber()) && functionBody->GetByteCode() != nullptr && functionBody->GetCanDefer()) + { + functionBody->RedeferFunction(inactiveThreshold); + } } }; diff --git a/lib/Runtime/Base/ScriptContext.h b/lib/Runtime/Base/ScriptContext.h index 2b07af027c2..75ae6a8cd39 100644 --- a/lib/Runtime/Base/ScriptContext.h +++ b/lib/Runtime/Base/ScriptContext.h @@ -425,7 +425,6 @@ namespace Js const ScriptContextBase* GetScriptContextBase() const { return static_cast(this); } - void UpdateInactiveCounts(); void RedeferFunctionBodies(ActiveFunctionSet *pActive, uint inactiveThreshold); bool DoUndeferGlobalFunctions() const; diff --git a/lib/Runtime/Base/ThreadContext.cpp b/lib/Runtime/Base/ThreadContext.cpp index 9e064f158c3..49f80c54329 100644 --- a/lib/Runtime/Base/ThreadContext.cpp +++ b/lib/Runtime/Base/ThreadContext.cpp @@ -190,6 +190,7 @@ ThreadContext::ThreadContext(AllocationPolicyManager * allocationPolicyManager, isAllJITCodeInPreReservedRegion(true), redeferralState(InitialRedeferralState), gcSinceLastRedeferral(0), + gcSinceCallCountsCollected(0), tridentLoadAddress(nullptr), debugManager(nullptr) #if ENABLE_TTD @@ -1608,7 +1609,7 @@ ThreadContext::ProbeStackNoDispose(size_t size, Js::ScriptContext *scriptContext { if (JsUtil::ExternalApi::IsScriptActiveOnCurrentThreadContext()) { - this->RedeferFunctionBodies(); + this->TryRedeferral(); } } } @@ -2431,102 +2432,134 @@ ThreadContext::PostCollectionCallBack() } } - if (PHASE_ON1(Js::RedeferralPhase) && this->redeferralState != InitialRedeferralState) - { - this->UpdateInactiveCounts(); - } - if (this->DoRedeferralOnGc()) + if (this->DoTryRedeferral()) { HRESULT hr = S_OK; BEGIN_TRANSLATE_OOM_TO_HRESULT { - this->RedeferFunctionBodies(); + this->TryRedeferral(); } END_TRANSLATE_OOM_TO_HRESULT(hr); - if (hr == S_OK) - { - gcSinceLastRedeferral = 0; - if (redeferralState == StartupRedeferralState) - { - redeferralState = MainRedeferralState; - } - } } + + this->UpdateRedeferralState(); } } -void -ThreadContext::UpdateInactiveCounts() +bool +ThreadContext::DoTryRedeferral() const { - Js::ScriptContext *scriptContext; - for (scriptContext = GetScriptContextList(); scriptContext; scriptContext = scriptContext->next) + if (PHASE_FORCE1(Js::RedeferralPhase) || PHASE_STRESS1(Js::RedeferralPhase)) { - if (scriptContext->IsClosed()) - { - continue; - } - scriptContext->UpdateInactiveCounts(); + return true; } -} -bool -ThreadContext::DoRedeferralOnGc() -{ if (!PHASE_ON1(Js::RedeferralPhase)) { return false; } - if (PHASE_FORCE1(Js::RedeferralPhase)) + switch (this->redeferralState) + { + case InitialRedeferralState: + return false; + + case StartupRedeferralState: + return gcSinceCallCountsCollected >= StartupRedeferralInactiveThreshold; + + case MainRedeferralState: + return gcSinceCallCountsCollected >= MainRedeferralInactiveThreshold; + + default: + Assert(0); + return false; + }; +} + +bool +ThreadContext::DoRedeferFunctionBodies() const +{ + if (PHASE_FORCE1(Js::RedeferralPhase) || PHASE_STRESS1(Js::RedeferralPhase)) { return true; } - gcSinceLastRedeferral++; - Assert(gcSinceLastRedeferral != 0); - switch(redeferralState) + if (!PHASE_ON1(Js::RedeferralPhase)) + { + return false; + } + + switch (this->redeferralState) { case InitialRedeferralState: - if (gcSinceLastRedeferral == InitialRedeferralDelay) - { - redeferralState = StartupRedeferralState; - } return false; case StartupRedeferralState: - return (gcSinceLastRedeferral >= StartupRedeferralCheckInterval); + return gcSinceLastRedeferral >= StartupRedeferralCheckInterval; case MainRedeferralState: - return (gcSinceLastRedeferral >= MainRedeferralCheckInterval); + return gcSinceLastRedeferral >= MainRedeferralCheckInterval; default: Assert(0); return false; - } + }; } -void -ThreadContext::RedeferFunctionBodies() +uint +ThreadContext::GetRedeferralCollectionInterval() const { - // Collect the set of active functions. - ActiveFunctionSet *pActiveFuncs = nullptr; - pActiveFuncs = Anew(this->GetThreadAlloc(), ActiveFunctionSet, this->GetThreadAlloc()); - this->GetActiveFunctions(pActiveFuncs); + switch(this->redeferralState) + { + case InitialRedeferralState: + return InitialRedeferralDelay; + + case StartupRedeferralState: + return StartupRedeferralCheckInterval; + + case MainRedeferralState: + return MainRedeferralCheckInterval; + + default: + Assert(0); + return (uint)-1; + } +} - uint inactiveThreshold = 0; - switch (redeferralState) +uint +ThreadContext::GetRedeferralInactiveThreshold() const +{ + switch(this->redeferralState) { + case InitialRedeferralState: + return InitialRedeferralDelay; + case StartupRedeferralState: - inactiveThreshold = StartupRedeferralInactiveThreshold; - break; + return StartupRedeferralInactiveThreshold; + case MainRedeferralState: - inactiveThreshold = MainRedeferralInactiveThreshold; - break; + return MainRedeferralInactiveThreshold; + default: - Assert(PHASE_FORCE1(Js::RedeferralPhase) || PHASE_STRESS1(Js::RedeferralPhase)); - break; + Assert(0); + return (uint)-1; } +} + +void +ThreadContext::TryRedeferral() +{ + bool doRedefer = this->DoRedeferFunctionBodies(); + // Collect the set of active functions. + ActiveFunctionSet *pActiveFuncs = nullptr; + if (doRedefer) + { + pActiveFuncs = Anew(this->GetThreadAlloc(), ActiveFunctionSet, this->GetThreadAlloc()); + this->GetActiveFunctions(pActiveFuncs); + } + + uint inactiveThreshold = this->GetRedeferralInactiveThreshold(); Js::ScriptContext *scriptContext; for (scriptContext = GetScriptContextList(); scriptContext; scriptContext = scriptContext->next) { @@ -2537,7 +2570,10 @@ ThreadContext::RedeferFunctionBodies() scriptContext->RedeferFunctionBodies(pActiveFuncs, inactiveThreshold); } - Adelete(this->GetThreadAlloc(), pActiveFuncs); + if (pActiveFuncs) + { + Adelete(this->GetThreadAlloc(), pActiveFuncs); + } } void @@ -2560,6 +2596,44 @@ ThreadContext::GetActiveFunctions(ActiveFunctionSet * pActiveFuncs) } } +void +ThreadContext::UpdateRedeferralState() +{ + uint inactiveThreshold = this->GetRedeferralInactiveThreshold(); + uint collectInterval = this->GetRedeferralCollectionInterval(); + + this->gcSinceCallCountsCollected++; + if (this->gcSinceCallCountsCollected >= inactiveThreshold) + { + this->gcSinceCallCountsCollected = 0; + } + + this->gcSinceLastRedeferral++; + if (this->gcSinceLastRedeferral >= collectInterval) + { + // Advance state + switch (this->redeferralState) + { + case InitialRedeferralState: + this->redeferralState = StartupRedeferralState; + break; + + case StartupRedeferralState: + this->redeferralState = MainRedeferralState; + break; + + case MainRedeferralState: + break; + + default: + Assert(0); + break; + } + + this->gcSinceLastRedeferral = 0; + } +} + #ifdef FAULT_INJECTION void ThreadContext::DisposeScriptContextByFaultInjectionCallBack() diff --git a/lib/Runtime/Base/ThreadContext.h b/lib/Runtime/Base/ThreadContext.h index 432b85a0989..caa8b874845 100644 --- a/lib/Runtime/Base/ThreadContext.h +++ b/lib/Runtime/Base/ThreadContext.h @@ -674,6 +674,7 @@ class ThreadContext sealed : }; RedeferralState redeferralState; uint gcSinceLastRedeferral; + uint gcSinceCallCountsCollected; static const uint InitialRedeferralDelay = 5; static const uint StartupRedeferralCheckInterval = 10; @@ -1205,10 +1206,13 @@ class ThreadContext sealed : static size_t GetProcessCodeSize() { return processNativeCodeSize; } size_t GetSourceSize() { return sourceCodeSize; } - void UpdateInactiveCounts(); - void RedeferFunctionBodies(); - void GetActiveFunctions(ActiveFunctionSet * ppActive); - bool DoRedeferralOnGc(); + bool DoTryRedeferral() const; + void TryRedeferral(); + bool DoRedeferFunctionBodies() const; + void UpdateRedeferralState(); + uint GetRedeferralCollectionInterval() const; + uint GetRedeferralInactiveThreshold() const; + void GetActiveFunctions(ActiveFunctionSet * pActive); Js::ScriptEntryExitRecord * GetScriptEntryExit() const { return entryExitRecord; } void RegisterCodeGenRecyclableData(Js::CodeGenRecyclableData *const codeGenRecyclableData); diff --git a/lib/Runtime/Language/InterpreterStackFrame.cpp b/lib/Runtime/Language/InterpreterStackFrame.cpp index f32d5f4ecf2..1fac553bd60 100644 --- a/lib/Runtime/Language/InterpreterStackFrame.cpp +++ b/lib/Runtime/Language/InterpreterStackFrame.cpp @@ -1733,7 +1733,6 @@ namespace Js Assert(threadContext->IsInScript()); FunctionBody* executeFunction = JavascriptFunction::FromVar(function)->GetFunctionBody(); - executeFunction->SetInactiveCount(0); #ifdef ENABLE_DEBUG_CONFIG_OPTIONS if (!isAsmJs && executeFunction->IsInDebugMode() != functionScriptContext->IsScriptContextInDebugMode()) // debug mode mismatch { diff --git a/lib/Runtime/Language/i386/AsmJsJitTemplate.cpp b/lib/Runtime/Language/i386/AsmJsJitTemplate.cpp index a62ebfaddb6..818d7a7bcf9 100644 --- a/lib/Runtime/Language/i386/AsmJsJitTemplate.cpp +++ b/lib/Runtime/Language/i386/AsmJsJitTemplate.cpp @@ -523,11 +523,7 @@ namespace Js //CodeGenDone status is set by TJ if ((entryPointInfo->IsNotScheduled() || entryPointInfo->IsCodeGenDone()) && !PHASE_OFF(BackEndPhase, body) && !PHASE_OFF(FullJitPhase, body)) { - if (entryPointInfo->callsCount < 255) - { - ++entryPointInfo->callsCount; - } - const int minTemplatizedJitRunCount = (int)CONFIG_FLAG(MinTemplatizedJitRunCount); + const uint32 minTemplatizedJitRunCount = (uint32)CONFIG_FLAG(MinTemplatizedJitRunCount); if ((entryPointInfo->callsCount >= minTemplatizedJitRunCount || body->IsHotAsmJsLoop())) { if (PHASE_TRACE1(AsmjsEntryPointInfoPhase))