[Avida-SVN] r2844 - development/source/script

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Mon Oct 13 21:03:05 PDT 2008


Author: brysonda
Date: 2008-10-14 00:03:05 -0400 (Tue, 14 Oct 2008)
New Revision: 2844

Modified:
   development/source/script/ASAvidaLib.cc
   development/source/script/AvidaScript.h
   development/source/script/cASCPPParameter.h
   development/source/script/cASNativeObject.h
   development/source/script/cASNativeObjectMethod.h
   development/source/script/cDirectInterpretASTVisitor.cc
Log:
AS: Working native object parameter passing.

Modified: development/source/script/ASAvidaLib.cc
===================================================================
--- development/source/script/ASAvidaLib.cc	2008-10-14 01:48:24 UTC (rev 2843)
+++ development/source/script/ASAvidaLib.cc	2008-10-14 04:03:05 UTC (rev 2844)
@@ -28,12 +28,39 @@
 #include "cASLibrary.h"
 
 #include "cAvidaConfig.h"
+#include "cDefaultRunDriver.h"
 #include "cWorld.h"
 
 #include <cstring>
 
 
+namespace AvidaScript {
+  template<> inline sASTypeInfo TypeOf<cAvidaConfig*>() { return sASTypeInfo(AS_TYPE_OBJECT_REF, "Config"); }
+  template<> inline sASTypeInfo TypeOf<cDefaultRunDriver*>() { return sASTypeInfo(AS_TYPE_OBJECT_REF, "Driver"); }  
+  template<> inline sASTypeInfo TypeOf<cWorld*>() { return sASTypeInfo(AS_TYPE_OBJECT_REF, "World"); }
+};
 
+
+
+
+static void setupNativeObjects()
+{
+  tASNativeObject<cAvidaConfig>::InitializeMethodRegistrar();
+  tASNativeObject<cAvidaConfig>::
+    RegisterMethod(new tASNativeObjectMethod<cAvidaConfig, cString (const cString&)>(&cAvidaConfig::GetAsString), "Get");
+  
+  
+  tASNativeObject<cDefaultRunDriver>::InitializeMethodRegistrar();
+  tASNativeObject<cDefaultRunDriver>::
+    RegisterMethod(new tASNativeObjectMethod<cDefaultRunDriver, void ()>(&cDefaultRunDriver::Run), "Run");
+
+  
+  tASNativeObject<cWorld>::InitializeMethodRegistrar();
+};
+
+
+
+
 template<class FunctionType> class tASNativeObjectInstantiate;
 
 template<class NativeClass> 
@@ -43,10 +70,9 @@
   sASTypeInfo m_signature;
   
 public:
-  tASNativeObjectInstantiate(const cString& name) : cASFunction(name)
+  tASNativeObjectInstantiate() : cASFunction(AvidaScript::TypeOf<NativeClass*>().info)
   {
-    m_rtype = AvidaScript::TypeOf<cASNativeObject>();
-    m_rtype.info = name;
+    m_rtype = AvidaScript::TypeOf<NativeClass*>();
     m_signature = AvidaScript::TypeOf<void>();
   }
   
@@ -69,10 +95,9 @@
   sASTypeInfo m_signature;
   
 public:
-  tASNativeObjectInstantiate(const cString& name) : cASFunction(name)
+  tASNativeObjectInstantiate() : cASFunction(AvidaScript::TypeOf<NativeClass*>().info)
   {
-    m_rtype = AvidaScript::TypeOf<cASNativeObject>();
-    m_rtype.info = name;
+    m_rtype = AvidaScript::TypeOf<NativeClass*>();
     m_signature = AvidaScript::TypeOf<Arg1Type>();
   }
   
@@ -88,22 +113,13 @@
 };
 
 
