CBotInstr* CBotInstrCall::Compile(CBotToken* &p, CBotCStack* pStack) { CBotToken* pp = p; p = p->GetNext(); if (p->GetType() == ID_OPENPAR) { CBotVar* ppVars[1000]; CBotInstrCall* inst = new CBotInstrCall(); inst->SetToken(pp); // compile la list of parameters inst->m_parameters = CompileParams(p, pStack, ppVars); if ( !pStack->IsOk() ) { delete inst; return nullptr; } // the routine is known? // CBotClass* pClass = nullptr; inst->m_typRes = pStack->CompileCall(pp, ppVars, inst->m_nFuncIdent); if ( inst->m_typRes.GetType() >= 20 ) { // if (pVar2!=nullptr) pp = pVar2->RetToken(); pStack->SetError( static_cast<CBotError>(inst->m_typRes.GetType()), pp ); delete pStack->TokenStack(); delete inst; return nullptr; } delete pStack->TokenStack(); if ( inst->m_typRes.GetType() > 0 ) { CBotVar* pRes = CBotVar::Create("", inst->m_typRes); pStack->SetVar(pRes); // for knowing the type of the result } else pStack->SetVar(nullptr); // routine returns void if (nullptr != (inst->m_exprRetVar = CBotExprRetVar::Compile(p, pStack))) { inst->m_exprRetVar->SetToken(&inst->m_token); delete pStack->TokenStack(); } if ( !pStack->IsOk() ) { delete inst; return nullptr; } return inst; } p = pp; delete pStack->TokenStack(); return nullptr; }
CBotInstr* CBotInstrCall::Compile(CBotToken* &p, CBotCStack* pStack) { CBotVar* ppVars[1000]; int i = 0; CBotToken* pp = p; p = p->GetNext(); pStack->SetStartError(p->GetStart()); CBotCStack* pile = pStack; if ( IsOfType(p, ID_OPENPAR) ) { int start, end; CBotInstrCall* inst = new CBotInstrCall(); inst->SetToken(pp); // compile la list of parameters if (!IsOfType(p, ID_CLOSEPAR)) while (true) { start = p->GetStart(); pile = pile->TokenStack(); // keeps the results on the stack CBotInstr* param = CBotExpression::Compile(p, pile); end = p->GetStart(); if ( inst->m_Parameters == NULL ) inst->m_Parameters = param; else inst->m_Parameters->AddNext(param); // constructs the list if ( !pile->IsOk() ) { delete inst; return pStack->Return(NULL, pile); } if ( param != NULL ) { if ( pile->GetTypResult().Eq(99) ) { delete pStack->TokenStack(); pStack->SetError(TX_VOID, p->GetStart()); delete inst; return NULL; } ppVars[i] = pile->GetVar(); ppVars[i]->GetToken()->SetPos(start, end); i++; if (IsOfType(p, ID_COMMA)) continue; // skips the comma if (IsOfType(p, ID_CLOSEPAR)) break; } pStack->SetError(TX_CLOSEPAR, p->GetStart()); delete pStack->TokenStack(); delete inst; return NULL; } ppVars[i] = NULL; // the routine is known? // CBotClass* pClass = NULL; inst->m_typRes = pStack->CompileCall(pp, ppVars, inst->m_nFuncIdent); if ( inst->m_typRes.GetType() >= 20 ) { // if (pVar2!=NULL) pp = pVar2->RetToken(); pStack->SetError( inst->m_typRes.GetType(), pp ); delete pStack->TokenStack(); delete inst; return NULL; } delete pStack->TokenStack(); if ( inst->m_typRes.GetType() > 0 ) { CBotVar* pRes = CBotVar::Create("", inst->m_typRes); pStack->SetVar(pRes); // for knowing the type of the result } else pStack->SetVar(NULL); // routine returns void return inst; } p = pp; delete pStack->TokenStack(); return NULL; }