public static void RunThread(CallFunction call, int ThreadCount = 1, CallbackFunction callBack = null) { for (int i = 0; i < ThreadCount; i++) { BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (object sender, DoWorkEventArgs e) => { bool result = call(); e.Result = result; }; worker.RunWorkerCompleted += (object sender, RunWorkerCompletedEventArgs e) => { if (callBack != null) { if (e.Error != null) { callBack((bool)e.Result); } else { callBack(false); } } }; worker.RunWorkerAsync(); } }
public async Task CallFunction_request_returns200OK() { // Arrange var tokenServiceMock = new Mock <ITokenService>(); tokenServiceMock.Setup(t => t.FetchAccessTokenByTenantId(It.IsAny <string>())) .ReturnsAsync(_accessToken); var userServiceMock = new Mock <IUsersService>(); userServiceMock.Setup(u => u.GetUserIdsFromEmailAsync(It.IsAny <string[]>(), _accessToken)) .ReturnsAsync(_userIds); var callServiceMock = new Mock <ICallService>(); callServiceMock.Setup(c => c.StartGroupCallWithSpecificMembers(_userIds, It.IsAny <string>(), _accessToken)) .ReturnsAsync(true); var callFunction = new CallFunction(tokenServiceMock.Object, userServiceMock.Object, callServiceMock.Object, new Mock <IMeetingService>().Object); // Act var result = await callFunction.Calls(this.CreateHttpRequest().Object, new Mock <ILogger>().Object); // Assert Assert.IsType <OkObjectResult>(result); }
internal override void CompileBy(FunctionCompiler compiler, bool isLastOperator) { OpCode callOpCode; if (CallFunction.Type != ExpressionType.Member) { CallFunction.CompileBy(compiler, false); callOpCode = OpCode.Call; } else { var memberOperator = (MemberOperator)CallFunction; memberOperator.BaseValue.CompileBy(compiler, false); compiler.Emitter.Emit(OpCode.Dup); memberOperator.CompilePropertyBy(compiler); compiler.Emitter.Emit(OpCode.LdMember); callOpCode = OpCode.CallMember; } foreach (var argument in ArgumentList) { argument.CompileBy(compiler, false); } compiler.Emitter.Emit(OpCode.LdInteger, ArgumentList.Count); compiler.Emitter.Emit(callOpCode, !isLastOperator); }
/// <summary> /// Initialise the spell system global settings /// </summary> /// <remarks> /// Includes inputs, class links targeting layers and more /// </remarks> protected virtual void Start() { iLastLevel = 1; animator = GetComponent <Animator>(); #if !VANILLA vThirdPerson = GetComponent <vThirdPersonController>(); #endif GlobalFuncs.DEBUGGING_MESSAGES = DebuggingMessages; GlobalFuncs.MAGICAL_POOL = PooledMagic; GlobalFuncs.EnemyDestroyDelay = EnemyDestroyDelay; GlobalFuncs.OnDeathDropRadius = OnDeathDropRadius; // init targeting //Test = CollisionLayers.value | EnemyLayers.value; GlobalFuncs.targetingLayerMaskAll = FriendLayers.value | EnemyLayers.value; GlobalFuncs.targetingLayerMaskFriend = FriendLayers; GlobalFuncs.targetingLayerMaskEnemy = EnemyLayers; GlobalFuncs.targetingTagsAll = FriendTags.Union(EnemyTags).ToArray(); GlobalFuncs.targetingTagsFriend = FriendTags; GlobalFuncs.targetingTagsEnemy = EnemyTags; GlobalFuncs.targetingLayerMaskCollision = CollisionLayers; GlobalFuncs.targetingLayerMaskPhysics = PhysicsLayers; //Test = GlobalFuncs.targettingLayerMaskCollision.value | GlobalFuncs.targettingLayerMaskEnemy.value; // add a listener to the leveling component if available CharacterBase levelingSystem = GetComponent <CharacterBase>(); if (levelingSystem) { levelingSystem.NotifyUpdateHUD += new CharacterBase.UpdateHUDHandler(UpdateHUDListener); GlobalFuncs.GiveXPToPlayer = new SetIntValue(levelingSystem.AddXP); AddMana = new SetIntValue(levelingSystem.AddMana); SetManaMAX = new CallFunction(levelingSystem.SetManaMAX); levelingSystem.ForceUpdateHUD(); } }
public static void Initialize(string[] args, Libraries libraryNames) { DllLoadUtils = Platform.IsLinux() ? (IDllLoadUtils) new DllLoadUtilsLinux() : new DllLoadUtilsWindows(); string platformMain; if (Platform.IsLinux()) { platformMain = "unixmain"; LibraryName = IntPtr.Size == 8 ? libraryNames.Linux64bit : libraryNames.Linux32bit; } else if (Platform.IsOSX()) { platformMain = "osxmain"; LibraryName = IntPtr.Size == 8 ? libraryNames.OSX64bit : libraryNames.OSX32bit; } else { platformMain = "winmain"; LibraryName = IntPtr.Size == 8 ? libraryNames.Windows64bit : libraryNames.Windows32bit; } Torque6LibHandle = DllLoadUtils.LoadLibrary(LibraryName); if (Torque6LibHandle == IntPtr.Zero) { throw new Exception("Unable to load " + (IntPtr.Size == 8 ? "64" : "32") + " bit dll: " + LibraryName); } var mainHandle = DllLoadUtils.GetProcAddress(Torque6LibHandle, platformMain); var setCallbacksHandle = DllLoadUtils.GetProcAddress(Torque6LibHandle, "SetCallbacks"); var setCallbacks = (T6SetCallFunction)Marshal.GetDelegateForFunctionPointer( setCallbacksHandle, typeof(T6SetCallFunction)); var main = (T6Main)Marshal.GetDelegateForFunctionPointer( mainHandle, typeof(T6Main)); CallFunction callDelegate = CallFunctionDelegate; CallMethod methodDelegate = CallMethodDelegate; IsMethod isMethodDelegate = IsMethodDelegate; IntPtr mainEntryPointPtr = IntPtr.Zero; if (Initializer.GetScriptEntry() != null) { mainEntryPointPtr = Marshal.GetFunctionPointerForDelegate( (MainEntryPoint)Initializer.GetScriptEntry().CreateDelegate(typeof(MainEntryPoint))); } setCallbacks(Marshal.GetFunctionPointerForDelegate(callDelegate) , Marshal.GetFunctionPointerForDelegate(methodDelegate) , Marshal.GetFunctionPointerForDelegate(isMethodDelegate) , mainEntryPointPtr); main(args.Length, args, IntPtr.Zero); DllLoadUtils.FreeLibrary(Torque6LibHandle); }
public void Execute(CallFunction cmd) { _file.WriteLine($"{_indents}CallFunction\tFunction:{cmd.Function.Name};Parameters:{string.Join(", ", cmd.Parameters.Select(v => v.Name))};Result:{(cmd.Result != null ? cmd.Result.Name : "")}"); if (_processedFunctions.Contains(cmd.Function)) { return; } _processedFunctions.Add(cmd.Function); _pendingFunctions.Add(cmd.Function); }
/// <summary> /// Executes a CallFunction command /// </summary> /// <param name="cmd">command to be executed.</param> public void Execute(CallFunction cmd) { var commands = cmd.Function.CommandList; if (commands == null) { return; } // Remove and save previous assign value commands var stack = new Stack <AssignValue>(); while (commands.Commands[1] is AssignValue) { stack.Push((AssignValue)commands.Commands[1]); commands.Commands.RemoveAt(1); } // Add my assign value commands. for (var para = cmd.Parameters.Count - 1; para >= 0; para--) { var parameter = cmd.Function.Parameters[para]; var newCmd = new AssignValue { Recipient = parameter, Value = cmd.Parameters[para].Value }; commands.Commands.Insert(1, newCmd); } Execute(commands); // Remove my assign value commands for (var para = cmd.Parameters.Count - 1; para >= 0; para--) { commands.Commands.RemoveAt(1); } // Restore previous assign value commands. while (stack.Count != 0) { commands.Commands.Insert(1, stack.Pop()); } // Manages the return value. if (cmd.Function.Type != Type.Rutina) { var aux = cmd.Function.Returns.Value; if (!(cmd.Function.Returns is Constant)) { cmd.Function.Returns.Unroll(); } cmd.Result.Value = aux; } }
public async Task CallFunction_request_returnBadReqeustResult() { // Arrange var tokenServiceMock = new Mock <ITokenService>(); var callFunction = new CallFunction(new Mock <ITokenService>().Object, new Mock <IUsersService>().Object, new Mock <ICallService>().Object, new Mock <IMeetingService>().Object); // Act var result = await callFunction.Calls(this.UnexpecterdHttpRequest().Object, new Mock <ILogger>().Object); // Assert Assert.IsType <BadRequestResult>(result); }
private void RegisterFunction(string name, CallFunction func) { if (func == null) { return; } if (mHandlers.ContainsKey(name)) { return; } mHandlers.Add(name, func); }
public bool DoHandler(ObjectBase obj, string name, ArrayList param) { if (!mHandlers.ContainsKey(name)) { GameDebug.Log("gm命令 (" + name + ")未找到"); return(false); } CallFunction func = mHandlers[name] as CallFunction; func(obj, param); return(true); }
public bool DoHandler(ObjectBase obj, respond_msg_gm respond) { if (!mHandlers.ContainsKey(respond.name)) { GameDebug.Log("gm命令 (" + respond.name + ")未找到"); return(false); } CallFunction func = mHandlers[respond.name] as CallFunction; return(func(obj, respond)); }
public async Task CallFunction_request_mayThrowException() { // Arrange var tokenServiceMock = new Mock <ITokenService>(); tokenServiceMock.Setup(t => t.FetchAccessTokenByTenantId(It.IsAny <string>())) .ThrowsAsync(new Exception()); var callFunction = new CallFunction(tokenServiceMock.Object, new Mock <IUsersService>().Object, new Mock <ICallService>().Object, new Mock <IMeetingService>().Object); // Act & Assert await Assert.ThrowsAsync <Exception>(async() => await callFunction.Calls(this.CreateHttpRequest().Object, new Mock <ILogger>().Object)); }
private IEnumerator CreateGameCoroutine() { var createGame = new CallFunction(_functions, "createGame"); yield return(createGame); var sb = new StringBuilder(); var resultDictionary = (Dictionary <object, object>)createGame.Result.Data; foreach (var keyValuePair in resultDictionary) { sb.Append(keyValuePair.Key).Append("::").Append(keyValuePair.Value).Append("; "); } Debug.Log($"Create Game Result: {sb}"); _createGameCoroutine = null; }
private void UpdateDisplay(string strCapture) { CallFunction del = delegate() { ux_txtReceivedData.Text += strCapture + Environment.NewLine; //+ ConvertToNumeric(strCapture); ux_txtReceivedData.SelectionStart = ux_txtReceivedData.Text.Length; ux_txtReceivedData.ScrollToCaret(); }; //gui controls need to have their methods called within thier own threads if (ux_txtReceivedData.InvokeRequired) { ux_txtReceivedData.Invoke(del); } else { del.Invoke(); } }
private IEnumerator JoinGame(string gameId) { var gameDictionary = new Dictionary <string, string> { ["text"] = gameId }; var joinGame = new CallFunction(_functions, "joinGame", gameDictionary); yield return(joinGame); var sb = new StringBuilder(); var resultDictionary = (Dictionary <object, object>)joinGame.Result.Data; foreach (var keyValuePair in resultDictionary) { sb.Append(keyValuePair.Key).Append("::").Append(keyValuePair.Value).Append("; "); } Debug.Log($"Create Game Result: {sb}"); _coroutine = null; }
public void TestCallFunction() { const string functionName = "myfunction1"; const string arg1 = "arg1"; const string arg2 = "arg2"; var expected = new CallFunction { Connected = true, DeviceId = "123", LastApp = functionName, ReturnValue = 1 }; var client = new ParticleIoNetClient("token", TestHelpers.GetHttpClient(expected)); var sut = client.GetDevice("device1"); var actual = sut.CallFunctionAsync(functionName, arg1, arg2).Result; Assert.AreEqual(expected, actual); }
public void CallFunctionEqualityTest() { var left = new CallFunction { DeviceId = "id", LastApp = "lastapp", Connected = true, ReturnValue = 123 }; var right = new CallFunction { DeviceId = "id", LastApp = "lastapp", Connected = true, ReturnValue = 123 }; //Assert.AreEqual(left.GetHashCode(), right.GetHashCode()); Assert.AreEqual(left, right); }
public async Task <IHttpActionResult> POSTAsync() { try { //取得 http Post RawData(should be JSON) postData = Request.Content.ReadAsStringAsync().Result; //剖析JSON ReceivedMessage = isRock.LineBot.Utility.Parsing(postData); //建立 Line BOT LintBot = new isRock.LineBot.Bot(ChannelAccessToken); //取得 User 的資訊 userInfo = LintBot.GetUserInfo(ReceivedMessage.events.FirstOrDefault().source.userId); switch (userInfo.displayName.Trim()) { case "熊寶寶": username = "******"; break; case "蔡福元": username = "******"; break; case "Maggie": username = "******"; break; default: break; } //取得 User 所 PO 的訊息 string userMsg = ReceivedMessage.events[0].message.text; //新朋友來了(或解除封鎖) if (ReceivedMessage.events.FirstOrDefault().type == "follow" || ReceivedMessage.events.FirstOrDefault().type == "join") { NewJoin(); } //專門處理關鍵字 - "/ShowMyID" if (userMsg.ToUpper().Contains("/SHOWMYID")) { ShowMyID(); } //專門處理關鍵字 - "PM2.5" if (userMsg.ToUpper().Contains("PM2.5") || userMsg.Contains("空氣品質") || userMsg.Contains("空污")) { string getmsg = await CallFunction.GetAirQulity(userMsg.ToUpper()); isRock.LineBot.Utility.ReplyMessage(ReceivedMessage.events[0].replyToken, getmsg, ChannelAccessToken); //LintBot.ReplyMessage(ReceivedMessage.events[0].replyToken, pm25); } //專門處理關鍵字 - "股價 / 股票" if (userMsg.ToUpper().Contains("股價") || userMsg.Contains("股票")) { GetStock(userMsg.ToUpper()); } //專門處理關鍵字 - "股價 / 股票" if (userMsg.ToUpper().Contains("匯率")) { string getmsg = CallFunction.GetExchange(userMsg.ToUpper()); isRock.LineBot.Utility.ReplyMessage(ReceivedMessage.events[0].replyToken, getmsg, ChannelAccessToken); } ////專門處理 Q & A :前置字元為"熊熊:" //if (userMsg.Contains("熊熊:") || userMsg.Contains("熊熊,")) //{ // QNAMaker(userMsg); //} // 先處理以上含有特殊關鍵字,若未含特殊關鍵字就丟 Q&A (不用再判斷是否有"熊熊,"開頭) QNAMaker(userMsg); //若 Q&A 沒有處理到,就專門處理關鍵字 - "里長嬤" or "里長伯" if (userMsg.Contains("里長嬤")) { District("里長嬤"); } if (userMsg.Contains("里長伯")) { District("里長伯"); } //回覆API OK return(Ok()); } catch (Exception ex) { return(InternalServerError(new Exception("Error : " + ex.Message.ToString()))); } }
private Statement ParseStatement() { Statement parsedStatement; if (currentToken == listTokens.Count) { ExceptionHandler("statement was expected before end of file"); } if (listTokens[currentToken].Equals("print")) { currentToken++; Write _Write = new Write(); _Write.Expression = ParseExpression(); parsedStatement = _Write; } else if (listTokens[currentToken].Equals("var")) { currentToken++; DeclareVariable _DeclareVariable = new DeclareVariable(); if (currentToken < listTokens.Count && listTokens[currentToken] is string) { _DeclareVariable.Identifier = (string)listTokens[currentToken]; } else { ExceptionHandler("variable name was expected after 'var'"); } currentToken++; if (currentToken == listTokens.Count || listTokens[currentToken].ToString() != Lexer.Tokens.EqualTo.ToString()) { ExceptionHandler("= sign was expected after 'var identifier'"); } currentToken++; _DeclareVariable.Expression = ParseExpression(); parsedStatement = _DeclareVariable; } else if (listTokens[currentToken].Equals("call")) { currentToken++; CallFunction _CallFunction = new CallFunction(); if (currentToken < listTokens.Count && listTokens[currentToken] is string) { _CallFunction.FunctionName = (string)listTokens[currentToken]; } else { ExceptionHandler("function name is expected after 'call'"); } currentToken++; _CallFunction.Parameter1 = ParseExpression(); //index++; if (currentToken == listTokens.Count || listTokens[currentToken].ToString() != Lexer.Tokens.Comma.ToString()) { ExceptionHandler("',' sign was expected after first parameter"); } currentToken++; _CallFunction.Parameter2 = ParseExpression(); //index++; if (currentToken == listTokens.Count || listTokens[currentToken].ToString() != Lexer.Tokens.Comma.ToString()) { ExceptionHandler("',' sign was expected after second parameter"); } currentToken++; _CallFunction.Parameter3 = ParseExpression(); //index++; if (currentToken == listTokens.Count || listTokens[currentToken].ToString() != Lexer.Tokens.Terminator.ToString()) { ExceptionHandler("';' sign was expected after third parameter"); } parsedStatement = _CallFunction; } else if (listTokens[currentToken].Equals("string") || listTokens[currentToken].Equals("numeric") || listTokens[currentToken].Equals("void")) { DeclareFunction _DeclareFunction = new DeclareFunction(); _DeclareFunction.ReturnType = listTokens[currentToken].ToString(); currentToken++; if (currentToken < listTokens.Count && listTokens[currentToken] is string) { _DeclareFunction.FunctionName = (string)listTokens[currentToken]; } else { ExceptionHandler("function name is expected after return type"); } currentToken++; if (listTokens[currentToken].Equals("var")) { currentToken++; DeclareVariable _DeclareVariable = new DeclareVariable(); if (currentToken < listTokens.Count && listTokens[currentToken] is string) { _DeclareVariable.Identifier = (string)listTokens[currentToken]; } else { ExceptionHandler("variable name was expected after 'var'"); } currentToken++; if (currentToken == listTokens.Count || listTokens[currentToken].ToString() != Lexer.Tokens.EqualTo.ToString()) { ExceptionHandler("= sign was expected after 'var identifier'"); } currentToken++; _DeclareVariable.Expression = ParseExpression(); _DeclareFunction.Parameter1 = _DeclareVariable; } currentToken++; if (listTokens[currentToken].Equals("var")) { currentToken++; DeclareVariable _DeclareVariable = new DeclareVariable(); if (currentToken < listTokens.Count && listTokens[currentToken] is string) { _DeclareVariable.Identifier = (string)listTokens[currentToken]; } else { ExceptionHandler("variable name was expected after 'var'"); } currentToken++; if (currentToken == listTokens.Count || listTokens[currentToken].ToString() != Lexer.Tokens.EqualTo.ToString()) { ExceptionHandler("= sign was expected after 'var identifier'"); } currentToken++; _DeclareVariable.Expression = ParseExpression(); _DeclareFunction.Parameter2 = _DeclareVariable; } currentToken++; if (listTokens[currentToken].Equals("var")) { currentToken++; DeclareVariable _DeclareVariable = new DeclareVariable(); if (currentToken < listTokens.Count && listTokens[currentToken] is string) { _DeclareVariable.Identifier = (string)listTokens[currentToken]; } else { ExceptionHandler("variable name was expected after 'var'"); } currentToken++; if (currentToken == listTokens.Count || listTokens[currentToken].ToString() != Lexer.Tokens.EqualTo.ToString()) { ExceptionHandler("= sign was expected after 'var identifier'"); } currentToken++; _DeclareVariable.Expression = ParseExpression(); _DeclareFunction.Parameter3 = _DeclareVariable; } if (currentToken == listTokens.Count || !listTokens[currentToken].Equals("begin")) { ExceptionHandler("expected 'begin' after input parameters"); } currentToken++; _DeclareFunction.Body = ParseStatement(); parsedStatement = _DeclareFunction; if (currentToken == listTokens.Count || !listTokens[currentToken].Equals("endfunc")) { ExceptionHandler("unterminated function', 'endfunc' expected at the end"); } currentToken++; } else if (listTokens[currentToken].Equals("read")) { currentToken++; ReadInput _ReadInput = new ReadInput(); if (currentToken < listTokens.Count && listTokens[currentToken] is string) { _ReadInput.Identifier = (string)listTokens[currentToken++]; parsedStatement = _ReadInput; } else { ExceptionHandler("variable name is expected after 'read'"); parsedStatement = null; } } // IfThenElse ifThenElse = new IfThenElse(); // RelationalExpression relExpr = new RelationalExpression(); // relExpr.Left = ParseExpression(); // if (listTokens[index] == Scanner.EqualTo) // relExpr.Operand = RelationalOperands.EqualTo; // else if (listTokens[index] == Scanner.LessThan) // relExpr.Operand = RelationalOperands.LessThan; // else if (listTokens[index] == Scanner.GreaterThan) // relExpr.Operand = RelationalOperands.GreaterThan; // else // { // ExceptionHandler("expected relational operand"); // } // index++; // relExpr.Right = ParseExpression(); // ifThenElse.If = relExpr; // index++; // ifThenElse.Then = ParseStatement(); // parsedStatement = ifThenElse; // //index++; else if (listTokens[this.currentToken].Equals("while")) { currentToken++; While _while = new While(); _while.LeftExpression = ParseExpression(); if (listTokens[currentToken].ToString() == Lexer.Tokens.EqualTo.ToString()) { _while.Operand = RelationalOperands.EqualTo; } else if (listTokens[currentToken].ToString() == Lexer.Tokens.LessThan.ToString()) { _while.Operand = RelationalOperands.LessThan; } else if (listTokens[currentToken].ToString() == Lexer.Tokens.GreaterThan.ToString()) { _while.Operand = RelationalOperands.GreaterThan; } currentToken++; _while.RightExpression = ParseExpression(); if (currentToken == listTokens.Count || !listTokens[currentToken].Equals("do")) { ExceptionHandler("expected 'do' after while"); } currentToken++; _while.Body = ParseStatement(); parsedStatement = _while; if (currentToken == listTokens.Count || !listTokens[currentToken].Equals("endwhile")) { ExceptionHandler("unterminated 'while', endwhile expected at the end"); } currentToken++; } else if (listTokens[this.currentToken].Equals("if")) { currentToken++; IfThen _IfThen = new IfThen(); _IfThen.LeftExpression = ParseExpression(); if (listTokens[currentToken].ToString() == Lexer.Tokens.EqualTo.ToString()) { _IfThen.Operand = RelationalOperands.EqualTo; } else if (listTokens[currentToken].ToString() == Lexer.Tokens.LessThan.ToString()) { _IfThen.Operand = RelationalOperands.LessThan; } else if (listTokens[currentToken].ToString() == Lexer.Tokens.GreaterThan.ToString()) { _IfThen.Operand = RelationalOperands.GreaterThan; } currentToken++; _IfThen.RightExpression = ParseExpression(); if (currentToken == listTokens.Count || !listTokens[currentToken].Equals("then")) { ExceptionHandler("expected 'then' after if"); } currentToken++; _IfThen.ThenBody = ParseStatement(); if (currentToken == listTokens.Count || !listTokens[currentToken].Equals("else")) { ExceptionHandler("'else' is expected"); } currentToken++; _IfThen.ElseBody = ParseStatement(); parsedStatement = _IfThen; if (currentToken == listTokens.Count || !listTokens[currentToken].Equals("endif")) { ExceptionHandler("unterminated 'if', endif expected at the end"); } currentToken++; } else if (listTokens[currentToken].Equals("for")) { currentToken++; For _For = new For(); if (currentToken < listTokens.Count && listTokens[currentToken] is string) { _For.Identifier = (string)listTokens[currentToken]; } else { ExceptionHandler("expected identifier after 'for'"); } currentToken++; if (currentToken == listTokens.Count || listTokens[currentToken].ToString() != Lexer.Tokens.EqualTo.ToString()) { ExceptionHandler("for missing '='"); } currentToken++; _For.From = ParseExpression(); if (currentToken == listTokens.Count || !listTokens[currentToken].Equals("to")) { ExceptionHandler("expected 'to' after for"); } currentToken++; _For.To = ParseExpression(); if (currentToken == listTokens.Count || !listTokens[currentToken].Equals("do")) { ExceptionHandler("expected 'do' after from expression in for loop"); } currentToken++; _For.Body = ParseStatement(); parsedStatement = _For; if (currentToken == listTokens.Count || !listTokens[currentToken].Equals("end")) { ExceptionHandler("unterminated 'for' loop body"); } currentToken++; } else if (listTokens[currentToken] is string) { // assignment Assignment _Assignment = new Assignment(); _Assignment.Identifier = (string)listTokens[currentToken++]; if (currentToken == listTokens.Count || listTokens[currentToken].ToString() != Lexer.Tokens.EqualTo.ToString()) { ExceptionHandler("expected '='"); } currentToken++; _Assignment.Expression = ParseExpression(); parsedStatement = _Assignment; } else { ExceptionHandler("parse error at token " + currentToken + ": " + listTokens[currentToken]); parsedStatement = null; } if (currentToken < listTokens.Count && listTokens[currentToken].ToString() == Lexer.Tokens.Terminator.ToString()) { currentToken++; if (currentToken < listTokens.Count && !listTokens[currentToken].Equals("end") && !listTokens[currentToken].Equals("else") && !listTokens[currentToken].Equals("endif") && !listTokens[currentToken].Equals("endwhile") && !listTokens[currentToken].Equals("endfunc")) { StatementSequence sequence = new StatementSequence(); sequence.Left = parsedStatement; sequence.Right = ParseStatement(); parsedStatement = sequence; } } return(parsedStatement); }
internal protected override void Stop() { CallFunction?.Invoke(); }
public static InstructionCollection Parse(Stream input, long instructionsPosition) { var instructions = new SortedList <int, InstructionBase>(); using (var helper = new InstructionParseHelper(input, instructionsPosition)) { var reader = helper.GetReader(); while (helper.CanParse(instructions)) { //now reader the instructions var instructionPosition = helper.CurrentPosition; var type = reader.ReadByteAsEnum <InstructionType>(); var requireAlignment = InstructionAlignment.IsAligned(type); if (requireAlignment) { reader.Align(4); } InstructionBase instruction = null; var parameters = new List <Value>(); switch (type) { case InstructionType.ToNumber: instruction = new ToNumber(); break; case InstructionType.NextFrame: instruction = new NextFrame(); break; case InstructionType.Play: instruction = new Play(); break; case InstructionType.Stop: instruction = new Stop(); break; case InstructionType.Add: instruction = new Add(); break; case InstructionType.Subtract: instruction = new Subtract(); break; case InstructionType.Multiply: instruction = new Multiply(); break; case InstructionType.Divide: instruction = new Divide(); break; case InstructionType.Not: instruction = new Not(); break; case InstructionType.StringEquals: instruction = new StringEquals(); break; case InstructionType.Pop: instruction = new Pop(); break; case InstructionType.ToInteger: instruction = new ToInteger(); break; case InstructionType.GetVariable: instruction = new GetVariable(); break; case InstructionType.SetVariable: instruction = new SetVariable(); break; case InstructionType.StringConcat: instruction = new StringConcat(); break; case InstructionType.GetProperty: instruction = new GetProperty(); break; case InstructionType.SetProperty: instruction = new SetProperty(); break; case InstructionType.Trace: instruction = new Trace(); break; case InstructionType.Random: instruction = new RandomNumber(); break; case InstructionType.Delete: instruction = new Delete(); break; case InstructionType.Delete2: instruction = new Delete2(); break; case InstructionType.DefineLocal: instruction = new DefineLocal(); break; case InstructionType.CallFunction: instruction = new CallFunction(); break; case InstructionType.Return: instruction = new Return(); break; case InstructionType.Modulo: instruction = new Modulo(); break; case InstructionType.NewObject: instruction = new NewObject(); break; case InstructionType.InitArray: instruction = new InitArray(); break; case InstructionType.InitObject: instruction = new InitObject(); break; case InstructionType.TypeOf: instruction = new TypeOf(); break; case InstructionType.Add2: instruction = new Add2(); break; case InstructionType.LessThan2: instruction = new LessThan2(); break; case InstructionType.Equals2: instruction = new Equals2(); break; case InstructionType.ToString: instruction = new ToString(); break; case InstructionType.PushDuplicate: instruction = new PushDuplicate(); break; case InstructionType.GetMember: instruction = new GetMember(); break; case InstructionType.SetMember: instruction = new SetMember(); break; case InstructionType.Increment: instruction = new Increment(); break; case InstructionType.Decrement: instruction = new Decrement(); break; case InstructionType.CallMethod: instruction = new CallMethod(); break; case InstructionType.Enumerate2: instruction = new Enumerate2(); break; case InstructionType.EA_PushThis: instruction = new PushThis(); break; case InstructionType.EA_PushZero: instruction = new PushZero(); break; case InstructionType.EA_PushOne: instruction = new PushOne(); break; case InstructionType.EA_CallFunc: instruction = new CallFunc(); break; case InstructionType.EA_CallMethodPop: instruction = new CallMethodPop(); break; case InstructionType.BitwiseXOr: instruction = new BitwiseXOr(); break; case InstructionType.Greater: instruction = new Greater(); break; case InstructionType.EA_PushThisVar: instruction = new PushThisVar(); break; case InstructionType.EA_PushGlobalVar: instruction = new PushGlobalVar(); break; case InstructionType.EA_ZeroVar: instruction = new ZeroVar(); break; case InstructionType.EA_PushTrue: instruction = new PushTrue(); break; case InstructionType.EA_PushFalse: instruction = new PushFalse(); break; case InstructionType.EA_PushNull: instruction = new PushNull(); break; case InstructionType.EA_PushUndefined: instruction = new PushUndefined(); break; case InstructionType.GotoFrame: instruction = new GotoFrame(); parameters.Add(Value.FromInteger(reader.ReadInt32())); break; case InstructionType.GetURL: instruction = new GetUrl(); parameters.Add(Value.FromString(reader.ReadStringAtOffset())); parameters.Add(Value.FromString(reader.ReadStringAtOffset())); break; case InstructionType.SetRegister: instruction = new SetRegister(); parameters.Add(Value.FromInteger(reader.ReadInt32())); break; case InstructionType.ConstantPool: { instruction = new ConstantPool(); var count = reader.ReadUInt32(); var constants = reader.ReadFixedSizeArrayAtOffset <uint>(() => reader.ReadUInt32(), count); foreach (var constant in constants) { parameters.Add(Value.FromConstant(constant)); } } break; case InstructionType.GotoLabel: instruction = new GotoLabel(); parameters.Add(Value.FromString(reader.ReadStringAtOffset())); break; case InstructionType.DefineFunction2: { instruction = new DefineFunction2(); var name = reader.ReadStringAtOffset(); var nParams = reader.ReadUInt32(); var nRegisters = reader.ReadByte(); var flags = reader.ReadUInt24(); //list of parameter strings var paramList = reader.ReadFixedSizeListAtOffset <FunctionArgument>(() => new FunctionArgument() { Register = reader.ReadInt32(), Parameter = reader.ReadStringAtOffset(), }, nParams); parameters.Add(Value.FromString(name)); parameters.Add(Value.FromInteger((int)nParams)); parameters.Add(Value.FromInteger((int)nRegisters)); parameters.Add(Value.FromInteger((int)flags)); foreach (var param in paramList) { parameters.Add(Value.FromInteger(param.Register)); parameters.Add(Value.FromString(param.Parameter)); } //body size of the function parameters.Add(Value.FromInteger(reader.ReadInt32())); //skip 8 bytes reader.ReadUInt64(); } break; case InstructionType.PushData: { instruction = new PushData(); var count = reader.ReadUInt32(); var constants = reader.ReadFixedSizeArrayAtOffset <uint>(() => reader.ReadUInt32(), count); foreach (var constant in constants) { parameters.Add(Value.FromConstant(constant)); } } break; case InstructionType.BranchAlways: { instruction = new BranchAlways(); var offset = reader.ReadInt32(); parameters.Add(Value.FromInteger(offset)); helper.ReportBranchOffset(offset); } break; case InstructionType.GetURL2: instruction = new GetUrl2(); break; case InstructionType.DefineFunction: { instruction = new DefineFunction(); var name = reader.ReadStringAtOffset(); //list of parameter strings var paramList = reader.ReadListAtOffset <string>(() => reader.ReadStringAtOffset()); parameters.Add(Value.FromString(name)); parameters.Add(Value.FromInteger(paramList.Count)); foreach (var param in paramList) { parameters.Add(Value.FromString(param)); } //body size of the function parameters.Add(Value.FromInteger(reader.ReadInt32())); //skip 8 bytes reader.ReadUInt64(); } break; case InstructionType.BranchIfTrue: { instruction = new BranchIfTrue(); var offset = reader.ReadInt32(); parameters.Add(Value.FromInteger(offset)); helper.ReportBranchOffset(offset); } break; case InstructionType.GotoFrame2: instruction = new GotoFrame2(); parameters.Add(Value.FromInteger(reader.ReadInt32())); break; case InstructionType.EA_PushString: instruction = new PushString(); //the constant id that should be pushed parameters.Add(Value.FromString(reader.ReadStringAtOffset())); break; case InstructionType.EA_PushConstantByte: instruction = new PushConstantByte(); //the constant id that should be pushed parameters.Add(Value.FromConstant(reader.ReadByte())); break; case InstructionType.EA_GetStringVar: instruction = new GetStringVar(); parameters.Add(Value.FromString(reader.ReadStringAtOffset())); break; case InstructionType.EA_SetStringVar: instruction = new SetStringVar(); parameters.Add(Value.FromString(reader.ReadStringAtOffset())); break; case InstructionType.EA_GetStringMember: instruction = new GetStringMember(); parameters.Add(Value.FromString(reader.ReadStringAtOffset())); break; case InstructionType.EA_SetStringMember: instruction = new SetStringMember(); parameters.Add(Value.FromString(reader.ReadStringAtOffset())); break; case InstructionType.EA_PushValueOfVar: instruction = new PushValueOfVar(); //the constant id that should be pushed parameters.Add(Value.FromConstant(reader.ReadByte())); break; case InstructionType.EA_GetNamedMember: instruction = new GetNamedMember(); parameters.Add(Value.FromConstant(reader.ReadByte())); break; case InstructionType.EA_CallNamedFuncPop: instruction = new CallNamedFuncPop(); parameters.Add(Value.FromConstant(reader.ReadByte())); break; case InstructionType.EA_CallNamedFunc: instruction = new CallNamedFunc(); parameters.Add(Value.FromConstant(reader.ReadByte())); break; case InstructionType.EA_CallNamedMethodPop: instruction = new CallNamedMethodPop(); parameters.Add(Value.FromConstant(reader.ReadByte())); break; case InstructionType.EA_PushFloat: instruction = new PushFloat(); parameters.Add(Value.FromFloat(reader.ReadSingle())); break; case InstructionType.EA_PushByte: instruction = new PushByte(); parameters.Add(Value.FromInteger(reader.ReadByte())); break; case InstructionType.EA_PushShort: instruction = new PushShort(); parameters.Add(Value.FromInteger(reader.ReadUInt16())); break; case InstructionType.End: instruction = new End(); break; case InstructionType.EA_CallNamedMethod: instruction = new CallNamedMethod(); parameters.Add(Value.FromConstant(reader.ReadByte())); break; case InstructionType.Var: instruction = new Var(); break; case InstructionType.EA_PushRegister: instruction = new PushRegister(); parameters.Add(Value.FromInteger(reader.ReadByte())); break; case InstructionType.EA_PushConstantWord: instruction = new PushConstantWord(); parameters.Add(Value.FromConstant(reader.ReadUInt16())); break; case InstructionType.EA_CallFuncPop: instruction = new CallFunctionPop(); break; case InstructionType.StrictEqual: instruction = new StrictEquals(); break; default: throw new InvalidDataException("Unimplemented bytecode instruction:" + type.ToString()); } if (instruction != null) { instruction.Parameters = parameters; instructions.Add(instructionPosition, instruction); } } } return(new InstructionCollection(instructions)); }
public void Parse() { var current = _reader.BaseStream.Position; _reader.BaseStream.Seek(_offset, SeekOrigin.Begin); bool parsing = true; bool branched = false; int branchBytes = 0; while (parsing) { //now reader the instructions var type = _reader.ReadByteAsEnum <InstructionType>(); var aligned = InstructionAlignment.IsAligned(type); if (aligned) { var padding = _reader.Align(4); if (padding > 0) { Items.Add(new Padding(padding)); if (branched) { branchBytes -= (int)padding; if (branchBytes <= 0) { branched = false; branchBytes = 0; } } } } InstructionBase instruction = null; List <Value> parameters = new List <Value>(); switch (type) { case InstructionType.ToNumber: instruction = new ToNumber(); break; case InstructionType.NextFrame: instruction = new NextFrame(); break; case InstructionType.Play: instruction = new Play(); break; case InstructionType.Stop: instruction = new Stop(); break; case InstructionType.Add: instruction = new Add(); break; case InstructionType.Subtract: instruction = new Subtract(); break; case InstructionType.Multiply: instruction = new Multiply(); break; case InstructionType.Divide: instruction = new Divide(); break; case InstructionType.Not: instruction = new Not(); break; case InstructionType.StringEquals: instruction = new StringEquals(); break; case InstructionType.Pop: instruction = new Pop(); break; case InstructionType.ToInteger: instruction = new ToInteger(); break; case InstructionType.GetVariable: instruction = new GetVariable(); break; case InstructionType.SetVariable: instruction = new SetVariable(); break; case InstructionType.StringConcat: instruction = new StringConcat(); break; case InstructionType.GetProperty: instruction = new GetProperty(); break; case InstructionType.SetProperty: instruction = new SetProperty(); break; case InstructionType.Trace: instruction = new Trace(); break; case InstructionType.Delete: instruction = new Delete(); break; case InstructionType.Delete2: instruction = new Delete2(); break; case InstructionType.DefineLocal: instruction = new DefineLocal(); break; case InstructionType.CallFunction: instruction = new CallFunction(); break; case InstructionType.Return: instruction = new Return(); break; case InstructionType.NewObject: instruction = new NewObject(); break; case InstructionType.InitArray: instruction = new InitArray(); break; case InstructionType.InitObject: instruction = new InitObject(); break; case InstructionType.TypeOf: instruction = new InitObject(); break; case InstructionType.Add2: instruction = new Add2(); break; case InstructionType.LessThan2: instruction = new LessThan2(); break; case InstructionType.Equals2: instruction = new Equals2(); break; case InstructionType.ToString: instruction = new ToString(); break; case InstructionType.PushDuplicate: instruction = new PushDuplicate(); break; case InstructionType.GetMember: instruction = new GetMember(); break; case InstructionType.SetMember: instruction = new SetMember(); break; case InstructionType.Increment: instruction = new Increment(); break; case InstructionType.Decrement: instruction = new Decrement(); break; case InstructionType.CallMethod: instruction = new CallMethod(); break; case InstructionType.Enumerate2: instruction = new Enumerate2(); break; case InstructionType.EA_PushThis: instruction = new PushThis(); break; case InstructionType.EA_PushZero: instruction = new PushZero(); break; case InstructionType.EA_PushOne: instruction = new PushOne(); break; case InstructionType.EA_CallFunc: instruction = new CallFunc(); break; case InstructionType.EA_CallMethodPop: instruction = new CallMethodPop(); break; case InstructionType.BitwiseXOr: instruction = new BitwiseXOr(); break; case InstructionType.Greater: instruction = new Greater(); break; case InstructionType.EA_PushThisVar: instruction = new PushThisVar(); break; case InstructionType.EA_PushGlobalVar: instruction = new PushGlobalVar(); break; case InstructionType.EA_ZeroVar: instruction = new ZeroVar(); break; case InstructionType.EA_PushTrue: instruction = new PushTrue(); break; case InstructionType.EA_PushFalse: instruction = new PushFalse(); break; case InstructionType.EA_PushNull: instruction = new PushNull(); break; case InstructionType.EA_PushUndefined: instruction = new PushUndefined(); break; case InstructionType.GotoFrame: instruction = new GotoFrame(); parameters.Add(Value.FromInteger(_reader.ReadInt32())); break; case InstructionType.GetURL: instruction = new GetUrl(); parameters.Add(Value.FromString(_reader.ReadStringAtOffset())); parameters.Add(Value.FromString(_reader.ReadStringAtOffset())); break; case InstructionType.SetRegister: instruction = new SetRegister(); parameters.Add(Value.FromInteger(_reader.ReadInt32())); break; case InstructionType.ConstantPool: { instruction = new ConstantPool(); var count = _reader.ReadUInt32(); var constants = _reader.ReadFixedSizeArrayAtOffset <uint>(() => _reader.ReadUInt32(), count); foreach (var constant in constants) { parameters.Add(Value.FromConstant(constant)); } } break; case InstructionType.GotoLabel: instruction = new GotoLabel(); parameters.Add(Value.FromString(_reader.ReadStringAtOffset())); break; case InstructionType.DefineFunction2: { instruction = new DefineFunction2(); var name = _reader.ReadStringAtOffset(); var nParams = _reader.ReadUInt32(); var nRegisters = _reader.ReadByte(); var flags = _reader.ReadUInt24(); //list of parameter strings var paramList = _reader.ReadFixedSizeListAtOffset <FunctionArgument>(() => new FunctionArgument() { Register = _reader.ReadInt32(), Parameter = _reader.ReadStringAtOffset(), }, nParams); parameters.Add(Value.FromString(name)); parameters.Add(Value.FromInteger((int)nParams)); parameters.Add(Value.FromInteger((int)nRegisters)); parameters.Add(Value.FromInteger((int)flags)); foreach (var param in paramList) { parameters.Add(Value.FromInteger(param.Register)); parameters.Add(Value.FromString(param.Parameter)); } //body size of the function parameters.Add(Value.FromInteger(_reader.ReadInt32())); //skip 8 bytes _reader.ReadUInt64(); } break; case InstructionType.PushData: { instruction = new PushData(); var count = _reader.ReadUInt32(); var constants = _reader.ReadFixedSizeArrayAtOffset <uint>(() => _reader.ReadUInt32(), count); foreach (var constant in constants) { parameters.Add(Value.FromConstant(constant)); } } break; case InstructionType.BranchAlways: instruction = new BranchAlways(); if (!branched) { branchBytes = _reader.ReadInt32(); parameters.Add(Value.FromInteger(branchBytes)); if (branchBytes > 0) { branchBytes += (int)instruction.Size + 1; branched = true; } } else { parameters.Add(Value.FromInteger(_reader.ReadInt32())); } break; case InstructionType.GetURL2: instruction = new GetUrl2(); break; case InstructionType.DefineFunction: { instruction = new DefineFunction(); var name = _reader.ReadStringAtOffset(); //list of parameter strings var paramList = _reader.ReadListAtOffset <string>(() => _reader.ReadStringAtOffset()); parameters.Add(Value.FromString(name)); parameters.Add(Value.FromInteger(paramList.Count)); foreach (var param in paramList) { parameters.Add(Value.FromString(param)); } //body size of the function parameters.Add(Value.FromInteger(_reader.ReadInt32())); //skip 8 bytes _reader.ReadUInt64(); } break; case InstructionType.BranchIfTrue: instruction = new BranchIfTrue(); if (!branched) { branchBytes = _reader.ReadInt32(); parameters.Add(Value.FromInteger(branchBytes)); if (branchBytes > 0) { branchBytes += (int)instruction.Size + 1; branched = true; } } else { parameters.Add(Value.FromInteger(_reader.ReadInt32())); } break; case InstructionType.GotoFrame2: instruction = new GotoFrame2(); parameters.Add(Value.FromInteger(_reader.ReadByte())); break; case InstructionType.EA_PushString: instruction = new PushString(); //the constant id that should be pushed parameters.Add(Value.FromString(_reader.ReadStringAtOffset())); break; case InstructionType.EA_PushConstantByte: instruction = new PushConstantByte(); //the constant id that should be pushed parameters.Add(Value.FromConstant(_reader.ReadByte())); break; case InstructionType.EA_GetStringVar: instruction = new GetStringVar(); parameters.Add(Value.FromString(_reader.ReadStringAtOffset())); break; case InstructionType.EA_SetStringVar: instruction = new SetStringMember(); parameters.Add(Value.FromString(_reader.ReadStringAtOffset())); break; case InstructionType.EA_GetStringMember: instruction = new GetStringMember(); parameters.Add(Value.FromString(_reader.ReadStringAtOffset())); break; case InstructionType.EA_SetStringMember: instruction = new SetStringMember(); parameters.Add(Value.FromString(_reader.ReadStringAtOffset())); break; case InstructionType.EA_PushValueOfVar: instruction = new PushValueOfVar(); //the constant id that should be pushed parameters.Add(Value.FromConstant(_reader.ReadByte())); break; case InstructionType.EA_GetNamedMember: instruction = new GetNamedMember(); parameters.Add(Value.FromConstant(_reader.ReadByte())); break; case InstructionType.EA_CallNamedFuncPop: instruction = new CallNamedFuncPop(); parameters.Add(Value.FromConstant(_reader.ReadByte())); break; case InstructionType.EA_CallNamedFunc: instruction = new CallNamedFunc(); parameters.Add(Value.FromConstant(_reader.ReadByte())); break; case InstructionType.EA_CallNamedMethodPop: instruction = new CallNamedMethodPop(); parameters.Add(Value.FromConstant(_reader.ReadByte())); break; case InstructionType.EA_PushFloat: instruction = new PushFloat(); parameters.Add(Value.FromFloat(_reader.ReadSingle())); break; case InstructionType.EA_PushByte: instruction = new PushByte(); parameters.Add(Value.FromInteger(_reader.ReadByte())); break; case InstructionType.EA_PushShort: instruction = new PushShort(); parameters.Add(Value.FromInteger(_reader.ReadUInt16())); break; case InstructionType.End: instruction = new End(); if (!branched) { parsing = false; } break; case InstructionType.EA_CallNamedMethod: instruction = new CallNamedMethod(); parameters.Add(Value.FromConstant(_reader.ReadByte())); break; case InstructionType.Var: instruction = new Var(); break; default: throw new InvalidDataException("Unimplemented bytecode instruction:" + type.ToString()); } if (instruction != null) { instruction.Parameters = parameters; Items.Add(instruction); } if (branched) { branchBytes -= (int)instruction.Size + 1; if (branchBytes <= 0) { branched = false; } } } _reader.BaseStream.Seek(current, SeekOrigin.Begin); }
public virtual void Execute() { CallFunction?.Invoke(); }
public static void Initialize(string[] args, Libraries libraryNames) { DllLoadUtils = Platform.IsLinux() ? (IDllLoadUtils) new DllLoadUtilsLinux() : new DllLoadUtilsWindows(); string platformMain; if (Platform.IsLinux()) { //platformMain = "torque_unixmain"; platformMain = "TorqueMain"; LibraryName = IntPtr.Size == 8 ? libraryNames.Linux64bit : libraryNames.Linux32bit; } else if (Platform.IsOSX()) { //platformMain = "torque_macmain"; platformMain = "TorqueMain"; LibraryName = IntPtr.Size == 8 ? libraryNames.OSX64bit : libraryNames.OSX32bit; } else { //platformMain = "torque_winmain"; platformMain = "TorqueMain"; LibraryName = IntPtr.Size == 8 ? libraryNames.Windows64bit : libraryNames.Windows32bit; } Torque3DLibHandle = DllLoadUtils.LoadLibrary(LibraryName); if (Torque3DLibHandle == IntPtr.Zero) { throw new Exception("Unable to load " + (IntPtr.Size == 8 ? "64" : "32") + " bit dll: " + LibraryName + ", in directory: " + Directory.GetCurrentDirectory()); } var mainHandle = DllLoadUtils.GetProcAddress(Torque3DLibHandle, platformMain); var setCallbacksHandle = DllLoadUtils.GetProcAddress(Torque3DLibHandle, "SetCallbacks"); var engineInitHandle = DllLoadUtils.GetProcAddress(Torque3DLibHandle, "torque_engineinit"); var engineTickHandle = DllLoadUtils.GetProcAddress(Torque3DLibHandle, "torque_enginetick"); var getReturnStatusHandle = DllLoadUtils.GetProcAddress(Torque3DLibHandle, "torque_getreturnstatus"); var engineShutdownHandle = DllLoadUtils.GetProcAddress(Torque3DLibHandle, "torque_engineshutdown"); var setCallbacks = (SetCallbacks)Marshal.GetDelegateForFunctionPointer( setCallbacksHandle, typeof(SetCallbacks)); //var main = (TorqueMain)Marshal.GetDelegateForFunctionPointer( // mainHandle, typeof(TorqueMain)); var engineInit = (torque_engineinit)Marshal.GetDelegateForFunctionPointer( engineInitHandle, typeof(torque_engineinit)); var engineTick = (torque_enginetick)Marshal.GetDelegateForFunctionPointer( engineTickHandle, typeof(torque_enginetick)); //var engineGetReturnStatus = (torque_getreturnstatus)Marshal.GetDelegateForFunctionPointer( // getReturnStatusHandle, typeof(torque_getreturnstatus)); var engineShutdown = (torque_engineshutdown)Marshal.GetDelegateForFunctionPointer( engineShutdownHandle, typeof(torque_engineshutdown)); CallFunction callDelegate = CallFunctionDelegate; CallMethod methodDelegate = CallMethodDelegate; IsMethod isMethodDelegate = IsMethodDelegate; IntPtr mainEntryPointPtr = IntPtr.Zero; if (Initializer.GetScriptEntry() != null) { mainEntryPointPtr = Marshal.GetFunctionPointerForDelegate( (MainEntryPoint)Initializer.GetScriptEntry().CreateDelegate(typeof(MainEntryPoint))); } setCallbacks(Marshal.GetFunctionPointerForDelegate(callDelegate) , Marshal.GetFunctionPointerForDelegate(methodDelegate) , Marshal.GetFunctionPointerForDelegate(isMethodDelegate) , mainEntryPointPtr); if (!engineInit(args.Length, args)) { return; } while (engineTick() > 0) { } engineShutdown(); SimDictionary.Shutdown(); DllLoadUtils.FreeLibrary(Torque3DLibHandle); }