-static void setupNativeObjects()
-{
-  tASNativeObject<cAvidaConfig>::InitializeMethodRegistrar();
-  tASNativeObject<cAvidaConfig>::
-    RegisterMethod(new tASNativeObjectMethod<cAvidaConfig, cString (const cString&)>(&cAvidaConfig::GetAsString), "Get");
 
-
-  tASNativeObject<cWorld>::InitializeMethodRegistrar();
-};
-
-
 void RegisterASAvidaLib(cASLibrary* lib)
 {
   setupNativeObjects();
   
-  lib->RegisterFunction(new tASNativeObjectInstantiate<cAvidaConfig ()>("Config"));
-  lib->RegisterFunction(new tASNativeObjectInstantiate<cWorld (cAvidaConfig*)>("World"));
+  lib->RegisterFunction(new tASNativeObjectInstantiate<cAvidaConfig ()>());
+  lib->RegisterFunction(new tASNativeObjectInstantiate<cDefaultRunDriver (cWorld*)>());
+  lib->RegisterFunction(new tASNativeObjectInstantiate<cWorld (cAvidaConfig*)>());
     // @TODO - world takes ownership of config, but I don't handle that here... world could delete it without AS knowing
 }

Modified: development/source/script/AvidaScript.h
===================================================================
--- development/source/script/AvidaScript.h	2008-10-14 01:48:24 UTC (rev 2843)
+++ development/source/script/AvidaScript.h	2008-10-14 04:03:05 UTC (rev 2844)
@@ -239,6 +239,7 @@
   
   sASTypeInfo() : type(AS_TYPE_INVALID) { ; }
   sASTypeInfo(ASType_t in_type) : type(in_type) { ; }
+  sASTypeInfo(ASType_t in_type, const cString& in_info) : type(in_type), info(in_info) { ; }
   
   bool operator==(const sASTypeInfo& ot) const { return (type == ot.type && info == ot.info); }
   bool operator!=(const sASTypeInfo& ot) const { return (type != ot.type || info != ot.info); }

Modified: development/source/script/cASCPPParameter.h
===================================================================
--- development/source/script/cASCPPParameter.h	2008-10-14 01:48:24 UTC (rev 2843)
+++ development/source/script/cASCPPParameter.h	2008-10-14 04:03:05 UTC (rev 2844)
@@ -55,6 +55,7 @@
   void Set(cString* val) { m_string = val; }
   void Set(const cString& val) { m_string = new cString(val); }
   void Set(cASNativeObject* val) { m_nobj = val; }
+  template<class NativeClass> void Set(tASNativeObject<NativeClass>* val) { m_nobj = val; }
   template<class NativeClass> void Set(NativeClass* val) { m_nobj = new tASNativeObject<NativeClass>(val); }
   
   template<typename T> inline T Get() const;

Modified: development/source/script/cASNativeObject.h
===================================================================
--- development/source/script/cASNativeObject.h	2008-10-14 01:48:24 UTC (rev 2843)
+++ development/source/script/cASNativeObject.h	2008-10-14 04:03:05 UTC (rev 2844)
@@ -74,8 +74,8 @@
   static tDictionary<int>* s_method_dict;
   
   NativeClass* m_object;
-
   
+  
 public:
   tASNativeObject(NativeClass* obj) : m_object(obj) { ; }
   ~tASNativeObject() { delete m_object; }
@@ -95,8 +95,8 @@
   {
     s_methods = new tArray<cASNativeObjectMethod<NativeClass>*>();
     s_method_dict = new tDictionary<int>();
-    
   }
