blob: 72e64dce6e852cf032b13c06a1ee091a2b6e8be0 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2013 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5"use strict";
6
7// This file relies on the fact that the following declarations have been made
8// in runtime.js:
9// var $Function = global.Function;
10
11// ----------------------------------------------------------------------------
12
13
14// Generator functions and objects are specified by ES6, sections 15.19.3 and
15// 15.19.4.
16
17function GeneratorObjectNext(value) {
18 if (!IS_GENERATOR(this)) {
19 throw MakeTypeError('incompatible_method_receiver',
20 ['[Generator].prototype.next', this]);
21 }
22
23 if (DEBUG_IS_ACTIVE) %DebugPrepareStepInIfStepping(this);
24 return %_GeneratorNext(this, value);
25}
26
27function GeneratorObjectThrow(exn) {
28 if (!IS_GENERATOR(this)) {
29 throw MakeTypeError('incompatible_method_receiver',
30 ['[Generator].prototype.throw', this]);
31 }
32
33 return %_GeneratorThrow(this, exn);
34}
35
36function GeneratorObjectIterator() {
37 return this;
38}
39
40function GeneratorFunctionPrototypeConstructor(x) {
41 if (%_IsConstructCall()) {
42 throw MakeTypeError('not_constructor', ['GeneratorFunctionPrototype']);
43 }
44}
45
46function GeneratorFunctionConstructor(arg1) { // length == 1
47 var source = NewFunctionString(arguments, 'function*');
48 var global_proxy = %GlobalProxy(global);
49 // Compile the string in the constructor and not a helper so that errors
50 // appear to come from here.
51 var f = %_CallFunction(global_proxy, %CompileString(source, true));
52 %FunctionMarkNameShouldPrintAsAnonymous(f);
53 return f;
54}
55
56
57function SetUpGenerators() {
58 %CheckIsBootstrapping();
59
60 // Both Runtime_GeneratorNext and Runtime_GeneratorThrow are supported by
61 // neither Crankshaft nor TurboFan, disable optimization of wrappers here.
62 %NeverOptimizeFunction(GeneratorObjectNext);
63 %NeverOptimizeFunction(GeneratorObjectThrow);
64
65 // Set up non-enumerable functions on the generator prototype object.
66 var GeneratorObjectPrototype = GeneratorFunctionPrototype.prototype;
67 InstallFunctions(GeneratorObjectPrototype,
68 DONT_ENUM | DONT_DELETE | READ_ONLY,
69 ["next", GeneratorObjectNext,
70 "throw", GeneratorObjectThrow]);
71
72 %FunctionSetName(GeneratorObjectIterator, '[Symbol.iterator]');
73 %AddNamedProperty(GeneratorObjectPrototype, symbolIterator,
74 GeneratorObjectIterator, DONT_ENUM | DONT_DELETE | READ_ONLY);
75 %AddNamedProperty(GeneratorObjectPrototype, "constructor",
76 GeneratorFunctionPrototype, DONT_ENUM | DONT_DELETE | READ_ONLY);
77 %InternalSetPrototype(GeneratorFunctionPrototype, $Function.prototype);
78 %SetCode(GeneratorFunctionPrototype, GeneratorFunctionPrototypeConstructor);
79 %AddNamedProperty(GeneratorFunctionPrototype, "constructor",
80 GeneratorFunction, DONT_ENUM | DONT_DELETE | READ_ONLY);
81 %InternalSetPrototype(GeneratorFunction, $Function);
82 %SetCode(GeneratorFunction, GeneratorFunctionConstructor);
83}
84
85SetUpGenerators();