FunctionCallExpression.cs 2.2 KB

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