[Avida-SVN] r2793 - development/source/script
brysonda at myxo.css.msu.edu
brysonda at myxo.css.msu.edu
Wed Sep 17 20:47:39 PDT 2008
Author: brysonda
Date: 2008-09-17 23:47:37 -0400 (Wed, 17 Sep 2008)
New Revision: 2793
Modified:
development/source/script/AvidaScript.h
development/source/script/cASNativeObject.h
development/source/script/cDirectInterpretASTVisitor.cc
development/source/script/cDirectInterpretASTVisitor.h
Log:
AS (#1): More native object support.
Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h 2008-09-15 17:47:08 UTC (rev 2792)
+++ development/source/script/AvidaScript.h 2008-09-18 03:47:37 UTC (rev 2793)
@@ -164,6 +164,7 @@
AS_DIRECT_INTERPRET_ERR_KEY_NOT_FOUND,
AS_DIRECT_INTERPRET_ERR_MATRIX_OP_TYPE_MISMATCH,
AS_DIRECT_INTERPRET_ERR_MATRIX_SIZE_MISMATCH,
+ AS_DIRECT_INTERPRET_ERR_NATIVE_OBJECT_TYPE_MISMATCH,
AS_DIRECT_INTERPRET_ERR_OBJECT_ASSIGN_FAIL,
AS_DIRECT_INTERPRET_ERR_TYPE_CAST,
AS_DIRECT_INTERPRET_ERR_UNDEFINED_TYPE_OP,
Modified: development/source/script/cASNativeObject.h
===================================================================
--- development/source/script/cASNativeObject.h 2008-09-15 17:47:08 UTC (rev 2792)
+++ development/source/script/cASNativeObject.h 2008-09-18 03:47:37 UTC (rev 2793)
@@ -33,17 +33,40 @@
class cASNativeObject
{
+private:
+ int m_ref_count;
public:
- cASNativeObject() { ; }
+ cASNativeObject() : m_ref_count(1) { ; }
virtual ~cASNativeObject() { ; }
- bool CallMethod(int mid, int argc, cASCPPParameter args[]) { return false; } // @TODO
+ virtual const char* GetType() = 0;
+ virtual bool CallMethod(int mid, int argc, cASCPPParameter args[]) = 0;
+
int LookupValue(const cString& val_name) { return AS_NOT_FOUND; } // @TODO
int LookupMethod(const cString& meth_name) { return AS_NOT_FOUND; } // @TODO
- void Release() { ; }
+ inline cASNativeObject* GetReference() { m_ref_count++; return this; }
+ inline void RemoveReference() { m_ref_count--; if (m_ref_count == 0) delete this; }
+ inline bool IsShared() { return (m_ref_count > 1); }
};
+
+template<class NativeClass, const char* TypeName>
+class tASNativeObject : public cASNativeObject
+{
+private:
+ NativeClass* m_object;
+
+public:
+ tASNativeObject(NativeClass* obj) : m_object(obj) { ; }
+ ~tASNativeObject() { delete m_object; }
+
+ const char* GetType() { return TypeName; }
+
+ bool CallMethod(int mid, int argc, cASCPPParameter args[]) { return false; } // @TODO;
+};
+
+
#endif
Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc 2008-09-15 17:47:08 UTC (rev 2792)
+++ development/source/script/cDirectInterpretASTVisitor.cc 2008-09-18 03:47:37 UTC (rev 2793)
@@ -116,7 +116,10 @@
case TYPE(CHAR): m_call_stack[sp + var_id].value.as_char = asChar(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
+
+ case TYPE(OBJECT_REF):
+ m_call_stack[sp + var_id].value.as_nobj->RemoveReference();
+ m_call_stack[sp + var_id].value.as_nobj = asNativeObject(symtbl->GetVariableType(var_id).info, m_rtype, m_rvalue, node);
case TYPE(VAR):
m_call_stack[sp + var_id].value = m_rvalue;
@@ -212,7 +215,10 @@
case TYPE(CHAR): m_call_stack[var_idx].value.as_char = asChar(val.type, val.value, node); break;
case TYPE(FLOAT): m_call_stack[var_idx].value.as_float = asFloat(val.type, val.value, node); break;
case TYPE(INT): m_call_stack[var_idx].value.as_int = asInt(val.type, val.value, node); break;
- case TYPE(OBJECT_REF): INTERPRET_ERROR(INTERNAL); // @TODO - foreach assignment
+ case TYPE(OBJECT_REF):
+ m_call_stack[var_idx].value.as_nobj->RemoveReference();
+ m_call_stack[var_idx].value.as_nobj = asNativeObject(var_type.info, val.type, val.value, node);
+ break;
case TYPE(ARRAY):
m_call_stack[var_idx].value.as_array->RemoveReference();
@@ -306,7 +312,7 @@
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 - var def assignment
+ case TYPE(OBJECT_REF): m_call_stack[m_sp + var_id].value.as_nobj = asNativeObject(node.GetType().info, m_rtype, m_rvalue, node); break;
case TYPE(MATRIX): m_call_stack[m_sp + var_id].value.as_matrix = asMatrix(m_rtype, m_rvalue, node); break;
case TYPE(STRING):
delete m_call_stack[m_sp + var_id].value.as_string;
@@ -342,6 +348,8 @@
} else {
INTERPRET_ERROR(INTERNAL);
}
+ } else if (node.GetType().type == TYPE(OBJECT_REF)) {
+ // @TODO - set native object ref to special NULL value
}
}
@@ -1243,7 +1251,7 @@
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 - func call arg assignment
+ case TYPE(OBJECT_REF): m_call_stack[sp + var_id].value.as_nobj = asNativeObject(func_symtbl->GetVariableType(var_id).info, m_rtype, m_rvalue, node); break;
case TYPE(MATRIX): m_call_stack[sp + var_id].value.as_matrix = asMatrix(m_rtype, m_rvalue, node); break;
case TYPE(STRING):
{
@@ -1275,7 +1283,7 @@
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
+ case TYPE(OBJECT_REF): m_rvalue.as_nobj = asNativeObject(node.GetType().info, m_rtype, m_rvalue, node); break;
case TYPE(MATRIX): m_rvalue.as_matrix = asMatrix(m_rtype, m_rvalue, node); break;
case TYPE(STRING): m_rvalue.as_string = asString(m_rtype, m_rvalue, node); break;
case TYPE(VAR): break;
@@ -1434,7 +1442,7 @@
switch (node.GetType().type) {
case TYPE(ARRAY): m_rvalue.as_ref = new cArrayVarRef(m_call_stack[sp + var_id].value); break;
case TYPE(DICT): m_rvalue.as_ref = new cDictVarRef(m_call_stack[sp + var_id].value); break;
- case TYPE(OBJECT_REF): INTERPRET_ERROR(INTERNAL); // @TODO - var ref object assignment
+ case TYPE(OBJECT_REF): m_rvalue.as_ref = new cNativeObjectVarRef(m_call_stack[sp + var_id].value); break;
case TYPE(MATRIX): m_rvalue.as_ref = new cMatrixVarRef(m_call_stack[sp + var_id].value); break;
case TYPE(STRING): m_rvalue.as_ref = new cStringVarRef(m_call_stack[sp + var_id].value); break;
@@ -1459,7 +1467,7 @@
case TYPE(STRING): m_rvalue.as_string = new cString(*m_call_stack[sp + var_id].value.as_string); break;
- case TYPE(OBJECT_REF): INTERPRET_ERROR(INTERNAL); // @TODO - var ref assignment
+ case TYPE(OBJECT_REF): m_rvalue.as_nobj = m_call_stack[sp + var_id].value.as_nobj->GetReference(); break;
default:
INTERPRET_ERROR(INTERNAL);
@@ -1490,7 +1498,10 @@
case TYPE(CHAR): m_call_stack[var_idx].value.as_char = asChar(val.type, val.value, node); break;
case TYPE(FLOAT): m_call_stack[var_idx].value.as_float = asFloat(val.type, val.value, node); break;
case TYPE(INT): m_call_stack[var_idx].value.as_int = asInt(val.type, val.value, node); break;
- case TYPE(OBJECT_REF): INTERPRET_ERROR(INTERNAL); // @TODO - assignment
+ case TYPE(OBJECT_REF):
+ m_call_stack[var_idx].value.as_nobj->RemoveReference();
+ m_call_stack[var_idx].value.as_nobj = asNativeObject(var_type.info, val.type, val.value, node);
+ break;
case TYPE(VAR):
m_call_stack[var_idx].value = val.value;
@@ -1757,6 +1768,22 @@
}
+cASNativeObject* cDirectInterpretASTVisitor::asNativeObject(const cString& info, const sASTypeInfo& type, uAnyType value,
+ cASTNode& node)
+{
+ switch (type.type) {
+ case TYPE(OBJECT_REF):
+ if (type.info != info) INTERPRET_ERROR(NATIVE_OBJECT_TYPE_MISMATCH, *info, *type.info);
+ return value.as_nobj;
+
+ default:
+ INTERPRET_ERROR(TYPE_CAST, mapType(type), mapType(TYPE(OBJECT_REF)));
+ }
+
+ return NULL;
+}
+
+
cString* cDirectInterpretASTVisitor::asString(const sASTypeInfo& type, uAnyType value, cASTNode& node)
{
switch (type.type) {
@@ -1786,9 +1813,9 @@
return str;
}
- case TYPE(OBJECT_REF): // @TODO - as string
+ case TYPE(OBJECT_REF):
{
- cString* str = new cString(cStringUtil::Stringf("< object >"));
+ cString* str = new cString(cStringUtil::Stringf("< %s object @ %p >", value.as_nobj->GetType(), value.as_nobj));
return str;
}
@@ -2196,9 +2223,7 @@
case TYPE(ARRAY): return value.as_array == lval.value.as_array;
case TYPE(DICT): return value.as_dict == lval.value.as_dict;
case TYPE(MATRIX): return value.as_matrix == lval.value.as_matrix;
-
- case TYPE(OBJECT_REF): // @TODO - aggregate value compare
- return value.as_void == lval.value.as_void;
+ case TYPE(OBJECT_REF): return value.as_nobj == lval.value.as_nobj;
default:
break;
@@ -2497,8 +2522,21 @@
}
+bool cDirectInterpretASTVisitor::cNativeObjectVarRef::Get(const sAggregateValue& idx, sAggregateValue& val)
+{
+ // @TODO - get indexed native var
+ return false;
+}
+bool cDirectInterpretASTVisitor::cNativeObjectVarRef::Set(sAggregateValue& idx, sAggregateValue& val)
+{
+ // @TODO - set indexed native var
+ return false;
+}
+
+
+
bool cDirectInterpretASTVisitor::cObjectIndexRef::Get(const sAggregateValue& idx, sAggregateValue& val)
{
sAggregateValue o_val;
@@ -2721,6 +2759,13 @@
case AS_DIRECT_INTERPRET_ERR_MATRIX_SIZE_MISMATCH:
std::cerr << "matrix size mismatch for '" << VA_ARG_STR << "' operation" << ERR_ENDL;
break;
+ case AS_DIRECT_INTERPRET_ERR_NATIVE_OBJECT_TYPE_MISMATCH:
+ {
+ const char* otype = VA_ARG_STR;
+ const char* itype = VA_ARG_STR;
+ std::cerr << "expected object of type '" << otype << "', received '" << itype << "'" << ERR_ENDL;
+ }
+ break;
case AS_DIRECT_INTERPRET_ERR_OBJECT_ASSIGN_FAIL:
std::cerr << "aggregate assignment failed" << ERR_ENDL;
break;
Modified: development/source/script/cDirectInterpretASTVisitor.h
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.h 2008-09-15 17:47:08 UTC (rev 2792)
+++ development/source/script/cDirectInterpretASTVisitor.h 2008-09-18 03:47:37 UTC (rev 2793)
@@ -54,6 +54,7 @@
cLocalDict* as_dict;
cLocalMatrix* as_matrix;
cObjectRef* as_ref;
+ cASNativeObject* as_nobj;
void* as_void;
} uAnyType;
@@ -133,6 +134,7 @@
int asInt(const sASTypeInfo& type, uAnyType value, cASTNode& node);
double asFloat(const sASTypeInfo& type, uAnyType value, cASTNode& node);
cLocalMatrix* asMatrix(const sASTypeInfo& type, uAnyType value, cASTNode& node);
+ cASNativeObject* asNativeObject(const cString& info, const sASTypeInfo& type, uAnyType value, cASTNode& node);
cString* asString(const sASTypeInfo& type, uAnyType value, cASTNode& node);
ASType_t getRuntimeType(ASType_t ltype, ASType_t rtype, bool allow_str = false);
@@ -307,20 +309,20 @@
bool Set(sAggregateValue& idx, sAggregateValue& val);
};
- class cNativeObjectRef : public cObjectRef
+ class cNativeObjectVarRef : public cObjectRef
{
private:
- cASNativeObject* m_no;
+ uAnyType& m_var;
public:
- cNativeObjectRef();
- ~cNativeObjectRef() { m_no->Release(); }
+ cNativeObjectVarRef(uAnyType& var) : m_var(var) { ; }
+ ~cNativeObjectVarRef() { ; }
bool IsWritable() { return false; }
- bool Get(sAggregateValue& val) { return false; }
- bool Get(const sAggregateValue& idx, sAggregateValue& val) { return false; }
+ bool Get(sAggregateValue& val) { val.value = m_var; val.type = AS_TYPE_OBJECT_REF; return false; }
+ bool Get(const sAggregateValue& idx, sAggregateValue& val);
bool Set(sAggregateValue& val) { return false; }
- bool Set(sAggregateValue& idx, sAggregateValue& val) { return false; }
+ bool Set(sAggregateValue& idx, sAggregateValue& val);
};
class cObjectIndexRef : public cObjectRef
More information about the Avida-cvs
mailing list