[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