OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 2276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2287 if (source->IsSmi()) { | 2287 if (source->IsSmi()) { |
2288 Push(Smi::cast(*source)); | 2288 Push(Smi::cast(*source)); |
2289 } else { | 2289 } else { |
2290 ASSERT(source->IsHeapObject()); | 2290 ASSERT(source->IsHeapObject()); |
2291 movq(kScratchRegister, source, RelocInfo::EMBEDDED_OBJECT); | 2291 movq(kScratchRegister, source, RelocInfo::EMBEDDED_OBJECT); |
2292 push(kScratchRegister); | 2292 push(kScratchRegister); |
2293 } | 2293 } |
2294 } | 2294 } |
2295 | 2295 |
2296 | 2296 |
2297 void MacroAssembler::LoadHeapObject(Register result, | |
2298 Handle<HeapObject> object) { | |
2299 if (isolate()->heap()->InNewSpace(*object)) { | |
2300 Handle<JSGlobalPropertyCell> cell = | |
2301 isolate()->factory()->NewJSGlobalPropertyCell(object); | |
2302 movq(result, cell, RelocInfo::GLOBAL_PROPERTY_CELL); | |
2303 movq(result, Operand(result, 0)); | |
2304 } else { | |
2305 Move(result, object); | |
2306 } | |
2307 } | |
2308 | |
2309 | |
2310 void MacroAssembler::PushHeapObject(Handle<HeapObject> object) { | |
2311 if (isolate()->heap()->InNewSpace(*object)) { | |
2312 Handle<JSGlobalPropertyCell> cell = | |
2313 isolate()->factory()->NewJSGlobalPropertyCell(object); | |
2314 movq(kScratchRegister, cell, RelocInfo::GLOBAL_PROPERTY_CELL); | |
2315 movq(kScratchRegister, Operand(kScratchRegister, 0)); | |
2316 push(kScratchRegister); | |
2317 } else { | |
2318 Push(object); | |
2319 } | |
2320 } | |
2321 | |
2322 | |
2323 void MacroAssembler::LoadGlobalCell(Register dst, | |
2324 Handle<JSGlobalPropertyCell> cell) { | |
2325 if (dst.is(rax)) { | |
2326 load_rax(cell.location(), RelocInfo::GLOBAL_PROPERTY_CELL); | |
2327 } else { | |
2328 movq(dst, cell, RelocInfo::GLOBAL_PROPERTY_CELL); | |
2329 movq(dst, Operand(dst, 0)); | |
2330 } | |
2331 } | |
2332 | |
2333 | |
2297 void MacroAssembler::Push(Smi* source) { | 2334 void MacroAssembler::Push(Smi* source) { |
2298 intptr_t smi = reinterpret_cast<intptr_t>(source); | 2335 intptr_t smi = reinterpret_cast<intptr_t>(source); |
2299 if (is_int32(smi)) { | 2336 if (is_int32(smi)) { |
2300 push(Immediate(static_cast<int32_t>(smi))); | 2337 push(Immediate(static_cast<int32_t>(smi))); |
2301 } else { | 2338 } else { |
2302 Register constant = GetSmiConstant(source); | 2339 Register constant = GetSmiConstant(source); |
2303 push(constant); | 2340 push(constant); |
2304 } | 2341 } |
2305 } | 2342 } |
2306 | 2343 |
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3052 FieldOperand(rdx, SharedFunctionInfo::kFormalParameterCountOffset)); | 3089 FieldOperand(rdx, SharedFunctionInfo::kFormalParameterCountOffset)); |
3053 // Advances rdx to the end of the Code object header, to the start of | 3090 // Advances rdx to the end of the Code object header, to the start of |
3054 // the executable code. | 3091 // the executable code. |
3055 movq(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); | 3092 movq(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); |
3056 | 3093 |
3057 ParameterCount expected(rbx); | 3094 ParameterCount expected(rbx); |
3058 InvokeCode(rdx, expected, actual, flag, call_wrapper, call_kind); | 3095 InvokeCode(rdx, expected, actual, flag, call_wrapper, call_kind); |
3059 } | 3096 } |
3060 | 3097 |
3061 | 3098 |
3062 void MacroAssembler::InvokeFunction(JSFunction* function, | 3099 void MacroAssembler::InvokeFunction(JSFunction* function, |
Vyacheslav Egorov (Chromium)
2011/10/12 12:36:05
check all callers for gc safeness.
| |
3063 const ParameterCount& actual, | 3100 const ParameterCount& actual, |
3064 InvokeFlag flag, | 3101 InvokeFlag flag, |
3065 const CallWrapper& call_wrapper, | 3102 const CallWrapper& call_wrapper, |
3066 CallKind call_kind) { | 3103 CallKind call_kind) { |
3067 // You can't call a function without a valid frame. | 3104 // You can't call a function without a valid frame. |
3068 ASSERT(flag == JUMP_FUNCTION || has_frame()); | 3105 ASSERT(flag == JUMP_FUNCTION || has_frame()); |
3069 | 3106 |
3070 ASSERT(function->is_compiled()); | 3107 ASSERT(function->is_compiled()); |
3071 // Get the function and setup the context. | 3108 // Get the function and setup the context. |
3072 Move(rdi, Handle<JSFunction>(function)); | 3109 LoadHeapObject(rdi, Handle<JSFunction>(function)); |
3073 movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); | 3110 movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); |
3074 | 3111 |
3075 if (V8::UseCrankshaft()) { | 3112 if (V8::UseCrankshaft()) { |
3076 // Since Crankshaft can recompile a function, we need to load | 3113 // Since Crankshaft can recompile a function, we need to load |
3077 // the Code object every time we call the function. | 3114 // the Code object every time we call the function. |
3078 movq(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); | 3115 movq(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); |
3079 ParameterCount expected(function->shared()->formal_parameter_count()); | 3116 ParameterCount expected(function->shared()->formal_parameter_count()); |
3080 InvokeCode(rdx, expected, actual, flag, call_wrapper, call_kind); | 3117 InvokeCode(rdx, expected, actual, flag, call_wrapper, call_kind); |
3081 } else { | 3118 } else { |
3082 // Invoke the cached code. | 3119 // Invoke the cached code. |
(...skipping 1191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4274 | 4311 |
4275 and_(bitmap_scratch, Immediate(~Page::kPageAlignmentMask)); | 4312 and_(bitmap_scratch, Immediate(~Page::kPageAlignmentMask)); |
4276 addl(Operand(bitmap_scratch, MemoryChunk::kLiveBytesOffset), length); | 4313 addl(Operand(bitmap_scratch, MemoryChunk::kLiveBytesOffset), length); |
4277 | 4314 |
4278 bind(&done); | 4315 bind(&done); |
4279 } | 4316 } |
4280 | 4317 |
4281 } } // namespace v8::internal | 4318 } } // namespace v8::internal |
4282 | 4319 |
4283 #endif // V8_TARGET_ARCH_X64 | 4320 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |