[colobot] 05/145: Add error code no expression, remove some bad code

Didier Raboud odyx at moszumanska.debian.org
Mon Jul 11 12:56:11 UTC 2016


This is an automated email from the git hooks/post-receive script.

odyx pushed a commit to branch debian/master
in repository colobot.

commit 6be1f562889d62758947d825924f737036aec6ac
Author: melex750 <melex750 at users.noreply.github.com>
Date:   Sun Mar 20 20:55:22 2016 -0400

    Add error code no expression, remove some bad code
---
 src/CBot/CBotClass.cpp                |  6 ++--
 src/CBot/CBotEnums.h                  |  1 +
 src/CBot/CBotInstr/CBotDefArray.cpp   |  4 +--
 src/CBot/CBotInstr/CBotDefBoolean.cpp |  2 +-
 src/CBot/CBotInstr/CBotDefClass.cpp   |  2 +-
 src/CBot/CBotInstr/CBotDefFloat.cpp   |  2 +-
 src/CBot/CBotInstr/CBotDefInt.cpp     |  2 +-
 src/CBot/CBotInstr/CBotDefString.cpp  |  2 +-
 src/CBot/CBotInstr/CBotListArray.cpp  | 67 +++++++----------------------------
 src/CBot/CBotInstr/CBotListArray.h    |  2 +-
 src/common/restext.cpp                |  1 +
 11 files changed, 25 insertions(+), 66 deletions(-)

