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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_X64 | 7 #if V8_TARGET_ARCH_X64 |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 1831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1842 } | 1842 } |
1843 | 1843 |
1844 | 1844 |
1845 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 1845 void FullCodeGenerator::VisitAssignment(Assignment* expr) { |
1846 DCHECK(expr->target()->IsValidReferenceExpression()); | 1846 DCHECK(expr->target()->IsValidReferenceExpression()); |
1847 | 1847 |
1848 Comment cmnt(masm_, "[ Assignment"); | 1848 Comment cmnt(masm_, "[ Assignment"); |
1849 | 1849 |
1850 // Left-hand side can only be a property, a global or a (parameter or local) | 1850 // Left-hand side can only be a property, a global or a (parameter or local) |
1851 // slot. | 1851 // slot. |
1852 enum LhsKind { VARIABLE, NAMED_PROPERTY, KEYED_PROPERTY }; | 1852 enum LhsKind { |
| 1853 VARIABLE, |
| 1854 NAMED_PROPERTY, |
| 1855 KEYED_PROPERTY, |
| 1856 NAMED_SUPER_PROPERTY |
| 1857 }; |
1853 LhsKind assign_type = VARIABLE; | 1858 LhsKind assign_type = VARIABLE; |
1854 Property* property = expr->target()->AsProperty(); | 1859 Property* property = expr->target()->AsProperty(); |
1855 if (property != NULL) { | 1860 if (property != NULL) { |
1856 assign_type = (property->key()->IsPropertyName()) | 1861 assign_type = (property->key()->IsPropertyName()) |
1857 ? NAMED_PROPERTY | 1862 ? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY |
1858 : KEYED_PROPERTY; | 1863 : NAMED_PROPERTY) |
| 1864 : KEYED_PROPERTY; |
1859 } | 1865 } |
1860 | 1866 |
1861 // Evaluate LHS expression. | 1867 // Evaluate LHS expression. |
1862 switch (assign_type) { | 1868 switch (assign_type) { |
1863 case VARIABLE: | 1869 case VARIABLE: |
1864 // Nothing to do here. | 1870 // Nothing to do here. |
1865 break; | 1871 break; |
1866 case NAMED_PROPERTY: | 1872 case NAMED_PROPERTY: |
1867 if (expr->is_compound()) { | 1873 if (expr->is_compound()) { |
1868 // We need the receiver both on the stack and in the register. | 1874 // We need the receiver both on the stack and in the register. |
1869 VisitForStackValue(property->obj()); | 1875 VisitForStackValue(property->obj()); |
1870 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); | 1876 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, 0)); |
1871 } else { | 1877 } else { |
1872 VisitForStackValue(property->obj()); | 1878 VisitForStackValue(property->obj()); |
1873 } | 1879 } |
1874 break; | 1880 break; |
| 1881 case NAMED_SUPER_PROPERTY: |
| 1882 VisitForStackValue(property->obj()->AsSuperReference()->this_var()); |
| 1883 EmitLoadHomeObject(property->obj()->AsSuperReference()); |
| 1884 __ Push(result_register()); |
| 1885 if (expr->is_compound()) { |
| 1886 __ Push(MemOperand(rsp, kPointerSize)); |
| 1887 __ Push(result_register()); |
| 1888 } |
| 1889 break; |
1875 case KEYED_PROPERTY: { | 1890 case KEYED_PROPERTY: { |
1876 if (expr->is_compound()) { | 1891 if (expr->is_compound()) { |
1877 VisitForStackValue(property->obj()); | 1892 VisitForStackValue(property->obj()); |
1878 VisitForStackValue(property->key()); | 1893 VisitForStackValue(property->key()); |
1879 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, kPointerSize)); | 1894 __ movp(LoadDescriptor::ReceiverRegister(), Operand(rsp, kPointerSize)); |
1880 __ movp(LoadDescriptor::NameRegister(), Operand(rsp, 0)); | 1895 __ movp(LoadDescriptor::NameRegister(), Operand(rsp, 0)); |
1881 } else { | 1896 } else { |
1882 VisitForStackValue(property->obj()); | 1897 VisitForStackValue(property->obj()); |
1883 VisitForStackValue(property->key()); | 1898 VisitForStackValue(property->key()); |
1884 } | 1899 } |
1885 break; | 1900 break; |
1886 } | 1901 } |
1887 } | 1902 } |
1888 | 1903 |
1889 // For compound assignments we need another deoptimization point after the | 1904 // For compound assignments we need another deoptimization point after the |
1890 // variable/property load. | 1905 // variable/property load. |
1891 if (expr->is_compound()) { | 1906 if (expr->is_compound()) { |
1892 { AccumulatorValueContext context(this); | 1907 { AccumulatorValueContext context(this); |
1893 switch (assign_type) { | 1908 switch (assign_type) { |
1894 case VARIABLE: | 1909 case VARIABLE: |
1895 EmitVariableLoad(expr->target()->AsVariableProxy()); | 1910 EmitVariableLoad(expr->target()->AsVariableProxy()); |
1896 PrepareForBailout(expr->target(), TOS_REG); | 1911 PrepareForBailout(expr->target(), TOS_REG); |
1897 break; | 1912 break; |
1898 case NAMED_PROPERTY: | 1913 case NAMED_PROPERTY: |
1899 EmitNamedPropertyLoad(property); | 1914 EmitNamedPropertyLoad(property); |
1900 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1915 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1901 break; | 1916 break; |
| 1917 case NAMED_SUPER_PROPERTY: |
| 1918 EmitNamedSuperPropertyLoad(property); |
| 1919 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
| 1920 break; |
1902 case KEYED_PROPERTY: | 1921 case KEYED_PROPERTY: |
1903 EmitKeyedPropertyLoad(property); | 1922 EmitKeyedPropertyLoad(property); |
1904 PrepareForBailoutForId(property->LoadId(), TOS_REG); | 1923 PrepareForBailoutForId(property->LoadId(), TOS_REG); |
1905 break; | 1924 break; |
1906 } | 1925 } |
1907 } | 1926 } |
1908 | 1927 |
1909 Token::Value op = expr->binary_op(); | 1928 Token::Value op = expr->binary_op(); |
1910 __ Push(rax); // Left operand goes on the stack. | 1929 __ Push(rax); // Left operand goes on the stack. |
1911 VisitForAccumulatorValue(expr->value()); | 1930 VisitForAccumulatorValue(expr->value()); |
(...skipping 25 matching lines...) Expand all Loading... |
1937 switch (assign_type) { | 1956 switch (assign_type) { |
1938 case VARIABLE: | 1957 case VARIABLE: |
1939 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), | 1958 EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), |
1940 expr->op()); | 1959 expr->op()); |
1941 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 1960 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
1942 context()->Plug(rax); | 1961 context()->Plug(rax); |
1943 break; | 1962 break; |
1944 case NAMED_PROPERTY: | 1963 case NAMED_PROPERTY: |
1945 EmitNamedPropertyAssignment(expr); | 1964 EmitNamedPropertyAssignment(expr); |
1946 break; | 1965 break; |
| 1966 case NAMED_SUPER_PROPERTY: |
| 1967 EmitNamedSuperPropertyAssignment(expr); |
| 1968 break; |
1947 case KEYED_PROPERTY: | 1969 case KEYED_PROPERTY: |
1948 EmitKeyedPropertyAssignment(expr); | 1970 EmitKeyedPropertyAssignment(expr); |
1949 break; | 1971 break; |
1950 } | 1972 } |
1951 } | 1973 } |
1952 | 1974 |
1953 | 1975 |
1954 void FullCodeGenerator::VisitYield(Yield* expr) { | 1976 void FullCodeGenerator::VisitYield(Yield* expr) { |
1955 Comment cmnt(masm_, "[ Yield"); | 1977 Comment cmnt(masm_, "[ Yield"); |
1956 // Evaluate yielded value first; the initial iterator definition depends on | 1978 // Evaluate yielded value first; the initial iterator definition depends on |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2264 // Only the value field needs a write barrier, as the other values are in the | 2286 // Only the value field needs a write barrier, as the other values are in the |
2265 // root set. | 2287 // root set. |
2266 __ RecordWriteField(rax, JSGeneratorObject::kResultValuePropertyOffset, | 2288 __ RecordWriteField(rax, JSGeneratorObject::kResultValuePropertyOffset, |
2267 rcx, rdx, kDontSaveFPRegs); | 2289 rcx, rdx, kDontSaveFPRegs); |
2268 } | 2290 } |
2269 | 2291 |
2270 | 2292 |
2271 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { | 2293 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { |
2272 SetSourcePosition(prop->position()); | 2294 SetSourcePosition(prop->position()); |
2273 Literal* key = prop->key()->AsLiteral(); | 2295 Literal* key = prop->key()->AsLiteral(); |
| 2296 DCHECK(!prop->IsSuperAccess()); |
| 2297 |
2274 __ Move(LoadDescriptor::NameRegister(), key->value()); | 2298 __ Move(LoadDescriptor::NameRegister(), key->value()); |
2275 if (FLAG_vector_ics) { | 2299 if (FLAG_vector_ics) { |
2276 __ Move(VectorLoadICDescriptor::SlotRegister(), | 2300 __ Move(VectorLoadICDescriptor::SlotRegister(), |
2277 Smi::FromInt(prop->PropertyFeedbackSlot())); | 2301 Smi::FromInt(prop->PropertyFeedbackSlot())); |
2278 CallLoadIC(NOT_CONTEXTUAL); | 2302 CallLoadIC(NOT_CONTEXTUAL); |
2279 } else { | 2303 } else { |
2280 CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId()); | 2304 CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId()); |
2281 } | 2305 } |
2282 } | 2306 } |
2283 | 2307 |
2284 | 2308 |
2285 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) { | 2309 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) { |
| 2310 // Stack: receiver, home_object |
2286 SetSourcePosition(prop->position()); | 2311 SetSourcePosition(prop->position()); |
2287 Literal* key = prop->key()->AsLiteral(); | 2312 Literal* key = prop->key()->AsLiteral(); |
2288 DCHECK(!key->value()->IsSmi()); | 2313 DCHECK(!key->value()->IsSmi()); |
2289 DCHECK(prop->IsSuperAccess()); | 2314 DCHECK(prop->IsSuperAccess()); |
2290 | 2315 |
2291 SuperReference* super_ref = prop->obj()->AsSuperReference(); | |
2292 EmitLoadHomeObject(super_ref); | |
2293 __ Push(rax); | |
2294 VisitForStackValue(super_ref->this_var()); | |
2295 __ Push(key->value()); | 2316 __ Push(key->value()); |
2296 __ CallRuntime(Runtime::kLoadFromSuper, 3); | 2317 __ CallRuntime(Runtime::kLoadFromSuper, 3); |
2297 } | 2318 } |
2298 | 2319 |
2299 | 2320 |
2300 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { | 2321 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { |
2301 SetSourcePosition(prop->position()); | 2322 SetSourcePosition(prop->position()); |
2302 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); | 2323 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); |
2303 if (FLAG_vector_ics) { | 2324 if (FLAG_vector_ics) { |
2304 __ Move(VectorLoadICDescriptor::SlotRegister(), | 2325 __ Move(VectorLoadICDescriptor::SlotRegister(), |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2519 SetSourcePosition(expr->position()); | 2540 SetSourcePosition(expr->position()); |
2520 __ Move(StoreDescriptor::NameRegister(), prop->key()->AsLiteral()->value()); | 2541 __ Move(StoreDescriptor::NameRegister(), prop->key()->AsLiteral()->value()); |
2521 __ Pop(StoreDescriptor::ReceiverRegister()); | 2542 __ Pop(StoreDescriptor::ReceiverRegister()); |
2522 CallStoreIC(expr->AssignmentFeedbackId()); | 2543 CallStoreIC(expr->AssignmentFeedbackId()); |
2523 | 2544 |
2524 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2545 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
2525 context()->Plug(rax); | 2546 context()->Plug(rax); |
2526 } | 2547 } |
2527 | 2548 |
2528 | 2549 |
| 2550 void FullCodeGenerator::EmitNamedSuperPropertyAssignment(Assignment* expr) { |
| 2551 // Assignment to named property of super. |
| 2552 // rax : value |
| 2553 // stack : receiver ('this'), home_object |
| 2554 Property* prop = expr->target()->AsProperty(); |
| 2555 DCHECK(prop != NULL); |
| 2556 Literal* key = prop->key()->AsLiteral(); |
| 2557 DCHECK(key != NULL); |
| 2558 |
| 2559 __ Push(rax); |
| 2560 __ Push(key->value()); |
| 2561 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict |
| 2562 : Runtime::kStoreToSuper_Sloppy), |
| 2563 4); |
| 2564 context()->Plug(rax); |
| 2565 } |
| 2566 |
| 2567 |
2529 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2568 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
2530 // Assignment to a property, using a keyed store IC. | 2569 // Assignment to a property, using a keyed store IC. |
2531 | 2570 |
2532 __ Pop(StoreDescriptor::NameRegister()); // Key. | 2571 __ Pop(StoreDescriptor::NameRegister()); // Key. |
2533 __ Pop(StoreDescriptor::ReceiverRegister()); | 2572 __ Pop(StoreDescriptor::ReceiverRegister()); |
2534 DCHECK(StoreDescriptor::ValueRegister().is(rax)); | 2573 DCHECK(StoreDescriptor::ValueRegister().is(rax)); |
2535 // Record source code position before IC call. | 2574 // Record source code position before IC call. |
2536 SetSourcePosition(expr->position()); | 2575 SetSourcePosition(expr->position()); |
2537 Handle<Code> ic = CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 2576 Handle<Code> ic = CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); |
2538 CallIC(ic, expr->AssignmentFeedbackId()); | 2577 CallIC(ic, expr->AssignmentFeedbackId()); |
2539 | 2578 |
2540 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2579 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
2541 context()->Plug(rax); | 2580 context()->Plug(rax); |
2542 } | 2581 } |
2543 | 2582 |
2544 | 2583 |
2545 void FullCodeGenerator::VisitProperty(Property* expr) { | 2584 void FullCodeGenerator::VisitProperty(Property* expr) { |
2546 Comment cmnt(masm_, "[ Property"); | 2585 Comment cmnt(masm_, "[ Property"); |
2547 Expression* key = expr->key(); | 2586 Expression* key = expr->key(); |
2548 | 2587 |
2549 if (key->IsPropertyName()) { | 2588 if (key->IsPropertyName()) { |
2550 if (!expr->IsSuperAccess()) { | 2589 if (!expr->IsSuperAccess()) { |
2551 VisitForAccumulatorValue(expr->obj()); | 2590 VisitForAccumulatorValue(expr->obj()); |
2552 DCHECK(!rax.is(LoadDescriptor::ReceiverRegister())); | 2591 DCHECK(!rax.is(LoadDescriptor::ReceiverRegister())); |
2553 __ movp(LoadDescriptor::ReceiverRegister(), rax); | 2592 __ movp(LoadDescriptor::ReceiverRegister(), rax); |
2554 EmitNamedPropertyLoad(expr); | 2593 EmitNamedPropertyLoad(expr); |
2555 } else { | 2594 } else { |
| 2595 VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); |
| 2596 EmitLoadHomeObject(expr->obj()->AsSuperReference()); |
| 2597 __ Push(result_register()); |
2556 EmitNamedSuperPropertyLoad(expr); | 2598 EmitNamedSuperPropertyLoad(expr); |
2557 } | 2599 } |
2558 PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 2600 PrepareForBailoutForId(expr->LoadId(), TOS_REG); |
2559 context()->Plug(rax); | 2601 context()->Plug(rax); |
2560 } else { | 2602 } else { |
2561 VisitForStackValue(expr->obj()); | 2603 VisitForStackValue(expr->obj()); |
2562 VisitForAccumulatorValue(expr->key()); | 2604 VisitForAccumulatorValue(expr->key()); |
2563 __ Move(LoadDescriptor::NameRegister(), rax); | 2605 __ Move(LoadDescriptor::NameRegister(), rax); |
2564 __ Pop(LoadDescriptor::ReceiverRegister()); | 2606 __ Pop(LoadDescriptor::ReceiverRegister()); |
2565 EmitKeyedPropertyLoad(expr); | 2607 EmitKeyedPropertyLoad(expr); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2614 | 2656 |
2615 SetSourcePosition(prop->position()); | 2657 SetSourcePosition(prop->position()); |
2616 Literal* key = prop->key()->AsLiteral(); | 2658 Literal* key = prop->key()->AsLiteral(); |
2617 DCHECK(!key->value()->IsSmi()); | 2659 DCHECK(!key->value()->IsSmi()); |
2618 // Load the function from the receiver. | 2660 // Load the function from the receiver. |
2619 SuperReference* super_ref = prop->obj()->AsSuperReference(); | 2661 SuperReference* super_ref = prop->obj()->AsSuperReference(); |
2620 EmitLoadHomeObject(super_ref); | 2662 EmitLoadHomeObject(super_ref); |
2621 __ Push(rax); | 2663 __ Push(rax); |
2622 VisitForAccumulatorValue(super_ref->this_var()); | 2664 VisitForAccumulatorValue(super_ref->this_var()); |
2623 __ Push(rax); | 2665 __ Push(rax); |
2624 __ Push(Operand(rsp, kPointerSize)); | |
2625 __ Push(rax); | 2666 __ Push(rax); |
| 2667 __ Push(Operand(rsp, kPointerSize * 2)); |
2626 __ Push(key->value()); | 2668 __ Push(key->value()); |
2627 | 2669 |
2628 // Stack here: | 2670 // Stack here: |
2629 // - home_object | 2671 // - home_object |
2630 // - this (receiver) | 2672 // - this (receiver) |
2631 // - home_object <-- LoadFromSuper will pop here and below. | 2673 // - this (receiver) <-- LoadFromSuper will pop here and below. |
2632 // - this (receiver) | 2674 // - home_object |
2633 // - key | 2675 // - key |
2634 __ CallRuntime(Runtime::kLoadFromSuper, 3); | 2676 __ CallRuntime(Runtime::kLoadFromSuper, 3); |
2635 | 2677 |
2636 // Replace home_object with target function. | 2678 // Replace home_object with target function. |
2637 __ movp(Operand(rsp, kPointerSize), rax); | 2679 __ movp(Operand(rsp, kPointerSize), rax); |
2638 | 2680 |
2639 // Stack here: | 2681 // Stack here: |
2640 // - target function | 2682 // - target function |
2641 // - this (receiver) | 2683 // - this (receiver) |
2642 EmitCall(expr, CallICState::METHOD); | 2684 EmitCall(expr, CallICState::METHOD); |
(...skipping 1661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4304 // Expression can only be a property, a global or a (parameter or local) | 4346 // Expression can only be a property, a global or a (parameter or local) |
4305 // slot. | 4347 // slot. |
4306 enum LhsKind { VARIABLE, NAMED_PROPERTY, KEYED_PROPERTY }; | 4348 enum LhsKind { VARIABLE, NAMED_PROPERTY, KEYED_PROPERTY }; |
4307 LhsKind assign_type = VARIABLE; | 4349 LhsKind assign_type = VARIABLE; |
4308 Property* prop = expr->expression()->AsProperty(); | 4350 Property* prop = expr->expression()->AsProperty(); |
4309 // In case of a property we use the uninitialized expression context | 4351 // In case of a property we use the uninitialized expression context |
4310 // of the key to detect a named property. | 4352 // of the key to detect a named property. |
4311 if (prop != NULL) { | 4353 if (prop != NULL) { |
4312 assign_type = | 4354 assign_type = |
4313 (prop->key()->IsPropertyName()) ? NAMED_PROPERTY : KEYED_PROPERTY; | 4355 (prop->key()->IsPropertyName()) ? NAMED_PROPERTY : KEYED_PROPERTY; |
| 4356 if (prop->IsSuperAccess()) { |
| 4357 // throw exception. |
| 4358 VisitSuperReference(prop->obj()->AsSuperReference()); |
| 4359 return; |
| 4360 } |
4314 } | 4361 } |
4315 | 4362 |
4316 // Evaluate expression and get value. | 4363 // Evaluate expression and get value. |
4317 if (assign_type == VARIABLE) { | 4364 if (assign_type == VARIABLE) { |
4318 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 4365 DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); |
4319 AccumulatorValueContext context(this); | 4366 AccumulatorValueContext context(this); |
4320 EmitVariableLoad(expr->expression()->AsVariableProxy()); | 4367 EmitVariableLoad(expr->expression()->AsVariableProxy()); |
4321 } else { | 4368 } else { |
4322 // Reserve space for result of postfix operation. | 4369 // Reserve space for result of postfix operation. |
4323 if (expr->is_postfix() && !context()->IsEffect()) { | 4370 if (expr->is_postfix() && !context()->IsEffect()) { |
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4916 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), | 4963 DCHECK_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
4917 Assembler::target_address_at(call_target_address, | 4964 Assembler::target_address_at(call_target_address, |
4918 unoptimized_code)); | 4965 unoptimized_code)); |
4919 return OSR_AFTER_STACK_CHECK; | 4966 return OSR_AFTER_STACK_CHECK; |
4920 } | 4967 } |
4921 | 4968 |
4922 | 4969 |
4923 } } // namespace v8::internal | 4970 } } // namespace v8::internal |
4924 | 4971 |
4925 #endif // V8_TARGET_ARCH_X64 | 4972 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |