[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