[Avida-SVN] r2430 - in development/source: script tools

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Thu Mar 6 14:09:04 PST 2008


Author: brysonda
Date: 2008-03-06 17:09:04 -0500 (Thu, 06 Mar 2008)
New Revision: 2430

Modified:
   development/source/script/cDirectInterpretASTVisitor.cc
   development/source/script/cDirectInterpretASTVisitor.h
   development/source/tools/tSmartArray.h
Log:
AS:
Add basic call stack storage.
Implement assignment operation.

Add reserved storage support in tSmartArray and change shrink and expand operations to integers.

Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc	2008-03-06 19:27:00 UTC (rev 2429)
+++ development/source/script/cDirectInterpretASTVisitor.cc	2008-03-06 22:09:04 UTC (rev 2430)
@@ -29,6 +29,9 @@
 #include "avida.h"
 #include "AvidaScript.h"
 
+#include "cStringUtil.h"
+#include "cSymbolTable.h"
+
 using namespace AvidaScript;
 
 
@@ -41,14 +44,35 @@
 #define TOKEN(x) AS_TOKEN_ ## x
 #define TYPE(x) AS_TYPE_ ## x
 
-
-cDirectInterpretASTVisitor::cDirectInterpretASTVisitor() : m_has_returned(false)
+cDirectInterpretASTVisitor::cDirectInterpretASTVisitor(cSymbolTable* global_symtbl)
+  : m_global_symtbl(global_symtbl), m_cur_symtbl(global_symtbl), m_call_stack(0, 2048), m_sp(0), m_has_returned(false)
 {
+  for (int i = 0; i < m_global_symtbl->GetNumVariables(); i++) m_call_stack[i].as_string = NULL;
 }
 
 void cDirectInterpretASTVisitor::visitAssignment(cASTAssignment& node)
 {
-  // @TODO - handle assignment
+  cSymbolTable* symtbl = node.IsVarGlobal() ? m_global_symtbl : m_cur_symtbl;
+  int vid = node.GetVarID();
+  
+  node.GetExpression()->Accept(*this);
+  
+  switch (symtbl->GetVariableType(vid)) {
+    case TYPE(ARRAY):       INTERPRET_ERROR(INTERNAL); // @TODO - assignment
+    case TYPE(BOOL):        m_call_stack[m_sp + vid].as_bool = asBool(m_rtype, m_rvalue, node); break;
+    case TYPE(CHAR):        m_call_stack[m_sp + vid].as_char = asChar(m_rtype, m_rvalue, node); break;
+    case TYPE(FLOAT):       m_call_stack[m_sp + vid].as_float = asFloat(m_rtype, m_rvalue, node); break;
+    case TYPE(INT):         m_call_stack[m_sp + vid].as_int = asInt(m_rtype, m_rvalue, node); break;
+    case TYPE(OBJECT_REF):  INTERPRET_ERROR(INTERNAL); // @TODO - assignment
+    case TYPE(MATRIX):      INTERPRET_ERROR(INTERNAL); // @TODO - assignment
+    case TYPE(STRING):
+      delete m_call_stack[m_sp + vid].as_string;
+      m_call_stack[m_sp + vid].as_string = asString(m_rtype, m_rvalue, node);
+      break;
+      
+    default:
+      INTERPRET_ERROR(INTERNAL);
+  }
 }
 
 
