Revision: 9952 Author: [email protected] Date: Thu Nov 10 04:32:39 2011 Log: Implement inline runtime function %_SetValueOf for Crankshaft.
It is frequently used inside our builtins and is implemented purely by HIR instructions: a smi check, an instance-type check and an in-object property store for storing to the value field. Review URL: http://codereview.chromium.org/8507016 http://code.google.com/p/v8/source/detail?r=9952 Modified: /branches/bleeding_edge/src/hydrogen.cc ======================================= --- /branches/bleeding_edge/src/hydrogen.cc Tue Nov 8 06:39:37 2011 +++ /branches/bleeding_edge/src/hydrogen.cc Thu Nov 10 04:32:39 2011 @@ -6261,7 +6261,44 @@ void HGraphBuilder::GenerateSetValueOf(CallRuntime* call) { - return Bailout("inlined runtime function: SetValueOf"); + ASSERT(call->arguments()->length() == 2); + CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); + CHECK_ALIVE(VisitForValue(call->arguments()->at(1))); + HValue* value = Pop(); + HValue* object = Pop(); + // Check if object is a not a smi. + HIsSmiAndBranch* smicheck = new(zone()) HIsSmiAndBranch(object); + HBasicBlock* if_smi = graph()->CreateBasicBlock(); + HBasicBlock* if_heap_object = graph()->CreateBasicBlock(); + HBasicBlock* join = graph()->CreateBasicBlock(); + smicheck->SetSuccessorAt(0, if_smi); + smicheck->SetSuccessorAt(1, if_heap_object); + current_block()->Finish(smicheck); + if_smi->Goto(join); + + // Check if object is a JSValue. + set_current_block(if_heap_object); + HHasInstanceTypeAndBranch* typecheck = + new(zone()) HHasInstanceTypeAndBranch(object, JS_VALUE_TYPE); + HBasicBlock* if_js_value = graph()->CreateBasicBlock(); + HBasicBlock* not_js_value = graph()->CreateBasicBlock(); + typecheck->SetSuccessorAt(0, if_js_value); + typecheck->SetSuccessorAt(1, not_js_value); + current_block()->Finish(typecheck); + not_js_value->Goto(join); + + // Create in-object property store to kValueOffset. + set_current_block(if_js_value); + Handle<String> name = isolate()->factory()->undefined_symbol(); + AddInstruction(new HStoreNamedField(object, + name, + value, + true, // in-object store. + JSValue::kValueOffset)); + if_js_value->Goto(join); + join->SetJoinId(call->id()); + set_current_block(join); + return ast_context()->ReturnValue(value); } -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
