if (!methods)
BOOST_THROW_EXCEPTION(std::invalid_argument("Method '" + method + "' does not exist."));
- String funcName = methods->Get(method);
+ Value funcName = methods->Get(method);
if (funcName.IsEmpty())
BOOST_THROW_EXCEPTION(std::invalid_argument("Method '" + method + "' does not exist."));
- ScriptFunction::Ptr func = ScriptFunctionRegistry::GetInstance()->GetItem(funcName);
+ ScriptFunction::Ptr func;
- if (!func)
- BOOST_THROW_EXCEPTION(std::invalid_argument("Function '" + funcName + "' does not exist."));
+ if (funcName.IsObjectType<ScriptFunction>()) {
+ func = funcName;
+ } else {
+ func = ScriptFunction::GetByName(funcName);
+
+ if (!func)
+ BOOST_THROW_EXCEPTION(std::invalid_argument("Function '" + String(funcName) + "' does not exist."));
+ }
return func->Invoke(arguments);
}
ScriptFunction::Ptr ScriptFunction::GetByName(const String& name)
{
- return ScriptFunctionRegistry::GetInstance()->GetItem(name);
+ ScriptVariable::Ptr sv = ScriptVariable::GetByName(name);
+
+ if (!sv)
+ return ScriptFunction::Ptr();
+
+ return sv->GetData();
}
-void ScriptFunction::Register(const String& name, const ScriptFunction::Callback& function)
+void ScriptFunction::Register(const String& name, const ScriptFunction::Ptr& function)
{
- ScriptVariable::Ptr sv = ScriptVariable::Set(name, name);
+ ScriptVariable::Ptr sv = ScriptVariable::Set(name, function);
sv->SetConstant(true);
-
- ScriptFunction::Ptr func = make_shared<ScriptFunction>(function);
- ScriptFunctionRegistry::GetInstance()->Register(name, func);
}
void ScriptFunction::Unregister(const String& name)
{
ScriptVariable::Unregister(name);
- ScriptFunctionRegistry::GetInstance()->Unregister(name);
}
RegisterFunctionHelper::RegisterFunctionHelper(const String& name, const ScriptFunction::Callback& function)
{
- ScriptFunction::Register(name, function);
-}
-
-ScriptFunctionRegistry *ScriptFunctionRegistry::GetInstance(void)
-{
- return Singleton<ScriptFunctionRegistry>::GetInstance();
+ ScriptFunction::Register(name, make_shared<ScriptFunction>(function));
}
Value Invoke(const std::vector<Value>& arguments);
static ScriptFunction::Ptr GetByName(const String& name);
- static void Register(const String& name, const ScriptFunction::Callback& function);
+ static void Register(const String& name, const ScriptFunction::Ptr& function);
static void Unregister(const String& name);
private:
Callback m_Callback;
};
-/**
- * A registry for script functions.
- *
- * @ingroup base
- */
-class I2_BASE_API ScriptFunctionRegistry : public Registry<ScriptFunctionRegistry, ScriptFunction::Ptr>
-{
-public:
- static ScriptFunctionRegistry *GetInstance(void);
-};
-
/**
* Helper class for registering ScriptFunction implementation classes.
*
Value AExpression::OpFunctionCall(const AExpression *expr, const Dictionary::Ptr& locals)
{
- String funcName = expr->EvaluateOperand1(locals);
- ScriptFunction::Ptr func = ScriptFunction::GetByName(funcName);
+ Value funcName = expr->EvaluateOperand1(locals);
+
+ ScriptFunction::Ptr func;
+
+ if (funcName.IsObjectType<ScriptFunction>())
+ func = funcName;
+ else
+ func = ScriptFunction::GetByName(funcName);
if (!func)
BOOST_THROW_EXCEPTION(ConfigError("Function '" + funcName + "' does not exist."));
AExpression::Ptr aexpr = left->Get(1);
String name = left->Get(0);
- if (name.IsEmpty())
- name = "__lambda" + Utility::NewUniqueID();
-
Array::Ptr funcargs = expr->m_Operand2;
- ScriptFunction::Callback callback = boost::bind(&AExpression::FunctionWrapper, _1, funcargs, aexpr, locals);
- ScriptFunction::Register(name, callback);
- return name;
+ ScriptFunction::Ptr func = make_shared<ScriptFunction>(boost::bind(&AExpression::FunctionWrapper, _1, funcargs, aexpr, locals));
+
+ if (!name.IsEmpty())
+ ScriptFunction::Register(name, func);
+
+ return func;
}
Value AExpression::OpApply(const AExpression* expr, const Dictionary::Ptr& locals)
item->Compile()->Register();
return Empty;
-}
\ No newline at end of file
+}