FunctionCallExpression.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using MoonSharp.Interpreter.Debugging;
  6. using MoonSharp.Interpreter.Execution;
  7. namespace MoonSharp.Interpreter.Tree.Expressions
  8. {
  9. class FunctionCallExpression : Expression
  10. {
  11. List<Expression> m_Arguments;
  12. Expression m_Function;
  13. string m_Name;
  14. string m_DebugErr;
  15. internal SourceRef SourceRef { get; private set; }
  16. public FunctionCallExpression(ScriptLoadingContext lcontext, Expression function, Token thisCallName)
  17. : base(lcontext)
  18. {
  19. Token callToken = thisCallName ?? lcontext.Lexer.Current;
  20. m_Name = thisCallName != null ? thisCallName.Text : null;
  21. m_DebugErr = function.GetFriendlyDebugName();
  22. m_Function = function;
  23. switch (lcontext.Lexer.Current.Type)
  24. {
  25. case TokenType.Brk_Open_Round:
  26. Token openBrk = lcontext.Lexer.Current;
  27. lcontext.Lexer.Next();
  28. Token t = lcontext.Lexer.Current;
  29. if (t.Type == TokenType.Brk_Close_Round)
  30. {
  31. m_Arguments = new List<Expression>();
  32. SourceRef = callToken.GetSourceRef(t);
  33. lcontext.Lexer.Next();
  34. }
  35. else
  36. {
  37. m_Arguments = ExprList(lcontext);
  38. SourceRef = callToken.GetSourceRef(CheckMatch(lcontext, openBrk, TokenType.Brk_Close_Round, ")"));
  39. }
  40. break;
  41. case TokenType.String:
  42. case TokenType.String_Long:
  43. {
  44. m_Arguments = new List<Expression>();
  45. Expression le = new LiteralExpression(lcontext, lcontext.Lexer.Current);
  46. m_Arguments.Add(le);
  47. SourceRef = callToken.GetSourceRef(lcontext.Lexer.Current);
  48. }
  49. break;
  50. case TokenType.Brk_Open_Curly:
  51. {
  52. m_Arguments = new List<Expression>();
  53. m_Arguments.Add(new TableConstructor(lcontext));
  54. SourceRef = callToken.GetSourceRefUpTo(lcontext.Lexer.Current);
  55. }
  56. break;
  57. default:
  58. throw new SyntaxErrorException(lcontext.Lexer.Current, "function arguments expected");
  59. }
  60. }
  61. public override void Compile(Execution.VM.ByteCode bc)
  62. {
  63. m_Function.Compile(bc);
  64. int argslen = m_Arguments.Count;
  65. if (!string.IsNullOrEmpty(m_Name))
  66. {
  67. bc.Emit_Copy(0);
  68. bc.Emit_Index(DynValue.NewString(m_Name));
  69. bc.Emit_Swap(0, 1);
  70. ++argslen;
  71. }
  72. for (int i = 0; i < m_Arguments.Count; i++)
  73. m_Arguments[i].Compile(bc);
  74. if (!string.IsNullOrEmpty(m_Name))
  75. {
  76. bc.Emit_ThisCall(argslen, m_DebugErr);
  77. }
  78. else
  79. {
  80. bc.Emit_Call(argslen, m_DebugErr);
  81. }
  82. }
  83. public override DynValue Eval(ScriptExecutionContext context)
  84. {
  85. throw new DynamicExpressionException("Dynamic Expressions cannot call functions.");
  86. }
  87. }
  88. }