diff --git a/src/CBot/CBotClass.cpp b/src/CBot/CBotClass.cpp
index 5f76145..aca2d2b 100644
--- a/src/CBot/CBotClass.cpp
+++ b/src/CBot/CBotClass.cpp
@@ -566,7 +566,7 @@ bool CBotClass::CompileDefItem(CBotToken* &p, CBotCStack* pStack, bool bSecond)
                 if ( p->GetType() != ID_CLBRK )
                 {
                     i = CBotExpression::Compile( p, pStack );           // expression for the value
-                    if (i == nullptr || pStack->GetType() >= CBotTypBoolean) // must be a number
+                    if (i == nullptr || pStack->GetType() != CBotTypInt) // must be a number
                     {
                         pStack->SetError(CBotErrBadIndex, p->GetStart());
                         return false;
@@ -681,9 +681,9 @@ bool CBotClass::CompileDefItem(CBotToken* &p, CBotCStack* pStack, bool bSecond)
             if ( IsOfType(p, ID_ASS ) )
             {
                 pStack->SetStartError(p->GetStart());
-                if ( IsOfTypeList(p, TokenTypVar, ID_NEW, ID_SEP, 0) ) // no var, new, or ';'
+                if ( IsOfType(p, ID_SEP) )
                 {
-                    pStack->SetError(CBotErrBadLeft, p->GetPrev());
+                    pStack->SetError(CBotErrNoExpression, p->GetPrev());
                     return false;
                 }
                 if ( type.Eq(CBotTypArrayPointer) )
diff --git a/src/CBot/CBotEnums.h b/src/CBot/CBotEnums.h
index 475648a..24e0095 100644
--- a/src/CBot/CBotEnums.h
+++ b/src/CBot/CBotEnums.h
@@ -235,6 +235,7 @@ enum CBotError : int
     CBotErrBadIndex      = 5040, //!< wrong index type "[ false ]"
     CBotErrPrivate       = 5041, //!< protected item
     CBotErrNoPublic      = 5042, //!< missing word "public"
+    CBotErrNoExpression  = 5043, //!< expression expected after =
 
     // Runtime errors
     CBotErrZeroDiv       = 6000, //!< division by zero
diff --git a/src/CBot/CBotInstr/CBotDefArray.cpp b/src/CBot/CBotInstr/CBotDefArray.cpp
index c70c8f9..473fdc8 100644
--- a/src/CBot/CBotInstr/CBotDefArray.cpp
+++ b/src/CBot/CBotInstr/CBotDefArray.cpp
@@ -76,7 +76,7 @@ CBotInstr* CBotDefArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResul
             if (p->GetType() != ID_CLBRK)
             {
                 i = CBotExpression::Compile(p, pStk);                  // expression for the value
-                if (i == nullptr || pStk->GetType() >= CBotTypBoolean) // must be a number
+                if (i == nullptr || pStk->GetType() != CBotTypInt)     // must be a number
                 {
                     pStk->SetError(CBotErrBadIndex, p->GetStart());
                     goto error;
@@ -106,7 +106,7 @@ CBotInstr* CBotDefArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResul
             pStk->SetStartError(p->GetStart());
             if ( IsOfType(p, ID_SEP) )
             {
-                pStk->SetError(CBotErrBadLeft, p->GetPrev());
+                pStk->SetError(CBotErrNoExpression, p->GetPrev());
                 goto error;
             }
             if ( nullptr == (inst->m_listass = CBotListArray::Compile(p, pStk, type.GetTypElem())) )
diff --git a/src/CBot/CBotInstr/CBotDefBoolean.cpp b/src/CBot/CBotInstr/CBotDefBoolean.cpp
index 63b9d34..d64a186 100644
--- a/src/CBot/CBotInstr/CBotDefBoolean.cpp
+++ b/src/CBot/CBotInstr/CBotDefBoolean.cpp
@@ -90,7 +90,7 @@ CBotInstr* CBotDefBoolean::Compile(CBotToken* &p, CBotCStack* pStack, bool cont,
             pStk->SetStartError(p->GetStart());
             if ( IsOfType(p, ID_SEP) )
             {
-                pStk->SetError(CBotErrBadLeft, p->GetPrev());
+                pStk->SetError(CBotErrNoExpression, p->GetPrev());
                 goto error;
             }
             if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
diff --git a/src/CBot/CBotInstr/CBotDefClass.cpp b/src/CBot/CBotInstr/CBotDefClass.cpp
index 72ec71e..ab4ea99 100644
--- a/src/CBot/CBotInstr/CBotDefClass.cpp
+++ b/src/CBot/CBotInstr/CBotDefClass.cpp
@@ -157,7 +157,7 @@ CBotInstr* CBotDefClass::Compile(CBotToken* &p, CBotCStack* pStack, CBotClass* p
             pStk->SetStartError(p->GetStart());
             if ( IsOfType(p, ID_SEP) )
             {
-                pStk->SetError(CBotErrBadLeft, p->GetPrev());
+                pStk->SetError(CBotErrNoExpression, p->GetPrev());
                 goto error;
             }
             if (inst->m_hasParams)
diff --git a/src/CBot/CBotInstr/CBotDefFloat.cpp b/src/CBot/CBotInstr/CBotDefFloat.cpp
index 33398fa..5348a52 100644
--- a/src/CBot/CBotInstr/CBotDefFloat.cpp
+++ b/src/CBot/CBotInstr/CBotDefFloat.cpp
@@ -89,7 +89,7 @@ CBotInstr* CBotDefFloat::Compile(CBotToken* &p, CBotCStack* pStack, bool cont, b
             pStk->SetStartError(p->GetStart());
             if ( IsOfType(p, ID_SEP) )
             {
-                pStk->SetError(CBotErrBadLeft, p->GetPrev());
+                pStk->SetError(CBotErrNoExpression, p->GetPrev());
                 goto error;
             }
             if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
diff --git a/src/CBot/CBotInstr/CBotDefInt.cpp b/src/CBot/CBotInstr/CBotDefInt.cpp
index 9f7dcb6..babd3fd 100644
--- a/src/CBot/CBotInstr/CBotDefInt.cpp
+++ b/src/CBot/CBotInstr/CBotDefInt.cpp
@@ -93,7 +93,7 @@ CBotInstr* CBotDefInt::Compile(CBotToken* &p, CBotCStack* pStack, bool cont, boo
             pStk->SetStartError(p->GetStart());
             if ( IsOfType(p, ID_SEP) )
             {
-                pStk->SetError(CBotErrBadLeft, p->GetPrev());
+                pStk->SetError(CBotErrNoExpression, p->GetPrev());
                 goto error;
             }
             if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
diff --git a/src/CBot/CBotInstr/CBotDefString.cpp b/src/CBot/CBotInstr/CBotDefString.cpp
index 77e0119..cb4502d 100644
--- a/src/CBot/CBotInstr/CBotDefString.cpp
+++ b/src/CBot/CBotInstr/CBotDefString.cpp
@@ -93,7 +93,7 @@ CBotInstr* CBotDefString::Compile(CBotToken* &p, CBotCStack* pStack, bool cont,
             pStk->SetStartError(p->GetStart());
             if ( IsOfType(p, ID_SEP) )
             {
-                pStk->SetError(CBotErrBadLeft, p->GetPrev());
+                pStk->SetError(CBotErrNoExpression, p->GetPrev());
                 goto error;
             }
             if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
diff --git a/src/CBot/CBotInstr/CBotListArray.cpp b/src/CBot/CBotInstr/CBotListArray.cpp
index ab25e05..bc6ac28 100644
--- a/src/CBot/CBotInstr/CBotListArray.cpp
+++ b/src/CBot/CBotInstr/CBotListArray.cpp
@@ -45,7 +45,7 @@ CBotListArray::~CBotListArray()
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-CBotInstr* CBotListArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResult type, bool classItem)
+CBotInstr* CBotListArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResult type)
 {
     CBotCStack* pStk = pStack->TokenStack(p);
 
@@ -69,58 +69,33 @@ CBotInstr* CBotListArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResu
         if (type.Eq( CBotTypArrayPointer ))
         {
             pStk->SetStartError(p->GetStart());
-            if (p->GetType() == TokenTypVar)
+            if ( nullptr == (inst->m_expr = CBotListArray::Compile(p, pStk, type.GetTypElem())) )
             {
-                if (!classItem)
+                if (pStk->IsOk())
                 {
                     inst->m_expr = CBotTwoOpExpr::Compile(p, pStk);
-                    if (!pStk->GetTypResult().Compare(type))  // compatible type ?
+                    if (inst->m_expr == nullptr || !pStk->GetTypResult().Compare(type))  // compatible type ?
                     {
                         pStk->SetError(CBotErrBadType1, p->GetStart());
                         goto error;
                     }
                 }
-                else
-                {
-                    pStk->SetError(CBotErrBadLeft, p->GetPrev());
-                    goto error;
-                }
-            }
-            else
-            {
-                if (nullptr == ( inst->m_expr = CBotListArray::Compile( p, pStk, type.GetTypElem() ) ))
-                {
-                    goto error;
-                }
             }
             while (IsOfType( p, ID_COMMA ))                                     // other elements?
             {
                 pStk->SetStartError(p->GetStart());
                 CBotInstr* i = nullptr;
-                if (p->GetType() == TokenTypVar)
+                if ( nullptr == (i = CBotListArray::Compile(p, pStk, type.GetTypElem())) )
                 {
-                    if (!classItem)
+                    if (pStk->IsOk())
                     {
                         i = CBotTwoOpExpr::Compile(p, pStk);
-                        if (nullptr == i || !pStk->GetTypResult().Compare(type))  // compatible type ?
+                        if (i == nullptr || !pStk->GetTypResult().Compare(type))  // compatible type ?
                         {
                             pStk->SetError(CBotErrBadType1, p->GetStart());
                             goto error;
                         }
                     }
-                    else
-                    {
-                        pStk->SetError(CBotErrBadLeft, p->GetPrev());
-                        goto error;
-                    }
-                }
-                else
-                {
-                    i = CBotListArray::Compile(p, pStk, type.GetTypElem());
-                    if (nullptr == i)
-                    {
-                        goto error;
-                    }
                 }
                 inst->m_expr->AddNext3(i);
                 if ( p->GetType() == ID_COMMA ) continue;
@@ -133,23 +108,15 @@ CBotInstr* CBotListArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResu
         else
         {
             pStk->SetStartError(p->GetStart());
-            if (classItem && IsOfType(p, TokenTypVar, ID_NEW)) // don't allow func() or var between "{ }"
-            {
-                pStk->SetError(CBotErrBadLeft, p->GetPrev());
-                goto error;
-            }
+
             if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
             {
                 goto error;
             }
             CBotVar* pv = pStk->GetVar();                                       // result of the expression
-            CBotTypResult retType;
-            if (pv != nullptr) retType = pv->GetTypResult(CBotVar::GetTypeMode::CLASS_AS_INTRINSIC);
 
-            if (pv == nullptr || (type.Eq(CBotTypString) && !retType.Eq(CBotTypString)) ||
-                (!(type.Eq(CBotTypPointer) && retType.Eq(CBotTypNullPointer)) &&
-                 !TypesCompatibles( type, pv->GetTypResult()) &&
-                 !TypeCompatible(type, retType, ID_ASS) ) )                      // compatible type?
+            if (pv == nullptr || (!TypesCompatibles( type, pv->GetTypResult()) &&
+                !(type.Eq(CBotTypPointer) && pv->GetTypResult().Eq(CBotTypNullPointer))) ) // compatible type?
             {
                 pStk->SetError(CBotErrBadType1, p->GetStart());
                 goto error;
@@ -159,12 +126,6 @@ CBotInstr* CBotListArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResu
             {
                 pStk->SetStartError(p->GetStart());
 
-                if (classItem && IsOfType(p, TokenTypVar, ID_NEW)) // don't allow func() or var between "{ }"
-                {
-                    pStk->SetError(CBotErrBadLeft, p);
-                    goto error;
-                }
-
                 CBotInstr* i = CBotTwoOpExpr::Compile(p, pStk) ;
                 if (nullptr == i)
                 {
@@ -172,13 +133,9 @@ CBotInstr* CBotListArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResu
                 }
 
                 CBotVar* pv = pStk->GetVar();                                   // result of the expression
-                CBotTypResult retType;
-                if (pv != nullptr) retType = pv->GetTypResult(CBotVar::GetTypeMode::CLASS_AS_INTRINSIC);
 
-                if (pv == nullptr || (type.Eq(CBotTypString) && !retType.Eq(CBotTypString)) ||
-                    (!(type.Eq(CBotTypPointer) && retType.Eq(CBotTypNullPointer)) &&
-                     !TypesCompatibles( type, pv->GetTypResult()) &&
-                     !TypeCompatible(type, retType, ID_ASS) ) )                  // compatible type?
+                if (pv == nullptr || (!TypesCompatibles( type, pv->GetTypResult()) &&
+                    !(type.Eq(CBotTypPointer) && pv->GetTypResult().Eq(CBotTypNullPointer))) ) // compatible type?
                 {
                     pStk->SetError(CBotErrBadType1, p->GetStart());
                     goto error;
diff --git a/src/CBot/CBotInstr/CBotListArray.h b/src/CBot/CBotInstr/CBotListArray.h
index 5c9eafd..329e587 100644
--- a/src/CBot/CBotInstr/CBotListArray.h
+++ b/src/CBot/CBotInstr/CBotListArray.h
@@ -41,7 +41,7 @@ public:
      * \param classItem
      * \return
      */
-    static CBotInstr* Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResult type, bool classItem = false);
+    static CBotInstr* Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResult type);
 
     /*!
      * \brief Execute Executes the definition of an array.
diff --git a/src/common/restext.cpp b/src/common/restext.cpp
index 0139c1e..9b49267 100644
--- a/src/common/restext.cpp
+++ b/src/common/restext.cpp
@@ -715,6 +715,7 @@ void InitializeRestext()
     stringsCbot[CBot::CBotErrBadIndex]      = TR("Incorrect index type");
     stringsCbot[CBot::CBotErrPrivate]       = TR("Private element");
     stringsCbot[CBot::CBotErrNoPublic]      = TR("Public required");
+    stringsCbot[CBot::CBotErrNoExpression]  = TR("expression expected after =");
 
     stringsCbot[CBot::CBotErrZeroDiv]       = TR("Dividing by zero");
     stringsCbot[CBot::CBotErrNotInit]       = TR("Variable not initialized");

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git



More information about the Pkg-games-commits mailing list