[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