| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #ifndef V8_COMPILER_H_ | 5 #ifndef V8_COMPILER_H_ |
| 6 #define V8_COMPILER_H_ | 6 #define V8_COMPILER_H_ |
| 7 | 7 |
| 8 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "src/allocation.h" | 10 #include "src/allocation.h" |
| 11 #include "src/bailout-reason.h" | 11 #include "src/bailout-reason.h" |
| 12 #include "src/compilation-dependencies.h" | |
| 13 #include "src/contexts.h" | 12 #include "src/contexts.h" |
| 14 #include "src/frames.h" | |
| 15 #include "src/isolate.h" | 13 #include "src/isolate.h" |
| 16 #include "src/source-position-table.h" | |
| 17 #include "src/source-position.h" | |
| 18 #include "src/zone.h" | 14 #include "src/zone.h" |
| 19 | 15 |
| 20 namespace v8 { | 16 namespace v8 { |
| 21 namespace internal { | 17 namespace internal { |
| 22 | 18 |
| 23 // Forward declarations. | 19 // Forward declarations. |
| 24 class CompilationInfo; | 20 class CompilationInfo; |
| 25 class CompilationJob; | 21 class CompilationJob; |
| 26 class JavaScriptFrame; | 22 class JavaScriptFrame; |
| 27 class ParseInfo; | 23 class ParseInfo; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 // Please note this interface is the only part dealing with {Code} objects | 130 // Please note this interface is the only part dealing with {Code} objects |
| 135 // directly. Other methods are agnostic to {Code} and can use an interpreter | 131 // directly. Other methods are agnostic to {Code} and can use an interpreter |
| 136 // instead of generating JIT code for a function at all. | 132 // instead of generating JIT code for a function at all. |
| 137 | 133 |
| 138 // Generate and return optimized code for OSR, or empty handle on failure. | 134 // Generate and return optimized code for OSR, or empty handle on failure. |
| 139 MUST_USE_RESULT static MaybeHandle<Code> GetOptimizedCodeForOSR( | 135 MUST_USE_RESULT static MaybeHandle<Code> GetOptimizedCodeForOSR( |
| 140 Handle<JSFunction> function, BailoutId osr_ast_id, | 136 Handle<JSFunction> function, BailoutId osr_ast_id, |
| 141 JavaScriptFrame* osr_frame); | 137 JavaScriptFrame* osr_frame); |
| 142 }; | 138 }; |
| 143 | 139 |
| 144 | |
| 145 // CompilationInfo encapsulates some information known at compile time. It | |
| 146 // is constructed based on the resources available at compile-time. | |
| 147 class CompilationInfo final { | |
| 148 public: | |
| 149 // Various configuration flags for a compilation, as well as some properties | |
| 150 // of the compiled code produced by a compilation. | |
| 151 enum Flag { | |
| 152 kDeferredCalling = 1 << 0, | |
| 153 kNonDeferredCalling = 1 << 1, | |
| 154 kSavesCallerDoubles = 1 << 2, | |
| 155 kRequiresFrame = 1 << 3, | |
| 156 kMustNotHaveEagerFrame = 1 << 4, | |
| 157 kDeoptimizationSupport = 1 << 5, | |
| 158 kDebug = 1 << 6, | |
| 159 kSerializing = 1 << 7, | |
| 160 kFunctionContextSpecializing = 1 << 8, | |
| 161 kFrameSpecializing = 1 << 9, | |
| 162 kNativeContextSpecializing = 1 << 10, | |
| 163 kInliningEnabled = 1 << 11, | |
| 164 kDisableFutureOptimization = 1 << 12, | |
| 165 kSplittingEnabled = 1 << 13, | |
| 166 kDeoptimizationEnabled = 1 << 14, | |
| 167 kSourcePositionsEnabled = 1 << 15, | |
| 168 kBailoutOnUninitialized = 1 << 16, | |
| 169 kOptimizeFromBytecode = 1 << 17, | |
| 170 kTypeFeedbackEnabled = 1 << 18, | |
| 171 kAccessorInliningEnabled = 1 << 19, | |
| 172 }; | |
| 173 | |
| 174 CompilationInfo(ParseInfo* parse_info, Handle<JSFunction> closure); | |
| 175 CompilationInfo(Vector<const char> debug_name, Isolate* isolate, Zone* zone, | |
| 176 Code::Flags code_flags); | |
| 177 ~CompilationInfo(); | |
| 178 | |
| 179 ParseInfo* parse_info() const { return parse_info_; } | |
| 180 | |
| 181 // ----------------------------------------------------------- | |
| 182 // TODO(titzer): inline and delete accessors of ParseInfo | |
| 183 // ----------------------------------------------------------- | |
| 184 Handle<Script> script() const; | |
| 185 FunctionLiteral* literal() const; | |
| 186 DeclarationScope* scope() const; | |
| 187 Handle<Context> context() const; | |
| 188 Handle<SharedFunctionInfo> shared_info() const; | |
| 189 bool has_shared_info() const; | |
| 190 // ----------------------------------------------------------- | |
| 191 | |
| 192 Isolate* isolate() const { | |
| 193 return isolate_; | |
| 194 } | |
| 195 Zone* zone() { return zone_; } | |
| 196 bool is_osr() const { return !osr_ast_id_.IsNone(); } | |
| 197 Handle<JSFunction> closure() const { return closure_; } | |
| 198 Handle<Code> code() const { return code_; } | |
| 199 Code::Flags code_flags() const { return code_flags_; } | |
| 200 BailoutId osr_ast_id() const { return osr_ast_id_; } | |
| 201 JavaScriptFrame* osr_frame() const { return osr_frame_; } | |
| 202 int num_parameters() const; | |
| 203 int num_parameters_including_this() const; | |
| 204 bool is_this_defined() const; | |
| 205 | |
| 206 void set_parameter_count(int parameter_count) { | |
| 207 DCHECK(IsStub()); | |
| 208 parameter_count_ = parameter_count; | |
| 209 } | |
| 210 | |
| 211 bool has_bytecode_array() const { return !bytecode_array_.is_null(); } | |
| 212 Handle<BytecodeArray> bytecode_array() const { return bytecode_array_; } | |
| 213 | |
| 214 bool is_tracking_positions() const { return track_positions_; } | |
| 215 | |
| 216 bool is_calling() const { | |
| 217 return GetFlag(kDeferredCalling) || GetFlag(kNonDeferredCalling); | |
| 218 } | |
| 219 | |
| 220 void MarkAsDeferredCalling() { SetFlag(kDeferredCalling); } | |
| 221 | |
| 222 bool is_deferred_calling() const { return GetFlag(kDeferredCalling); } | |
| 223 | |
| 224 void MarkAsNonDeferredCalling() { SetFlag(kNonDeferredCalling); } | |
| 225 | |
| 226 bool is_non_deferred_calling() const { return GetFlag(kNonDeferredCalling); } | |
| 227 | |
| 228 void MarkAsSavesCallerDoubles() { SetFlag(kSavesCallerDoubles); } | |
| 229 | |
| 230 bool saves_caller_doubles() const { return GetFlag(kSavesCallerDoubles); } | |
| 231 | |
| 232 void MarkAsRequiresFrame() { SetFlag(kRequiresFrame); } | |
| 233 | |
| 234 bool requires_frame() const { return GetFlag(kRequiresFrame); } | |
| 235 | |
| 236 void MarkMustNotHaveEagerFrame() { SetFlag(kMustNotHaveEagerFrame); } | |
| 237 | |
| 238 bool GetMustNotHaveEagerFrame() const { | |
| 239 return GetFlag(kMustNotHaveEagerFrame); | |
| 240 } | |
| 241 | |
| 242 // Compiles marked as debug produce unoptimized code with debug break slots. | |
| 243 // Inner functions that cannot be compiled w/o context are compiled eagerly. | |
| 244 // Always include deoptimization support to avoid having to recompile again. | |
| 245 void MarkAsDebug() { | |
| 246 SetFlag(kDebug); | |
| 247 SetFlag(kDeoptimizationSupport); | |
| 248 } | |
| 249 | |
| 250 bool is_debug() const { return GetFlag(kDebug); } | |
| 251 | |
| 252 void PrepareForSerializing() { SetFlag(kSerializing); } | |
| 253 | |
| 254 bool will_serialize() const { return GetFlag(kSerializing); } | |
| 255 | |
| 256 void MarkAsFunctionContextSpecializing() { | |
| 257 SetFlag(kFunctionContextSpecializing); | |
| 258 } | |
| 259 | |
| 260 bool is_function_context_specializing() const { | |
| 261 return GetFlag(kFunctionContextSpecializing); | |
| 262 } | |
| 263 | |
| 264 void MarkAsFrameSpecializing() { SetFlag(kFrameSpecializing); } | |
| 265 | |
| 266 bool is_frame_specializing() const { return GetFlag(kFrameSpecializing); } | |
| 267 | |
| 268 void MarkAsNativeContextSpecializing() { | |
| 269 SetFlag(kNativeContextSpecializing); | |
| 270 } | |
| 271 | |
| 272 bool is_native_context_specializing() const { | |
| 273 return GetFlag(kNativeContextSpecializing); | |
| 274 } | |
| 275 | |
| 276 void MarkAsDeoptimizationEnabled() { SetFlag(kDeoptimizationEnabled); } | |
| 277 | |
| 278 bool is_deoptimization_enabled() const { | |
| 279 return GetFlag(kDeoptimizationEnabled); | |
| 280 } | |
| 281 | |
| 282 void MarkAsTypeFeedbackEnabled() { SetFlag(kTypeFeedbackEnabled); } | |
| 283 | |
| 284 bool is_type_feedback_enabled() const { | |
| 285 return GetFlag(kTypeFeedbackEnabled); | |
| 286 } | |
| 287 | |
| 288 void MarkAsAccessorInliningEnabled() { SetFlag(kAccessorInliningEnabled); } | |
| 289 | |
| 290 bool is_accessor_inlining_enabled() const { | |
| 291 return GetFlag(kAccessorInliningEnabled); | |
| 292 } | |
| 293 | |
| 294 void MarkAsSourcePositionsEnabled() { SetFlag(kSourcePositionsEnabled); } | |
| 295 | |
| 296 bool is_source_positions_enabled() const { | |
| 297 return GetFlag(kSourcePositionsEnabled); | |
| 298 } | |
| 299 | |
| 300 void MarkAsInliningEnabled() { SetFlag(kInliningEnabled); } | |
| 301 | |
| 302 bool is_inlining_enabled() const { return GetFlag(kInliningEnabled); } | |
| 303 | |
| 304 void MarkAsSplittingEnabled() { SetFlag(kSplittingEnabled); } | |
| 305 | |
| 306 bool is_splitting_enabled() const { return GetFlag(kSplittingEnabled); } | |
| 307 | |
| 308 void MarkAsBailoutOnUninitialized() { SetFlag(kBailoutOnUninitialized); } | |
| 309 | |
| 310 bool is_bailout_on_uninitialized() const { | |
| 311 return GetFlag(kBailoutOnUninitialized); | |
| 312 } | |
| 313 | |
| 314 void MarkAsOptimizeFromBytecode() { SetFlag(kOptimizeFromBytecode); } | |
| 315 | |
| 316 bool is_optimizing_from_bytecode() const { | |
| 317 return GetFlag(kOptimizeFromBytecode); | |
| 318 } | |
| 319 | |
| 320 bool GeneratePreagedPrologue() const { | |
| 321 // Generate a pre-aged prologue if we are optimizing for size, which | |
| 322 // will make code flushing more aggressive. Only apply to Code::FUNCTION, | |
| 323 // since StaticMarkingVisitor::IsFlushable only flushes proper functions. | |
| 324 return FLAG_optimize_for_size && FLAG_age_code && !is_debug() && | |
| 325 output_code_kind() == Code::FUNCTION; | |
| 326 } | |
| 327 | |
| 328 void SetCode(Handle<Code> code) { code_ = code; } | |
| 329 | |
| 330 void SetBytecodeArray(Handle<BytecodeArray> bytecode_array) { | |
| 331 bytecode_array_ = bytecode_array; | |
| 332 } | |
| 333 | |
| 334 bool ShouldTrapOnDeopt() const { | |
| 335 return (FLAG_trap_on_deopt && IsOptimizing()) || | |
| 336 (FLAG_trap_on_stub_deopt && IsStub()); | |
| 337 } | |
| 338 | |
| 339 bool has_native_context() const; | |
| 340 Context* native_context() const; | |
| 341 | |
| 342 bool has_global_object() const; | |
| 343 JSGlobalObject* global_object() const; | |
| 344 | |
| 345 // Accessors for the different compilation modes. | |
| 346 bool IsOptimizing() const { return mode_ == OPTIMIZE; } | |
| 347 bool IsStub() const { return mode_ == STUB; } | |
| 348 void SetOptimizing() { | |
| 349 DCHECK(has_shared_info()); | |
| 350 SetMode(OPTIMIZE); | |
| 351 optimization_id_ = isolate()->NextOptimizationId(); | |
| 352 code_flags_ = | |
| 353 Code::KindField::update(code_flags_, Code::OPTIMIZED_FUNCTION); | |
| 354 } | |
| 355 void SetOptimizingForOsr(BailoutId osr_ast_id, JavaScriptFrame* osr_frame) { | |
| 356 SetOptimizing(); | |
| 357 osr_ast_id_ = osr_ast_id; | |
| 358 osr_frame_ = osr_frame; | |
| 359 } | |
| 360 | |
| 361 // Deoptimization support. | |
| 362 bool HasDeoptimizationSupport() const { | |
| 363 return GetFlag(kDeoptimizationSupport); | |
| 364 } | |
| 365 void EnableDeoptimizationSupport() { | |
| 366 DCHECK_EQ(BASE, mode_); | |
| 367 SetFlag(kDeoptimizationSupport); | |
| 368 } | |
| 369 bool ShouldEnsureSpaceForLazyDeopt() { return !IsStub(); } | |
| 370 | |
| 371 bool ExpectsJSReceiverAsReceiver(); | |
| 372 | |
| 373 // Determines whether or not to insert a self-optimization header. | |
| 374 bool ShouldSelfOptimize(); | |
| 375 | |
| 376 void set_deferred_handles(DeferredHandles* deferred_handles) { | |
| 377 DCHECK(deferred_handles_ == NULL); | |
| 378 deferred_handles_ = deferred_handles; | |
| 379 } | |
| 380 | |
| 381 void ReopenHandlesInNewHandleScope(); | |
| 382 | |
| 383 void AbortOptimization(BailoutReason reason) { | |
| 384 DCHECK(reason != kNoReason); | |
| 385 if (bailout_reason_ == kNoReason) bailout_reason_ = reason; | |
| 386 SetFlag(kDisableFutureOptimization); | |
| 387 } | |
| 388 | |
| 389 void RetryOptimization(BailoutReason reason) { | |
| 390 DCHECK(reason != kNoReason); | |
| 391 if (GetFlag(kDisableFutureOptimization)) return; | |
| 392 bailout_reason_ = reason; | |
| 393 } | |
| 394 | |
| 395 BailoutReason bailout_reason() const { return bailout_reason_; } | |
| 396 | |
| 397 int prologue_offset() const { | |
| 398 DCHECK_NE(Code::kPrologueOffsetNotSet, prologue_offset_); | |
| 399 return prologue_offset_; | |
| 400 } | |
| 401 | |
| 402 void set_prologue_offset(int prologue_offset) { | |
| 403 DCHECK_EQ(Code::kPrologueOffsetNotSet, prologue_offset_); | |
| 404 prologue_offset_ = prologue_offset; | |
| 405 } | |
| 406 | |
| 407 CompilationDependencies* dependencies() { return &dependencies_; } | |
| 408 | |
| 409 int optimization_id() const { return optimization_id_; } | |
| 410 | |
| 411 int osr_expr_stack_height() { return osr_expr_stack_height_; } | |
| 412 void set_osr_expr_stack_height(int height) { | |
| 413 DCHECK(height >= 0); | |
| 414 osr_expr_stack_height_ = height; | |
| 415 } | |
| 416 | |
| 417 bool has_simple_parameters(); | |
| 418 | |
| 419 struct InlinedFunctionHolder { | |
| 420 Handle<SharedFunctionInfo> shared_info; | |
| 421 | |
| 422 // Root that holds the unoptimized code of the inlined function alive | |
| 423 // (and out of reach of code flushing) until we finish compilation. | |
| 424 // Do not remove. | |
| 425 Handle<Code> inlined_code_object_root; | |
| 426 | |
| 427 InlinedFunctionHolder(Handle<SharedFunctionInfo> inlined_shared_info, | |
| 428 Handle<Code> inlined_code_object_root) | |
| 429 : shared_info(inlined_shared_info), | |
| 430 inlined_code_object_root(inlined_code_object_root) {} | |
| 431 }; | |
| 432 | |
| 433 typedef std::vector<InlinedFunctionHolder> InlinedFunctionList; | |
| 434 InlinedFunctionList const& inlined_functions() const { | |
| 435 return inlined_functions_; | |
| 436 } | |
| 437 | |
| 438 void AddInlinedFunction(Handle<SharedFunctionInfo> inlined_function); | |
| 439 | |
| 440 std::unique_ptr<char[]> GetDebugName() const; | |
| 441 | |
| 442 Code::Kind output_code_kind() const; | |
| 443 | |
| 444 StackFrame::Type GetOutputStackFrameType() const; | |
| 445 | |
| 446 int GetDeclareGlobalsFlags() const; | |
| 447 | |
| 448 SourcePositionTableBuilder::RecordingMode SourcePositionRecordingMode() const; | |
| 449 | |
| 450 private: | |
| 451 // Compilation mode. | |
| 452 // BASE is generated by the full codegen, optionally prepared for bailouts. | |
| 453 // OPTIMIZE is optimized code generated by the Hydrogen-based backend. | |
| 454 enum Mode { | |
| 455 BASE, | |
| 456 OPTIMIZE, | |
| 457 STUB | |
| 458 }; | |
| 459 | |
| 460 CompilationInfo(ParseInfo* parse_info, Vector<const char> debug_name, | |
| 461 Code::Flags code_flags, Mode mode, Isolate* isolate, | |
| 462 Zone* zone); | |
| 463 | |
| 464 ParseInfo* parse_info_; | |
| 465 Isolate* isolate_; | |
| 466 | |
| 467 void SetMode(Mode mode) { | |
| 468 mode_ = mode; | |
| 469 } | |
| 470 | |
| 471 void SetFlag(Flag flag) { flags_ |= flag; } | |
| 472 | |
| 473 void SetFlag(Flag flag, bool value) { | |
| 474 flags_ = value ? flags_ | flag : flags_ & ~flag; | |
| 475 } | |
| 476 | |
| 477 bool GetFlag(Flag flag) const { return (flags_ & flag) != 0; } | |
| 478 | |
| 479 unsigned flags_; | |
| 480 | |
| 481 Code::Flags code_flags_; | |
| 482 | |
| 483 Handle<JSFunction> closure_; | |
| 484 | |
| 485 // The compiled code. | |
| 486 Handle<Code> code_; | |
| 487 | |
| 488 // Compilation mode flag and whether deoptimization is allowed. | |
| 489 Mode mode_; | |
| 490 BailoutId osr_ast_id_; | |
| 491 | |
| 492 // Holds the bytecode array generated by the interpreter. | |
| 493 // TODO(rmcilroy/mstarzinger): Temporary work-around until compiler.cc is | |
| 494 // refactored to avoid us needing to carry the BytcodeArray around. | |
| 495 Handle<BytecodeArray> bytecode_array_; | |
| 496 | |
| 497 // The zone from which the compilation pipeline working on this | |
| 498 // CompilationInfo allocates. | |
| 499 Zone* zone_; | |
| 500 | |
| 501 DeferredHandles* deferred_handles_; | |
| 502 | |
| 503 // Dependencies for this compilation, e.g. stable maps. | |
| 504 CompilationDependencies dependencies_; | |
| 505 | |
| 506 BailoutReason bailout_reason_; | |
| 507 | |
| 508 int prologue_offset_; | |
| 509 | |
| 510 bool track_positions_; | |
| 511 | |
| 512 InlinedFunctionList inlined_functions_; | |
| 513 | |
| 514 // Number of parameters used for compilation of stubs that require arguments. | |
| 515 int parameter_count_; | |
| 516 | |
| 517 int optimization_id_; | |
| 518 | |
| 519 int osr_expr_stack_height_; | |
| 520 | |
| 521 // The current OSR frame for specialization or {nullptr}. | |
| 522 JavaScriptFrame* osr_frame_ = nullptr; | |
| 523 | |
| 524 Vector<const char> debug_name_; | |
| 525 | |
| 526 DISALLOW_COPY_AND_ASSIGN(CompilationInfo); | |
| 527 }; | |
| 528 | |
| 529 // A base class for compilation jobs intended to run concurrent to the main | 140 // A base class for compilation jobs intended to run concurrent to the main |
| 530 // thread. The job is split into three phases which are called in sequence on | 141 // thread. The job is split into three phases which are called in sequence on |
| 531 // different threads and with different limitations: | 142 // different threads and with different limitations: |
| 532 // 1) PrepareJob: Runs on main thread. No major limitations. | 143 // 1) PrepareJob: Runs on main thread. No major limitations. |
| 533 // 2) ExecuteJob: Runs concurrently. No heap allocation or handle derefs. | 144 // 2) ExecuteJob: Runs concurrently. No heap allocation or handle derefs. |
| 534 // 3) FinalizeJob: Runs on main thread. No dependency changes. | 145 // 3) FinalizeJob: Runs on main thread. No dependency changes. |
| 535 // | 146 // |
| 536 // Each of the three phases can either fail or succeed. The current state of | 147 // Each of the three phases can either fail or succeed. The current state of |
| 537 // the job can be checked using {state()}. | 148 // the job can be checked using {state()}. |
| 538 class CompilationJob { | 149 class CompilationJob { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 560 | 171 |
| 561 // Executes the compile job. Can be called on a background thread if | 172 // Executes the compile job. Can be called on a background thread if |
| 562 // can_execute_on_background_thread() returns true. | 173 // can_execute_on_background_thread() returns true. |
| 563 MUST_USE_RESULT Status ExecuteJob(); | 174 MUST_USE_RESULT Status ExecuteJob(); |
| 564 | 175 |
| 565 // Finalizes the compile job. Must be called on the main thread. | 176 // Finalizes the compile job. Must be called on the main thread. |
| 566 MUST_USE_RESULT Status FinalizeJob(); | 177 MUST_USE_RESULT Status FinalizeJob(); |
| 567 | 178 |
| 568 // Report a transient failure, try again next time. Should only be called on | 179 // Report a transient failure, try again next time. Should only be called on |
| 569 // optimization compilation jobs. | 180 // optimization compilation jobs. |
| 570 Status RetryOptimization(BailoutReason reason) { | 181 Status RetryOptimization(BailoutReason reason); |
| 571 DCHECK(info_->IsOptimizing()); | |
| 572 info_->RetryOptimization(reason); | |
| 573 state_ = State::kFailed; | |
| 574 return FAILED; | |
| 575 } | |
| 576 | 182 |
| 577 // Report a persistent failure, disable future optimization on the function. | 183 // Report a persistent failure, disable future optimization on the function. |
| 578 // Should only be called on optimization compilation jobs. | 184 // Should only be called on optimization compilation jobs. |
| 579 Status AbortOptimization(BailoutReason reason) { | 185 Status AbortOptimization(BailoutReason reason); |
| 580 DCHECK(info_->IsOptimizing()); | |
| 581 info_->AbortOptimization(reason); | |
| 582 state_ = State::kFailed; | |
| 583 return FAILED; | |
| 584 } | |
| 585 | 186 |
| 586 void RecordOptimizedCompilationStats() const; | 187 void RecordOptimizedCompilationStats() const; |
| 587 void RecordUnoptimizedCompilationStats() const; | 188 void RecordUnoptimizedCompilationStats() const; |
| 588 | 189 |
| 589 virtual bool can_execute_on_background_thread() const { return true; } | 190 virtual bool can_execute_on_background_thread() const { return true; } |
| 590 | 191 |
| 591 void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; } | 192 void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; } |
| 592 uintptr_t stack_limit() const { return stack_limit_; } | 193 uintptr_t stack_limit() const { return stack_limit_; } |
| 593 | 194 |
| 594 State state() const { return state_; } | 195 State state() const { return state_; } |
| 595 CompilationInfo* info() const { return info_; } | 196 CompilationInfo* info() const { return info_; } |
| 596 Isolate* isolate() const { return info()->isolate(); } | 197 Isolate* isolate() const; |
| 597 | 198 |
| 598 protected: | 199 protected: |
| 599 // Overridden by the actual implementation. | 200 // Overridden by the actual implementation. |
| 600 virtual Status PrepareJobImpl() = 0; | 201 virtual Status PrepareJobImpl() = 0; |
| 601 virtual Status ExecuteJobImpl() = 0; | 202 virtual Status ExecuteJobImpl() = 0; |
| 602 virtual Status FinalizeJobImpl() = 0; | 203 virtual Status FinalizeJobImpl() = 0; |
| 603 | 204 |
| 604 // Registers weak object to optimized code dependencies. | 205 // Registers weak object to optimized code dependencies. |
| 605 // TODO(turbofan): Move this to pipeline.cc once Crankshaft dies. | 206 // TODO(turbofan): Move this to pipeline.cc once Crankshaft dies. |
| 606 void RegisterWeakObjectsInOptimizedCode(Handle<Code> code); | 207 void RegisterWeakObjectsInOptimizedCode(Handle<Code> code); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 621 state_ = State::kFailed; | 222 state_ = State::kFailed; |
| 622 } | 223 } |
| 623 return status; | 224 return status; |
| 624 } | 225 } |
| 625 }; | 226 }; |
| 626 | 227 |
| 627 } // namespace internal | 228 } // namespace internal |
| 628 } // namespace v8 | 229 } // namespace v8 |
| 629 | 230 |
| 630 #endif // V8_COMPILER_H_ | 231 #endif // V8_COMPILER_H_ |
| OLD | NEW |