[Avida-SVN] r2478 - development/source/script

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Wed Mar 19 20:24:37 PDT 2008


Author: brysonda
Date: 2008-03-19 23:24:37 -0400 (Wed, 19 Mar 2008)
New Revision: 2478

Modified:
   development/source/script/ASTree.cc
   development/source/script/ASTree.h
   development/source/script/AvidaScript.h
   development/source/script/cDirectInterpretASTVisitor.cc
   development/source/script/cLexer.l
   development/source/script/cParser.cc
   development/source/script/cSemanticASTVisitor.cc
   development/source/script/cSemanticASTVisitor.h
Log:
AS:
Add type inspection built-ins. 
Change the syntax of built-in methods.
Add parse and semantic support for a variety of new built-in methods, especially for dict types.

Modified: development/source/script/ASTree.cc
===================================================================
--- development/source/script/ASTree.cc	2008-03-19 23:47:55 UTC (rev 2477)
+++ development/source/script/ASTree.cc	2008-03-20 03:24:37 UTC (rev 2478)
@@ -74,26 +74,33 @@
 }
 
 
-cASTBuiltInCall::cASTBuiltInCall(const cASFilePosition& fp, const cString& name)
-  : cASTNode(fp), m_args(NULL), m_type(AS_TYPE_INVALID), m_builtin(AS_BUILTIN_UNKNOWN), m_vr(NULL)
+cASTBuiltInCall::cASTBuiltInCall(const cASFilePosition& fp, const cString& name, cASTNode* target)
+  : cASTNode(fp), m_args(NULL), m_type(AS_TYPE_INVALID), m_builtin(AS_BUILTIN_UNKNOWN), m_target(target)
 {
   if (name == "asbool") m_builtin = AS_BUILTIN_CAST_BOOL;
   else if (name == "aschar") m_builtin = AS_BUILTIN_CAST_CHAR;
   else if (name == "asint") m_builtin = AS_BUILTIN_CAST_INT;
   else if (name == "asfloat") m_builtin = AS_BUILTIN_CAST_FLOAT;
   else if (name == "asstring") m_builtin = AS_BUILTIN_CAST_STRING;
+  
+  else if (name == "isarray") m_builtin = AS_BUILTIN_IS_ARRAY;
+  else if (name == "isbool") m_builtin = AS_BUILTIN_IS_BOOL;
+  else if (name == "ischar") m_builtin = AS_BUILTIN_IS_CHAR;
+  else if (name == "isdict") m_builtin = AS_BUILTIN_IS_DICT;
+  else if (name == "isint") m_builtin = AS_BUILTIN_IS_INT;
+  else if (name == "isfloat") m_builtin = AS_BUILTIN_IS_FLOAT;
+  else if (name == "ismatrix") m_builtin = AS_BUILTIN_IS_MATRIX;
+  else if (name == "isstring") m_builtin = AS_BUILTIN_IS_STRING;
+  
+  else if (name == "clear") m_builtin = AS_BUILTIN_CLEAR;
+  else if (name == "copy") m_builtin = AS_BUILTIN_COPY;
+  else if (name == "haskey") m_builtin = AS_BUILTIN_HASKEY;
+  else if (name == "keys") m_builtin = AS_BUILTIN_KEYS;
   else if (name == "len") m_builtin = AS_BUILTIN_LEN;
+  else if (name == "remove") m_builtin = AS_BUILTIN_REMOVE;
   else if (name == "resize") m_builtin = AS_BUILTIN_RESIZE;
+  else if (name == "values") m_builtin = AS_BUILTIN_VALUES;
 }
 
-cASTBuiltInCall::~cASTBuiltInCall()
-{
-  delete m_args;
-  delete m_vr;
-}
 
-void cASTBuiltInCall::SetVariableReference(cASTVariableReference* vr)
-{
-  delete m_vr;
-  m_vr = vr;
-}
+

Modified: development/source/script/ASTree.h
===================================================================
--- development/source/script/ASTree.h	2008-03-19 23:47:55 UTC (rev 2477)
+++ development/source/script/ASTree.h	2008-03-20 03:24:37 UTC (rev 2478)
@@ -461,22 +461,21 @@
   cASTArgumentList* m_args;
   sASTypeInfo m_type;
   ASBuiltIn_t m_builtin;
