OLD | NEW |
1 // Copyright 2017 the V8 project authors. All rights reserved. | 1 // Copyright 2017 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/builtins/builtins-utils-gen.h" | 5 #include "src/builtins/builtins-utils-gen.h" |
6 #include "src/builtins/builtins.h" | 6 #include "src/builtins/builtins.h" |
7 #include "src/code-stub-assembler.h" | 7 #include "src/code-stub-assembler.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 Return(OrdinaryHasInstance(context, constructor, object)); | 405 Return(OrdinaryHasInstance(context, constructor, object)); |
406 } | 406 } |
407 | 407 |
408 TF_BUILTIN(GetSuperConstructor, ObjectBuiltinsAssembler) { | 408 TF_BUILTIN(GetSuperConstructor, ObjectBuiltinsAssembler) { |
409 Node* object = Parameter(Descriptor::kObject); | 409 Node* object = Parameter(Descriptor::kObject); |
410 Node* context = Parameter(Descriptor::kContext); | 410 Node* context = Parameter(Descriptor::kContext); |
411 | 411 |
412 Return(GetSuperConstructor(object, context)); | 412 Return(GetSuperConstructor(object, context)); |
413 } | 413 } |
414 | 414 |
| 415 TF_BUILTIN(CreateGeneratorObject, ObjectBuiltinsAssembler) { |
| 416 Node* closure = Parameter(Descriptor::kClosure); |
| 417 Node* receiver = Parameter(Descriptor::kReceiver); |
| 418 Node* context = Parameter(Descriptor::kContext); |
| 419 |
| 420 // Get the initial map from the function, jumping to the runtime if we don't |
| 421 // have one. |
| 422 Node* maybe_map = |
| 423 LoadObjectField(closure, JSFunction::kPrototypeOrInitialMapOffset); |
| 424 Label runtime(this); |
| 425 GotoIf(DoesntHaveInstanceType(maybe_map, MAP_TYPE), &runtime); |
| 426 |
| 427 Node* shared = |
| 428 LoadObjectField(closure, JSFunction::kSharedFunctionInfoOffset); |
| 429 Node* bytecode_array = |
| 430 LoadObjectField(shared, SharedFunctionInfo::kFunctionDataOffset); |
| 431 Node* frame_size = ChangeInt32ToIntPtr(LoadObjectField( |
| 432 bytecode_array, BytecodeArray::kFrameSizeOffset, MachineType::Int32())); |
| 433 Node* size = WordSar(frame_size, IntPtrConstant(kPointerSizeLog2)); |
| 434 Node* register_file = AllocateFixedArray(FAST_HOLEY_ELEMENTS, size); |
| 435 FillFixedArrayWithValue(FAST_HOLEY_ELEMENTS, register_file, IntPtrConstant(0), |
| 436 size, Heap::kUndefinedValueRootIndex); |
| 437 |
| 438 Node* const result = AllocateJSObjectFromMap(maybe_map); |
| 439 |
| 440 StoreObjectFieldNoWriteBarrier(result, JSGeneratorObject::kFunctionOffset, |
| 441 closure); |
| 442 StoreObjectFieldNoWriteBarrier(result, JSGeneratorObject::kContextOffset, |
| 443 context); |
| 444 StoreObjectFieldNoWriteBarrier(result, JSGeneratorObject::kReceiverOffset, |
| 445 receiver); |
| 446 StoreObjectFieldNoWriteBarrier(result, JSGeneratorObject::kRegisterFileOffset, |
| 447 register_file); |
| 448 Node* executing = SmiConstant(JSGeneratorObject::kGeneratorExecuting); |
| 449 StoreObjectFieldNoWriteBarrier(result, JSGeneratorObject::kContinuationOffset, |
| 450 executing); |
| 451 HandleSlackTracking(context, result, maybe_map, JSGeneratorObject::kSize); |
| 452 Return(result); |
| 453 |
| 454 BIND(&runtime); |
| 455 { |
| 456 Return(CallRuntime(Runtime::kCreateJSGeneratorObject, context, closure, |
| 457 receiver)); |
| 458 } |
| 459 } |
| 460 |
415 } // namespace internal | 461 } // namespace internal |
416 } // namespace v8 | 462 } // namespace v8 |
OLD | NEW |