JintLabeledStatement.cs 1.2 KB

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