Пример #1
0
        /// <summary>
        /// Executes the function.
        /// </summary>
        /// <param name="processor">The processor with context that called this functions.</param>
        /// <param name="caller">The calling object.</param>
        /// <param name="This">The "This" reference used in the call context.</param>
        /// <param name="parameters">The parameters used in this function call.</param>
        public SObject Call(ScriptProcessor processor, SObject caller, SObject This, SObject[] parameters)
        {
            var     functionProcessor = new ScriptProcessor(processor.Context, processor.GetLineNumber());
            SObject functionReturnObject;

            if (HasBuiltInMethod)
            {
                if (Method != null)
                {
                    functionReturnObject = Method(functionProcessor, caller, This, parameters);
                }
                else
                {
                    var dotNetParams    = parameters.Select(ScriptOutAdapter.Translate);
                    var dotNetReturnObj = DotNetMethod(ScriptOutAdapter.Translate(caller), new ScriptObjectLink(processor, caller), dotNetParams.ToArray());
                    functionReturnObject = ScriptInAdapter.Translate(processor, dotNetReturnObj);
                }
            }
            else
            {
                for (var i = 0; i < _parameters.Length; i++)
                {
                    functionProcessor.Context.AddVariable(_parameters[i],
                                                          parameters.Length > i ? parameters[i] : functionProcessor.Undefined);
                }

                functionProcessor.Context.This = This;
                functionReturnObject           = functionProcessor.Run(Body);
            }

            return(functionReturnObject);
        }
Пример #2
0
        public void RunScript(string source)
        {
            _activeProcessorCount++;

            Task.Run(() =>
            {
                try
                {
                    var processor = CreateProcessor();
                    var result    = processor.Run(source);

                    if (ScriptContextManipulator.ThrownRuntimeError(processor) &&
                        ScriptOutAdapter.Translate(result) is ScriptRuntimeException runtimeException)
                    {
                        throw runtimeException;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("An error occurred during script execution: " + ex.Message);
                }

                _activeProcessorCount--;
            });
        }
Пример #3
0
        protected static bool EnsureTypeContract(SObject[] parameters, Type[] typeContract, out object[] netObjects, int optionalCount = 0)
        {
            if (parameters.Length + optionalCount >= typeContract.Length)
            {
                netObjects = new object[parameters.Length];
                var i = 0;

                while (i < parameters.Length)
                {
                    netObjects[i] = ScriptOutAdapter.Translate(parameters[i]);

                    if (i < typeContract.Length && typeContract[i] != netObjects[i]?.GetType())
                    {
                        return(false);
                    }

                    i++;
                }

                return(true);
            }
            else
            {
                netObjects = null;
                return(false);
            }
        }
Пример #4
0
        public void SUndefinedTranslateTest()
        {
            var processor = ScriptProcessorFactory.GetNew();

            SUndefined Undefined = (SUndefined)processor.Undefined;

            var obj = ScriptOutAdapter.Translate(Undefined);

            Assert.IsTrue(obj is SUndefined);
        }
Пример #5
0
        public void SNullTranslateTest()
        {
            var processor = ScriptProcessorFactory.GetNew();

            SNull Null = (SNull)processor.Null;

            var obj = ScriptOutAdapter.Translate(Null);

            Assert.IsTrue(obj == null);
        }
Пример #6
0
        public void SBoolTranslateTest()
        {
            var processor = ScriptProcessorFactory.GetNew();

            SBool testBool = processor.CreateBool(true);

            var obj = ScriptOutAdapter.Translate(testBool);

            Assert.IsTrue(obj.GetType() == typeof(bool));
            Assert.IsTrue((bool)obj == testBool.Value);
        }
Пример #7
0
        public void SNumberTranslateTest()
        {
            var processor = ScriptProcessorFactory.GetNew();

            SNumber testNumber = processor.CreateNumber(-72.65);

            var obj = ScriptOutAdapter.Translate(testNumber);

            Assert.IsTrue(obj.GetType() == typeof(double));
            Assert.IsTrue((double)obj == testNumber.Value);
        }
Пример #8
0
        public void SStringTranslateTest()
        {
            var processor = ScriptProcessorFactory.GetNew();

            SString testString = processor.CreateString("this is a test string!");

            var obj = ScriptOutAdapter.Translate(testString);

            Assert.IsTrue(obj.GetType() == typeof(string));
            Assert.IsTrue((string)obj == testString.Value);
        }
Пример #9
0
        public static void RunScript(string scriptFile)
        {
            if (_apiClasses == null)
            {
                InitializeApiClasses();
            }
            if (_prototypeBuffer == null)
            {
                InitializePrototypeBuffer();
            }

            ActiveProcessorCount++;
            Task.Run(() =>
            {
                try
                {
                    var gamemode = GameInstance.GetService <GameModeManager>().ActiveGameMode;
                    var source   = Encoding.UTF8.GetString(gamemode.FileLoader.GetFile(gamemode.GetScriptFilePath(scriptFile), false).Data);

                    var processor = CreateProcessor();
                    var result    = processor.Run(source);

                    if (ScriptContextManipulator.ThrownRuntimeError(processor))
                    {
                        var exObj = ScriptOutAdapter.Translate(result);

                        var runtimeException = exObj as ScriptRuntimeException;
                        if (runtimeException != null)
                        {
                            throw runtimeException;
                        }
                    }
                }
                catch (ArgumentNullException)
                {
                    var message = $"Failed to run script \"{scriptFile}\"";
                    GameLogger.Instance.Log(MessageType.Error, message);
                    GameInstance.GetService <NotificationBar>().PushNotification(NotificationKind.Error, message);
                }
                catch (ScriptRuntimeException ex)
                {
                    var message = $"Script execution failed at runtime. {ex.Type} ({scriptFile}, L{ex.Line}): {ex.Message}";
                    GameLogger.Instance.Log(MessageType.Error, message);
                    GameInstance.GetService <NotificationBar>().PushNotification(NotificationKind.Error, message);
                }

                ActiveProcessorCount--;
            });
        }
Пример #10
0
        public void SArrayTranslateTest()
        {
            var processor = ScriptProcessorFactory.GetNew();

            SObject arrobj = processor.CreateArray(new SObject[]
            {
                processor.CreateBool(true),
                processor.CreateString("test"),
                processor.CreateNumber(-1234.3)
            });

            Assert.IsTrue(arrobj is SArray);

            var obj = ScriptOutAdapter.Translate(arrobj);

            Assert.IsTrue(obj.GetType().IsArray);

            var arr = (Array)obj;

            Assert.IsTrue(arr.Length == 3);
        }