示例#1
0
        /// <summary>
        /// Gets the names of all of the variables defined by an instance.
        /// </summary>
        /// <param name="inst">The instance to get the variable names from</param>
        /// <returns></returns>
        public static TsObject[] VariableInstanceGetNames(ITsInstance inst)
        {
            TsObject[] arr;
            int        i;

            switch (inst)
            {
            case TsInstance ts:
                arr = new TsObject[ts._members.Count];
                i   = 0;
                foreach (var key in ts._members.Keys)
                {
                    arr[i++] = key;
                }

                return(arr);

            case DynamicInstance di:
                arr = new TsObject[di._members.Count];
                i   = 0;
                foreach (var key in di._members.Keys)
                {
                    arr[i++] = key;
                }

                return(arr);

            default:
                throw new InvalidOperationException($"Could not get variable names from instance of type {inst.ObjectType}");
            }
        }
示例#2
0
        public static TsObject Try(ITsInstance target, TsObject[] args)
        {
            var del = (TsDelegate)args[0];

            TsObject[] delArgs = null;
            if (args.Length > 1)
            {
                delArgs = new TsObject[args.Length - 1];
                Array.Copy(args, 1, delArgs, 0, delArgs.Length);
            }

            var result = new DynamicInstance("obj_exception");

            try
            {
                del.Invoke(delArgs);
                result["has_error"]  = false;
                result["error_type"] = "";
                result["error_msg"]  = "";
            }
            catch (Exception e)
            {
                result["has_error"]  = true;
                result["error_type"] = e.GetType().Name;
                result["error_msg"]  = e.Message;
            }

            return(result);
        }
示例#3
0
 public static string ObjectGetParent(ITsInstance inst)
 {
     if (Inherits.TryGetValue(inst.ObjectType, out var parent))
     {
         return(parent);
     }
     return("");
 }
示例#4
0
 public static TsObject Choose(ITsInstance target, TsObject[] args)
 {
     if (args.Length == 0)
     {
         throw new ArgumentException("There must be at least one argument passed to Choose.");
     }
     return(args[Rng.Next(args.Length)]);
 }
示例#5
0
 public static TsObject moniter_try_enter(ITsInstance inst, TsObject[] args)
 {
     if (args.Length < 1)
     {
         throw new ArgumentOutOfRangeException("args", "There must be at least one argument to call moniter_try_enter");
     }
     if (args.Length == 2)
     {
         return(Monitor.TryEnter(args[0].GetValue(), (int)args[1]));
     }
     else
     {
         return(Monitor.TryEnter(args[0].GetValue()));
     }
 }
示例#6
0
        public static TsObject InstanceCreate(ITsInstance inst, TsObject[] args)
        {
            var type = (string)args[0];

            if (!Constructors.TryGetValue(type, out var ctor))
            {
                throw new ArgumentException($"Cannot create instance of '{type}': Type doesn't exist", "type");
            }

            TsObject[] ctorArgs = null;
            if (args.Length > 1)
            {
                ctorArgs = new TsObject[args.Length - 1];
                Array.Copy(args, 1, ctorArgs, 0, args.Length - 1);
            }
            return(new TsObject(ctor(ctorArgs)));
        }
示例#7
0
        public static TsObject Min(ITsInstance target, TsObject[] args)
        {
            if (args.Length == 0)
            {
                throw new ArgumentOutOfRangeException("args", "You must pass in at least one value to Max");
            }
            var min = args[0].GetFloat();

            for (var i = 1; i < args.Length; i++)
            {
                var num = args[i].GetFloat();
                if (num < min)
                {
                    min = num;
                }
            }
            return(new TsObject(min));
        }
示例#8
0
        public static TsObject ArrayCreate(ITsInstance target, TsObject[] args)
        {
            var size  = args[0].GetInt();
            var value = TsObject.Empty();

            if (args.Length > 1)
            {
                value = args[1];
            }
            var result = new TsObject[size];

            for (var i = 0; i < size; ++i)
            {
                result[i] = value;
            }

            return(new TsObject(result));
        }
示例#9
0
        public static TsObject task_wait_any(ITsInstance inst, TsObject[] args)
        {
            var tasks = new RealTask[args.Length];

            for (var i = 0; i < tasks.Length; i++)
            {
                tasks[i] = ((Task)args[i]).Source;
            }

            try
            {
                var result = RealTask.WaitAny(tasks);
                return(CreateTaskResult(result, ""));
            }
            catch (AggregateException e)
            {
                return(CreateTaskResult(-1, e.InnerException.ToString()));
            }
        }
示例#10
0
        public static TsObject EventPerform(ITsInstance inst, TsObject[] args)
        {
            if (inst.TryGetDelegate((string)args[1], out var ev))
            {
                TsObject[] copy;
                if (args.Length > 2)
                {
                    copy = new TsObject[args.Length - 2];
                    Array.Copy(args, 2, copy, 0, copy.Length);
                }
                else
                {
                    copy = null;
                }

                return(ev.Invoke(args[0].GetInstance(), copy));
            }
            return(TsObject.Empty());
        }
示例#11
0
        public static TsObject CallInstanceScript(ITsInstance inst, TsObject[] args)
        {
            if (TsReflection.TryGetScript((string)args[1], (string)args[2], out var ev))
            {
                TsObject[] copy;
                if (args.Length > 3)
                {
                    copy = new TsObject[args.Length - 3];
                    Array.Copy(args, 3, copy, 0, copy.Length);
                }
                else
                {
                    copy = null;
                }

                return(ev.Invoke(args[0].GetInstance(), copy));
            }
            return(TsObject.Empty());
        }
示例#12
0
        public static TsObject task_wait_all(ITsInstance inst, TsObject[] args)
        {
            var tasks = new RealTask[args.Length];

            for (var i = 0; i < tasks.Length; i++)
            {
                tasks[i] = ((Task)args[i]).Source;
            }

            try
            {
                RealTask.WaitAll(tasks);
                return("");
            }
            catch (AggregateException e)
            {
                return(e.InnerException.ToString());
            }
        }
示例#13
0
        public static TsObject CallGlobalScript(ITsInstance inst, TsObject[] args)
        {
            if (args.Length < 1)
            {
                throw new ArgumentException("You must pass at least a script name to script_execute.");
            }
            var name = args[0].GetString();

            if (!TsReflection.GlobalScripts.TryGetValue(name, out var function))
            {
                throw new ArgumentException($"Tried to execute a non-existant function: {name}");
            }
            var parameters = new TsObject[args.Length - 1];

            if (parameters.Length != 0)
            {
                Array.Copy(args, 1, parameters, 0, parameters.Length);
            }
            return(function.Invoke(inst, parameters));
        }
示例#14
0
        /// <summary>
        /// Determines if an instance has a variable with the given name
        /// </summary>
        /// <param name="inst">The instance to check</param>
        /// <param name="name">The name of the variable</param>
        /// <returns></returns>
        public static bool VariableInstanceExists(ITsInstance inst, string name)
        {
            switch (inst)
            {
            case TsInstance ts:
                return(ts._members.ContainsKey(name));

            case DynamicInstance di:
                return(di._members.ContainsKey(name));

            default:
                try
                {
                    inst.GetMember(name);
                    return(true);
                }
                catch
                {
                    return(false);
                }
            }
        }
示例#15
0
        public static TsObject TryExpect(ITsInstance target, TsObject[] args)
        {
            var del = (TsDelegate)args[0];

            TsObject[] delArgs = null;
            if (args.Length > 2)
            {
                delArgs = new TsObject[args.Length - 2];
                Array.Copy(args, 2, delArgs, 0, delArgs.Length);
            }

            try
            {
                del.Invoke(delArgs);
            }
            catch (Exception e)
            {
                return(e.GetType().Name == (string)args[1]);
            }

            return(false);
        }
