/// <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); }
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--; }); }
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); } }
public void SUndefinedTranslateTest() { var processor = ScriptProcessorFactory.GetNew(); SUndefined Undefined = (SUndefined)processor.Undefined; var obj = ScriptOutAdapter.Translate(Undefined); Assert.IsTrue(obj is SUndefined); }
public void SNullTranslateTest() { var processor = ScriptProcessorFactory.GetNew(); SNull Null = (SNull)processor.Null; var obj = ScriptOutAdapter.Translate(Null); Assert.IsTrue(obj == null); }
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); }
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); }
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); }
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--; }); }
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); }