Line data Source code
1 : // Copyright 2014 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 : #include "src/runtime/runtime-utils.h"
6 :
7 : #include "src/arguments.h"
8 : #include "src/factory.h"
9 : #include "src/frames-inl.h"
10 : #include "src/objects-inl.h"
11 :
12 : namespace v8 {
13 : namespace internal {
14 :
15 112641 : RUNTIME_FUNCTION(Runtime_CreateJSGeneratorObject) {
16 37547 : HandleScope scope(isolate);
17 : DCHECK_EQ(2, args.length());
18 75094 : CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
19 37547 : CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 1);
20 37547 : CHECK(IsResumableFunction(function->shared()->kind()));
21 :
22 : // Underlying function needs to have bytecode available.
23 : DCHECK(function->shared()->HasBytecodeArray());
24 : DCHECK(!function->shared()->HasBaselineCode());
25 37547 : int size = function->shared()->bytecode_array()->register_count();
26 37547 : Handle<FixedArray> register_file = isolate->factory()->NewFixedArray(size);
27 :
28 : Handle<JSGeneratorObject> generator =
29 37547 : isolate->factory()->NewJSGeneratorObject(function);
30 37547 : generator->set_function(*function);
31 75094 : generator->set_context(isolate->context());
32 37547 : generator->set_receiver(*receiver);
33 37547 : generator->set_register_file(*register_file);
34 37547 : generator->set_continuation(JSGeneratorObject::kGeneratorExecuting);
35 37547 : return *generator;
36 : }
37 :
38 32348 : RUNTIME_FUNCTION(Runtime_GeneratorClose) {
39 16174 : HandleScope scope(isolate);
40 : DCHECK_EQ(1, args.length());
41 32348 : CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
42 :
43 16174 : generator->set_continuation(JSGeneratorObject::kGeneratorClosed);
44 :
45 16174 : return isolate->heap()->undefined_value();
46 : }
47 :
48 5376 : RUNTIME_FUNCTION(Runtime_GeneratorGetFunction) {
49 2688 : HandleScope scope(isolate);
50 : DCHECK_EQ(1, args.length());
51 5376 : CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
52 :
53 2688 : return generator->function();
54 : }
55 :
56 0 : RUNTIME_FUNCTION(Runtime_GeneratorGetReceiver) {
57 0 : HandleScope scope(isolate);
58 : DCHECK_EQ(1, args.length());
59 0 : CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
60 :
61 0 : return generator->receiver();
62 : }
63 :
64 138334 : RUNTIME_FUNCTION(Runtime_GeneratorGetContext) {
65 69167 : HandleScope scope(isolate);
66 : DCHECK_EQ(1, args.length());
67 138334 : CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
68 :
69 69167 : return generator->context();
70 : }
71 :
72 148062 : RUNTIME_FUNCTION(Runtime_GeneratorGetInputOrDebugPos) {
73 74031 : HandleScope scope(isolate);
74 : DCHECK_EQ(1, args.length());
75 148062 : CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
76 :
77 74031 : return generator->input_or_debug_pos();
78 : }
79 :
80 0 : RUNTIME_FUNCTION(Runtime_AsyncGeneratorGetAwaitInputOrDebugPos) {
81 0 : HandleScope scope(isolate);
82 : DCHECK_EQ(1, args.length());
83 0 : CONVERT_ARG_HANDLE_CHECKED(JSAsyncGeneratorObject, generator, 0);
84 :
85 0 : return generator->await_input_or_debug_pos();
86 : }
87 :
88 0 : RUNTIME_FUNCTION(Runtime_AsyncGeneratorResolve) {
89 0 : HandleScope scope(isolate);
90 : DCHECK_EQ(3, args.length());
91 :
92 : // Runtime call is implemented in InterpreterIntrinsics and lowered in
93 : // JSIntrinsicLowering
94 0 : UNREACHABLE();
95 :
96 : return isolate->heap()->undefined_value();
97 : }
98 :
99 0 : RUNTIME_FUNCTION(Runtime_AsyncGeneratorReject) {
100 0 : HandleScope scope(isolate);
101 : DCHECK_EQ(2, args.length());
102 :
103 : // Runtime call is implemented in InterpreterIntrinsics and lowered in
104 : // JSIntrinsicLowering
105 0 : UNREACHABLE();
106 :
107 : return isolate->heap()->undefined_value();
108 : }
109 :
110 138334 : RUNTIME_FUNCTION(Runtime_GeneratorGetResumeMode) {
111 69167 : HandleScope scope(isolate);
112 : DCHECK_EQ(1, args.length());
113 138334 : CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
114 :
115 69167 : return Smi::FromInt(generator->resume_mode());
116 : }
117 :
118 0 : RUNTIME_FUNCTION(Runtime_GeneratorGetContinuation) {
119 0 : HandleScope scope(isolate);
120 : DCHECK_EQ(1, args.length());
121 0 : CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
122 :
123 0 : return Smi::FromInt(generator->continuation());
124 : }
125 :
126 0 : RUNTIME_FUNCTION(Runtime_GeneratorGetSourcePosition) {
127 0 : HandleScope scope(isolate);
128 : DCHECK_EQ(1, args.length());
129 0 : CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
130 :
131 0 : if (!generator->is_suspended()) return isolate->heap()->undefined_value();
132 0 : return Smi::FromInt(generator->source_position());
133 : }
134 :
135 : } // namespace internal
136 : } // namespace v8
|