@@ -199,8 +223,8 @@
             
           case TYPE(STRING):
             {
-              cString* l = lval.as_string;
-              cString* r = rval.as_string;
+              cString* l = asString(ltype, lval, node);
+              cString* r = asString(rtype, rval, node);
               m_rvalue.as_bool = (node.GetOperator() == TOKEN(OP_EQ)) ? (*l == *r) : (*l != *r);
               delete l;
               delete r;
@@ -270,7 +294,7 @@
         ASType_t rettype = node.GetType();
         
         // Determine the operation type if it is a runtime decision
-        if (rettype == TYPE(RUNTIME)) rettype = getRuntimeType(ltype, rtype);
+        if (rettype == TYPE(RUNTIME)) rettype = getRuntimeType(ltype, rtype, true);
              
         switch (rettype) {
           case TYPE(CHAR):  m_rvalue.as_char = asChar(ltype, lval, node) + asChar(rtype, rval, node); break;
@@ -279,8 +303,8 @@
 
           case TYPE(STRING):
             {
-              cString* l = lval.as_string;
-              cString* r = rval.as_string;
+              cString* l = asString(ltype, lval, node);
+              cString* r = asString(rtype, rval, node);
               m_rvalue.as_string = new cString(*l + *r);
               delete l;
               delete r;
@@ -512,11 +536,13 @@
 void cDirectInterpretASTVisitor::visitObjectCall(cASTObjectCall& node)
 {
   // @TODO - handle object call
+  INTERPRET_ERROR(INTERNAL);
 }
 
 void cDirectInterpretASTVisitor::visitObjectReference(cASTObjectReference& node)
 {
   // @TODO - handle object reference
+  INTERPRET_ERROR(INTERNAL);
 }
 
 void cDirectInterpretASTVisitor::visitVariableReference(cASTVariableReference& node)
@@ -637,8 +663,28 @@
 }
 
 
-ASType_t cDirectInterpretASTVisitor::getRuntimeType(ASType_t ltype, ASType_t rtype)
+cString* cDirectInterpretASTVisitor::asString(ASType_t type, uAnyType value, cASTNode& node)
 {
+  switch (type) {
+    case TYPE(ARRAY):       INTERPRET_ERROR(INTERNAL); // @TODO - as string
+    case TYPE(BOOL):        return new cString(cStringUtil::Convert(value.as_bool));
+    case TYPE(CHAR):        return new cString(value.as_char);
+    case TYPE(INT):         return new cString(cStringUtil::Convert(value.as_int));
+    case TYPE(FLOAT):       return new cString(cStringUtil::Convert(value.as_float));
+    case TYPE(MATRIX):      INTERPRET_ERROR(INTERNAL); // @TODO - as string
+    case TYPE(OBJECT_REF):  INTERPRET_ERROR(INTERNAL); // @TODO - as string
+    case TYPE(STRING):      return value.as_string;
+      
+    default:
+      INTERPRET_ERROR(TYPE_CAST, mapType(type), mapType(TYPE(INT)));
+  }
+  
+  return false;
+}
+
+
+ASType_t cDirectInterpretASTVisitor::getRuntimeType(ASType_t ltype, ASType_t rtype, bool allow_str)
+{
   switch (ltype) {
     case TYPE(ARRAY):
       return TYPE(ARRAY);
@@ -667,7 +713,7 @@
         case TYPE(FLOAT):     return TYPE(FLOAT);
         case TYPE(INT):       return TYPE(INT);
         case TYPE(MATRIX):    return TYPE(MATRIX);
-        case TYPE(STRING):    return TYPE(STRING);
+        case TYPE(STRING):    if (allow_str) return TYPE(STRING); break;
         case TYPE(RUNTIME):   return TYPE(INVALID);
         default: break;
       }
@@ -680,7 +726,7 @@
         case TYPE(FLOAT):     return TYPE(FLOAT);
         case TYPE(INT):       return TYPE(FLOAT);
         case TYPE(MATRIX):    return TYPE(MATRIX);
-        case TYPE(STRING):    return TYPE(FLOAT);
+        case TYPE(STRING):    if (allow_str) return TYPE(FLOAT); break;
         case TYPE(RUNTIME):   return TYPE(INVALID);
         default: break;
       }
@@ -693,7 +739,7 @@
         case TYPE(FLOAT):     return TYPE(FLOAT);
         case TYPE(INT):       return TYPE(INT);
         case TYPE(MATRIX):    return TYPE(MATRIX);
-        case TYPE(STRING):    return TYPE(INT);
+        case TYPE(STRING):    if (allow_str) return TYPE(INT); break;
         case TYPE(RUNTIME):   return TYPE(INVALID);
         default: break;
       }
@@ -701,7 +747,7 @@
     case TYPE(MATRIX):
       return TYPE(MATRIX);
     case TYPE(STRING):
-      return TYPE(STRING);
+      if (allow_str) return TYPE(STRING); break;
       
     case TYPE(RUNTIME):
       return TYPE(INVALID);

Modified: development/source/script/cDirectInterpretASTVisitor.h
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.h	2008-03-06 19:27:00 UTC (rev 2429)
+++ development/source/script/cDirectInterpretASTVisitor.h	2008-03-06 22:09:04 UTC (rev 2430)
@@ -27,10 +27,17 @@
 
 #include "cASTVisitor.h"
 
+#include "tSmartArray.h"
 
+class cSymbolTable;
+
+
 class cDirectInterpretASTVisitor : public cASTVisitor
 {
 private:
+  cSymbolTable* m_global_symtbl;
+  cSymbolTable* m_cur_symtbl;
+  
   typedef union {
     bool as_bool;
     char as_char;
@@ -41,14 +48,18 @@
   
   uAnyType m_rvalue;
   ASType_t m_rtype;
+  
+  tSmartArray<uAnyType> m_call_stack;
+  int m_sp;
   bool m_has_returned;
   
+  
   cDirectInterpretASTVisitor(const cDirectInterpretASTVisitor&); // @not_implemented
   cDirectInterpretASTVisitor& operator=(const cDirectInterpretASTVisitor&); // @not_implemented
   
   
 public:
-  cDirectInterpretASTVisitor();
+  cDirectInterpretASTVisitor(cSymbolTable* global_symtbl);
   
   
   void visitAssignment(cASTAssignment&);
@@ -81,8 +92,9 @@
   char asChar(ASType_t type, uAnyType value, cASTNode& node);
   int asInt(ASType_t type, uAnyType value, cASTNode& node);
   double asFloat(ASType_t type, uAnyType value, cASTNode& node);
+  cString* asString(ASType_t type, uAnyType value, cASTNode& node);
 
-  ASType_t getRuntimeType(ASType_t ltype, ASType_t rtype);
+  ASType_t getRuntimeType(ASType_t ltype, ASType_t rtype, bool allow_str = false);
   
   void reportError(ASDirectInterpretError_t err, const cASFilePosition& fp, const int line, ...);
 };

Modified: development/source/tools/tSmartArray.h
===================================================================
--- development/source/tools/tSmartArray.h	2008-03-06 19:27:00 UTC (rev 2429)
+++ development/source/tools/tSmartArray.h	2008-03-06 22:09:04 UTC (rev 2430)
@@ -39,8 +39,8 @@
 
 // "I am so smart..."
 static const int SMRT_INCREASE_MINIMUM = 10;
-static const double SMRT_INCREASE_FACTOR = 1.5;
-static const double SMRT_SHRINK_TEST_FACTOR = 4.0;
+static const int SMRT_INCREASE_FACTOR = 2;
+static const int SMRT_SHRINK_TEST_FACTOR = 4;
 
 template <class T> class tSmartArray
 {
@@ -52,11 +52,13 @@
   T* m_data;    // Data Array
   int m_size;   // Raw Array Size
   int m_active; // Active Size
+  int m_reserve;
   
 public:
-  explicit tSmartArray(const int size = 0) : m_data(NULL), m_size(0), m_active(0) { ResizeClear(size); }
-  tSmartArray(const tSmartArray& rhs) : m_data(NULL), m_size(0), m_active(0) { this->operator=(rhs); }
-  tSmartArray(const tArray<T>& rhs) : m_data(NULL), m_size(0), m_active(0) { this->operator=(rhs); }
+  explicit tSmartArray(int size = 0, int reserve = 0)
+    : m_data(NULL), m_size(0), m_active(0), m_reserve(reserve) { ResizeClear(size); }
+  tSmartArray(const tSmartArray& rhs) : m_data(NULL), m_size(0), m_active(0), m_reserve(0) { this->operator=(rhs); }
+  tSmartArray(const tArray<T>& rhs) : m_data(NULL), m_size(0), m_active(0), m_reserve(0) { this->operator=(rhs); }
 
   ~tSmartArray() { delete [] m_data; }
   
@@ -73,7 +75,9 @@
     return *this;
   }
   
-  bool Good() const { return (m_data != NULL); }
+  int GetReserve() const { return m_reserve; }
+  void SetReserve(int reserve) { m_reserve = reserve; }
+  
   int GetSize() const { return m_active; }
   
   void ResizeClear(const int in_size)
@@ -81,12 +85,12 @@
     assert(m_size >= 0);
 
     m_active = in_size;
-    m_size = in_size;
+    m_size = (in_size >= m_reserve) ? in_size : m_reserve;    
     
     if (m_data != NULL) delete [] m_data;
     
-    if (in_size > 0) {
-      m_data = new T[in_size];   // Allocate block for data
+    if (m_size > 0) {
+      m_data = new T[m_size];   // Allocate block for data
       assert(m_data != NULL); // Memory allocation error: Out of Memory?
     }
     else m_data = NULL;
@@ -109,12 +113,12 @@
     }
     
     // Determine if we need to adjust the allocated array sizes...
-    if (new_size > m_size || new_size * SMRT_SHRINK_TEST_FACTOR < m_size) {
-      int new_array_size = static_cast<int>(new_size * SMRT_INCREASE_FACTOR);
+    int shrink_test = new_size * SMRT_SHRINK_TEST_FACTOR;
+    if (new_size > m_size || (shrink_test < m_size && shrink_test >= m_reserve)) {
+      int new_array_size = new_size * SMRT_INCREASE_FACTOR;
       const int new_array_min = new_size + SMRT_INCREASE_MINIMUM;
       if (new_array_min > new_array_size) new_array_size = new_array_min;
       
-      
       T* new_data = new T[new_array_size];
       assert(new_data != NULL); // Memory Allocation Error: Out of Memory?
       




More information about the Avida-cvs mailing list