public virtual DekiScriptLiteral Invoke(Location location, XUri uri, DekiScriptLiteral args, DekiScriptEnv env) { var sw = Stopwatch.StartNew(); DekiScriptInvocationTargetDescriptor descriptor; var target = _functions.TryGetValue(uri, out descriptor) ? descriptor.Target : FindTarget(uri); try { // invoke function directly return target.Invoke(this, args); } catch(Exception e) { throw UnwrapAsyncException(uri, e).Rethrow(); } finally { sw.Stop(); bool property = (uri.LastSegment ?? string.Empty).StartsWithInvariant("$"); env.AddFunctionProfile(location, (descriptor != null) ? (property ? "$" : "") + descriptor.Name : uri.ToString(), sw.Elapsed); } }