FunctionCallExpression.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. lcontext.Lexer.Next();
  24. m_Arguments = ExprList(lcontext);
  25. CheckMatch(lcontext, "(", TokenType.Brk_Close_Round);
  26. break;
  27. case TokenType.String:
  28. case TokenType.String_Long:
  29. {
  30. m_Arguments = new List<Expression>();
  31. Expression le = new LiteralExpression(lcontext, lcontext.Lexer.Current());
  32. lcontext.Lexer.Next();
  33. m_Arguments.Add(le);
  34. }
  35. break;
  36. case TokenType.Brk_Open_Curly:
  37. {
  38. m_Arguments = new List<Expression>();
  39. Expression le = new TableConstructor(lcontext);
  40. CheckMatch(lcontext, "{", TokenType.Brk_Close_Curly);
  41. m_Arguments.Add(le);
  42. }
  43. break;
  44. default:
  45. throw new SyntaxErrorException("function arguments expected");
  46. }
  47. }
  48. public override void Compile(Execution.VM.ByteCode bc)
  49. {
  50. m_Function.Compile(bc);
  51. int argslen = m_Arguments.Count;
  52. if (!string.IsNullOrEmpty(m_Name))
  53. {
  54. bc.Emit_Copy(0);
  55. bc.Emit_Literal(DynValue.NewString(m_Name));
  56. bc.Emit_Index();
  57. bc.Emit_Swap(0, 1);
  58. ++argslen;
  59. }
  60. for (int i = 0; i < m_Arguments.Count; i++)
  61. m_Arguments[i].Compile(bc);
  62. if (!string.IsNullOrEmpty(m_Name))
  63. {
  64. bc.Emit_ThisCall(argslen, m_DebugErr);
  65. }
  66. else
  67. {
  68. bc.Emit_Call(argslen, m_DebugErr);
  69. }
  70. }
  71. public override DynValue Eval(ScriptExecutionContext context)
  72. {
  73. throw new DynamicExpressionException("Dynamic Expressions cannot call functions.");
  74. }
  75. }
  76. }