| 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_ARM |     7 #if V8_TARGET_ARCH_ARM | 
|     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 1867 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1878 } |  1878 } | 
|  1879  |  1879  | 
|  1880  |  1880  | 
|  1881 void FullCodeGenerator::VisitAssignment(Assignment* expr) { |  1881 void FullCodeGenerator::VisitAssignment(Assignment* expr) { | 
|  1882   DCHECK(expr->target()->IsValidReferenceExpression()); |  1882   DCHECK(expr->target()->IsValidReferenceExpression()); | 
|  1883  |  1883  | 
|  1884   Comment cmnt(masm_, "[ Assignment"); |  1884   Comment cmnt(masm_, "[ Assignment"); | 
|  1885  |  1885  | 
|  1886   // Left-hand side can only be a property, a global or a (parameter or local) |  1886   // Left-hand side can only be a property, a global or a (parameter or local) | 
|  1887   // slot. |  1887   // slot. | 
|  1888   enum LhsKind { VARIABLE, NAMED_PROPERTY, KEYED_PROPERTY }; |  1888   enum LhsKind { | 
 |  1889     VARIABLE, | 
 |  1890     NAMED_PROPERTY, | 
 |  1891     KEYED_PROPERTY, | 
 |  1892     NAMED_SUPER_PROPERTY | 
 |  1893   }; | 
|  1889   LhsKind assign_type = VARIABLE; |  1894   LhsKind assign_type = VARIABLE; | 
|  1890   Property* property = expr->target()->AsProperty(); |  1895   Property* property = expr->target()->AsProperty(); | 
|  1891   if (property != NULL) { |  1896   if (property != NULL) { | 
|  1892     assign_type = (property->key()->IsPropertyName()) |  1897     assign_type = (property->key()->IsPropertyName()) | 
|  1893         ? NAMED_PROPERTY |  1898                       ? (property->IsSuperAccess() ? NAMED_SUPER_PROPERTY | 
|  1894         : KEYED_PROPERTY; |  1899                                                    : NAMED_PROPERTY) | 
 |  1900                       : KEYED_PROPERTY; | 
|  1895   } |  1901   } | 
|  1896  |  1902  | 
|  1897   // Evaluate LHS expression. |  1903   // Evaluate LHS expression. | 
|  1898   switch (assign_type) { |  1904   switch (assign_type) { | 
|  1899     case VARIABLE: |  1905     case VARIABLE: | 
|  1900       // Nothing to do here. |  1906       // Nothing to do here. | 
|  1901       break; |  1907       break; | 
|  1902     case NAMED_PROPERTY: |  1908     case NAMED_PROPERTY: | 
|  1903       if (expr->is_compound()) { |  1909       if (expr->is_compound()) { | 
|  1904         // We need the receiver both on the stack and in the register. |  1910         // We need the receiver both on the stack and in the register. | 
|  1905         VisitForStackValue(property->obj()); |  1911         VisitForStackValue(property->obj()); | 
|  1906         __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); |  1912         __ ldr(LoadDescriptor::ReceiverRegister(), MemOperand(sp, 0)); | 
|  1907       } else { |  1913       } else { | 
|  1908         VisitForStackValue(property->obj()); |  1914         VisitForStackValue(property->obj()); | 
|  1909       } |  1915       } | 
|  1910       break; |  1916       break; | 
 |  1917     case NAMED_SUPER_PROPERTY: | 
 |  1918       VisitForStackValue(property->obj()->AsSuperReference()->this_var()); | 
 |  1919       EmitLoadHomeObject(property->obj()->AsSuperReference()); | 
 |  1920       __ Push(result_register()); | 
 |  1921       if (expr->is_compound()) { | 
 |  1922         const Register scratch = r1; | 
 |  1923         __ ldr(scratch, MemOperand(sp, kPointerSize)); | 
 |  1924         __ Push(scratch); | 
 |  1925         __ Push(result_register()); | 
 |  1926       } | 
 |  1927       break; | 
|  1911     case KEYED_PROPERTY: |  1928     case KEYED_PROPERTY: | 
|  1912       if (expr->is_compound()) { |  1929       if (expr->is_compound()) { | 
|  1913         VisitForStackValue(property->obj()); |  1930         VisitForStackValue(property->obj()); | 
|  1914         VisitForStackValue(property->key()); |  1931         VisitForStackValue(property->key()); | 
|  1915         __ ldr(LoadDescriptor::ReceiverRegister(), |  1932         __ ldr(LoadDescriptor::ReceiverRegister(), | 
|  1916                MemOperand(sp, 1 * kPointerSize)); |  1933                MemOperand(sp, 1 * kPointerSize)); | 
|  1917         __ ldr(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); |  1934         __ ldr(LoadDescriptor::NameRegister(), MemOperand(sp, 0)); | 
|  1918       } else { |  1935       } else { | 
|  1919         VisitForStackValue(property->obj()); |  1936         VisitForStackValue(property->obj()); | 
|  1920         VisitForStackValue(property->key()); |  1937         VisitForStackValue(property->key()); | 
|  1921       } |  1938       } | 
|  1922       break; |  1939       break; | 
|  1923   } |  1940   } | 
|  1924  |  1941  | 
|  1925   // For compound assignments we need another deoptimization point after the |  1942   // For compound assignments we need another deoptimization point after the | 
|  1926   // variable/property load. |  1943   // variable/property load. | 
|  1927   if (expr->is_compound()) { |  1944   if (expr->is_compound()) { | 
|  1928     { AccumulatorValueContext context(this); |  1945     { AccumulatorValueContext context(this); | 
|  1929       switch (assign_type) { |  1946       switch (assign_type) { | 
|  1930         case VARIABLE: |  1947         case VARIABLE: | 
|  1931           EmitVariableLoad(expr->target()->AsVariableProxy()); |  1948           EmitVariableLoad(expr->target()->AsVariableProxy()); | 
|  1932           PrepareForBailout(expr->target(), TOS_REG); |  1949           PrepareForBailout(expr->target(), TOS_REG); | 
|  1933           break; |  1950           break; | 
|  1934         case NAMED_PROPERTY: |  1951         case NAMED_PROPERTY: | 
|  1935           EmitNamedPropertyLoad(property); |  1952           EmitNamedPropertyLoad(property); | 
|  1936           PrepareForBailoutForId(property->LoadId(), TOS_REG); |  1953           PrepareForBailoutForId(property->LoadId(), TOS_REG); | 
|  1937           break; |  1954           break; | 
 |  1955         case NAMED_SUPER_PROPERTY: | 
 |  1956           EmitNamedSuperPropertyLoad(property); | 
 |  1957           PrepareForBailoutForId(property->LoadId(), TOS_REG); | 
 |  1958           break; | 
|  1938         case KEYED_PROPERTY: |  1959         case KEYED_PROPERTY: | 
|  1939           EmitKeyedPropertyLoad(property); |  1960           EmitKeyedPropertyLoad(property); | 
|  1940           PrepareForBailoutForId(property->LoadId(), TOS_REG); |  1961           PrepareForBailoutForId(property->LoadId(), TOS_REG); | 
|  1941           break; |  1962           break; | 
|  1942       } |  1963       } | 
|  1943     } |  1964     } | 
|  1944  |  1965  | 
|  1945     Token::Value op = expr->binary_op(); |  1966     Token::Value op = expr->binary_op(); | 
|  1946     __ push(r0);  // Left operand goes on the stack. |  1967     __ push(r0);  // Left operand goes on the stack. | 
|  1947     VisitForAccumulatorValue(expr->value()); |  1968     VisitForAccumulatorValue(expr->value()); | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
|  1974   switch (assign_type) { |  1995   switch (assign_type) { | 
|  1975     case VARIABLE: |  1996     case VARIABLE: | 
|  1976       EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), |  1997       EmitVariableAssignment(expr->target()->AsVariableProxy()->var(), | 
|  1977                              expr->op()); |  1998                              expr->op()); | 
|  1978       PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |  1999       PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 
|  1979       context()->Plug(r0); |  2000       context()->Plug(r0); | 
|  1980       break; |  2001       break; | 
|  1981     case NAMED_PROPERTY: |  2002     case NAMED_PROPERTY: | 
|  1982       EmitNamedPropertyAssignment(expr); |  2003       EmitNamedPropertyAssignment(expr); | 
|  1983       break; |  2004       break; | 
 |  2005     case NAMED_SUPER_PROPERTY: | 
 |  2006       EmitNamedSuperPropertyAssignment(expr); | 
 |  2007       break; | 
|  1984     case KEYED_PROPERTY: |  2008     case KEYED_PROPERTY: | 
|  1985       EmitKeyedPropertyAssignment(expr); |  2009       EmitKeyedPropertyAssignment(expr); | 
|  1986       break; |  2010       break; | 
|  1987   } |  2011   } | 
|  1988 } |  2012 } | 
|  1989  |  2013  | 
|  1990  |  2014  | 
|  1991 void FullCodeGenerator::VisitYield(Yield* expr) { |  2015 void FullCodeGenerator::VisitYield(Yield* expr) { | 
|  1992   Comment cmnt(masm_, "[ Yield"); |  2016   Comment cmnt(masm_, "[ Yield"); | 
|  1993   // Evaluate yielded value first; the initial iterator definition depends on |  2017   // Evaluate yielded value first; the initial iterator definition depends on | 
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2312   // Only the value field needs a write barrier, as the other values are in the |  2336   // Only the value field needs a write barrier, as the other values are in the | 
|  2313   // root set. |  2337   // root set. | 
|  2314   __ RecordWriteField(r0, JSGeneratorObject::kResultValuePropertyOffset, |  2338   __ RecordWriteField(r0, JSGeneratorObject::kResultValuePropertyOffset, | 
|  2315                       r2, r3, kLRHasBeenSaved, kDontSaveFPRegs); |  2339                       r2, r3, kLRHasBeenSaved, kDontSaveFPRegs); | 
|  2316 } |  2340 } | 
|  2317  |  2341  | 
|  2318  |  2342  | 
|  2319 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { |  2343 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { | 
|  2320   SetSourcePosition(prop->position()); |  2344   SetSourcePosition(prop->position()); | 
|  2321   Literal* key = prop->key()->AsLiteral(); |  2345   Literal* key = prop->key()->AsLiteral(); | 
 |  2346   DCHECK(!prop->IsSuperAccess()); | 
|  2322  |  2347  | 
|  2323   __ mov(LoadDescriptor::NameRegister(), Operand(key->value())); |  2348   __ mov(LoadDescriptor::NameRegister(), Operand(key->value())); | 
|  2324   if (FLAG_vector_ics) { |  2349   if (FLAG_vector_ics) { | 
|  2325     __ mov(VectorLoadICDescriptor::SlotRegister(), |  2350     __ mov(VectorLoadICDescriptor::SlotRegister(), | 
|  2326            Operand(Smi::FromInt(prop->PropertyFeedbackSlot()))); |  2351            Operand(Smi::FromInt(prop->PropertyFeedbackSlot()))); | 
|  2327     CallLoadIC(NOT_CONTEXTUAL); |  2352     CallLoadIC(NOT_CONTEXTUAL); | 
|  2328   } else { |  2353   } else { | 
|  2329     CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId()); |  2354     CallLoadIC(NOT_CONTEXTUAL, prop->PropertyFeedbackId()); | 
|  2330   } |  2355   } | 
|  2331 } |  2356 } | 
|  2332  |  2357  | 
|  2333  |  2358  | 
|  2334 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) { |  2359 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) { | 
 |  2360   // Stack: receiver, home_object. | 
|  2335   SetSourcePosition(prop->position()); |  2361   SetSourcePosition(prop->position()); | 
|  2336   Literal* key = prop->key()->AsLiteral(); |  2362   Literal* key = prop->key()->AsLiteral(); | 
|  2337   DCHECK(!key->value()->IsSmi()); |  2363   DCHECK(!key->value()->IsSmi()); | 
|  2338   DCHECK(prop->IsSuperAccess()); |  2364   DCHECK(prop->IsSuperAccess()); | 
|  2339  |  2365  | 
|  2340   SuperReference* super_ref = prop->obj()->AsSuperReference(); |  | 
|  2341   EmitLoadHomeObject(super_ref); |  | 
|  2342   __ Push(r0); |  | 
|  2343   VisitForStackValue(super_ref->this_var()); |  | 
|  2344   __ Push(key->value()); |  2366   __ Push(key->value()); | 
|  2345   __ CallRuntime(Runtime::kLoadFromSuper, 3); |  2367   __ CallRuntime(Runtime::kLoadFromSuper, 3); | 
|  2346 } |  2368 } | 
|  2347  |  2369  | 
|  2348  |  2370  | 
|  2349 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { |  2371 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { | 
|  2350   SetSourcePosition(prop->position()); |  2372   SetSourcePosition(prop->position()); | 
|  2351   Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); |  2373   Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); | 
|  2352   if (FLAG_vector_ics) { |  2374   if (FLAG_vector_ics) { | 
|  2353     __ mov(VectorLoadICDescriptor::SlotRegister(), |  2375     __ mov(VectorLoadICDescriptor::SlotRegister(), | 
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2605   __ mov(StoreDescriptor::NameRegister(), |  2627   __ mov(StoreDescriptor::NameRegister(), | 
|  2606          Operand(prop->key()->AsLiteral()->value())); |  2628          Operand(prop->key()->AsLiteral()->value())); | 
|  2607   __ pop(StoreDescriptor::ReceiverRegister()); |  2629   __ pop(StoreDescriptor::ReceiverRegister()); | 
|  2608   CallStoreIC(expr->AssignmentFeedbackId()); |  2630   CallStoreIC(expr->AssignmentFeedbackId()); | 
|  2609  |  2631  | 
|  2610   PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |  2632   PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 
|  2611   context()->Plug(r0); |  2633   context()->Plug(r0); | 
|  2612 } |  2634 } | 
|  2613  |  2635  | 
|  2614  |  2636  | 
 |  2637 void FullCodeGenerator::EmitNamedSuperPropertyAssignment(Assignment* expr) { | 
 |  2638   // Assignment to named property of super. | 
 |  2639   // r0 : value | 
 |  2640   // stack : receiver ('this'), home_object | 
 |  2641   Property* prop = expr->target()->AsProperty(); | 
 |  2642   DCHECK(prop != NULL); | 
 |  2643   Literal* key = prop->key()->AsLiteral(); | 
 |  2644   DCHECK(key != NULL); | 
 |  2645  | 
 |  2646   __ Push(r0); | 
 |  2647   __ Push(key->value()); | 
 |  2648   __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict | 
 |  2649                                           : Runtime::kStoreToSuper_Sloppy), | 
 |  2650                  4); | 
 |  2651   context()->Plug(r0); | 
 |  2652 } | 
 |  2653  | 
 |  2654  | 
