bool CBotLeftExpr::Execute(CBotStack* &pj, CBotStack* array) { CBotStack* pile = pj->AddStack(); CBotVar* var1 = nullptr; CBotVar* var2 = nullptr; // fetch a variable (not copy) if (!ExecuteVar(var1, array, nullptr, false)) return false; if (pile->IfStep()) return false; if (var1) { var2 = pj->GetVar(); // result on the input stack if (var2) { CBotTypResult t1 = var1->GetTypResult(); CBotTypResult t2 = var2->GetTypResult(); if (t2.Eq(CBotTypPointer)) { CBotClass* c1 = t1.GetClass(); CBotClass* c2 = var2->GetClass(); if ( !c2->IsChildOf(c1)) { CBotToken* pt = &m_token; pile->SetError(CBotErrBadType1, pt); return pj->Return(pile); // operation performed } var1->SetVal(var2); // set pointer var1->SetType(t1); // keep pointer type } else var1->SetVal(var2); // do assignment } pile->SetCopyVar(var1); // replace the stack with the copy of the variable // (for name) } return pj->Return(pile); // operation performed }