[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