OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/execution.h" | 5 #include "src/execution.h" |
6 | 6 |
7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
8 #include "src/codegen.h" | 8 #include "src/codegen.h" |
9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
10 #include "src/isolate-inl.h" | 10 #include "src/isolate-inl.h" |
11 #include "src/vm-state-inl.h" | 11 #include "src/vm-state-inl.h" |
12 | 12 |
13 namespace v8 { | 13 namespace v8 { |
14 namespace internal { | 14 namespace internal { |
15 | 15 |
16 StackGuard::StackGuard() | 16 StackGuard::StackGuard() |
17 : isolate_(NULL) { | 17 : isolate_(NULL) { |
18 } | 18 } |
19 | 19 |
20 | 20 |
21 void StackGuard::set_interrupt_limits(const ExecutionAccess& lock) { | 21 void StackGuard::set_interrupt_limits(const ExecutionAccess& lock) { |
22 ASSERT(isolate_ != NULL); | 22 DCHECK(isolate_ != NULL); |
23 thread_local_.jslimit_ = kInterruptLimit; | 23 thread_local_.jslimit_ = kInterruptLimit; |
24 thread_local_.climit_ = kInterruptLimit; | 24 thread_local_.climit_ = kInterruptLimit; |
25 isolate_->heap()->SetStackLimits(); | 25 isolate_->heap()->SetStackLimits(); |
26 } | 26 } |
27 | 27 |
28 | 28 |
29 void StackGuard::reset_limits(const ExecutionAccess& lock) { | 29 void StackGuard::reset_limits(const ExecutionAccess& lock) { |
30 ASSERT(isolate_ != NULL); | 30 DCHECK(isolate_ != NULL); |
31 thread_local_.jslimit_ = thread_local_.real_jslimit_; | 31 thread_local_.jslimit_ = thread_local_.real_jslimit_; |
32 thread_local_.climit_ = thread_local_.real_climit_; | 32 thread_local_.climit_ = thread_local_.real_climit_; |
33 isolate_->heap()->SetStackLimits(); | 33 isolate_->heap()->SetStackLimits(); |
34 } | 34 } |
35 | 35 |
36 | 36 |
37 MUST_USE_RESULT static MaybeHandle<Object> Invoke( | 37 MUST_USE_RESULT static MaybeHandle<Object> Invoke( |
38 bool is_construct, | 38 bool is_construct, |
39 Handle<JSFunction> function, | 39 Handle<JSFunction> function, |
40 Handle<Object> receiver, | 40 Handle<Object> receiver, |
(...skipping 25 matching lines...) Expand all Loading... |
66 | 66 |
67 // Convert calls on global objects to be calls on the global | 67 // Convert calls on global objects to be calls on the global |
68 // receiver instead to avoid having a 'this' pointer which refers | 68 // receiver instead to avoid having a 'this' pointer which refers |
69 // directly to a global object. | 69 // directly to a global object. |
70 if (receiver->IsGlobalObject()) { | 70 if (receiver->IsGlobalObject()) { |
71 receiver = handle(Handle<GlobalObject>::cast(receiver)->global_proxy()); | 71 receiver = handle(Handle<GlobalObject>::cast(receiver)->global_proxy()); |
72 } | 72 } |
73 | 73 |
74 // Make sure that the global object of the context we're about to | 74 // Make sure that the global object of the context we're about to |
75 // make the current one is indeed a global object. | 75 // make the current one is indeed a global object. |
76 ASSERT(function->context()->global_object()->IsGlobalObject()); | 76 DCHECK(function->context()->global_object()->IsGlobalObject()); |
77 | 77 |
78 { | 78 { |
79 // Save and restore context around invocation and block the | 79 // Save and restore context around invocation and block the |
80 // allocation of handles without explicit handle scopes. | 80 // allocation of handles without explicit handle scopes. |
81 SaveContext save(isolate); | 81 SaveContext save(isolate); |
82 SealHandleScope shs(isolate); | 82 SealHandleScope shs(isolate); |
83 JSEntryFunction stub_entry = FUNCTION_CAST<JSEntryFunction>(code->entry()); | 83 JSEntryFunction stub_entry = FUNCTION_CAST<JSEntryFunction>(code->entry()); |
84 | 84 |
85 // Call the function through the right JS entry stub. | 85 // Call the function through the right JS entry stub. |
86 byte* function_entry = function->code()->entry(); | 86 byte* function_entry = function->code()->entry(); |
87 JSFunction* func = *function; | 87 JSFunction* func = *function; |
88 Object* recv = *receiver; | 88 Object* recv = *receiver; |
89 Object*** argv = reinterpret_cast<Object***>(args); | 89 Object*** argv = reinterpret_cast<Object***>(args); |
90 value = | 90 value = |
91 CALL_GENERATED_CODE(stub_entry, function_entry, func, recv, argc, argv); | 91 CALL_GENERATED_CODE(stub_entry, function_entry, func, recv, argc, argv); |
92 } | 92 } |
93 | 93 |
94 #ifdef VERIFY_HEAP | 94 #ifdef VERIFY_HEAP |
95 value->ObjectVerify(); | 95 value->ObjectVerify(); |
96 #endif | 96 #endif |
97 | 97 |
98 // Update the pending exception flag and return the value. | 98 // Update the pending exception flag and return the value. |
99 bool has_exception = value->IsException(); | 99 bool has_exception = value->IsException(); |
100 ASSERT(has_exception == isolate->has_pending_exception()); | 100 DCHECK(has_exception == isolate->has_pending_exception()); |
101 if (has_exception) { | 101 if (has_exception) { |
102 isolate->ReportPendingMessages(); | 102 isolate->ReportPendingMessages(); |
103 // Reset stepping state when script exits with uncaught exception. | 103 // Reset stepping state when script exits with uncaught exception. |
104 if (isolate->debug()->is_active()) { | 104 if (isolate->debug()->is_active()) { |
105 isolate->debug()->ClearStepping(); | 105 isolate->debug()->ClearStepping(); |
106 } | 106 } |
107 return MaybeHandle<Object>(); | 107 return MaybeHandle<Object>(); |
108 } else { | 108 } else { |
109 isolate->clear_pending_message(); | 109 isolate->clear_pending_message(); |
110 } | 110 } |
(...skipping 13 matching lines...) Expand all Loading... |
124 isolate, callable, TryGetFunctionDelegate(isolate, callable), Object); | 124 isolate, callable, TryGetFunctionDelegate(isolate, callable), Object); |
125 } | 125 } |
126 Handle<JSFunction> func = Handle<JSFunction>::cast(callable); | 126 Handle<JSFunction> func = Handle<JSFunction>::cast(callable); |
127 | 127 |
128 // In sloppy mode, convert receiver. | 128 // In sloppy mode, convert receiver. |
129 if (convert_receiver && !receiver->IsJSReceiver() && | 129 if (convert_receiver && !receiver->IsJSReceiver() && |
130 !func->shared()->native() && | 130 !func->shared()->native() && |
131 func->shared()->strict_mode() == SLOPPY) { | 131 func->shared()->strict_mode() == SLOPPY) { |
132 if (receiver->IsUndefined() || receiver->IsNull()) { | 132 if (receiver->IsUndefined() || receiver->IsNull()) { |
133 receiver = handle(func->global_proxy()); | 133 receiver = handle(func->global_proxy()); |
134 ASSERT(!receiver->IsJSBuiltinsObject()); | 134 DCHECK(!receiver->IsJSBuiltinsObject()); |
135 } else { | 135 } else { |
136 ASSIGN_RETURN_ON_EXCEPTION( | 136 ASSIGN_RETURN_ON_EXCEPTION( |
137 isolate, receiver, ToObject(isolate, receiver), Object); | 137 isolate, receiver, ToObject(isolate, receiver), Object); |
138 } | 138 } |
139 } | 139 } |
140 | 140 |
141 return Invoke(false, func, receiver, argc, argv); | 141 return Invoke(false, func, receiver, argc, argv); |
142 } | 142 } |
143 | 143 |
144 | 144 |
(...skipping 16 matching lines...) Expand all Loading... |
161 v8::TryCatch catcher; | 161 v8::TryCatch catcher; |
162 catcher.SetVerbose(false); | 162 catcher.SetVerbose(false); |
163 catcher.SetCaptureMessage(false); | 163 catcher.SetCaptureMessage(false); |
164 | 164 |
165 // Get isolate now, because handle might be persistent | 165 // Get isolate now, because handle might be persistent |
166 // and get destroyed in the next call. | 166 // and get destroyed in the next call. |
167 Isolate* isolate = func->GetIsolate(); | 167 Isolate* isolate = func->GetIsolate(); |
168 MaybeHandle<Object> maybe_result = Invoke(false, func, receiver, argc, args); | 168 MaybeHandle<Object> maybe_result = Invoke(false, func, receiver, argc, args); |
169 | 169 |
170 if (maybe_result.is_null()) { | 170 if (maybe_result.is_null()) { |
171 ASSERT(catcher.HasCaught()); | 171 DCHECK(catcher.HasCaught()); |
172 ASSERT(isolate->has_pending_exception()); | 172 DCHECK(isolate->has_pending_exception()); |
173 ASSERT(isolate->external_caught_exception()); | 173 DCHECK(isolate->external_caught_exception()); |
174 if (exception_out != NULL) { | 174 if (exception_out != NULL) { |
175 if (isolate->pending_exception() == | 175 if (isolate->pending_exception() == |
176 isolate->heap()->termination_exception()) { | 176 isolate->heap()->termination_exception()) { |
177 *exception_out = isolate->factory()->termination_exception(); | 177 *exception_out = isolate->factory()->termination_exception(); |
178 } else { | 178 } else { |
179 *exception_out = v8::Utils::OpenHandle(*catcher.Exception()); | 179 *exception_out = v8::Utils::OpenHandle(*catcher.Exception()); |
180 } | 180 } |
181 } | 181 } |
182 isolate->OptionalRescheduleException(true); | 182 isolate->OptionalRescheduleException(true); |
183 } | 183 } |
184 | 184 |
185 ASSERT(!isolate->has_pending_exception()); | 185 DCHECK(!isolate->has_pending_exception()); |
186 ASSERT(!isolate->external_caught_exception()); | 186 DCHECK(!isolate->external_caught_exception()); |
187 return maybe_result; | 187 return maybe_result; |
188 } | 188 } |
189 | 189 |
190 | 190 |
191 Handle<Object> Execution::GetFunctionDelegate(Isolate* isolate, | 191 Handle<Object> Execution::GetFunctionDelegate(Isolate* isolate, |
192 Handle<Object> object) { | 192 Handle<Object> object) { |
193 ASSERT(!object->IsJSFunction()); | 193 DCHECK(!object->IsJSFunction()); |
194 Factory* factory = isolate->factory(); | 194 Factory* factory = isolate->factory(); |
195 | 195 |
196 // If you return a function from here, it will be called when an | 196 // If you return a function from here, it will be called when an |
197 // attempt is made to call the given object as a function. | 197 // attempt is made to call the given object as a function. |
198 | 198 |
199 // If object is a function proxy, get its handler. Iterate if necessary. | 199 // If object is a function proxy, get its handler. Iterate if necessary. |
200 Object* fun = *object; | 200 Object* fun = *object; |
201 while (fun->IsJSFunctionProxy()) { | 201 while (fun->IsJSFunctionProxy()) { |
202 fun = JSFunctionProxy::cast(fun)->call_trap(); | 202 fun = JSFunctionProxy::cast(fun)->call_trap(); |
203 } | 203 } |
204 if (fun->IsJSFunction()) return Handle<Object>(fun, isolate); | 204 if (fun->IsJSFunction()) return Handle<Object>(fun, isolate); |
205 | 205 |
206 // Objects created through the API can have an instance-call handler | 206 // Objects created through the API can have an instance-call handler |
207 // that should be used when calling the object as a function. | 207 // that should be used when calling the object as a function. |
208 if (fun->IsHeapObject() && | 208 if (fun->IsHeapObject() && |
209 HeapObject::cast(fun)->map()->has_instance_call_handler()) { | 209 HeapObject::cast(fun)->map()->has_instance_call_handler()) { |
210 return Handle<JSFunction>( | 210 return Handle<JSFunction>( |
211 isolate->native_context()->call_as_function_delegate()); | 211 isolate->native_context()->call_as_function_delegate()); |
212 } | 212 } |
213 | 213 |
214 return factory->undefined_value(); | 214 return factory->undefined_value(); |
215 } | 215 } |
216 | 216 |
217 | 217 |
218 MaybeHandle<Object> Execution::TryGetFunctionDelegate(Isolate* isolate, | 218 MaybeHandle<Object> Execution::TryGetFunctionDelegate(Isolate* isolate, |
219 Handle<Object> object) { | 219 Handle<Object> object) { |
220 ASSERT(!object->IsJSFunction()); | 220 DCHECK(!object->IsJSFunction()); |
221 | 221 |
222 // If object is a function proxy, get its handler. Iterate if necessary. | 222 // If object is a function proxy, get its handler. Iterate if necessary. |
223 Object* fun = *object; | 223 Object* fun = *object; |
224 while (fun->IsJSFunctionProxy()) { | 224 while (fun->IsJSFunctionProxy()) { |
225 fun = JSFunctionProxy::cast(fun)->call_trap(); | 225 fun = JSFunctionProxy::cast(fun)->call_trap(); |
226 } | 226 } |
227 if (fun->IsJSFunction()) return Handle<Object>(fun, isolate); | 227 if (fun->IsJSFunction()) return Handle<Object>(fun, isolate); |
228 | 228 |
229 // Objects created through the API can have an instance-call handler | 229 // Objects created through the API can have an instance-call handler |
230 // that should be used when calling the object as a function. | 230 // that should be used when calling the object as a function. |
231 if (fun->IsHeapObject() && | 231 if (fun->IsHeapObject() && |
232 HeapObject::cast(fun)->map()->has_instance_call_handler()) { | 232 HeapObject::cast(fun)->map()->has_instance_call_handler()) { |
233 return Handle<JSFunction>( | 233 return Handle<JSFunction>( |
234 isolate->native_context()->call_as_function_delegate()); | 234 isolate->native_context()->call_as_function_delegate()); |
235 } | 235 } |
236 | 236 |
237 // If the Object doesn't have an instance-call handler we should | 237 // If the Object doesn't have an instance-call handler we should |
238 // throw a non-callable exception. | 238 // throw a non-callable exception. |
239 i::Handle<i::Object> error_obj = isolate->factory()->NewTypeError( | 239 i::Handle<i::Object> error_obj = isolate->factory()->NewTypeError( |
240 "called_non_callable", i::HandleVector<i::Object>(&object, 1)); | 240 "called_non_callable", i::HandleVector<i::Object>(&object, 1)); |
241 | 241 |
242 return isolate->Throw<Object>(error_obj); | 242 return isolate->Throw<Object>(error_obj); |
243 } | 243 } |
244 | 244 |
245 | 245 |
246 Handle<Object> Execution::GetConstructorDelegate(Isolate* isolate, | 246 Handle<Object> Execution::GetConstructorDelegate(Isolate* isolate, |
247 Handle<Object> object) { | 247 Handle<Object> object) { |
248 ASSERT(!object->IsJSFunction()); | 248 DCHECK(!object->IsJSFunction()); |
249 | 249 |
250 // If you return a function from here, it will be called when an | 250 // If you return a function from here, it will be called when an |
251 // attempt is made to call the given object as a constructor. | 251 // attempt is made to call the given object as a constructor. |
252 | 252 |
253 // If object is a function proxies, get its handler. Iterate if necessary. | 253 // If object is a function proxies, get its handler. Iterate if necessary. |
254 Object* fun = *object; | 254 Object* fun = *object; |
255 while (fun->IsJSFunctionProxy()) { | 255 while (fun->IsJSFunctionProxy()) { |
256 fun = JSFunctionProxy::cast(fun)->call_trap(); | 256 fun = JSFunctionProxy::cast(fun)->call_trap(); |
257 } | 257 } |
258 if (fun->IsJSFunction()) return Handle<Object>(fun, isolate); | 258 if (fun->IsJSFunction()) return Handle<Object>(fun, isolate); |
259 | 259 |
260 // Objects created through the API can have an instance-call handler | 260 // Objects created through the API can have an instance-call handler |
261 // that should be used when calling the object as a function. | 261 // that should be used when calling the object as a function. |
262 if (fun->IsHeapObject() && | 262 if (fun->IsHeapObject() && |
263 HeapObject::cast(fun)->map()->has_instance_call_handler()) { | 263 HeapObject::cast(fun)->map()->has_instance_call_handler()) { |
264 return Handle<JSFunction>( | 264 return Handle<JSFunction>( |
265 isolate->native_context()->call_as_constructor_delegate()); | 265 isolate->native_context()->call_as_constructor_delegate()); |
266 } | 266 } |
267 | 267 |
268 return isolate->factory()->undefined_value(); | 268 return isolate->factory()->undefined_value(); |
269 } | 269 } |
270 | 270 |
271 | 271 |
272 MaybeHandle<Object> Execution::TryGetConstructorDelegate( | 272 MaybeHandle<Object> Execution::TryGetConstructorDelegate( |
273 Isolate* isolate, Handle<Object> object) { | 273 Isolate* isolate, Handle<Object> object) { |
274 ASSERT(!object->IsJSFunction()); | 274 DCHECK(!object->IsJSFunction()); |
275 | 275 |
276 // If you return a function from here, it will be called when an | 276 // If you return a function from here, it will be called when an |
277 // attempt is made to call the given object as a constructor. | 277 // attempt is made to call the given object as a constructor. |
278 | 278 |
279 // If object is a function proxies, get its handler. Iterate if necessary. | 279 // If object is a function proxies, get its handler. Iterate if necessary. |
280 Object* fun = *object; | 280 Object* fun = *object; |
281 while (fun->IsJSFunctionProxy()) { | 281 while (fun->IsJSFunctionProxy()) { |
282 fun = JSFunctionProxy::cast(fun)->call_trap(); | 282 fun = JSFunctionProxy::cast(fun)->call_trap(); |
283 } | 283 } |
284 if (fun->IsJSFunction()) return Handle<Object>(fun, isolate); | 284 if (fun->IsJSFunction()) return Handle<Object>(fun, isolate); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 // Add scope to the chain. | 339 // Add scope to the chain. |
340 scope->prev_ = thread_local_.postpone_interrupts_; | 340 scope->prev_ = thread_local_.postpone_interrupts_; |
341 thread_local_.postpone_interrupts_ = scope; | 341 thread_local_.postpone_interrupts_ = scope; |
342 } | 342 } |
343 | 343 |
344 | 344 |
345 void StackGuard::PopPostponeInterruptsScope() { | 345 void StackGuard::PopPostponeInterruptsScope() { |
346 ExecutionAccess access(isolate_); | 346 ExecutionAccess access(isolate_); |
347 PostponeInterruptsScope* top = thread_local_.postpone_interrupts_; | 347 PostponeInterruptsScope* top = thread_local_.postpone_interrupts_; |
348 // Make intercepted interrupts active. | 348 // Make intercepted interrupts active. |
349 ASSERT((thread_local_.interrupt_flags_ & top->intercept_mask_) == 0); | 349 DCHECK((thread_local_.interrupt_flags_ & top->intercept_mask_) == 0); |
350 thread_local_.interrupt_flags_ |= top->intercepted_flags_; | 350 thread_local_.interrupt_flags_ |= top->intercepted_flags_; |
351 if (has_pending_interrupts(access)) set_interrupt_limits(access); | 351 if (has_pending_interrupts(access)) set_interrupt_limits(access); |
352 // Remove scope from chain. | 352 // Remove scope from chain. |
353 thread_local_.postpone_interrupts_ = top->prev_; | 353 thread_local_.postpone_interrupts_ = top->prev_; |
354 } | 354 } |
355 | 355 |
356 | 356 |
357 bool StackGuard::CheckInterrupt(InterruptFlag flag) { | 357 bool StackGuard::CheckInterrupt(InterruptFlag flag) { |
358 ExecutionAccess access(isolate_); | 358 ExecutionAccess access(isolate_); |
359 return thread_local_.interrupt_flags_ & flag; | 359 return thread_local_.interrupt_flags_ & flag; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 climit_ = kIllegalLimit; | 437 climit_ = kIllegalLimit; |
438 postpone_interrupts_ = NULL; | 438 postpone_interrupts_ = NULL; |
439 interrupt_flags_ = 0; | 439 interrupt_flags_ = 0; |
440 } | 440 } |
441 | 441 |
442 | 442 |
443 bool StackGuard::ThreadLocal::Initialize(Isolate* isolate) { | 443 bool StackGuard::ThreadLocal::Initialize(Isolate* isolate) { |
444 bool should_set_stack_limits = false; | 444 bool should_set_stack_limits = false; |
445 if (real_climit_ == kIllegalLimit) { | 445 if (real_climit_ == kIllegalLimit) { |
446 const uintptr_t kLimitSize = FLAG_stack_size * KB; | 446 const uintptr_t kLimitSize = FLAG_stack_size * KB; |
447 ASSERT(GetCurrentStackPosition() > kLimitSize); | 447 DCHECK(GetCurrentStackPosition() > kLimitSize); |
448 uintptr_t limit = GetCurrentStackPosition() - kLimitSize; | 448 uintptr_t limit = GetCurrentStackPosition() - kLimitSize; |
449 real_jslimit_ = SimulatorStack::JsLimitFromCLimit(isolate, limit); | 449 real_jslimit_ = SimulatorStack::JsLimitFromCLimit(isolate, limit); |
450 jslimit_ = SimulatorStack::JsLimitFromCLimit(isolate, limit); | 450 jslimit_ = SimulatorStack::JsLimitFromCLimit(isolate, limit); |
451 real_climit_ = limit; | 451 real_climit_ = limit; |
452 climit_ = limit; | 452 climit_ = limit; |
453 should_set_stack_limits = true; | 453 should_set_stack_limits = true; |
454 } | 454 } |
455 postpone_interrupts_ = NULL; | 455 postpone_interrupts_ = NULL; |
456 interrupt_flags_ = 0; | 456 interrupt_flags_ = 0; |
457 return should_set_stack_limits; | 457 return should_set_stack_limits; |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 | 681 |
682 if (CheckAndClearInterrupt(TERMINATE_EXECUTION)) { | 682 if (CheckAndClearInterrupt(TERMINATE_EXECUTION)) { |
683 return isolate_->TerminateExecution(); | 683 return isolate_->TerminateExecution(); |
684 } | 684 } |
685 | 685 |
686 if (CheckAndClearInterrupt(DEOPT_MARKED_ALLOCATION_SITES)) { | 686 if (CheckAndClearInterrupt(DEOPT_MARKED_ALLOCATION_SITES)) { |
687 isolate_->heap()->DeoptMarkedAllocationSites(); | 687 isolate_->heap()->DeoptMarkedAllocationSites(); |
688 } | 688 } |
689 | 689 |
690 if (CheckAndClearInterrupt(INSTALL_CODE)) { | 690 if (CheckAndClearInterrupt(INSTALL_CODE)) { |
691 ASSERT(isolate_->concurrent_recompilation_enabled()); | 691 DCHECK(isolate_->concurrent_recompilation_enabled()); |
692 isolate_->optimizing_compiler_thread()->InstallOptimizedFunctions(); | 692 isolate_->optimizing_compiler_thread()->InstallOptimizedFunctions(); |
693 } | 693 } |
694 | 694 |
695 if (CheckAndClearInterrupt(API_INTERRUPT)) { | 695 if (CheckAndClearInterrupt(API_INTERRUPT)) { |
696 // Callback must be invoked outside of ExecusionAccess lock. | 696 // Callback must be invoked outside of ExecusionAccess lock. |
697 isolate_->InvokeApiInterruptCallback(); | 697 isolate_->InvokeApiInterruptCallback(); |
698 } | 698 } |
699 | 699 |
700 isolate_->counters()->stack_interrupts()->Increment(); | 700 isolate_->counters()->stack_interrupts()->Increment(); |
701 isolate_->counters()->runtime_profiler_ticks()->Increment(); | 701 isolate_->counters()->runtime_profiler_ticks()->Increment(); |
702 isolate_->runtime_profiler()->OptimizeNow(); | 702 isolate_->runtime_profiler()->OptimizeNow(); |
703 | 703 |
704 return isolate_->heap()->undefined_value(); | 704 return isolate_->heap()->undefined_value(); |
705 } | 705 } |
706 | 706 |
707 } } // namespace v8::internal | 707 } } // namespace v8::internal |
OLD | NEW |