| Index: src/x64/fast-codegen-x64.cc
|
| ===================================================================
|
| --- src/x64/fast-codegen-x64.cc (revision 3807)
|
| +++ src/x64/fast-codegen-x64.cc (working copy)
|
| @@ -48,41 +48,47 @@
|
| PrintF("MapCheck(this)\n");
|
| }
|
|
|
| + ASSERT(info()->has_receiver() && info()->receiver()->IsHeapObject());
|
| + Handle<HeapObject> object = Handle<HeapObject>::cast(info()->receiver());
|
| + Handle<Map> map(object->map());
|
| +
|
| EmitLoadReceiver(rdx);
|
| - __ JumpIfSmi(rdx, bailout());
|
| + __ CheckMap(rdx, map, bailout(), false);
|
| +}
|
|
|
| - ASSERT(has_receiver() && receiver()->IsHeapObject());
|
| - Handle<HeapObject> object = Handle<HeapObject>::cast(receiver());
|
| - Handle<Map> map(object->map());
|
| - __ Cmp(FieldOperand(rdx, HeapObject::kMapOffset), map);
|
| - __ j(not_equal, bailout());
|
| +
|
| +void FastCodeGenerator::EmitGlobalMapCheck() {
|
| + Comment cmnt(masm(), ";; GlobalMapCheck");
|
| + if (FLAG_print_ir) {
|
| + PrintF(";; GlobalMapCheck()");
|
| + }
|
| +
|
| + ASSERT(info()->has_global_object());
|
| + Handle<Map> map(info()->global_object()->map());
|
| +
|
| + __ movq(rbx, CodeGenerator::GlobalObject());
|
| + __ CheckMap(rbx, map, bailout(), true);
|
| }
|
|
|
|
|
| -void FastCodeGenerator::EmitGlobalVariableLoad(Handle<String> name) {
|
| - // Compile global variable accesses as load IC calls. The only live
|
| - // registers are rsi (context) and possibly rdx (this). Both are also
|
| - // saved in the stack and rsi is preserved by the call.
|
| - __ push(CodeGenerator::GlobalObject());
|
| - __ Move(rcx, name);
|
| - Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize));
|
| - __ Call(ic, RelocInfo::CODE_TARGET_CONTEXT);
|
| - if (has_this_properties()) {
|
| - // Restore this.
|
| - EmitLoadReceiver(rdx);
|
| - } else {
|
| - __ nop(); // Not test rax, indicates IC has no inlined code at call site.
|
| +void FastCodeGenerator::EmitGlobalVariableLoad(Handle<Object> cell) {
|
| + ASSERT(cell->IsJSGlobalPropertyCell());
|
| + __ Move(rax, cell);
|
| + __ movq(rax, FieldOperand(rax, JSGlobalPropertyCell::kValueOffset));
|
| + if (FLAG_debug_code) {
|
| + __ Cmp(rax, Factory::the_hole_value());
|
| + __ Check(not_equal, "DontDelete cells can't contain the hole");
|
| }
|
| }
|
|
|
|
|
| void FastCodeGenerator::EmitThisPropertyStore(Handle<String> name) {
|
| LookupResult lookup;
|
| - receiver()->Lookup(*name, &lookup);
|
| + info()->receiver()->Lookup(*name, &lookup);
|
|
|
| - ASSERT(lookup.holder() == *receiver());
|
| + ASSERT(lookup.holder() == *info()->receiver());
|
| ASSERT(lookup.type() == FIELD);
|
| - Handle<Map> map(Handle<HeapObject>::cast(receiver())->map());
|
| + Handle<Map> map(Handle<HeapObject>::cast(info()->receiver())->map());
|
| int index = lookup.GetFieldIndex() - map->inobject_properties();
|
| int offset = index * kPointerSize;
|
|
|
| @@ -102,9 +108,9 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::Generate(CompilationInfo* info) {
|
| +void FastCodeGenerator::Generate(CompilationInfo* compilation_info) {
|
| ASSERT(info_ == NULL);
|
| - info_ = info;
|
| + info_ = compilation_info;
|
|
|
| // Save the caller's frame pointer and set up our own.
|
| Comment prologue_cmnt(masm(), ";; Prologue");
|
| @@ -116,10 +122,14 @@
|
| // point.
|
|
|
| // Receiver (this) is allocated to rdx if there are this properties.
|
| - if (has_this_properties()) EmitReceiverMapCheck();
|
| + if (info()->has_this_properties()) EmitReceiverMapCheck();
|
|
|
| - VisitStatements(info->function()->body());
|
| + // If there is a global variable access check if the global object
|
| + // is the same as at lazy-compilation time.
|
| + if (info()->has_globals()) EmitGlobalMapCheck();
|
|
|
| + VisitStatements(info()->function()->body());
|
| +
|
| Comment return_cmnt(masm(), ";; Return(<undefined>)");
|
| __ LoadRoot(rax, Heap::kUndefinedValueRootIndex);
|
|
|
|
|