-  cASTVariableReference* m_vr;
+  cASTNode* m_target;
   
 public:
-  cASTBuiltInCall(const cASFilePosition& fp, const cString& name);
-  ~cASTBuiltInCall();
+  cASTBuiltInCall(const cASFilePosition& fp, const cString& name, cASTNode* target = NULL);
+  ~cASTBuiltInCall() { delete m_args; delete m_target; }
   
   ASBuiltIn_t GetBuiltIn() const { return m_builtin; }
   
   void SetArguments(cASTArgumentList* args) { delete m_args; m_args = args; }
   cASTArgumentList* GetArguments() { return m_args; }
   
-  const sASTypeInfo& GetType() const { return m_type; }
+  inline const sASTypeInfo& GetType() const { return m_type; }
   inline void SetType(const sASTypeInfo& type) { m_type = type; }
   
-  cASTVariableReference* GetVariableReference() { return m_vr; }
-  void SetVariableReference(cASTVariableReference* vr);
+  inline cASTNode* GetTarget() { return m_target; }
   
   bool HasArguments() const { return (m_args); }
   

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2008-03-19 23:47:55 UTC (rev 2477)
+++ development/source/script/AvidaScript.h	2008-03-20 03:24:37 UTC (rev 2478)
@@ -176,8 +176,22 @@
   AS_BUILTIN_CAST_INT,
   AS_BUILTIN_CAST_FLOAT,
   AS_BUILTIN_CAST_STRING,
+  AS_BUILTIN_IS_ARRAY,
+  AS_BUILTIN_IS_BOOL,
+  AS_BUILTIN_IS_CHAR,
+  AS_BUILTIN_IS_DICT,
+  AS_BUILTIN_IS_INT,
+  AS_BUILTIN_IS_FLOAT,
+  AS_BUILTIN_IS_MATRIX,
+  AS_BUILTIN_IS_STRING,
+  AS_BUILTIN_CLEAR,
+  AS_BUILTIN_COPY,
+  AS_BUILTIN_HASKEY,
+  AS_BUILTIN_KEYS,
   AS_BUILTIN_LEN,
+  AS_BUILTIN_REMOVE,
   AS_BUILTIN_RESIZE,
