| Index: src/hydrogen.cc
|
| ===================================================================
|
| --- src/hydrogen.cc (revision 9943)
|
| +++ src/hydrogen.cc (working copy)
|
| @@ -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);
|
| }
|
|
|
|
|
|
|