[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