JintLabeledStatement.cs 1.2 KB

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