text: // Copyright (C) 2013 the V8 project authors. All rights reserved.
  // This code is governed by the BSD license found in the LICENSE file.
  /*---
  esid: sec-generatorvalidate
  description: >
      A TypeError should be thrown if the generator is resumed while in the
      "executing" state and the generator should be marked as "completed"
  info: |
    25.3.3.1 GeneratorStart
  
    [...]
    4. Set the code evaluation state of genContext such that when evaluation is
       resumed for that execution context the following steps will be performed:
       a. Let result be the result of evaluating generatorBody.
       b. Assert: If we return here, the generator either threw an exception or
          performed either an implicit or explicit return.
       c. Remove genContext from the execution context stack and restore the
          execution context that is at the top of the execution context stack as
          the running execution context.
       d. Set generator.[[GeneratorState]] to "completed".
       [...]
  
    25.3.3.3 GeneratorResume
  
    1. Let state be ? GeneratorValidate(generator).
  
    25.3.3.2 GeneratorValidate
  
    1. If Type(generator) is not Object, throw a TypeError exception.
    2. If generator does not have a [[GeneratorState]] internal slot, throw a
       TypeError exception.
    3. Assert: generator also has a [[GeneratorContext]] internal slot.
    4. Let state be generator.[[GeneratorState]].
    5. If state is "executing", throw a TypeError exception.
  features: [generators]
  ---*/
  
  var iter, result;
  
  function* withoutVal() {
    iter.next();
  }
  
  function* withVal() {
    iter.next(42);
  }
  
  iter = withoutVal();
  assert.throws(TypeError, function() {
    iter.next();
  }, 'Error when invoked without value');
  
  result = iter.next();
  
  assert.sameValue(
    typeof result, 'object', 'type following invocation without value'
  );
  assert.sameValue(
    result.value, undefined, '`value` following invocation without value'
  );
  assert.sameValue(
    result.done, true, '`done` following invocation without value'
  );
  
  iter = withVal();
  assert.throws(TypeError, function() {
    iter.next();
  }, 'Error when invoked with value');
  
  result = iter.next();
  
  assert.sameValue(
    typeof result, 'object', 'type following invocation with value'
  );
  assert.sameValue(
    result.value, undefined, '`value` following invocation with value'
  );
  assert.sameValue(
    result.done, true, '`done` following invocation with value'
  );
  