+  
   static void RegisterMethod(cASNativeObjectMethod<NativeClass>* method, const cString& name)
   {
     int mid = s_methods->Push(method);

Modified: development/source/script/cASNativeObjectMethod.h
===================================================================
--- development/source/script/cASNativeObjectMethod.h	2008-10-14 01:48:24 UTC (rev 2843)
+++ development/source/script/cASNativeObjectMethod.h	2008-10-14 04:03:05 UTC (rev 2844)
@@ -50,6 +50,34 @@
 template<class NativeClass, class FunctionType> class tASNativeObjectMethod;
 
 
+template<class NativeClass>
+class tASNativeObjectMethod<NativeClass, void ()> : public cASNativeObjectMethod<NativeClass>
+{
+private:
+  sASTypeInfo m_rtype;
+  sASTypeInfo m_signature;
+  void (NativeClass::*m_method)();
+  
+public:
+  tASNativeObjectMethod(void (NativeClass::*method)()) : m_method(method)
+  {
+    m_rtype = AvidaScript::TypeOf<void>();
+    m_signature = AvidaScript::TypeOf<void>();
+  }
+  
+  int GetArity() const { return 0; }
+  const sASTypeInfo& GetArgumentType(int arg) const { return m_signature; }
+  const sASTypeInfo& GetReturnType() const { return m_rtype; }
+  
+  cASCPPParameter Call(NativeClass* object, cASCPPParameter args[]) const
+  {
+    cASCPPParameter rvalue;
+    (object->*m_method)();
+    return cASCPPParameter(); // @TODO - return actual void value?
+  }
+};
+
+
 template<class NativeClass, class ReturnType, class Arg1Type>
 class tASNativeObjectMethod<NativeClass, ReturnType (Arg1Type)> : public cASNativeObjectMethod<NativeClass>
 {

Modified: development/source/script/cDirectInterpretASTVisitor.cc
===================================================================
--- development/source/script/cDirectInterpretASTVisitor.cc	2008-10-14 01:48:24 UTC (rev 2843)
+++ development/source/script/cDirectInterpretASTVisitor.cc	2008-10-14 04:03:05 UTC (rev 2844)
@@ -63,8 +63,13 @@
       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;
-      case TYPE(OBJECT_REF):  m_call_stack[i].value.as_ref = NULL; break;
       case TYPE(STRING):      m_call_stack[i].value.as_string = NULL; break;
+
+      case TYPE(OBJECT_REF):
+        m_call_stack[i].value.as_ref = NULL;
+        m_call_stack[i].type.info = m_global_symtbl->GetVariableType(i).info;
+        break;
+      
       default: break;
     }
   }
@@ -1167,6 +1172,7 @@
           case TYPE(FLOAT):       args[i].Set(asFloat(m_rtype, m_rvalue, node)); break;
           case TYPE(INT):         args[i].Set(asInt(m_rtype, m_rvalue, node)); break;
           case TYPE(STRING):      args[i].Set(asString(m_rtype, m_rvalue, node)); break;
+          case TYPE(OBJECT_REF):  args[i].Set(asNativeObject(func->GetArgumentType(i).info, m_rtype, m_rvalue, node)); break;
             
           default:
             INTERPRET_ERROR(INTERNAL);
@@ -1200,6 +1206,8 @@
         case TYPE(FLOAT):   break;
         case TYPE(INT):     break;
         case TYPE(STRING):  delete args[i].Get<cString*>(); break;
+        case TYPE(OBJECT_REF):
+          args[i].Get<cASNativeObject*>()->RemoveReference(); break;
           
         default:
           INTERPRET_ERROR(INTERNAL);
@@ -1535,7 +1543,10 @@
       case TYPE(STRING):      m_rvalue.as_string = new cString(*m_call_stack[sp + var_id].value.as_string); break;
 
       
-      case TYPE(OBJECT_REF):  m_rvalue.as_nobj = m_call_stack[sp + var_id].value.as_nobj->GetReference(); break;
+      case TYPE(OBJECT_REF):
+        m_rvalue.as_nobj = m_call_stack[sp + var_id].value.as_nobj->GetReference(); 
+        m_rtype.info = m_call_stack[sp + var_id].type.info;
+        break;
         
       default:
         INTERPRET_ERROR(INTERNAL);




More information about the Avida-cvs mailing list