From: chunyang.dai Date: Mon, 7 Sep 2015 08:10:22 +0000 (-0700) Subject: X87: [es6] Introduce a dedicated JSIteratorResult type. X-Git-Tag: upstream/4.7.83~430 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=691f796f7297ec3076dc23a7d79bb7da7f1d10e1;p=platform%2Fupstream%2Fv8.git X87: [es6] Introduce a dedicated JSIteratorResult type. port 72bc4b5c8a5c4279bcb8b340edbc8aa1c46d75a1 (r30557) original commit message: Use a single JSIteratorResult type for all implementation provided iterator results (i.e. the String, Array and collection iterators, and also for generators). This removes one source of unnecessary polymorphism in for-of loops. It is accomplished by a new intrinsic %_CreateIterResultObject() that should be used to create iterator result objects from JavaScript builtins (there's a matching factory method for C++ code). Also restructure the %StringIteratorPrototype%.next() and %ArrayIteratorPrototype%.next() functions to be a bit more friendly to optimizing compilers. BUG= Review URL: https://codereview.chromium.org/1331523002 Cr-Commit-Position: refs/heads/master@{#30610} --- diff --git a/src/full-codegen/x87/full-codegen-x87.cc b/src/full-codegen/x87/full-codegen-x87.cc index 9d625ba..dfa6b07 100644 --- a/src/full-codegen/x87/full-codegen-x87.cc +++ b/src/full-codegen/x87/full-codegen-x87.cc @@ -2183,40 +2183,28 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator, void FullCodeGenerator::EmitCreateIteratorResult(bool done) { - Label gc_required; - Label allocated; + Label allocate, done_allocate; - const int instance_size = 5 * kPointerSize; - DCHECK_EQ(isolate()->native_context()->iterator_result_map()->instance_size(), - instance_size); + __ Allocate(JSIteratorResult::kSize, eax, ecx, edx, &allocate, TAG_OBJECT); + __ jmp(&done_allocate, Label::kNear); - __ Allocate(instance_size, eax, ecx, edx, &gc_required, TAG_OBJECT); - __ jmp(&allocated); - - __ bind(&gc_required); - __ Push(Smi::FromInt(instance_size)); + __ bind(&allocate); + __ Push(Smi::FromInt(JSIteratorResult::kSize)); __ CallRuntime(Runtime::kAllocateInNewSpace, 1); - __ mov(context_register(), - Operand(ebp, StandardFrameConstants::kContextOffset)); - __ bind(&allocated); - __ mov(ebx, Operand(esi, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX))); + __ bind(&done_allocate); + __ mov(ebx, GlobalObjectOperand()); __ mov(ebx, FieldOperand(ebx, GlobalObject::kNativeContextOffset)); __ mov(ebx, ContextOperand(ebx, Context::ITERATOR_RESULT_MAP_INDEX)); - __ pop(ecx); - __ mov(edx, isolate()->factory()->ToBoolean(done)); __ mov(FieldOperand(eax, HeapObject::kMapOffset), ebx); __ mov(FieldOperand(eax, JSObject::kPropertiesOffset), isolate()->factory()->empty_fixed_array()); __ mov(FieldOperand(eax, JSObject::kElementsOffset), isolate()->factory()->empty_fixed_array()); - __ mov(FieldOperand(eax, JSGeneratorObject::kResultValuePropertyOffset), ecx); - __ mov(FieldOperand(eax, JSGeneratorObject::kResultDonePropertyOffset), edx); - - // Only the value field needs a write barrier, as the other values are in the - // root set. - __ RecordWriteField(eax, JSGeneratorObject::kResultValuePropertyOffset, ecx, - edx, kDontSaveFPRegs); + __ pop(FieldOperand(eax, JSIteratorResult::kValueOffset)); + __ mov(FieldOperand(eax, JSIteratorResult::kDoneOffset), + isolate()->factory()->ToBoolean(done)); + STATIC_ASSERT(JSIteratorResult::kSize == 5 * kPointerSize); } @@ -4381,6 +4369,36 @@ void FullCodeGenerator::EmitDebugIsActive(CallRuntime* expr) { } +void FullCodeGenerator::EmitCreateIterResultObject(CallRuntime* expr) { + ZoneList* args = expr->arguments(); + DCHECK_EQ(2, args->length()); + VisitForStackValue(args->at(0)); + VisitForStackValue(args->at(1)); + + Label runtime, done; + + __ Allocate(JSIteratorResult::kSize, eax, ecx, edx, &runtime, TAG_OBJECT); + __ mov(ebx, GlobalObjectOperand()); + __ mov(ebx, FieldOperand(ebx, GlobalObject::kNativeContextOffset)); + __ mov(ebx, ContextOperand(ebx, Context::ITERATOR_RESULT_MAP_INDEX)); + __ mov(FieldOperand(eax, HeapObject::kMapOffset), ebx); + __ mov(FieldOperand(eax, JSObject::kPropertiesOffset), + isolate()->factory()->empty_fixed_array()); + __ mov(FieldOperand(eax, JSObject::kElementsOffset), + isolate()->factory()->empty_fixed_array()); + __ pop(FieldOperand(eax, JSIteratorResult::kDoneOffset)); + __ pop(FieldOperand(eax, JSIteratorResult::kValueOffset)); + STATIC_ASSERT(JSIteratorResult::kSize == 5 * kPointerSize); + __ jmp(&done, Label::kNear); + + __ bind(&runtime); + __ CallRuntime(Runtime::kCreateIterResultObject, 2); + + __ bind(&done); + context()->Plug(eax); +} + + void FullCodeGenerator::EmitLoadJSRuntimeFunction(CallRuntime* expr) { // Push undefined as receiver. __ push(Immediate(isolate()->factory()->undefined_value()));