Fix 'this' for object:: functions

Fixes #672
Fixes #1026
1008-fix
melex750 2017-10-24 04:46:07 -04:00
parent 6b1dd5dd8b
commit a9e0874abc
3 changed files with 12 additions and 4 deletions

View File

@ -76,6 +76,8 @@ CBotInstr* CBotExprVar::Compile(CBotToken*& p, CBotCStack* pStack, bool bCheckRe
// This is an element of the current class // This is an element of the current class
// ads the equivalent of this. before // ads the equivalent of this. before
CBotToken token("this"); CBotToken token("this");
// invisible 'this.' highlights member token on error
token.SetPos(p->GetStart(), p->GetEnd());
inst->SetToken(&token); inst->SetToken(&token);
(static_cast<CBotExprVar*>(inst))->m_nIdent = -2; // identificator for this (static_cast<CBotExprVar*>(inst))->m_nIdent = -2; // identificator for this
@ -196,6 +198,8 @@ CBotInstr* CBotExprVar::CompileMethode(CBotToken* &p, CBotCStack* pStack)
// this is an element of the current class // this is an element of the current class
// adds the equivalent of this. before // adds the equivalent of this. before
// invisible 'this.' highlights member token on error
pthis.SetPos(pp->GetStart(), pp->GetEnd());
inst->SetToken(&pthis); inst->SetToken(&pthis);
(static_cast<CBotExprVar*>(inst))->m_nIdent = -2; // ident for this (static_cast<CBotExprVar*>(inst))->m_nIdent = -2; // ident for this

View File

@ -464,6 +464,7 @@ void CBotFunction::RestoreState(CBotVar** ppVars, CBotStack* &pj, CBotVar* pInst
{ {
CBotVar* pThis = pile->FindVar("this"); CBotVar* pThis = pile->FindVar("this");
pThis->SetInit(CBotVar::InitType::IS_POINTER); pThis->SetInit(CBotVar::InitType::IS_POINTER);
pThis->SetPointer(pInstance);
pThis->SetUniqNum(-2); pThis->SetUniqNum(-2);
} }
@ -672,6 +673,7 @@ int CBotFunction::DoCall(CBotProgram* program, const std::list<CBotFunction*>& l
{ {
CBotTypResult type; CBotTypResult type;
CBotFunction* pt = nullptr; CBotFunction* pt = nullptr;
CBotProgram* baseProg = pStack->GetProgram(true);
pt = FindLocalOrPublic(localFunctionList, nIdent, name, ppVars, type); pt = FindLocalOrPublic(localFunctionList, nIdent, name, ppVars, type);
@ -695,7 +697,7 @@ int CBotFunction::DoCall(CBotProgram* program, const std::list<CBotFunction*>& l
if (pStk3b->GetState() == 0 && !pt->m_MasterClass.empty()) if (pStk3b->GetState() == 0 && !pt->m_MasterClass.empty())
{ {
CBotVar* pInstance = program->m_thisVar; CBotVar* pInstance = (baseProg != nullptr) ? baseProg->m_thisVar : nullptr;
// make "this" known // make "this" known
CBotVar* pThis ; CBotVar* pThis ;
if ( pInstance == nullptr ) if ( pInstance == nullptr )
@ -762,8 +764,7 @@ void CBotFunction::RestoreCall(const std::list<CBotFunction*>& localFunctionList
CBotFunction* pt = nullptr; CBotFunction* pt = nullptr;
CBotStack* pStk1; CBotStack* pStk1;
CBotStack* pStk3; CBotStack* pStk3;
CBotProgram* baseProg = pStack->GetProgram(true);
// search function to return the ok identifier
pt = FindLocalOrPublic(localFunctionList, nIdent, name, ppVars, type); pt = FindLocalOrPublic(localFunctionList, nIdent, name, ppVars, type);
@ -792,10 +793,11 @@ void CBotFunction::RestoreCall(const std::list<CBotFunction*>& localFunctionList
{ {
if ( !pt->m_MasterClass.empty() ) if ( !pt->m_MasterClass.empty() )
{ {
// CBotVar* pInstance = m_pProg->m_thisVar; CBotVar* pInstance = (baseProg != nullptr) ? baseProg->m_thisVar : nullptr;
// make "this" known // make "this" known
CBotVar* pThis = pStk1->FindVar("this"); CBotVar* pThis = pStk1->FindVar("this");
pThis->SetInit(CBotVar::InitType::IS_POINTER); pThis->SetInit(CBotVar::InitType::IS_POINTER);
pThis->SetPointer(pInstance);
pThis->SetUniqNum(-2); pThis->SetUniqNum(-2);
} }
} }

View File

@ -72,6 +72,8 @@ CBotLeftExpr* CBotLeftExpr::Compile(CBotToken* &p, CBotCStack* pStack)
// this is an element of the current class // this is an element of the current class
// adds the equivalent of this. before // adds the equivalent of this. before
CBotToken pthis("this"); CBotToken pthis("this");
// invisible 'this.' highlights member token on error
pthis.SetPos(p->GetStart(), p->GetEnd());
inst->SetToken(&pthis); inst->SetToken(&pthis);
inst->m_nIdent = -2; // indent for this inst->m_nIdent = -2; // indent for this