void CBotStack::GetRunPos(const char* &FunctionName, int &start, int &end) { CBotProgram* prog = m_prog; // Current program CBotInstr* funct = NULL; // function found CBotInstr* instr = NULL; // the highest intruction CBotStack* p = this; while (p->m_next != NULL) { if ( p->m_instr != NULL ) instr = p->m_instr; if ( p->m_bFunc == 1 ) funct = p->m_instr; if ( p->m_next->m_prog != prog ) break ; if (p->m_next2 && p->m_next2->m_state != 0) p = p->m_next2 ; else p = p->m_next; } if ( p->m_instr != NULL ) instr = p->m_instr; if ( p->m_bFunc == 1 ) funct = p->m_instr; if ( funct == NULL ) return; CBotToken* t = funct->GetToken(); FunctionName = t->GetString(); // if ( p->m_instr != NULL ) instr = p->m_instr; t = instr->GetToken(); start = t->GetStart(); end = t->GetEnd(); }
bool CBotListArray::Execute(CBotStack* &pj, CBotVar* pVar) { CBotStack* pile1 = pj->AddStack(); CBotVar* pVar2; CBotInstr* p = m_expr; int n = 0; for (; p != nullptr ; n++, p = p->GetNext3b()) { if (pile1->GetState() > n) continue; pVar2 = pVar->GetItem(n, true); if (pVar2 == nullptr) { pj->SetError(CBotErrOutArray, p->GetToken()); return false; } CBotTypResult type = pVar2->GetTypResult(); if (!p->Execute(pile1, pVar2)) return false; // evaluate expression if (type.Eq(CBotTypPointer)) pVar2->SetType(type); // keep pointer type pile1->IncState(); } return pj->Return(pile1); }