+  AS_BUILTIN_VALUES,
   
   AS_BUILTIN_UNKNOWN
 } ASBuiltIn_t;

Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc	2008-03-19 23:47:55 UTC (rev 2477)
+++ development/source/script/cDirectInterpretASTVisitor.cc	2008-03-20 03:24:37 UTC (rev 2478)
@@ -826,6 +826,7 @@
 void cDirectInterpretASTVisitor::VisitBuiltInCall(cASTBuiltInCall& node)
 {
   cASTArgumentList* args = node.GetArguments();
+  cASTNode* trgt = node.GetTarget();
   
   switch (node.GetBuiltIn()) {
     case AS_BUILTIN_CAST_BOOL:
@@ -858,8 +859,83 @@
       m_rtype = TYPE(STRING);
       break;
       
+      
+    case AS_BUILTIN_IS_ARRAY:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_bool = m_rtype.type == TYPE(ARRAY);
+      m_rtype = TYPE(BOOL);
+      break;
+      
+    case AS_BUILTIN_IS_BOOL:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_bool = m_rtype.type == TYPE(BOOL);
+      m_rtype = TYPE(BOOL);
+      break;
+      
+    case AS_BUILTIN_IS_CHAR:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_bool = m_rtype.type == TYPE(CHAR);
+      m_rtype = TYPE(BOOL);
+      break;
+      
+    case AS_BUILTIN_IS_DICT:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_bool = m_rtype.type == TYPE(DICT);
+      m_rtype = TYPE(BOOL);
+      break;
+      
+    case AS_BUILTIN_IS_INT:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_bool = m_rtype.type == TYPE(INT);
+      m_rtype = TYPE(BOOL);
+      break;
+      
+    case AS_BUILTIN_IS_FLOAT:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_bool = m_rtype.type == TYPE(FLOAT);
+      m_rtype = TYPE(BOOL);
+      break;
+      
+    case AS_BUILTIN_IS_MATRIX:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_bool = m_rtype.type == TYPE(MATRIX);
+      m_rtype = TYPE(BOOL);
+      break;
+      
+    case AS_BUILTIN_IS_STRING:
+      args->Iterator().Next()->Accept(*this);
+      m_rvalue.as_bool = m_rtype.type == TYPE(STRING);
+      m_rtype = TYPE(BOOL);
+      break;
+      
+      
+    case AS_BUILTIN_CLEAR:
+      trgt->Accept(*this);
+      if (m_rtype.type == TYPE(DICT)) { // @TODO - builtin clear
+        INTERPRET_ERROR(INTERNAL);
+      } else if (m_rtype.type == TYPE(MATRIX)) { // @TODO - builtin clear
+        INTERPRET_ERROR(INTERNAL);
+      } else if (m_rtype.type == TYPE(ARRAY)) {
+        m_rvalue.as_array->Resize(0);
+      } else {
+        INTERPRET_ERROR(UNDEFINED_TYPE_OP, "resize", mapType(m_rtype));
+      }
+      break;
+      
+    case AS_BUILTIN_COPY: // @TODO
+      INTERPRET_ERROR(INTERNAL);
+      
+    case AS_BUILTIN_HASKEY: // @TODO
+      INTERPRET_ERROR(INTERNAL);
+      
+    case AS_BUILTIN_KEYS: // @TODO
+      INTERPRET_ERROR(INTERNAL);
+      
+    case AS_BUILTIN_VALUES: // @TODO
+      INTERPRET_ERROR(INTERNAL);
+      
     case AS_BUILTIN_LEN:
-      args->Iterator().Next()->Accept(*this);
+      trgt->Accept(*this);
       if (m_rtype == TYPE(STRING)) {
         int sz = m_rvalue.as_string->GetSize();
         delete m_rvalue.as_string;
@@ -872,23 +948,24 @@
       m_rtype = TYPE(INT);
       break;
       
+    case AS_BUILTIN_REMOVE: // @TODO
+      INTERPRET_ERROR(INTERNAL);
+    
     case AS_BUILTIN_RESIZE:
-      cASTVariableReference* vr = node.GetVariableReference();
-      if (vr->GetType() == TYPE(ARRAY)) {
-        int var_idx = (vr->IsVarGlobal() ? 0 : m_sp) + vr->GetVarID();
+      trgt->Accept(*this);
+      if (m_rtype.type == TYPE(DICT)) { // @TODO - builtin resize
+        INTERPRET_ERROR(INTERNAL);
+      } else if (m_rtype.type == TYPE(MATRIX)) { // @TODO - builtin resize
+        INTERPRET_ERROR(INTERNAL);
+      } else if (m_rtype.type == TYPE(ARRAY)) {
+        cLocalArray* arr = m_rvalue.as_array;
         
         args->Iterator().Next()->Accept(*this);
         int sz = asInt(m_rtype, m_rvalue, node);
         
-        cLocalArray* arr = m_call_stack[var_idx].value.as_array;
-        if (arr->IsShared()) {
-          arr = new cLocalArray(arr);
-          m_call_stack[var_idx].value.as_array->RemoveReference();
-          m_call_stack[var_idx].value.as_array = arr;         
-        }
-        m_call_stack[var_idx].value.as_array->Resize(sz);
+        arr->Resize(sz);
       } else {
-        // @TODO - resize matrix
+        INTERPRET_ERROR(UNDEFINED_TYPE_OP, "resize", mapType(m_rtype));
       }
       break;
       
@@ -1638,9 +1715,13 @@
 void cDirectInterpretASTVisitor::cLocalArray::Resize(int sz)
 {
   int o_sz = m_storage.GetSize();
+
+  // Cleanup values if we are shrinking
+  for (int i = sz; i < o_sz; i++) m_storage[i].Cleanup();
   
   m_storage.Resize(sz);
   
+  // Initialize values if we are growing
   for (int i = o_sz; i < sz; i++) {
     m_storage[i].value.as_int = 0;
     m_storage[i].type = TYPE(INT);

Modified: development/source/script/cLexer.l
===================================================================
--- development/source/script/cLexer.l	2008-03-19 23:47:55 UTC (rev 2477)
+++ development/source/script/cLexer.l	2008-03-20 03:24:37 UTC (rev 2478)
@@ -110,8 +110,22 @@
 asint       return AS_TOKEN_BUILTIN_CALL;
 asfloat     return AS_TOKEN_BUILTIN_CALL;
 asstring    return AS_TOKEN_BUILTIN_CALL;
-len         return AS_TOKEN_BUILTIN_CALL;
+isarray     return AS_TOKEN_BUILTIN_CALL;
+isbool      return AS_TOKEN_BUILTIN_CALL;
+ischar      return AS_TOKEN_BUILTIN_CALL;
+isdict      return AS_TOKEN_BUILTIN_CALL;
+isint       return AS_TOKEN_BUILTIN_CALL;
+isfloat     return AS_TOKEN_BUILTIN_CALL;
+ismatrix    return AS_TOKEN_BUILTIN_CALL;
+isstring    return AS_TOKEN_BUILTIN_CALL;
+clear       return AS_TOKEN_BUILTIN_METHOD;
+copy        return AS_TOKEN_BUILTIN_METHOD;
+haskey      return AS_TOKEN_BUILTIN_METHOD;
+keys        return AS_TOKEN_BUILTIN_METHOD;
+len         return AS_TOKEN_BUILTIN_METHOD;
+remove      return AS_TOKEN_BUILTIN_METHOD;
 resize      return AS_TOKEN_BUILTIN_METHOD;
+values      return AS_TOKEN_BUILTIN_METHOD;
 
 return      return AS_TOKEN_CMD_RETURN;
 

Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc	2008-03-19 23:47:55 UTC (rev 2477)
+++ development/source/script/cParser.cc	2008-03-20 03:24:37 UTC (rev 2478)
@@ -344,7 +344,22 @@
 {
   PARSE_TRACE("parseCallExpression");
   tAutoRelease<cASTNode> ce(target);
+
+  if (currentToken() == TOKEN(DOT) && peekToken() == TOKEN(BUILTIN_METHOD)) {
+    nextToken(); // consume '.'
+    
+    cASTBuiltInCall* bi = new cASTBuiltInCall(FILEPOS, currentText(), ce.Release());
+    ce.Set(bi);
+    
+    if (nextToken() != TOKEN(PREC_OPEN)) PARSE_UNEXPECT();
+    if (nextToken() != TOKEN(PREC_CLOSE)) bi->SetArguments(parseArgumentList());
+    if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT();
+    nextToken(); // consume ')'
+    
+    if (currentToken() != TOKEN(DOT) || currentToken() != TOKEN(IDX_OPEN)) return ce.Release();
+  }
   
+  
   bool eoe = false;
   while (!eoe) {
     if (currentToken() == TOKEN(DOT)) {
@@ -954,27 +969,6 @@
       case TOKEN(ID):
         node.Set(parseIDStatement());
         break;
-      case TOKEN(BUILTIN_METHOD):
-        if (peekToken() == TOKEN(PREC_OPEN)) {
-          cASTBuiltInCall* bi = new cASTBuiltInCall(FILEPOS, currentText());
-          nextToken(); // consume builtin method name token
-          if (nextToken() != TOKEN(PREC_CLOSE) && currentToken() == TOKEN(ID)) {
-            bi->SetVariableReference(new cASTVariableReference(FILEPOS, currentText()));
-            if (nextToken() == TOKEN(COMMA)) {
-              nextToken(); // consume ','
-              bi->SetArguments(parseArgumentList());
-            }
-          }
-          if (currentToken() != TOKEN(PREC_CLOSE)) PARSE_UNEXPECT();
-          nextToken(); // consume ')'
-          
-          if (currentToken() == TOKEN(DOT) || currentToken() == TOKEN(IDX_OPEN)) {
-            node.Set(parseCallExpression(bi, true));
-          } else {
-            node.Set(bi);
-          }
-        }
-        break;
       case TOKEN(REF):
         node.Set(parseRefStatement());
         break;

Modified: development/source/script/cSemanticASTVisitor.cc
===================================================================
--- development/source/script/cSemanticASTVisitor.cc	2008-03-19 23:47:55 UTC (rev 2477)
+++ development/source/script/cSemanticASTVisitor.cc	2008-03-20 03:24:37 UTC (rev 2478)
@@ -532,78 +532,109 @@
   }
 }
 
+
+void cSemanticASTVisitor::checkBuiltInCast(cASTBuiltInCall& node, ASType_t type)
+{
+  cASTArgumentList* args = node.GetArguments();
+  if (!args || args->GetSize() != 1) SEMANTIC_ERROR(BUILTIN_CALL_SIGNATURE_MISMATCH, mapBuiltIn(node.GetBuiltIn()));
+  else {
+    cASTNode* argn = args->Iterator().Next();
+    argn->Accept(*this);
+    checkCast(argn->GetType(), sASTypeInfo(type));
+  }  
+  node.SetType(type);
+}
+
 void cSemanticASTVisitor::VisitBuiltInCall(cASTBuiltInCall& node)
 {
 #define ERR_BUILTIN_MISMATCH SEMANTIC_ERROR(BUILTIN_CALL_SIGNATURE_MISMATCH, mapBuiltIn(node.GetBuiltIn()))
   cASTArgumentList* args = node.GetArguments();
+  cASTNode* trgt = node.GetTarget();
+  bool allow_dict = false;
   
   switch (node.GetBuiltIn()) {
-    case AS_BUILTIN_CAST_BOOL:
+    case AS_BUILTIN_CAST_BOOL:    checkBuiltInCast(node, TYPE(BOOL)); break;
+    case AS_BUILTIN_CAST_CHAR:    checkBuiltInCast(node, TYPE(CHAR)); break;
+    case AS_BUILTIN_CAST_INT:     checkBuiltInCast(node, TYPE(INT)); break;
+    case AS_BUILTIN_CAST_FLOAT:   checkBuiltInCast(node, TYPE(FLOAT)); break;
+    case AS_BUILTIN_CAST_STRING:  checkBuiltInCast(node, TYPE(STRING)); break;
+      
+    case AS_BUILTIN_IS_ARRAY:
+    case AS_BUILTIN_IS_BOOL:
+    case AS_BUILTIN_IS_CHAR:
+    case AS_BUILTIN_IS_DICT:
+    case AS_BUILTIN_IS_INT:
+    case AS_BUILTIN_IS_FLOAT:
+    case AS_BUILTIN_IS_MATRIX:
+    case AS_BUILTIN_IS_STRING:
       if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
       else {
         cASTNode* argn = args->Iterator().Next();
         argn->Accept(*this);
-        checkCast(argn->GetType(), TYPEINFO(BOOL));
-        node.SetType(TYPE(BOOL));
       }
+      node.SetType(TYPE(BOOL));
       break;
-
-    case AS_BUILTIN_CAST_CHAR:
-      if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
-      else {
-        cASTNode* argn = args->Iterator().Next();
-        argn->Accept(*this);
-        checkCast(argn->GetType(), TYPEINFO(CHAR));
-        node.SetType(TYPE(CHAR));
+      
+    case AS_BUILTIN_CLEAR:
+      trgt->Accept(*this);
+      {
+        ASType_t ttype = trgt->GetType().type;
+        if (ttype != TYPE(ARRAY) && ttype != TYPE(DICT) && ttype != TYPE(MATRIX) && ttype != TYPE(RUNTIME)) ERR_BUILTIN_MISMATCH;
       }
+      if (args) ERR_BUILTIN_MISMATCH;
+      node.SetType(TYPE(VOID));
       break;
       
-    case AS_BUILTIN_CAST_INT:
-      if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
-      else {
-        cASTNode* argn = args->Iterator().Next();
-        argn->Accept(*this);
-        checkCast(argn->GetType(), TYPEINFO(INT));
-        node.SetType(TYPE(INT));
+      
+    case AS_BUILTIN_COPY:
+      trgt->Accept(*this);
+      {
+        ASType_t ttype = trgt->GetType().type;
+        if (ttype != TYPE(ARRAY) && ttype != TYPE(RUNTIME)) ERR_BUILTIN_MISMATCH;
       }
+      if (args) ERR_BUILTIN_MISMATCH;
+      node.SetType(TYPE(VOID));
       break;
       
-    case AS_BUILTIN_CAST_FLOAT:
+    case AS_BUILTIN_HASKEY:
+      trgt->Accept(*this);
+      checkCast(trgt->GetType(), TYPEINFO(DICT));
       if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
       else {
         cASTNode* argn = args->Iterator().Next();
         argn->Accept(*this);
-        checkCast(argn->GetType(), TYPEINFO(FLOAT));
-        node.SetType(TYPE(FLOAT));
       }
+      node.SetType(TYPE(BOOL));
       break;
       
-    case AS_BUILTIN_CAST_STRING:
-      if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
-      else {
-        cASTNode* argn = args->Iterator().Next();
-        argn->Accept(*this);
-        checkCast(argn->GetType(), TYPEINFO(STRING));
-        node.SetType(TYPE(STRING));
-      }
+    case AS_BUILTIN_KEYS:
+    case AS_BUILTIN_VALUES:
+      trgt->Accept(*this);
+      checkCast(trgt->GetType(), TYPEINFO(DICT));
+      if (args) ERR_BUILTIN_MISMATCH;
+      node.SetType(TYPE(ARRAY));
       break;
       
     case AS_BUILTIN_LEN:
-      if (!args || args->GetSize() != 1) ERR_BUILTIN_MISMATCH;
-      else {
-        cASTNode* argn = args->Iterator().Next();
-        argn->Accept(*this);
-        checkCast(argn->GetType(), TYPEINFO(ARRAY));
-        node.SetType(TYPE(INT));
-      }
+      trgt->Accept(*this);
+      checkCast(trgt->GetType(), TYPEINFO(ARRAY));
+      if (args) ERR_BUILTIN_MISMATCH;
+      node.SetType(TYPE(INT));
       break;
       
+
+    case AS_BUILTIN_REMOVE:
+      allow_dict = true;
     case AS_BUILTIN_RESIZE:
-      if (!node.GetVariableReference() || !args) ERR_BUILTIN_MISMATCH;
-      else {
-        node.GetVariableReference()->Accept(*this);
+      trgt->Accept(*this);
+
+      {
+        ASType_t ttype = trgt->GetType().type;
+        if ((allow_dict && ttype != TYPE(ARRAY) && ttype != TYPE(DICT) && ttype != TYPE(RUNTIME)) || 
+            (!allow_dict && ttype != TYPE(ARRAY) && ttype != TYPE(MATRIX) && ttype != TYPE(RUNTIME)))
+          ERR_BUILTIN_MISMATCH;
         
-        if (node.GetVariableReference()->GetType().type == TYPE(ARRAY)) {
+        if (ttype == TYPE(ARRAY)) {
           if (args->GetSize() == 1) {
             cASTNode* argn = args->Iterator().Next();
             argn->Accept(*this);
@@ -611,7 +642,14 @@
           } else {
             ERR_BUILTIN_MISMATCH;
           }
-        } else if (node.GetVariableReference()->GetType().type == TYPE(MATRIX)) {
+        } else if (ttype == TYPE(DICT)) {
+          if (args->GetSize() == 1) {
+            cASTNode* argn = args->Iterator().Next();
+            argn->Accept(*this);
+          } else {
+            ERR_BUILTIN_MISMATCH;
+          }
+        } else if (ttype == TYPE(MATRIX)) {
           if (args->GetSize() == 2) {
             tListIterator<cASTNode> it = args->Iterator();
             cASTNode* argn = it.Next();
@@ -623,14 +661,13 @@
           } else {
             ERR_BUILTIN_MISMATCH;
           }          
-        } else {
-          ERR_BUILTIN_MISMATCH;
         }
+      }
 
-        node.SetType(TYPE(VOID));
-      }
+      node.SetType(TYPE(VOID));
       break;
       
+
     default:
       SEMANTIC_ERROR(INTERNAL);
       break;

Modified: development/source/script/cSemanticASTVisitor.h
===================================================================
--- development/source/script/cSemanticASTVisitor.h	2008-03-19 23:47:55 UTC (rev 2477)
+++ development/source/script/cSemanticASTVisitor.h	2008-03-20 03:24:37 UTC (rev 2478)
@@ -111,6 +111,7 @@
 
 private:
   // --------  Internal Utility Methods  --------
+  void checkBuiltInCast(cASTBuiltInCall& node, ASType_t type);
   ASType_t getConsensusType(const sASTypeInfo& t1, const sASTypeInfo& t2);
   inline bool validArithmeticType(const sASTypeInfo& type, bool allow_matrix = false) const;
   inline bool validBitwiseType(const sASTypeInfo& type) const;




More information about the Avida-cvs mailing list