示例#16
0
        public static TsObject TimeInvoke(ITsInstance target, TsObject[] args)
        {
            var del = (TsDelegate)args[0];

            TsObject[] delArgs = null;
            if (args.Length > 1)
            {
                delArgs = new TsObject[args.Length - 1];
                Array.Copy(args, 1, delArgs, 0, delArgs.Length);
            }

            var timer = new Stopwatch();

            timer.Start();
            del.Invoke(delArgs);
            timer.Stop();
            var result = new DynamicInstance("obj_timer_result");

            result["ms"]    = timer.ElapsedMilliseconds;
            result["ticks"] = timer.ElapsedTicks;
            return(result);
        }
示例#17
0
 /// <summary>
 /// Sets a variable on an instance
 /// </summary>
 /// <param name="inst">The instance to set the variable on</param>
 /// <param name="name">The name of the variable</param>
 /// <param name="value">The value to set</param>
 public static void VariableInstanceSet(ITsInstance inst, string name, TsObject value)
 {
     inst.SetMember(name, value);
 }
示例#18
0
 public static TsObject task_run(ITsInstance inst, TsObject[] args)
 {
     return(args.Length == 1
         ? new Task(RealTask.Run(() => args[0].GetDelegate().Invoke()))
         : new Task(RealTask.Run(() => args[0].GetDelegate().Invoke(), ((TaskCancellationToken)args[1]).Source.Token)));
 }
示例#19
0
 /// <summary>
 /// Gets the value of an instance variable.
 /// </summary>
 /// <param name="inst">The instance to get the value from</param>
 /// <param name="name">The name of the variable</param>
 /// <returns></returns>
 public static TsObject VariableInstanceGet(ITsInstance inst, string name)
 {
     return(inst.GetMember(name));
 }
示例#20
0
 public static TsObject thread_get_id(ITsInstance inst, TsObject[] args)
 {
     return(Thread.CurrentThread.ManagedThreadId);
 }
示例#21
0
 /// <summary>
 /// Creates a TaffyScript object from an instances id.
 /// </summary>
 /// <param name="instance">The instance to get the id from.</param>
 public TsObject(ITsInstance instance)
 {
     Type  = VariableType.Instance;
     Value = new TsImmutableValue <ITsInstance>(instance);
 }
示例#22
0
 /// <summary>
 /// Creates a copy of a TsDelegate with a new target.
 /// </summary>
 /// <param name="original"></param>
 /// <param name="target"></param>
 public TsDelegate(TsDelegate original, ITsInstance target)
 {
     Script = original.Script;
     Name   = original.Name;
     Target = target;
 }
示例#23
0
 public static TsObject thread_pool_queue_item(ITsInstance inst, TsObject[] args)
 {
     return(ThreadPool.QueueUserWorkItem((obj) => args[0].GetDelegate().Invoke()));
 }
示例#24
0
 public TsDelegate(TsScript script, string name, ITsInstance target)
 {
     Target = target;
     Script = script;
     Name   = name;
 }
示例#25
0
 public static TsObject moniter_exit(ITsInstance inst, TsObject[] args)
 {
     Monitor.Exit(args[0].GetValue());
     return(TsObject.Empty());
 }
示例#26
0
 /// <summary>
 /// Invokes the wrapped script with the specified target and arguments.
 /// </summary>
 /// <param name="target"></param>
 /// <param name="args"></param>
 /// <returns></returns>
 public TsObject Invoke(ITsInstance target, params TsObject[] args)
 {
     return(Script(target, args));
 }
示例#27
0
 public static string ObjectGetName(ITsInstance inst)
 {
     return(inst.ObjectType);
 }
示例#28
0
 public TsObject DelegateInvoke(ITsInstance target, params TsObject[] args)
 {
     return(GetDelegate().Invoke(target, args));
 }
示例#29
0
 public static TsObject thread_sleep(ITsInstance inst, TsObject[] args)
 {
     Thread.Sleep((int)args[0]);
     return(TsObject.Empty());
 }