Chromium Code Reviews| Index: src/runtime.cc |
| diff --git a/src/runtime.cc b/src/runtime.cc |
| index 7288f38171eb75f6c4e15106817249b4b0b950fe..b5ae6fa06b4902c1f4fba3769d47c999002792d3 100644 |
| --- a/src/runtime.cc |
| +++ b/src/runtime.cc |
| @@ -2292,6 +2292,42 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SetExpectedNumberOfProperties) { |
| } |
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateJSGeneratorObject) { |
| + NoHandleAllocation ha(isolate); |
| + ASSERT(args.length() == 0); |
| + JavaScriptFrameIterator it(isolate); |
| + JavaScriptFrame* frame = it.frame(); |
| + JSFunction* function = JSFunction::cast(frame->function()); |
| + ASSERT(function->shared()->is_generator()); |
| + |
| + JSGeneratorObject* generator; |
| + if (frame->IsConstructor()) { |
| + generator = JSGeneratorObject::cast(frame->receiver()); |
|
Michael Starzinger
2013/04/12 16:53:31
We shouldn't use the implicit receiver as the resu
Michael Starzinger
2013/04/14 21:32:50
You are right, I totally missed the fact that the
|
| + } else { |
| + Map *map; |
| + if (function->has_initial_map()) { |
|
Michael Starzinger
2013/04/12 16:53:31
I think we can get by without tweaking the initial
|
| + map = function->initial_map(); |
| + } else { |
| + // Allocate the initial map if absent. |
| + MaybeObject* maybe_map = isolate->heap()->AllocateInitialMap(function); |
| + if (!maybe_map->To(&map)) return maybe_map; |
| + function->set_initial_map(map); |
| + } |
| + ASSERT(map->instance_type() == JS_GENERATOR_OBJECT_TYPE); |
| + // Allocate the generator. |
| + MaybeObject* maybe_generator = isolate->heap()->Allocate(map, NEW_SPACE); |
|
Michael Starzinger
2013/04/14 21:32:50
Please move the JSGenerator allocation back into h
wingo
2013/04/15 09:24:57
Done.
|
| + if (!maybe_generator->To(&generator)) return maybe_generator; |
| + generator->initialize_properties(); |
| + generator->initialize_elements(); |
| + } |
| + generator->set_function(function); |
| + generator->set_context(Smi::FromInt(0)); |
| + generator->set_continuation(0); |
| + generator->set_operand_stack(Smi::FromInt(0)); |
| + return generator; |
| +} |
| + |
| + |
| MUST_USE_RESULT static MaybeObject* CharFromCode(Isolate* isolate, |
| Object* char_code) { |
| uint32_t code; |