OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 4753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4764 property->RecordTypeFeedback(oracle()); | 4764 property->RecordTypeFeedback(oracle()); |
4765 CHECK_ALIVE(VisitForValue(value)); | 4765 CHECK_ALIVE(VisitForValue(value)); |
4766 HValue* value = Pop(); | 4766 HValue* value = Pop(); |
4767 Handle<Map> map = property->GetReceiverType(); | 4767 Handle<Map> map = property->GetReceiverType(); |
4768 Handle<String> name = property->key()->AsPropertyName(); | 4768 Handle<String> name = property->key()->AsPropertyName(); |
4769 HInstruction* store; | 4769 HInstruction* store; |
4770 if (map.is_null()) { | 4770 if (map.is_null()) { |
4771 // If we don't know the monomorphic type, do a generic store. | 4771 // If we don't know the monomorphic type, do a generic store. |
4772 CHECK_ALIVE(store = BuildStoreNamedGeneric(literal, name, value)); | 4772 CHECK_ALIVE(store = BuildStoreNamedGeneric(literal, name, value)); |
4773 } else { | 4773 } else { |
| 4774 #if DEBUG |
| 4775 Handle<AccessorPair> accessors; |
| 4776 Handle<JSObject> holder; |
| 4777 ASSERT(!LookupAccessorPair(map, name, &accessors, &holder)); |
| 4778 #endif |
4774 CHECK_ALIVE(store = BuildStoreNamedMonomorphic(literal, | 4779 CHECK_ALIVE(store = BuildStoreNamedMonomorphic(literal, |
4775 name, | 4780 name, |
4776 value, | 4781 value, |
4777 map)); | 4782 map)); |
4778 } | 4783 } |
4779 AddInstruction(store); | 4784 AddInstruction(store); |
4780 if (store->HasObservableSideEffects()) AddSimulate(key->id()); | 4785 if (store->HasObservableSideEffects()) AddSimulate(key->id()); |
4781 } else { | 4786 } else { |
4782 CHECK_ALIVE(VisitForEffect(value)); | 4787 CHECK_ALIVE(VisitForEffect(value)); |
4783 } | 4788 } |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5049 Handle<String> name, | 5054 Handle<String> name, |
5050 HValue* value, | 5055 HValue* value, |
5051 Handle<Map> map) { | 5056 Handle<Map> map) { |
5052 // Handle a store to a known field. | 5057 // Handle a store to a known field. |
5053 LookupResult lookup(isolate()); | 5058 LookupResult lookup(isolate()); |
5054 if (ComputeLoadStoreField(map, name, &lookup, true)) { | 5059 if (ComputeLoadStoreField(map, name, &lookup, true)) { |
5055 // true = needs smi and map check. | 5060 // true = needs smi and map check. |
5056 return BuildStoreNamedField(object, name, value, map, &lookup, true); | 5061 return BuildStoreNamedField(object, name, value, map, &lookup, true); |
5057 } | 5062 } |
5058 | 5063 |
5059 // Handle a known setter directly in the receiver. | |
5060 map->LookupDescriptor(NULL, *name, &lookup); | |
5061 if (lookup.IsPropertyCallbacks()) { | |
5062 Handle<Object> callback(lookup.GetValueFromMap(*map)); | |
5063 Handle<JSObject> holder; | |
5064 if (!callback->IsAccessorPair()) { | |
5065 return BuildStoreNamedGeneric(object, name, value); | |
5066 } | |
5067 Handle<AccessorPair> accessors = Handle<AccessorPair>::cast(callback); | |
5068 return BuildCallSetter(object, value, map, accessors, holder); | |
5069 } | |
5070 | |
5071 // Handle a known setter somewhere in the prototype chain. | |
5072 LookupInPrototypes(map, name, &lookup); | |
5073 if (lookup.IsPropertyCallbacks()) { | |
5074 Handle<Object> callback(lookup.GetValue()); | |
5075 Handle<JSObject> holder(lookup.holder()); | |
5076 if (!callback->IsAccessorPair()) { | |
5077 return BuildStoreNamedGeneric(object, name, value); | |
5078 } | |
5079 Handle<AccessorPair> accessors = Handle<AccessorPair>::cast(callback); | |
5080 return BuildCallSetter(object, value, map, accessors, holder); | |
5081 } | |
5082 | |
5083 // No luck, do a generic store. | 5064 // No luck, do a generic store. |
5084 return BuildStoreNamedGeneric(object, name, value); | 5065 return BuildStoreNamedGeneric(object, name, value); |
5085 } | 5066 } |
5086 | 5067 |
5087 | 5068 |
5088 void HGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr, | 5069 void HGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr, |
5089 HValue* object, | 5070 HValue* object, |
5090 SmallMapList* types, | 5071 SmallMapList* types, |
5091 Handle<String> name) { | 5072 Handle<String> name) { |
5092 int count = 0; | 5073 int count = 0; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5230 value = Pop(); | 5211 value = Pop(); |
5231 HValue* object = Pop(); | 5212 HValue* object = Pop(); |
5232 | 5213 |
5233 Literal* key = prop->key()->AsLiteral(); | 5214 Literal* key = prop->key()->AsLiteral(); |
5234 Handle<String> name = Handle<String>::cast(key->handle()); | 5215 Handle<String> name = Handle<String>::cast(key->handle()); |
5235 ASSERT(!name.is_null()); | 5216 ASSERT(!name.is_null()); |
5236 | 5217 |
5237 SmallMapList* types = expr->GetReceiverTypes(); | 5218 SmallMapList* types = expr->GetReceiverTypes(); |
5238 if (expr->IsMonomorphic()) { | 5219 if (expr->IsMonomorphic()) { |
5239 Handle<Map> map = types->first(); | 5220 Handle<Map> map = types->first(); |
5240 CHECK_ALIVE(instr = BuildStoreNamedMonomorphic(object, name, value, map)); | 5221 Handle<AccessorPair> accessors; |
| 5222 Handle<JSObject> holder; |
| 5223 if (LookupAccessorPair(map, name, &accessors, &holder)) { |
| 5224 instr = BuildCallSetter(object, value, map, accessors, holder); |
| 5225 } else { |
| 5226 CHECK_ALIVE(instr = BuildStoreNamedMonomorphic(object, |
| 5227 name, |
| 5228 value, |
| 5229 map)); |
| 5230 } |
5241 } else if (types != NULL && types->length() > 1) { | 5231 } else if (types != NULL && types->length() > 1) { |
5242 HandlePolymorphicStoreNamedField(expr, object, value, types, name); | 5232 HandlePolymorphicStoreNamedField(expr, object, value, types, name); |
5243 return; | 5233 return; |
5244 | 5234 |
5245 } else { | 5235 } else { |
5246 instr = BuildStoreNamedGeneric(object, name, value); | 5236 instr = BuildStoreNamedGeneric(object, name, value); |
5247 } | 5237 } |
5248 | 5238 |
5249 } else { | 5239 } else { |
5250 // Keyed store. | 5240 // Keyed store. |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5394 if (prop->key()->IsPropertyName()) { | 5384 if (prop->key()->IsPropertyName()) { |
5395 // Named property. | 5385 // Named property. |
5396 CHECK_ALIVE(VisitForValue(prop->obj())); | 5386 CHECK_ALIVE(VisitForValue(prop->obj())); |
5397 HValue* object = Top(); | 5387 HValue* object = Top(); |
5398 | 5388 |
5399 Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); | 5389 Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); |
5400 Handle<Map> map; | 5390 Handle<Map> map; |
5401 HInstruction* load; | 5391 HInstruction* load; |
5402 if (prop->IsMonomorphic()) { | 5392 if (prop->IsMonomorphic()) { |
5403 map = prop->GetReceiverTypes()->first(); | 5393 map = prop->GetReceiverTypes()->first(); |
5404 load = BuildLoadNamedMonomorphic(object, name, prop, map); | 5394 Handle<AccessorPair> accessors; |
| 5395 Handle<JSObject> holder; |
| 5396 if (LookupAccessorPair(map, name, &accessors, &holder)) { |
| 5397 load = BuildCallGetter(object, map, accessors, holder); |
| 5398 } else { |
| 5399 load = BuildLoadNamedMonomorphic(object, name, prop, map); |
| 5400 } |
5405 } else { | 5401 } else { |
5406 load = BuildLoadNamedGeneric(object, name, prop); | 5402 load = BuildLoadNamedGeneric(object, name, prop); |
5407 } | 5403 } |
5408 PushAndAdd(load); | 5404 PushAndAdd(load); |
5409 if (load->HasObservableSideEffects()) AddSimulate(expr->CompoundLoadId()); | 5405 if (load->HasObservableSideEffects()) AddSimulate(expr->CompoundLoadId()); |
5410 | 5406 |
5411 CHECK_ALIVE(VisitForValue(expr->value())); | 5407 CHECK_ALIVE(VisitForValue(expr->value())); |
5412 HValue* right = Pop(); | 5408 HValue* right = Pop(); |
5413 HValue* left = Pop(); | 5409 HValue* left = Pop(); |
5414 | 5410 |
5415 HInstruction* instr = BuildBinaryOperation(operation, left, right); | 5411 HInstruction* instr = BuildBinaryOperation(operation, left, right); |
5416 PushAndAdd(instr); | 5412 PushAndAdd(instr); |
5417 if (instr->HasObservableSideEffects()) AddSimulate(operation->id()); | 5413 if (instr->HasObservableSideEffects()) AddSimulate(operation->id()); |
5418 | 5414 |
5419 HInstruction* store; | 5415 HInstruction* store; |
5420 if (map.is_null()) { | 5416 if (map.is_null()) { |
5421 // If we don't know the monomorphic type, do a generic store. | 5417 // If we don't know the monomorphic type, do a generic store. |
5422 CHECK_ALIVE(store = BuildStoreNamedGeneric(object, name, instr)); | 5418 CHECK_ALIVE(store = BuildStoreNamedGeneric(object, name, instr)); |
5423 } else { | 5419 } else { |
5424 CHECK_ALIVE(store = BuildStoreNamedMonomorphic(object, | 5420 Handle<AccessorPair> accessors; |
5425 name, | 5421 Handle<JSObject> holder; |
5426 instr, | 5422 if (LookupAccessorPair(map, name, &accessors, &holder)) { |
5427 map)); | 5423 store = BuildCallSetter(object, instr, map, accessors, holder); |
| 5424 } else { |
| 5425 CHECK_ALIVE(store = BuildStoreNamedMonomorphic(object, |
| 5426 name, |
| 5427 instr, |
| 5428 map)); |
| 5429 } |
5428 } | 5430 } |
5429 AddInstruction(store); | 5431 AddInstruction(store); |
5430 // Drop the simulated receiver and value. Return the value. | 5432 // Drop the simulated receiver and value. Return the value. |
5431 Drop(2); | 5433 Drop(2); |
5432 Push(instr); | 5434 Push(instr); |
5433 if (store->HasObservableSideEffects()) AddSimulate(expr->AssignmentId()); | 5435 if (store->HasObservableSideEffects()) AddSimulate(expr->AssignmentId()); |
5434 return ast_context()->ReturnValue(Pop()); | 5436 return ast_context()->ReturnValue(Pop()); |
5435 | 5437 |
5436 } else { | 5438 } else { |
5437 // Keyed property. | 5439 // Keyed property. |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5664 Handle<Map> map, | 5666 Handle<Map> map, |
5665 Handle<AccessorPair> accessors, | 5667 Handle<AccessorPair> accessors, |
5666 Handle<JSObject> holder) { | 5668 Handle<JSObject> holder) { |
5667 Handle<JSFunction> getter(JSFunction::cast(accessors->getter())); | 5669 Handle<JSFunction> getter(JSFunction::cast(accessors->getter())); |
5668 AddCheckConstantFunction(holder, object, map, true); | 5670 AddCheckConstantFunction(holder, object, map, true); |
5669 AddInstruction(new(zone()) HPushArgument(object)); | 5671 AddInstruction(new(zone()) HPushArgument(object)); |
5670 return new(zone()) HCallConstantFunction(getter, 1); | 5672 return new(zone()) HCallConstantFunction(getter, 1); |
5671 } | 5673 } |
5672 | 5674 |
5673 | 5675 |
| 5676 bool HGraphBuilder::LookupAccessorPair(Handle<Map> map, |
| 5677 Handle<String> name, |
| 5678 Handle<AccessorPair>* accessors, |
| 5679 Handle<JSObject>* holder) { |
| 5680 LookupResult lookup(isolate()); |
| 5681 |
| 5682 // Check for a JavaScript accessor directly in the map. |
| 5683 map->LookupDescriptor(NULL, *name, &lookup); |
| 5684 if (lookup.IsPropertyCallbacks()) { |
| 5685 Handle<Object> callback(lookup.GetValueFromMap(*map)); |
| 5686 if (!callback->IsAccessorPair()) return false; |
| 5687 *accessors = Handle<AccessorPair>::cast(callback); |
| 5688 *holder = Handle<JSObject>(); |
| 5689 return true; |
| 5690 } |
| 5691 |
| 5692 // Everything else, e.g. a field, can't be an accessor call. |
| 5693 if (lookup.IsFound()) return false; |
| 5694 |
| 5695 // Check for a JavaScript accessor somewhere in the proto chain. |
| 5696 LookupInPrototypes(map, name, &lookup); |
| 5697 if (lookup.IsPropertyCallbacks()) { |
| 5698 Handle<Object> callback(lookup.GetValue()); |
| 5699 if (!callback->IsAccessorPair()) return false; |
| 5700 *accessors = Handle<AccessorPair>::cast(callback); |
| 5701 *holder = Handle<JSObject>(lookup.holder()); |
| 5702 return true; |
| 5703 } |
| 5704 |
| 5705 // We haven't found a JavaScript accessor anywhere. |
| 5706 return false; |
| 5707 } |
| 5708 |
| 5709 |
5674 HInstruction* HGraphBuilder::BuildLoadNamedMonomorphic(HValue* object, | 5710 HInstruction* HGraphBuilder::BuildLoadNamedMonomorphic(HValue* object, |
5675 Handle<String> name, | 5711 Handle<String> name, |
5676 Property* expr, | 5712 Property* expr, |
5677 Handle<Map> map) { | 5713 Handle<Map> map) { |
5678 // Handle a load from a known field. | 5714 // Handle a load from a known field. |
5679 LookupResult lookup(isolate()); | 5715 LookupResult lookup(isolate()); |
5680 map->LookupDescriptor(NULL, *name, &lookup); | 5716 map->LookupDescriptor(NULL, *name, &lookup); |
5681 if (lookup.IsField()) { | 5717 if (lookup.IsField()) { |
5682 return BuildLoadNamedField(object, map, &lookup, true); | 5718 return BuildLoadNamedField(object, map, &lookup, true); |
5683 } | 5719 } |
5684 | 5720 |
5685 // Handle a load of a constant known function. | 5721 // Handle a load of a constant known function. |
5686 if (lookup.IsConstantFunction()) { | 5722 if (lookup.IsConstantFunction()) { |
5687 AddInstruction(new(zone()) HCheckNonSmi(object)); | 5723 AddInstruction(new(zone()) HCheckNonSmi(object)); |
5688 AddInstruction(HCheckMaps::NewWithTransitions(object, map, zone())); | 5724 AddInstruction(HCheckMaps::NewWithTransitions(object, map, zone())); |
5689 Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*map)); | 5725 Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*map)); |
5690 return new(zone()) HConstant(function, Representation::Tagged()); | 5726 return new(zone()) HConstant(function, Representation::Tagged()); |
5691 } | 5727 } |
5692 | 5728 |
5693 // Handle a known getter directly in the receiver. | |
5694 if (lookup.IsPropertyCallbacks()) { | |
5695 Handle<Object> callback(lookup.GetValueFromMap(*map)); | |
5696 Handle<JSObject> holder; | |
5697 if (!callback->IsAccessorPair()) { | |
5698 return BuildLoadNamedGeneric(object, name, expr); | |
5699 } | |
5700 Handle<AccessorPair> accessors = Handle<AccessorPair>::cast(callback); | |
5701 return BuildCallGetter(object, map, accessors, holder); | |
5702 } | |
5703 | |
5704 // Handle a known getter somewhere in the prototype chain. | |
5705 LookupInPrototypes(map, name, &lookup); | |
5706 if (lookup.IsPropertyCallbacks()) { | |
5707 Handle<Object> callback(lookup.GetValue()); | |
5708 Handle<JSObject> holder(lookup.holder()); | |
5709 if (!callback->IsAccessorPair()) { | |
5710 return BuildLoadNamedGeneric(object, name, expr); | |
5711 } | |
5712 Handle<AccessorPair> accessors = Handle<AccessorPair>::cast(callback); | |
5713 return BuildCallGetter(object, map, accessors, holder); | |
5714 } | |
5715 | |
5716 // No luck, do a generic load. | 5729 // No luck, do a generic load. |
5717 return BuildLoadNamedGeneric(object, name, expr); | 5730 return BuildLoadNamedGeneric(object, name, expr); |
5718 } | 5731 } |
5719 | 5732 |
5720 | 5733 |
5721 HInstruction* HGraphBuilder::BuildLoadKeyedGeneric(HValue* object, | 5734 HInstruction* HGraphBuilder::BuildLoadKeyedGeneric(HValue* object, |
5722 HValue* key) { | 5735 HValue* key) { |
5723 HValue* context = environment()->LookupContext(); | 5736 HValue* context = environment()->LookupContext(); |
5724 return new(zone()) HLoadKeyedGeneric(context, object, key); | 5737 return new(zone()) HLoadKeyedGeneric(context, object, key); |
5725 } | 5738 } |
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6326 HValue* function = Pop(); | 6339 HValue* function = Pop(); |
6327 AddInstruction(new(zone()) HCheckNonSmi(function)); | 6340 AddInstruction(new(zone()) HCheckNonSmi(function)); |
6328 instr = new(zone()) HLoadFunctionPrototype(function); | 6341 instr = new(zone()) HLoadFunctionPrototype(function); |
6329 | 6342 |
6330 } else if (expr->key()->IsPropertyName()) { | 6343 } else if (expr->key()->IsPropertyName()) { |
6331 Handle<String> name = expr->key()->AsLiteral()->AsPropertyName(); | 6344 Handle<String> name = expr->key()->AsLiteral()->AsPropertyName(); |
6332 SmallMapList* types = expr->GetReceiverTypes(); | 6345 SmallMapList* types = expr->GetReceiverTypes(); |
6333 | 6346 |
6334 HValue* obj = Pop(); | 6347 HValue* obj = Pop(); |
6335 if (expr->IsMonomorphic()) { | 6348 if (expr->IsMonomorphic()) { |
6336 instr = BuildLoadNamedMonomorphic(obj, name, expr, types->first()); | 6349 Handle<Map> map = types->first(); |
| 6350 Handle<AccessorPair> accessors; |
| 6351 Handle<JSObject> holder; |
| 6352 if (LookupAccessorPair(map, name, &accessors, &holder)) { |
| 6353 instr = BuildCallGetter(obj, map, accessors, holder); |
| 6354 } else { |
| 6355 instr = BuildLoadNamedMonomorphic(obj, name, expr, map); |
| 6356 } |
6337 } else if (types != NULL && types->length() > 1) { | 6357 } else if (types != NULL && types->length() > 1) { |
6338 AddInstruction(new(zone()) HCheckNonSmi(obj)); | 6358 AddInstruction(new(zone()) HCheckNonSmi(obj)); |
6339 HandlePolymorphicLoadNamedField(expr, obj, types, name); | 6359 HandlePolymorphicLoadNamedField(expr, obj, types, name); |
6340 return; | 6360 return; |
6341 } else { | 6361 } else { |
6342 instr = BuildLoadNamedGeneric(obj, name, expr); | 6362 instr = BuildLoadNamedGeneric(obj, name, expr); |
6343 } | 6363 } |
6344 | 6364 |
6345 } else { | 6365 } else { |
6346 CHECK_ALIVE(VisitForValue(expr->key())); | 6366 CHECK_ALIVE(VisitForValue(expr->key())); |
(...skipping 1469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7816 if (returns_original_input) Push(graph_->GetConstantUndefined()); | 7836 if (returns_original_input) Push(graph_->GetConstantUndefined()); |
7817 | 7837 |
7818 CHECK_ALIVE(VisitForValue(prop->obj())); | 7838 CHECK_ALIVE(VisitForValue(prop->obj())); |
7819 HValue* object = Top(); | 7839 HValue* object = Top(); |
7820 | 7840 |
7821 Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); | 7841 Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); |
7822 Handle<Map> map; | 7842 Handle<Map> map; |
7823 HInstruction* load; | 7843 HInstruction* load; |
7824 if (prop->IsMonomorphic()) { | 7844 if (prop->IsMonomorphic()) { |
7825 map = prop->GetReceiverTypes()->first(); | 7845 map = prop->GetReceiverTypes()->first(); |
7826 load = BuildLoadNamedMonomorphic(object, name, prop, map); | 7846 Handle<AccessorPair> accessors; |
| 7847 Handle<JSObject> holder; |
| 7848 if (LookupAccessorPair(map, name, &accessors, &holder)) { |
| 7849 load = BuildCallGetter(object, map, accessors, holder); |
| 7850 } else { |
| 7851 load = BuildLoadNamedMonomorphic(object, name, prop, map); |
| 7852 } |
7827 } else { | 7853 } else { |
7828 load = BuildLoadNamedGeneric(object, name, prop); | 7854 load = BuildLoadNamedGeneric(object, name, prop); |
7829 } | 7855 } |
7830 PushAndAdd(load); | 7856 PushAndAdd(load); |
7831 if (load->HasObservableSideEffects()) AddSimulate(expr->CountId()); | 7857 if (load->HasObservableSideEffects()) AddSimulate(expr->CountId()); |
7832 | 7858 |
7833 after = BuildIncrement(returns_original_input, expr); | 7859 after = BuildIncrement(returns_original_input, expr); |
7834 input = Pop(); | 7860 input = Pop(); |
7835 | 7861 |
7836 HInstruction* store; | 7862 HInstruction* store; |
7837 if (map.is_null()) { | 7863 if (map.is_null()) { |
7838 // If we don't know the monomorphic type, do a generic store. | 7864 // If we don't know the monomorphic type, do a generic store. |
7839 CHECK_ALIVE(store = BuildStoreNamedGeneric(object, name, after)); | 7865 CHECK_ALIVE(store = BuildStoreNamedGeneric(object, name, after)); |
7840 } else { | 7866 } else { |
7841 CHECK_ALIVE(store = BuildStoreNamedMonomorphic(object, | 7867 Handle<AccessorPair> accessors; |
7842 name, | 7868 Handle<JSObject> holder; |
7843 after, | 7869 if (LookupAccessorPair(map, name, &accessors, &holder)) { |
7844 map)); | 7870 store = BuildCallSetter(object, after, map, accessors, holder); |
| 7871 } else { |
| 7872 CHECK_ALIVE(store = BuildStoreNamedMonomorphic(object, |
| 7873 name, |
| 7874 after, |
| 7875 map)); |
| 7876 } |
7845 } | 7877 } |
7846 AddInstruction(store); | 7878 AddInstruction(store); |
7847 | 7879 |
7848 // Overwrite the receiver in the bailout environment with the result | 7880 // Overwrite the receiver in the bailout environment with the result |
7849 // of the operation, and the placeholder with the original value if | 7881 // of the operation, and the placeholder with the original value if |
7850 // necessary. | 7882 // necessary. |
7851 environment()->SetExpressionStackAt(0, after); | 7883 environment()->SetExpressionStackAt(0, after); |
7852 if (returns_original_input) environment()->SetExpressionStackAt(1, input); | 7884 if (returns_original_input) environment()->SetExpressionStackAt(1, input); |
7853 if (store->HasObservableSideEffects()) AddSimulate(expr->AssignmentId()); | 7885 if (store->HasObservableSideEffects()) AddSimulate(expr->AssignmentId()); |
7854 | 7886 |
(...skipping 1756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9611 } | 9643 } |
9612 } | 9644 } |
9613 | 9645 |
9614 #ifdef DEBUG | 9646 #ifdef DEBUG |
9615 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 9647 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
9616 if (allocator_ != NULL) allocator_->Verify(); | 9648 if (allocator_ != NULL) allocator_->Verify(); |
9617 #endif | 9649 #endif |
9618 } | 9650 } |
9619 | 9651 |
9620 } } // namespace v8::internal | 9652 } } // namespace v8::internal |
OLD | NEW |