void CNscContext::AddVariable (const char *pszIdentifier, NscType nType, UINT32 ulFlags) { // // Add a new symbol // NscSymbol *pSymbol = m_sSymbols .Add ( pszIdentifier, NscSymType_Variable); pSymbol ->nType = nType; pSymbol ->ulFlags = ulFlags; pSymbol ->nStackOffset = 0; pSymbol ->nExtra = 0; pSymbol ->nCompiledStart = 0xffffffff; pSymbol ->nCompiledEnd = 0xffffffff; size_t nSymbol = m_sSymbols .GetSymbolOffset (pSymbol); // // Depending on the scope of the variable, adjust offsets and such // if (IsNWScript () || (pSymbol ->ulFlags & NscSymFlag_Constant) != 0) { assert (!IsPhase2 ()); pSymbol ->ulFlags |= NscSymFlag_Constant; m_sSymCount ++; if (!IsNWScript() && m_fSymPrint) printf("Add const symbol %s, count now %d\n", pszIdentifier,m_sSymCount); } else if (IsGlobalScope ()) { assert (!IsPhase2 ()); m_anGlobalVars .Add (nSymbol); m_anGlobalDefs .Add (nSymbol); pSymbol ->ulFlags |= NscSymFlag_Global; //m_sSymCount ++; //if (m_fSymPrint) printf("Add global symbol %s, count now %d\n", pszIdentifier, m_sSymCount); } else { assert (IsPhase2 ()); assert (m_pCurrentFence); pSymbol ->nStackOffset = m_pCurrentFence ->nLocals + m_pCurrentFence ->nPrevLocals; m_pCurrentFence ->nLocals += GetTypeSize (nType); } }
bool FrameInjection::IsGlobalScope() { return IsGlobalScope(ThreadInfo::s_threadInfo->m_top); }