Home | History | Annotate | Download | only in runtime
      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 RUNTIME_FUNCTION(Runtime_CreateJSGeneratorObject) {
     16   HandleScope scope(isolate);
     17   DCHECK_EQ(2, args.length());
     18   CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
     19   CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 1);
     20   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   int size = function->shared()->bytecode_array()->register_count();
     26   Handle<FixedArray> register_file = isolate->factory()->NewFixedArray(size);
     27 
     28   Handle<JSGeneratorObject> generator =
     29       isolate->factory()->NewJSGeneratorObject(function);
     30   generator->set_function(*function);
     31   generator->set_context(isolate->context());
     32   generator->set_receiver(*receiver);
     33   generator->set_register_file(*register_file);
     34   generator->set_continuation(JSGeneratorObject::kGeneratorExecuting);
     35   return *generator;
     36 }
     37 
     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   generator->set_continuation(JSGeneratorObject::kGeneratorClosed);
     44 
     45   return isolate->heap()->undefined_value();
     46 }
     47 
     48 RUNTIME_FUNCTION(Runtime_GeneratorGetFunction) {
     49   HandleScope scope(isolate);
     50   DCHECK_EQ(1, args.length());
     51   CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
     52 
     53   return generator->function();
     54 }
     55 
     56 RUNTIME_FUNCTION(Runtime_GeneratorGetReceiver) {
     57   HandleScope scope(isolate);
     58   DCHECK_EQ(1, args.length());
     59   CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
     60 
     61   return generator->receiver();
     62 }
     63 
     64 RUNTIME_FUNCTION(Runtime_GeneratorGetContext) {
     65   HandleScope scope(isolate);
     66   DCHECK_EQ(1, args.length());
     67   CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
     68 
     69   return generator->context();
     70 }
     71 
     72 RUNTIME_FUNCTION(Runtime_GeneratorGetInputOrDebugPos) {
     73   HandleScope scope(isolate);
     74   DCHECK_EQ(1, args.length());
     75   CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
     76 
     77   return generator->input_or_debug_pos();
     78 }
     79 
     80 RUNTIME_FUNCTION(Runtime_GeneratorGetResumeMode) {
     81   HandleScope scope(isolate);
     82   DCHECK_EQ(1, args.length());
     83   CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
     84 
     85   return Smi::FromInt(generator->resume_mode());
     86 }
     87 
     88 RUNTIME_FUNCTION(Runtime_GeneratorGetContinuation) {
     89   HandleScope scope(isolate);
     90   DCHECK_EQ(1, args.length());
     91   CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
     92 
     93   return Smi::FromInt(generator->continuation());
     94 }
     95 
     96 RUNTIME_FUNCTION(Runtime_GeneratorGetSourcePosition) {
     97   HandleScope scope(isolate);
     98   DCHECK_EQ(1, args.length());
     99   CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
    100 
    101   if (!generator->is_suspended()) return isolate->heap()->undefined_value();
    102   return Smi::FromInt(generator->source_position());
    103 }
    104 
    105 }  // namespace internal
    106 }  // namespace v8
    107