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

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Mon Mar 10 20:13:06 PDT 2008


Author: brysonda
Date: 2008-03-10 23:13:06 -0400 (Mon, 10 Mar 2008)
New Revision: 2448

Modified:
   development/source/script/AvidaScript.h
   development/source/script/cSemanticASTVisitor.cc
   development/source/script/cSemanticASTVisitor.h
Log:
AS:
Add function default value checking, limiting to values that can be calculated in any context.

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2008-03-10 20:19:33 UTC (rev 2447)
+++ development/source/script/AvidaScript.h	2008-03-11 03:13:06 UTC (rev 2448)
@@ -124,6 +124,8 @@
   AS_SEMANTIC_ERR_CANNOT_CAST,
   AS_SEMANTIC_ERR_CANNOT_COMPARE,
   AS_SEMANTIC_ERR_FUNCTION_CALL_SIGNATURE_MISMATCH,
+  AS_SEMANTIC_ERR_FUNCTION_DEFAULT_CALL_INVALID,
+  AS_SEMANTIC_ERR_FUNCTION_DEFAULT_VARIABLE_REF_INVALID,
   AS_SEMANTIC_ERR_FUNCTION_REDEFINITION,
   AS_SEMANTIC_ERR_FUNCTION_RTYPE_MISMATCH,
   AS_SEMANTIC_ERR_FUNCTION_SIGNATURE_MISMATCH,

Modified: development/source/script/cSemanticASTVisitor.cc
===================================================================
--- development/source/script/cSemanticASTVisitor.cc	2008-03-10 20:19:33 UTC (rev 2447)
+++ development/source/script/cSemanticASTVisitor.cc	2008-03-11 03:13:06 UTC (rev 2448)
@@ -72,7 +72,7 @@
 
 cSemanticASTVisitor::cSemanticASTVisitor(cASLibrary* lib, cSymbolTable* global_symtbl, cASTNode* main)
   : m_library(lib), m_global_symtbl(global_symtbl), m_parent_scope(global_symtbl), m_fun_id(0), m_cur_symtbl(global_symtbl)
-  , m_success(true), m_fun_def(false), m_top_level(true), m_call_expr(false)
+  , m_success(true), m_fun_def(false), m_fun_def_arg(false), m_top_level(true), m_obj_assign(false)
 {
   // Add internal definition of the global function
   int fun_id = -1;
@@ -104,9 +104,9 @@
 
 void cSemanticASTVisitor::VisitObjectAssignment(cASTObjectAssignment& node)
 {
-  m_call_expr = true;
+  m_obj_assign = true;
   node.GetTarget()->Accept(*this);
-  m_call_expr = false;
+  m_obj_assign = false;
   
   if (node.GetTarget()->GetType() != TYPE(OBJECT_REF)) SEMANTIC_ERROR(INVALID_ASSIGNMENT_TARGET);
   
@@ -240,7 +240,12 @@
           if (!vd->GetAssignmentExpression())
             SEMANTIC_ERROR(ARGUMENT_DEFAULT_REQUIRED, (const char*)vd->GetName(), (const char*)node.GetName());
         } else {
-          if (vd->GetAssignmentExpression()) def_val_start = true;
+          if (vd->GetAssignmentExpression()) {
+            def_val_start = true;
+            m_fun_def_arg = true;
+            vd->GetAssignmentExpression()->Accept(*this);
+            m_fun_def_arg = false;
+          }
         }
       }
     }
@@ -362,7 +367,7 @@
     case TOKEN(IDX_OPEN):
       checkCast(node.GetLeft()->GetType(), TYPE(ARRAY));
       checkCast(node.GetRight()->GetType(), TYPE(INT));
-      node.SetType(m_call_expr ? TYPE(OBJECT_REF) : TYPE(RUNTIME));
+      node.SetType(m_obj_assign ? TYPE(OBJECT_REF) : TYPE(RUNTIME));
       break;
     case TOKEN(ARR_RANGE):
       checkCast(node.GetLeft()->GetType(), TYPE(INT));
@@ -507,7 +512,10 @@
 
 void cSemanticASTVisitor::VisitFunctionCall(cASTFunctionCall& node)
 {
-  // @TODO - somewhere in here, make sure that default value expressions are valid for this context if used
+  if (m_fun_def_arg) {
+    SEMANTIC_ERROR(FUNCTION_DEFAULT_CALL_INVALID);
+    return;
+  }
   
   int fun_id = -1;
   bool global = false;
@@ -600,6 +608,11 @@
 
 void cSemanticASTVisitor::VisitVariableReference(cASTVariableReference& node)
 {
+  if (m_fun_def_arg) {
+    SEMANTIC_ERROR(FUNCTION_DEFAULT_VARIABLE_REF_INVALID);
+    return;
+  }
+
   int var_id = -1;
   bool global = false;
   if (lookupVariable(node.GetName(), var_id, global)) {
@@ -835,9 +848,16 @@
       break;
     case AS_SEMANTIC_ERR_CANNOT_COMPARE:
       std::cerr << "cannot compare values" << ERR_ENDL; 
+      break;
     case AS_SEMANTIC_ERR_FUNCTION_CALL_SIGNATURE_MISMATCH:
       std::cerr << "invalid call signature for '" << VA_ARG_STR << "()'" << ERR_ENDL;
       break;
+    case AS_SEMANTIC_ERR_FUNCTION_DEFAULT_CALL_INVALID:
+      std::cerr << "function call invalid in default value" << ERR_ENDL; 
+      break;
+    case AS_SEMANTIC_ERR_FUNCTION_DEFAULT_VARIABLE_REF_INVALID:
+      std::cerr << "variable reference invalid in default value" << ERR_ENDL; 
+      break;
     case AS_SEMANTIC_ERR_FUNCTION_REDEFINITION:
       std::cerr << "redefinition of '" << VA_ARG_STR << "()'" << ERR_ENDL;
       break;

Modified: development/source/script/cSemanticASTVisitor.h
===================================================================
--- development/source/script/cSemanticASTVisitor.h	2008-03-10 20:19:33 UTC (rev 2447)
+++ development/source/script/cSemanticASTVisitor.h	2008-03-11 03:13:06 UTC (rev 2448)
@@ -61,8 +61,9 @@
   
   bool m_success;
   bool m_fun_def;
+  bool m_fun_def_arg;
   bool m_top_level;
-  bool m_call_expr;
+  bool m_obj_assign;
 
   
   // --------  Private Constructors  --------




More information about the Avida-cvs mailing list