runtime-generator.cc 3.96 KB
Newer Older
1 2 3 4
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

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 13 14 15 16

namespace v8 {
namespace internal {

RUNTIME_FUNCTION(Runtime_CreateJSGeneratorObject) {
  HandleScope scope(isolate);
17
  DCHECK_EQ(2, args.length());
18 19
  CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
  CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 1);
20
  CHECK(IsResumableFunction(function->shared()->kind()));
21

22 23 24 25
  // Underlying function needs to have bytecode available.
  DCHECK(function->shared()->HasBytecodeArray());
  DCHECK(!function->shared()->HasBaselineCode());
  int size = function->shared()->bytecode_array()->register_count();
26
  Handle<FixedArray> register_file = isolate->factory()->NewFixedArray(size);
27

28 29
  Handle<JSGeneratorObject> generator =
      isolate->factory()->NewJSGeneratorObject(function);
30
  generator->set_function(*function);
31 32
  generator->set_context(isolate->context());
  generator->set_receiver(*receiver);
33
  generator->set_register_file(*register_file);
34
  generator->set_continuation(JSGeneratorObject::kGeneratorExecuting);
35 36 37
  return *generator;
}

38
RUNTIME_FUNCTION(Runtime_GeneratorClose) {
39
  HandleScope scope(isolate);
40
  DCHECK_EQ(1, args.length());
41
  CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
42 43 44 45

  generator->set_continuation(JSGeneratorObject::kGeneratorClosed);

  return isolate->heap()->undefined_value();
46 47 48 49
}

RUNTIME_FUNCTION(Runtime_GeneratorGetFunction) {
  HandleScope scope(isolate);
50
  DCHECK_EQ(1, args.length());
51 52 53 54 55 56 57
  CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);

  return generator->function();
}

RUNTIME_FUNCTION(Runtime_GeneratorGetReceiver) {
  HandleScope scope(isolate);
58
  DCHECK_EQ(1, args.length());
59 60 61 62 63
  CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);

  return generator->receiver();
}

64 65 66 67 68 69 70 71
RUNTIME_FUNCTION(Runtime_GeneratorGetContext) {
  HandleScope scope(isolate);
  DCHECK_EQ(1, args.length());
  CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);

  return generator->context();
}

72
RUNTIME_FUNCTION(Runtime_GeneratorGetInputOrDebugPos) {
73
  HandleScope scope(isolate);
74
  DCHECK_EQ(1, args.length());
75 76
  CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);

77
  return generator->input_or_debug_pos();
78 79
}

80
RUNTIME_FUNCTION(Runtime_AsyncGeneratorGetAwaitInputOrDebugPos) {
81 82
  HandleScope scope(isolate);
  DCHECK_EQ(1, args.length());
83
  CONVERT_ARG_HANDLE_CHECKED(JSAsyncGeneratorObject, generator, 0);
84

85
  return generator->await_input_or_debug_pos();
86 87
}

88
RUNTIME_FUNCTION(Runtime_AsyncGeneratorResolve) {
89
  HandleScope scope(isolate);
90
  DCHECK_EQ(3, args.length());
91

92 93
  // Runtime call is implemented in InterpreterIntrinsics and lowered in
  // JSIntrinsicLowering
94 95 96 97 98 99 100 101 102
  UNREACHABLE();

  return isolate->heap()->undefined_value();
}

RUNTIME_FUNCTION(Runtime_AsyncGeneratorReject) {
  HandleScope scope(isolate);
  DCHECK_EQ(2, args.length());

103 104
  // Runtime call is implemented in InterpreterIntrinsics and lowered in
  // JSIntrinsicLowering
105 106 107 108 109
  UNREACHABLE();

  return isolate->heap()->undefined_value();
}

110 111
RUNTIME_FUNCTION(Runtime_GeneratorGetResumeMode) {
  HandleScope scope(isolate);
112
  DCHECK_EQ(1, args.length());
113 114 115 116 117
  CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);

  return Smi::FromInt(generator->resume_mode());
}

118 119
RUNTIME_FUNCTION(Runtime_GeneratorGetContinuation) {
  HandleScope scope(isolate);
120
  DCHECK_EQ(1, args.length());
121 122 123 124 125 126 127
  CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);

  return Smi::FromInt(generator->continuation());
}

RUNTIME_FUNCTION(Runtime_GeneratorGetSourcePosition) {
  HandleScope scope(isolate);
128
  DCHECK_EQ(1, args.length());
129 130
  CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);

131
  if (!generator->is_suspended()) return isolate->heap()->undefined_value();
132
  return Smi::FromInt(generator->source_position());
133 134
}

135 136
}  // namespace internal
}  // namespace v8