[Avida-SVN] r2466 - development/source/script
brysonda at myxo.css.msu.edu
brysonda at myxo.css.msu.edu
Tue Mar 18 16:52:50 PDT 2008
Author: brysonda
Date: 2008-03-18 19:52:50 -0400 (Tue, 18 Mar 2008)
New Revision: 2466
Modified:
development/source/script/cDirectInterpretASTVisitor.cc
development/source/script/cDirectInterpretASTVisitor.h
development/source/script/cDumpASTVisitor.cc
development/source/script/cParser.cc
Log:
AS:
Implement a subset of support code for dicts in the interpreter.
Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc 2008-03-18 17:29:58 UTC (rev 2465)
+++ development/source/script/cDirectInterpretASTVisitor.cc 2008-03-18 23:52:50 UTC (rev 2466)
@@ -57,6 +57,7 @@
case TYPE(ARRAY): m_call_stack[i].value.as_array = new cLocalArray; break;
case TYPE(BOOL): m_call_stack[i].value.as_bool = false; break;
case TYPE(CHAR): m_call_stack[i].value.as_char = 0; break;
+ case TYPE(DICT): m_call_stack[i].value.as_dict = new cLocalDict; break;
case TYPE(INT): m_call_stack[i].value.as_int = 0; break;
case TYPE(FLOAT): m_call_stack[i].value.as_float = 0.0; break;
case TYPE(MATRIX): m_call_stack[i].value.as_matrix = NULL; break;
@@ -77,6 +78,7 @@
case TYPE(ARRAY): m_call_stack[i].value.as_array->RemoveReference(); break;
case TYPE(BOOL): break;
case TYPE(CHAR): break;
+ case TYPE(DICT): m_call_stack[i].value.as_dict->RemoveReference(); break;
case TYPE(INT): break;
case TYPE(FLOAT): break;
case TYPE(MATRIX): break; // @TODO - cleanup scope
@@ -125,6 +127,12 @@
break;
+ case TYPE(DICT):
+ m_call_stack[sp + var_id].value.as_dict->RemoveReference();
+ m_call_stack[sp + var_id].value.as_dict = asDict(m_rtype, m_rvalue, node);
+ break;
+
+
case TYPE(MATRIX): INTERPRET_ERROR(INTERNAL); // @TODO - assignment
case TYPE(STRING):
@@ -202,6 +210,11 @@
m_call_stack[var_idx].value.as_array = asArray(val.type, val.value, node);
break;
+ case TYPE(DICT):
+ m_call_stack[var_idx].value.as_dict->RemoveReference();
+ m_call_stack[var_idx].value.as_dict = asDict(val.type, val.value, node);
+ break;
+
case TYPE(VAR):
m_call_stack[var_idx].value = val.value;
m_call_stack[var_idx].type = val.type;
@@ -278,6 +291,7 @@
case TYPE(ARRAY): m_call_stack[m_sp + var_id].value.as_array = asArray(m_rtype, m_rvalue, node); break;
case TYPE(BOOL): m_call_stack[m_sp + var_id].value.as_bool = asBool(m_rtype, m_rvalue, node); break;
case TYPE(CHAR): m_call_stack[m_sp + var_id].value.as_char = asChar(m_rtype, m_rvalue, node); break;
+ case TYPE(DICT): m_call_stack[m_sp + var_id].value.as_dict = asDict(m_rtype, m_rvalue, node); break;
case TYPE(FLOAT): m_call_stack[m_sp + var_id].value.as_float = asFloat(m_rtype, m_rvalue, node); break;
case TYPE(INT): m_call_stack[m_sp + var_id].value.as_int = asInt(m_rtype, m_rvalue, node); break;
case TYPE(OBJECT_REF): INTERPRET_ERROR(INTERNAL); // @TODO - assignment
@@ -683,6 +697,8 @@
m_rvalue.as_ref = new cObjectIndexRef(obj, idx);
m_rtype = TYPE(OBJECT_REF);
} else {
+
+ // @TODO - handle dict indexing
cLocalArray* arr = asArray(ltype, lval, node);
int idx = asInt(rtype, rval, node);
@@ -899,6 +915,7 @@
case TYPE(ARRAY): m_call_stack[sp + i].value.as_array = new cLocalArray; break;
case TYPE(BOOL): m_call_stack[sp + i].value.as_bool = false; break;
case TYPE(CHAR): m_call_stack[sp + i].value.as_char = 0; break;
+ case TYPE(DICT): m_call_stack[sp + i].value.as_dict = new cLocalDict; break;
case TYPE(INT): m_call_stack[sp + i].value.as_int = 0; break;
case TYPE(FLOAT): m_call_stack[sp + i].value.as_float = 0.0; break;
case TYPE(MATRIX): m_call_stack[sp + i].value.as_matrix = NULL; break;
@@ -924,6 +941,7 @@
case TYPE(ARRAY): m_call_stack[sp + var_id].value.as_array = asArray(m_rtype, m_rvalue, node); break;
case TYPE(BOOL): m_call_stack[sp + var_id].value.as_bool = asBool(m_rtype, m_rvalue, node); break;
case TYPE(CHAR): m_call_stack[sp + var_id].value.as_char = asChar(m_rtype, m_rvalue, node); break;
+ case TYPE(DICT): m_call_stack[sp + var_id].value.as_dict = asDict(m_rtype, m_rvalue, node); break;
case TYPE(FLOAT): m_call_stack[sp + var_id].value.as_float = asFloat(m_rtype, m_rvalue, node); break;
case TYPE(INT): m_call_stack[sp + var_id].value.as_int = asInt(m_rtype, m_rvalue, node); break;
case TYPE(OBJECT_REF): INTERPRET_ERROR(INTERNAL); // @TODO - assignment
@@ -955,6 +973,7 @@
case TYPE(ARRAY): m_rvalue.as_array = asArray(m_rtype, m_rvalue, node); break;
case TYPE(BOOL): m_rvalue.as_bool = asBool(m_rtype, m_rvalue, node); break;
case TYPE(CHAR): m_rvalue.as_char = asChar(m_rtype, m_rvalue, node); break;
+ case TYPE(DICT): m_rvalue.as_dict = asDict(m_rtype, m_rvalue, node); break;
case TYPE(FLOAT): m_rvalue.as_float = asFloat(m_rtype, m_rvalue, node); break;
case TYPE(INT): m_rvalue.as_int = asInt(m_rtype, m_rvalue, node); break;
case TYPE(OBJECT_REF): INTERPRET_ERROR(INTERNAL); // @TODO - return
@@ -977,6 +996,7 @@
case TYPE(ARRAY): m_call_stack[sp + i].value.as_array->RemoveReference(); break;
case TYPE(BOOL): break;
case TYPE(CHAR): break;
+ case TYPE(DICT): m_call_stack[sp + i].value.as_dict->RemoveReference(); break;
case TYPE(INT): break;
case TYPE(FLOAT): break;
case TYPE(MATRIX): break; // @TODO - cleanup scope
@@ -1091,6 +1111,7 @@
case TYPE(ARRAY): m_rvalue.as_array = m_call_stack[sp + var_id].value.as_array->GetReference(); break;
case TYPE(BOOL): m_rvalue.as_bool = m_call_stack[sp + var_id].value.as_bool; break;
case TYPE(CHAR): m_rvalue.as_char = m_call_stack[sp + var_id].value.as_char; break;
+ case TYPE(DICT): m_rvalue.as_dict = m_call_stack[sp + var_id].value.as_dict->GetReference(); break;
case TYPE(FLOAT): m_rvalue.as_float = m_call_stack[sp + var_id].value.as_float; break;
case TYPE(INT): m_rvalue.as_int = m_call_stack[sp + var_id].value.as_int; break;
case TYPE(MATRIX): INTERPRET_ERROR(INTERNAL); // @TODO - assignment
@@ -1140,7 +1161,12 @@
m_call_stack[var_idx].value.as_array = asArray(val.type, val.value, node);
break;
+ case TYPE(DICT):
+ m_call_stack[var_idx].value.as_dict->RemoveReference();
+ m_call_stack[var_idx].value.as_dict = asDict(val.type, val.value, node);
+ break;
+
case TYPE(MATRIX): INTERPRET_ERROR(INTERNAL); // @TODO - assignment
case TYPE(STRING):
@@ -1258,6 +1284,22 @@
}
+cDirectInterpretASTVisitor::cLocalDict* cDirectInterpretASTVisitor::asDict(const sASTypeInfo& type, uAnyType value, cASTNode& node)
+{
+ switch (type.type) {
+ case TYPE(DICT):
+ return value.as_dict;
+
+ case TYPE(ARRAY): // @TODO - asDict
+ INTERPRET_ERROR(INTERNAL);
+
+ default:
+ INTERPRET_ERROR(TYPE_CAST, mapType(type), mapType(TYPE(CHAR)));
+ }
+
+ return false;
+}
+
int cDirectInterpretASTVisitor::asInt(const sASTypeInfo& type, uAnyType value, cASTNode& node)
{
switch (type.type) {
@@ -1326,6 +1368,13 @@
return str;
}
+ case TYPE(DICT):
+ {
+ cString* str = new cString(cStringUtil::Stringf("< dict(%d) >", value.as_dict->GetSize()));
+ value.as_dict->RemoveReference();
+ return str;
+ }
+
case TYPE(MATRIX): // @TODO - as string
{
cString* str = new cString(cStringUtil::Stringf("< matrix(,) >"));
@@ -1379,6 +1428,8 @@
default: break;
}
break;
+ case TYPE(DICT):
+ return TYPE(DICT);
case TYPE(FLOAT):
switch (rtype) {
case TYPE(ARRAY): return TYPE(ARRAY);
@@ -1418,18 +1469,18 @@
bool cDirectInterpretASTVisitor::sAggregateValue::operator==(const sAggregateValue& lval)
{
if (type == lval.type) {
- switch (type) {
- case TYPE(BOOL): return val.as_bool == lval.val.as_bool;
- case TYPE(CHAR): return val.as_char == lval.val.as_char;
- case TYPE(INT): return val.as_int == lval.val.as_int;
- case TYPE(FLOAT): return val.as_float == lval.val.as_float;
- case TYPE(STRING): return *val.as_string == *lval.val.as_string;
- case TYPE(ARRAY): return val.as_array == lval.val.as_array;
+ switch (type.type) {
+ case TYPE(BOOL): return value.as_bool == lval.value.as_bool;
+ case TYPE(CHAR): return value.as_char == lval.value.as_char;
+ case TYPE(INT): return value.as_int == lval.value.as_int;
+ case TYPE(FLOAT): return value.as_float == lval.value.as_float;
+ case TYPE(STRING): return *value.as_string == *lval.value.as_string;
+ case TYPE(ARRAY): return value.as_array == lval.value.as_array;
case TYPE(DICT): // @TODO - aggregate value compare
case TYPE(MATRIX): // @TODO - aggregate value compare
case TYPE(OBJECT_REF): // @TODO - aggregate value compare
- return val.as_void == lval.val.as_void;
+ return value.as_void == lval.value.as_void;
default:
break;
@@ -1510,6 +1561,7 @@
switch (cell.type.type) {
case TYPE(STRING): delete cell.value.as_string; break;
case TYPE(ARRAY): cell.value.as_array->RemoveReference(); break;
+ case TYPE(DICT): cell.value.as_dict->RemoveReference(); break;
case TYPE(MATRIX): delete cell.value.as_matrix; break;
default: break;
}
@@ -1517,6 +1569,37 @@
}
+cDirectInterpretASTVisitor::cLocalDict::~cLocalDict()
+{
+ tList<sAggregateValue> keys;
+ tList<sAggregateValue> vals;
+
+ sAggregateValue* av = NULL;
+
+ tListIterator<sAggregateValue> kit(keys);
+ while ((av = kit.Next())) {
+ switch (av->type.type) {
+ case TYPE(STRING): delete av->value.as_string; break;
+ case TYPE(ARRAY): av->value.as_array->RemoveReference(); break;
+ case TYPE(DICT): av->value.as_dict->RemoveReference(); break;
+ case TYPE(MATRIX): delete av->value.as_matrix; break;
+ default: break;
+ }
+ }
+
+ tListIterator<sAggregateValue> vit(vals);
+ while ((av = vit.Next())) {
+ switch (av->type.type) {
+ case TYPE(STRING): delete av->value.as_string; break;
+ case TYPE(ARRAY): av->value.as_array->RemoveReference(); break;
+ case TYPE(DICT): av->value.as_dict->RemoveReference(); break;
+ case TYPE(MATRIX): delete av->value.as_matrix; break;
+ default: break;
+ }
+ }
+}
+
+
bool cDirectInterpretASTVisitor::cArrayVarRef::Set(int idx, ASType_t type, uAnyType value)
{
cLocalArray* arr = m_var.as_array;
Modified: development/source/script/cDirectInterpretASTVisitor.h
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.h 2008-03-18 17:29:58 UTC (rev 2465)
+++ development/source/script/cDirectInterpretASTVisitor.h 2008-03-18 23:52:50 UTC (rev 2466)
@@ -27,6 +27,7 @@
#include "cASTVisitor.h"
+#include "tHashTable.h"
#include "tSmartArray.h"
class cSymbolTable;
@@ -60,6 +61,7 @@
bool operator==(const sAggregateValue& rval);
};
+ template<typename HASH_TYPE> friend inline int nHashTable::HashKey(const HASH_TYPE& key, int table_size);
// -------- Internal Variables --------
@@ -120,6 +122,7 @@
cLocalArray* asArray(const sASTypeInfo& type, uAnyType value, cASTNode& node);
bool asBool(const sASTypeInfo& type, uAnyType value, cASTNode& node);
char asChar(const sASTypeInfo& type, uAnyType value, cASTNode& node);
+ cLocalDict* asDict(const sASTypeInfo& type, uAnyType value, cASTNode& node);
int asInt(const sASTypeInfo& type, uAnyType value, cASTNode& node);
double asFloat(const sASTypeInfo& type, uAnyType value, cASTNode& node);
cString* asString(const sASTypeInfo& type, uAnyType value, cASTNode& node);
@@ -162,7 +165,24 @@
class cLocalDict
{
+ private:
+ tHashTable<sAggregateValue, sAggregateValue> m_storage;
+ int m_ref_count;
+
+ public:
+ inline cLocalDict() : m_ref_count(1) { ; }
+ ~cLocalDict();
+
+ inline cLocalDict* GetReference() { m_ref_count++; return this; }
+ inline void RemoveReference() { m_ref_count--; if (m_ref_count == 0) delete this; }
+ inline bool IsShared() const { return (m_ref_count > 1); }
+
+ inline int GetSize() const { return m_storage.GetSize(); }
+
+ bool Get(const sAggregateValue& idx, sAggregateValue& val) const { return m_storage.Find(idx, val); }
+ void Set(const sAggregateValue& idx, const sAggregateValue& val) { m_storage.SetValue(idx, val); }
+ void Remove(const sAggregateValue& idx) { m_storage.Remove(idx); }
};
@@ -227,15 +247,15 @@
};
namespace nHashTable {
- template<> inline int HashKey<sAggregateValue>(const sAggregateValue& key)
+ template<> inline int HashKey<cDirectInterpretASTVisitor::sAggregateValue>(const cDirectInterpretASTVisitor::sAggregateValue& key, int table_size)
{
- switch (key.type) {
- case AS_TYPE_BOOL: return HashKey<int>(key.value.as_bool);
- case AS_TYPE_CHAR: return HashKey<int>(key.value.as_char);
- case AS_TYPE_INT: return HashKey<int>(key.value.as_int);
- case AS_TYPE_FLOAT: return HashKey<int>((int)key.value.as_float);
- case AS_TYPE_STRING: return HashKey<cString>(*key.value.as_string);
- default: return HashKey<void*>(key.value.as_void);
+ switch (key.type.type) {
+ case AS_TYPE_BOOL: return HashKey<int>(key.value.as_bool, table_size);
+ case AS_TYPE_CHAR: return HashKey<int>(key.value.as_char, table_size);
+ case AS_TYPE_INT: return HashKey<int>(key.value.as_int, table_size);
+ case AS_TYPE_FLOAT: return HashKey<int>((int)key.value.as_float, table_size);
+ case AS_TYPE_STRING: return HashKey<cString>(*key.value.as_string, table_size);
+ default: return HashKey<void*>(key.value.as_void, table_size);
}
}
}
Modified: development/source/script/cDumpASTVisitor.cc
===================================================================
--- development/source/script/cDumpASTVisitor.cc 2008-03-18 17:29:58 UTC (rev 2465)
+++ development/source/script/cDumpASTVisitor.cc 2008-03-18 23:52:50 UTC (rev 2466)
@@ -388,7 +388,27 @@
void cDumpASTVisitor::VisitLiteralDict(cASTLiteralDict& node)
{
- // @TODO - literal dict
+ indent();
+ cout << "@{" << endl;
+ m_depth++;
+
+ m_depth++;
+ tListIterator<cASTLiteralDict::sMapping> it = node.Iterator();
+ cASTLiteralDict::sMapping* mapping = NULL;
+ while ((mapping = it.Next())) {
+ mapping->idx->Accept(*this);
+ m_depth--;
+ indent();
+ cout << ":" << endl;
+ m_depth++;
+ mapping->val->Accept(*this);
+ }
+ m_depth--;
+
+ m_depth--;
+ indent();
+ cout << "}" << endl;
+
}
Modified: development/source/script/cParser.cc
===================================================================
--- development/source/script/cParser.cc 2008-03-18 17:29:58 UTC (rev 2465)
+++ development/source/script/cParser.cc 2008-03-18 23:52:50 UTC (rev 2466)
@@ -998,7 +998,7 @@
}
if (currentToken() == TOKEN(SUPPRESS)) {
- // @todo - mark output as suppressed
+ // @TODO - mark output as suppressed
} else if (currentToken() != TOKEN(ENDL)) {
PARSE_ERROR(UNTERMINATED_EXPR);
}
More information about the Avida-cvs
mailing list