JintLabeledStatement.cs 1.1 KB

12345678910111213141516171819202122232425262728293031
  1. using Esprima.Ast;
  2. namespace Jint.Runtime.Interpreter.Statements
  3. {
  4. internal sealed class JintLabeledStatement : JintStatement<LabeledStatement>
  5. {
  6. private readonly JintStatement _body;
  7. private readonly string _labelName;
  8. public JintLabeledStatement(Engine engine, LabeledStatement statement) : base(engine, statement)
  9. {
  10. _body = Build(engine, statement.Body);
  11. _labelName = statement.Label.Name;
  12. }
  13. protected override Completion ExecuteInternal()
  14. {
  15. // TODO: Esprima added Statement.Label, maybe not necessary as this line is finding the
  16. // containing label and could keep a table per program with all the labels
  17. // labeledStatement.Body.LabelSet = labeledStatement.Label;
  18. var result = _body.Execute();
  19. if (result.Type == CompletionType.Break && result.Identifier == _labelName)
  20. {
  21. var value = result.Value;
  22. return new Completion(CompletionType.Normal, value, null, Location);
  23. }
  24. return result;
  25. }
  26. }
  27. }