| OLD | NEW | 
|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 | 
| 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 2221 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2232   JumpPatchSite patch_site(masm_);    // Unbound, signals no inlined smi code. | 2232   JumpPatchSite patch_site(masm_);    // Unbound, signals no inlined smi code. | 
| 2233   { | 2233   { | 
| 2234     Assembler::BlockPoolsScope scope(masm_); | 2234     Assembler::BlockPoolsScope scope(masm_); | 
| 2235     CallIC(code, expr->BinaryOperationFeedbackId()); | 2235     CallIC(code, expr->BinaryOperationFeedbackId()); | 
| 2236     patch_site.EmitPatchInfo(); | 2236     patch_site.EmitPatchInfo(); | 
| 2237   } | 2237   } | 
| 2238   context()->Plug(x0); | 2238   context()->Plug(x0); | 
| 2239 } | 2239 } | 
| 2240 | 2240 | 
| 2241 | 2241 | 
| 2242 void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit) { | 2242 void FullCodeGenerator::EmitClassDefineProperties(ClassLiteral* lit, | 
|  | 2243                                                   int* used_store_slots) { | 
| 2243   // Constructor is in x0. | 2244   // Constructor is in x0. | 
| 2244   DCHECK(lit != NULL); | 2245   DCHECK(lit != NULL); | 
| 2245   __ push(x0); | 2246   __ push(x0); | 
| 2246 | 2247 | 
| 2247   // No access check is needed here since the constructor is created by the | 2248   // No access check is needed here since the constructor is created by the | 
| 2248   // class literal. | 2249   // class literal. | 
| 2249   Register scratch = x1; | 2250   Register scratch = x1; | 
| 2250   __ Ldr(scratch, | 2251   __ Ldr(scratch, | 
| 2251          FieldMemOperand(x0, JSFunction::kPrototypeOrInitialMapOffset)); | 2252          FieldMemOperand(x0, JSFunction::kPrototypeOrInitialMapOffset)); | 
| 2252   __ Push(scratch); | 2253   __ Push(scratch); | 
| 2253 | 2254 | 
| 2254   // store_slot_index points to the vector IC slot for the next store IC used. |  | 
| 2255   // ClassLiteral::ComputeFeedbackRequirements controls the allocation of slots |  | 
| 2256   // and must be updated if the number of store ICs emitted here changes. |  | 
| 2257   int store_slot_index = 0; |  | 
| 2258   for (int i = 0; i < lit->properties()->length(); i++) { | 2255   for (int i = 0; i < lit->properties()->length(); i++) { | 
| 2259     ObjectLiteral::Property* property = lit->properties()->at(i); | 2256     ObjectLiteral::Property* property = lit->properties()->at(i); | 
| 2260     Expression* value = property->value(); | 2257     Expression* value = property->value(); | 
| 2261 | 2258 | 
| 2262     if (property->is_static()) { | 2259     if (property->is_static()) { | 
| 2263       __ Peek(scratch, kPointerSize);  // constructor | 2260       __ Peek(scratch, kPointerSize);  // constructor | 
| 2264     } else { | 2261     } else { | 
| 2265       __ Peek(scratch, 0);  // prototype | 2262       __ Peek(scratch, 0);  // prototype | 
| 2266     } | 2263     } | 
| 2267     __ Push(scratch); | 2264     __ Push(scratch); | 
| 2268     EmitPropertyKey(property, lit->GetIdForProperty(i)); | 2265     EmitPropertyKey(property, lit->GetIdForProperty(i)); | 
| 2269 | 2266 | 
| 2270     // The static prototype property is read only. We handle the non computed | 2267     // The static prototype property is read only. We handle the non computed | 
| 2271     // property name case in the parser. Since this is the only case where we | 2268     // property name case in the parser. Since this is the only case where we | 
| 2272     // need to check for an own read only property we special case this so we do | 2269     // need to check for an own read only property we special case this so we do | 
| 2273     // not need to do this for every property. | 2270     // not need to do this for every property. | 
| 2274     if (property->is_static() && property->is_computed_name()) { | 2271     if (property->is_static() && property->is_computed_name()) { | 
| 2275       __ CallRuntime(Runtime::kThrowIfStaticPrototype, 1); | 2272       __ CallRuntime(Runtime::kThrowIfStaticPrototype, 1); | 
| 2276       __ Push(x0); | 2273       __ Push(x0); | 
| 2277     } | 2274     } | 
| 2278 | 2275 | 
| 2279     VisitForStackValue(value); | 2276     VisitForStackValue(value); | 
| 2280     EmitSetHomeObjectIfNeeded(value, 2, | 2277     EmitSetHomeObjectIfNeeded(value, 2, | 
| 2281                               lit->SlotForHomeObject(value, &store_slot_index)); | 2278                               lit->SlotForHomeObject(value, used_store_slots)); | 
| 2282 | 2279 | 
| 2283     switch (property->kind()) { | 2280     switch (property->kind()) { | 
| 2284       case ObjectLiteral::Property::CONSTANT: | 2281       case ObjectLiteral::Property::CONSTANT: | 
| 2285       case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 2282       case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 
| 2286       case ObjectLiteral::Property::PROTOTYPE: | 2283       case ObjectLiteral::Property::PROTOTYPE: | 
| 2287         UNREACHABLE(); | 2284         UNREACHABLE(); | 
| 2288       case ObjectLiteral::Property::COMPUTED: | 2285       case ObjectLiteral::Property::COMPUTED: | 
| 2289         __ CallRuntime(Runtime::kDefineClassMethod, 3); | 2286         __ CallRuntime(Runtime::kDefineClassMethod, 3); | 
| 2290         break; | 2287         break; | 
| 2291 | 2288 | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 2304       default: | 2301       default: | 
| 2305         UNREACHABLE(); | 2302         UNREACHABLE(); | 
| 2306     } | 2303     } | 
| 2307   } | 2304   } | 
| 2308 | 2305 | 
| 2309   // prototype | 2306   // prototype | 
| 2310   __ CallRuntime(Runtime::kToFastProperties, 1); | 2307   __ CallRuntime(Runtime::kToFastProperties, 1); | 
| 2311 | 2308 | 
| 2312   // constructor | 2309   // constructor | 
| 2313   __ CallRuntime(Runtime::kToFastProperties, 1); | 2310   __ CallRuntime(Runtime::kToFastProperties, 1); | 
| 2314 |  | 
| 2315   // Verify that compilation exactly consumed the number of store ic slots that |  | 
| 2316   // the ClassLiteral node had to offer. |  | 
| 2317   DCHECK(!FLAG_vector_stores || store_slot_index == lit->slot_count()); |  | 
| 2318 } | 2311 } | 
| 2319 | 2312 | 
| 2320 | 2313 | 
| 2321 void FullCodeGenerator::EmitAssignment(Expression* expr, | 2314 void FullCodeGenerator::EmitAssignment(Expression* expr, | 
| 2322                                        FeedbackVectorICSlot slot) { | 2315                                        FeedbackVectorICSlot slot) { | 
| 2323   DCHECK(expr->IsValidReferenceExpression()); | 2316   DCHECK(expr->IsValidReferenceExpression()); | 
| 2324 | 2317 | 
| 2325   Property* prop = expr->AsProperty(); | 2318   Property* prop = expr->AsProperty(); | 
| 2326   LhsKind assign_type = Property::GetAssignType(prop); | 2319   LhsKind assign_type = Property::GetAssignType(prop); | 
| 2327 | 2320 | 
| (...skipping 3257 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5585   } | 5578   } | 
| 5586 | 5579 | 
| 5587   return INTERRUPT; | 5580   return INTERRUPT; | 
| 5588 } | 5581 } | 
| 5589 | 5582 | 
| 5590 | 5583 | 
| 5591 }  // namespace internal | 5584 }  // namespace internal | 
| 5592 }  // namespace v8 | 5585 }  // namespace v8 | 
| 5593 | 5586 | 
| 5594 #endif  // V8_TARGET_ARCH_ARM64 | 5587 #endif  // V8_TARGET_ARCH_ARM64 | 
| OLD | NEW | 
|---|