Chromium Code Reviews| Index: src/runtime/runtime-generator.cc |
| diff --git a/src/runtime/runtime-generator.cc b/src/runtime/runtime-generator.cc |
| index eeac3ad6b64b934b897387313139d88ccaa6eb4e..a9bcb425627d5c4ee9e56c4779c17cfdfa2503b4 100644 |
| --- a/src/runtime/runtime-generator.cc |
| +++ b/src/runtime/runtime-generator.cc |
| @@ -68,6 +68,7 @@ RUNTIME_FUNCTION(Runtime_SuspendJSGeneratorObject) { |
| return isolate->heap()->undefined_value(); |
| } |
| + |
| RUNTIME_FUNCTION(Runtime_GeneratorClose) { |
| HandleScope scope(isolate); |
| DCHECK(args.length() == 1); |
| @@ -109,6 +110,16 @@ RUNTIME_FUNCTION(Runtime_GeneratorGetInput) { |
| } |
| +// Returns resume mode of generator activation. |
| +RUNTIME_FUNCTION(Runtime_GeneratorGetResumeMode) { |
| + HandleScope scope(isolate); |
| + DCHECK(args.length() == 1); |
| + CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0); |
| + |
| + return Smi::FromInt(generator->resume_mode()); |
| +} |
| + |
| + |
| // Returns generator continuation as a PC offset, or the magic -1 or 0 values. |
| RUNTIME_FUNCTION(Runtime_GeneratorGetContinuation) { |
| HandleScope scope(isolate); |
| @@ -134,5 +145,60 @@ RUNTIME_FUNCTION(Runtime_GeneratorGetSourcePosition) { |
| return isolate->heap()->undefined_value(); |
| } |
| + |
| +RUNTIME_FUNCTION(Runtime_SuspendIgnitionGenerator) { |
| + HandleScope scope(isolate); |
| + DCHECK(args.length() == 2); |
| + CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0); |
| + CONVERT_ARG_HANDLE_CHECKED(Smi, state, 1); |
| + |
| + JavaScriptFrameIterator it(isolate); |
| + JavaScriptFrame* frame = it.frame(); |
| + Handle<JSFunction> function(frame->function()); |
| + CHECK(function->shared()->is_generator()); |
| + CHECK(frame->type() == StackFrame::INTERPRETED); |
|
Michael Starzinger
2016/04/15 14:13:47
nit: CHECK_EQ
neis
2016/04/18 08:04:17
Done.
|
| + |
| + // Save register file. |
| + int size = function->shared()->bytecode_array()->register_count(); |
| + Handle<FixedArray> register_file = isolate->factory()->NewFixedArray(size); |
| + for (int i = 0; i < size; ++i) { |
| + Object* value = |
| + static_cast<InterpretedFrame*>(frame)->ReadInterpreterRegister(i); |
| + register_file->set(i, value); |
| + } |
| + |
| + generator->set_operand_stack(*register_file); |
| + generator->set_context(Context::cast(frame->context())); |
| + generator->set_continuation(state->value() + 1); // continuation 0 is special |
|
rmcilroy
2016/04/15 13:17:46
Is continuation '0' only special in the FCG genera
neis
2016/04/18 08:04:17
Both actually, because of some shared code. But I
|
| + |
| + return isolate->heap()->undefined_value(); |
| +} |
| + |
| + |
| +RUNTIME_FUNCTION(Runtime_ResumeIgnitionGenerator) { |
| + HandleScope scope(isolate); |
| + DCHECK(args.length() == 1); |
| + CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0); |
| + |
| + JavaScriptFrameIterator it(isolate); |
| + JavaScriptFrame* frame = it.frame(); |
| + Handle<JSFunction> function(frame->function()); |
| + CHECK(function->shared()->is_generator()); |
| + CHECK(frame->type() == StackFrame::INTERPRETED); |
|
Michael Starzinger
2016/04/15 14:13:47
nit: CHECK_EQ
neis
2016/04/18 08:04:17
Done.
|
| + |
| + // Restore register file. |
| + int size = function->shared()->bytecode_array()->register_count(); |
| + DCHECK_EQ(size, generator->operand_stack()->length()); |
| + for (int i = 0; i < size; ++i) { |
| + Object* value = generator->operand_stack()->get(i); |
| + static_cast<InterpretedFrame*>(frame)->WriteInterpreterRegister(i, value); |
| + } |
| + generator->set_operand_stack(isolate->heap()->empty_fixed_array()); |
| + |
| + int state = generator->continuation() - 1; |
| + generator->set_continuation(JSGeneratorObject::kGeneratorExecuting); |
| + return Smi::FromInt(state); |
| +} |
| + |
| } // namespace internal |
| } // namespace v8 |