[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