|  2615 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |  2655 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 
|  2616   // Assignment to a property, using a keyed store IC. |  2656   // Assignment to a property, using a keyed store IC. | 
|  2617  |  2657  | 
|  2618   // Record source code position before IC call. |  2658   // Record source code position before IC call. | 
|  2619   SetSourcePosition(expr->position()); |  2659   SetSourcePosition(expr->position()); | 
|  2620   __ Pop(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister()); |  2660   __ Pop(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister()); | 
|  2621   DCHECK(StoreDescriptor::ValueRegister().is(r0)); |  2661   DCHECK(StoreDescriptor::ValueRegister().is(r0)); | 
|  2622  |  2662  | 
|  2623   Handle<Code> ic = CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); |  2663   Handle<Code> ic = CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 
|  2624   CallIC(ic, expr->AssignmentFeedbackId()); |  2664   CallIC(ic, expr->AssignmentFeedbackId()); | 
|  2625  |  2665  | 
|  2626   PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |  2666   PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 
|  2627   context()->Plug(r0); |  2667   context()->Plug(r0); | 
|  2628 } |  2668 } | 
|  2629  |  2669  | 
|  2630  |  2670  | 
|  2631 void FullCodeGenerator::VisitProperty(Property* expr) { |  2671 void FullCodeGenerator::VisitProperty(Property* expr) { | 
|  2632   Comment cmnt(masm_, "[ Property"); |  2672   Comment cmnt(masm_, "[ Property"); | 
|  2633   Expression* key = expr->key(); |  2673   Expression* key = expr->key(); | 
|  2634  |  2674  | 
|  2635   if (key->IsPropertyName()) { |  2675   if (key->IsPropertyName()) { | 
|  2636     if (!expr->IsSuperAccess()) { |  2676     if (!expr->IsSuperAccess()) { | 
|  2637       VisitForAccumulatorValue(expr->obj()); |  2677       VisitForAccumulatorValue(expr->obj()); | 
|  2638       __ Move(LoadDescriptor::ReceiverRegister(), r0); |  2678       __ Move(LoadDescriptor::ReceiverRegister(), r0); | 
|  2639       EmitNamedPropertyLoad(expr); |  2679       EmitNamedPropertyLoad(expr); | 
|  2640     } else { |  2680     } else { | 
 |  2681       VisitForStackValue(expr->obj()->AsSuperReference()->this_var()); | 
 |  2682       EmitLoadHomeObject(expr->obj()->AsSuperReference()); | 
 |  2683       __ Push(result_register()); | 
|  2641       EmitNamedSuperPropertyLoad(expr); |  2684       EmitNamedSuperPropertyLoad(expr); | 
|  2642     } |  2685     } | 
|  2643     PrepareForBailoutForId(expr->LoadId(), TOS_REG); |  2686     PrepareForBailoutForId(expr->LoadId(), TOS_REG); | 
|  2644     context()->Plug(r0); |  2687     context()->Plug(r0); | 
|  2645   } else { |  2688   } else { | 
|  2646     VisitForStackValue(expr->obj()); |  2689     VisitForStackValue(expr->obj()); | 
|  2647     VisitForAccumulatorValue(expr->key()); |  2690     VisitForAccumulatorValue(expr->key()); | 
|  2648     __ Move(LoadDescriptor::NameRegister(), r0); |  2691     __ Move(LoadDescriptor::NameRegister(), r0); | 
|  2649     __ pop(LoadDescriptor::ReceiverRegister()); |  2692     __ pop(LoadDescriptor::ReceiverRegister()); | 
|  2650     EmitKeyedPropertyLoad(expr); |  2693     EmitKeyedPropertyLoad(expr); | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2705   SetSourcePosition(prop->position()); |  2748   SetSourcePosition(prop->position()); | 
|  2706   Literal* key = prop->key()->AsLiteral(); |  2749   Literal* key = prop->key()->AsLiteral(); | 
|  2707   DCHECK(!key->value()->IsSmi()); |  2750   DCHECK(!key->value()->IsSmi()); | 
|  2708   // Load the function from the receiver. |  2751   // Load the function from the receiver. | 
|  2709   const Register scratch = r1; |  2752   const Register scratch = r1; | 
|  2710   SuperReference* super_ref = prop->obj()->AsSuperReference(); |  2753   SuperReference* super_ref = prop->obj()->AsSuperReference(); | 
|  2711   EmitLoadHomeObject(super_ref); |  2754   EmitLoadHomeObject(super_ref); | 
|  2712   __ Push(r0); |  2755   __ Push(r0); | 
|  2713   VisitForAccumulatorValue(super_ref->this_var()); |  2756   VisitForAccumulatorValue(super_ref->this_var()); | 
|  2714   __ Push(r0); |  2757   __ Push(r0); | 
|  2715   __ ldr(scratch, MemOperand(sp, kPointerSize)); |  2758   __ Push(r0); | 
 |  2759   __ ldr(scratch, MemOperand(sp, kPointerSize * 2)); | 
|  2716   __ Push(scratch); |  2760   __ Push(scratch); | 
|  2717   __ Push(r0); |  | 
|  2718   __ Push(key->value()); |  2761   __ Push(key->value()); | 
|  2719  |  2762  | 
|  2720   // Stack here: |  2763   // Stack here: | 
|  2721   //  - home_object |  2764   //  - home_object | 
|  2722   //  - this (receiver) |  2765   //  - this (receiver) | 
|  2723   //  - home_object <-- LoadFromSuper will pop here and below. |  2766   //  - this (receiver) <-- LoadFromSuper will pop here and below. | 
|  2724   //  - this (receiver) |  2767   //  - home_object | 
|  2725   //  - key |  2768   //  - key | 
|  2726   __ CallRuntime(Runtime::kLoadFromSuper, 3); |  2769   __ CallRuntime(Runtime::kLoadFromSuper, 3); | 
|  2727  |  2770  | 
|  2728   // Replace home_object with target function. |  2771   // Replace home_object with target function. | 
|  2729   __ str(r0, MemOperand(sp, kPointerSize)); |  2772   __ str(r0, MemOperand(sp, kPointerSize)); | 
|  2730  |  2773  | 
|  2731   // Stack here: |  2774   // Stack here: | 
|  2732   // - target function |  2775   // - target function | 
|  2733   // - this (receiver) |  2776   // - this (receiver) | 
|  2734   EmitCall(expr, CallICState::METHOD); |  2777   EmitCall(expr, CallICState::METHOD); | 
| (...skipping 1597 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4332   // Expression can only be a property, a global or a (parameter or local) |  4375   // Expression can only be a property, a global or a (parameter or local) | 
|  4333   // slot. |  4376   // slot. | 
|  4334   enum LhsKind { VARIABLE, NAMED_PROPERTY, KEYED_PROPERTY }; |  4377   enum LhsKind { VARIABLE, NAMED_PROPERTY, KEYED_PROPERTY }; | 
|  4335   LhsKind assign_type = VARIABLE; |  4378   LhsKind assign_type = VARIABLE; | 
|  4336   Property* prop = expr->expression()->AsProperty(); |  4379   Property* prop = expr->expression()->AsProperty(); | 
|  4337   // In case of a property we use the uninitialized expression context |  4380   // In case of a property we use the uninitialized expression context | 
|  4338   // of the key to detect a named property. |  4381   // of the key to detect a named property. | 
|  4339   if (prop != NULL) { |  4382   if (prop != NULL) { | 
|  4340     assign_type = |  4383     assign_type = | 
|  4341         (prop->key()->IsPropertyName()) ? NAMED_PROPERTY : KEYED_PROPERTY; |  4384         (prop->key()->IsPropertyName()) ? NAMED_PROPERTY : KEYED_PROPERTY; | 
 |  4385     if (prop->IsSuperAccess()) { | 
 |  4386       // throw exception. | 
 |  4387       VisitSuperReference(prop->obj()->AsSuperReference()); | 
 |  4388       return; | 
 |  4389     } | 
|  4342   } |  4390   } | 
|  4343  |  4391  | 
|  4344   // Evaluate expression and get value. |  4392   // Evaluate expression and get value. | 
|  4345   if (assign_type == VARIABLE) { |  4393   if (assign_type == VARIABLE) { | 
|  4346     DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); |  4394     DCHECK(expr->expression()->AsVariableProxy()->var() != NULL); | 
|  4347     AccumulatorValueContext context(this); |  4395     AccumulatorValueContext context(this); | 
|  4348     EmitVariableLoad(expr->expression()->AsVariableProxy()); |  4396     EmitVariableLoad(expr->expression()->AsVariableProxy()); | 
|  4349   } else { |  4397   } else { | 
|  4350     // Reserve space for result of postfix operation. |  4398     // Reserve space for result of postfix operation. | 
|  4351     if (expr->is_postfix() && !context()->IsEffect()) { |  4399     if (expr->is_postfix() && !context()->IsEffect()) { | 
| (...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  5008  |  5056  | 
|  5009   DCHECK(interrupt_address == |  5057   DCHECK(interrupt_address == | 
|  5010          isolate->builtins()->OsrAfterStackCheck()->entry()); |  5058          isolate->builtins()->OsrAfterStackCheck()->entry()); | 
|  5011   return OSR_AFTER_STACK_CHECK; |  5059   return OSR_AFTER_STACK_CHECK; | 
|  5012 } |  5060 } | 
|  5013  |  5061  | 
|  5014  |  5062  | 
|  5015 } }  // namespace v8::internal |  5063 } }  // namespace v8::internal | 
|  5016  |  5064  | 
|  5017 #endif  // V8_TARGET_ARCH_ARM |  5065 #endif  // V8_TARGET_ARCH_ARM | 
| OLD | NEW |