/* ----------------------------------------------------------------------------- GSFramework Copyright 2001-2013 Emmanuel Julien. All Rights Reserved. ----------------------------------------------------------------------------- */ #include "script/script_unit.h" #include "script/script_object.h" #include "script/script_variant.h" #include "log/log.h" using namespace GS::Script; //------------------------------------------------------------------------------ bool Unit::SetupFunctionCall(const char *func, const Object *func_object) { if (!vm || !self || !vm->SetupFunctionCall(func, func_object, self)) return false; return vm->SetFunctionCallContext(Variant(iface_object, iface_type)); } bool Unit::PushUserObjectFunctionCallArgument(void *p, uint type, bool managed) { return vm->PushArgument(Variant(p, type)); } bool Unit::PushFunctionCallArgument(const Variant &arg) { return vm->PushArgument(arg); } bool Unit::DoFunctionCall(Variant *return_value) { return vm->DoFunctionCall(return_value); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ bool Unit::Open() { if (!vm) return false; if (self) return true; if (script_file.IsEmpty() || script_class.IsEmpty()) return true; // Instantiate class. if (!vm->CompileFile(script_file) || !vm->SetupFunctionCall(script_class)) return false; Variant rv; if (!vm->DoFunctionCall(&rv) || (rv.type != Variant::Type_ScriptObject)) { vm->Kill(String::Format("Function call to '%s' failed.", script_class.c_str())); return false; } self = rv.object; rv.object = NULL; // Detach object from the variant so that it does not get deleted. // Send parameters to the instance. ListForeachPtr(GS::Variant *, v, parm_list) vm->Set(v->id, Variant(*v), self); return true; } void Unit::Close() { // Note: Do not delete the parameter list from here. _safe_delete(self); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ Unit::Unit(IVM *_vm) : vm(_vm) { iface_object = NULL; iface_type = (uint)~0; self = NULL; } Unit::~Unit() { ListDeleteAllPtr(GS::Variant *, parm_list) Close(); } //------------------------------------------------------------------------------