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 4518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4529 } | 4529 } |
4530 | 4530 |
4531 | 4531 |
4532 HGraphBuilder::GlobalPropertyAccess HGraphBuilder::LookupGlobalProperty( | 4532 HGraphBuilder::GlobalPropertyAccess HGraphBuilder::LookupGlobalProperty( |
4533 Variable* var, LookupResult* lookup, bool is_store) { | 4533 Variable* var, LookupResult* lookup, bool is_store) { |
4534 if (var->is_this() || !info()->has_global_object()) { | 4534 if (var->is_this() || !info()->has_global_object()) { |
4535 return kUseGeneric; | 4535 return kUseGeneric; |
4536 } | 4536 } |
4537 Handle<GlobalObject> global(info()->global_object()); | 4537 Handle<GlobalObject> global(info()->global_object()); |
4538 global->Lookup(*var->name(), lookup); | 4538 global->Lookup(*var->name(), lookup); |
4539 if (!lookup->IsFound() || | 4539 if (!lookup->IsNormal() || |
4540 lookup->type() != NORMAL || | |
4541 (is_store && lookup->IsReadOnly()) || | 4540 (is_store && lookup->IsReadOnly()) || |
4542 lookup->holder() != *global) { | 4541 lookup->holder() != *global) { |
4543 return kUseGeneric; | 4542 return kUseGeneric; |
4544 } | 4543 } |
4545 | 4544 |
4546 return kUseCell; | 4545 return kUseCell; |
4547 } | 4546 } |
4548 | 4547 |
4549 | 4548 |
4550 HValue* HGraphBuilder::BuildContextChainWalk(Variable* var) { | 4549 HValue* HGraphBuilder::BuildContextChainWalk(Variable* var) { |
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4909 return ast_context()->ReturnValue(Pop()); | 4908 return ast_context()->ReturnValue(Pop()); |
4910 } | 4909 } |
4911 | 4910 |
4912 | 4911 |
4913 // Sets the lookup result and returns true if the load/store can be inlined. | 4912 // Sets the lookup result and returns true if the load/store can be inlined. |
4914 static bool ComputeLoadStoreField(Handle<Map> type, | 4913 static bool ComputeLoadStoreField(Handle<Map> type, |
4915 Handle<String> name, | 4914 Handle<String> name, |
4916 LookupResult* lookup, | 4915 LookupResult* lookup, |
4917 bool is_store) { | 4916 bool is_store) { |
4918 type->LookupInDescriptors(NULL, *name, lookup); | 4917 type->LookupInDescriptors(NULL, *name, lookup); |
4919 if (!lookup->IsFound()) return false; | 4918 if (lookup->IsField()) return true; |
4920 if (lookup->type() == FIELD) return true; | |
4921 return is_store && (lookup->type() == MAP_TRANSITION) && | 4919 return is_store && (lookup->type() == MAP_TRANSITION) && |
4922 (type->unused_property_fields() > 0); | 4920 (type->unused_property_fields() > 0); |
4923 } | 4921 } |
4924 | 4922 |
4925 | 4923 |
4926 static int ComputeLoadStoreFieldIndex(Handle<Map> type, | 4924 static int ComputeLoadStoreFieldIndex(Handle<Map> type, |
4927 Handle<String> name, | 4925 Handle<String> name, |
4928 LookupResult* lookup) { | 4926 LookupResult* lookup) { |
4929 ASSERT(lookup->type() == FIELD || lookup->type() == MAP_TRANSITION); | 4927 ASSERT(lookup->IsField() || lookup->type() == MAP_TRANSITION); |
4930 if (lookup->type() == FIELD) { | 4928 if (lookup->IsField()) { |
4931 return lookup->GetLocalFieldIndexFromMap(*type); | 4929 return lookup->GetLocalFieldIndexFromMap(*type); |
4932 } else { | 4930 } else { |
4933 Map* transition = lookup->GetTransitionMapFromMap(*type); | 4931 Map* transition = lookup->GetTransitionMapFromMap(*type); |
4934 return transition->PropertyIndexFor(*name) - type->inobject_properties(); | 4932 return transition->PropertyIndexFor(*name) - type->inobject_properties(); |
4935 } | 4933 } |
4936 } | 4934 } |
4937 | 4935 |
4938 | 4936 |
4939 HInstruction* HGraphBuilder::BuildStoreNamedField(HValue* object, | 4937 HInstruction* HGraphBuilder::BuildStoreNamedField(HValue* object, |
4940 Handle<String> name, | 4938 Handle<String> name, |
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5619 return new(zone()) HLoadNamedGeneric(context, obj, name); | 5617 return new(zone()) HLoadNamedGeneric(context, obj, name); |
5620 } | 5618 } |
5621 | 5619 |
5622 | 5620 |
5623 HInstruction* HGraphBuilder::BuildLoadNamed(HValue* obj, | 5621 HInstruction* HGraphBuilder::BuildLoadNamed(HValue* obj, |
5624 Property* expr, | 5622 Property* expr, |
5625 Handle<Map> map, | 5623 Handle<Map> map, |
5626 Handle<String> name) { | 5624 Handle<String> name) { |
5627 LookupResult lookup(isolate()); | 5625 LookupResult lookup(isolate()); |
5628 map->LookupInDescriptors(NULL, *name, &lookup); | 5626 map->LookupInDescriptors(NULL, *name, &lookup); |
5629 if (lookup.IsFound() && lookup.type() == FIELD) { | 5627 if (lookup.IsField()) { |
5630 return BuildLoadNamedField(obj, | 5628 return BuildLoadNamedField(obj, |
5631 expr, | 5629 expr, |
5632 map, | 5630 map, |
5633 &lookup, | 5631 &lookup, |
5634 true); | 5632 true); |
5635 } else if (lookup.IsFound() && lookup.type() == CONSTANT_FUNCTION) { | 5633 } else if (lookup.IsConstantFunction()) { |
5636 AddInstruction(new(zone()) HCheckNonSmi(obj)); | 5634 AddInstruction(new(zone()) HCheckNonSmi(obj)); |
5637 AddInstruction(HCheckMaps::NewWithTransitions(obj, map, zone())); | 5635 AddInstruction(HCheckMaps::NewWithTransitions(obj, map, zone())); |
5638 Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*map)); | 5636 Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*map)); |
5639 return new(zone()) HConstant(function, Representation::Tagged()); | 5637 return new(zone()) HConstant(function, Representation::Tagged()); |
5640 } else { | 5638 } else { |
5641 return BuildLoadNamedGeneric(obj, expr); | 5639 return BuildLoadNamedGeneric(obj, expr); |
5642 } | 5640 } |
5643 } | 5641 } |
5644 | 5642 |
5645 | 5643 |
(...skipping 2463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8109 Handle<JSFunction> target = Handle<JSFunction>::null(); | 8107 Handle<JSFunction> target = Handle<JSFunction>::null(); |
8110 VariableProxy* proxy = expr->right()->AsVariableProxy(); | 8108 VariableProxy* proxy = expr->right()->AsVariableProxy(); |
8111 bool global_function = (proxy != NULL) && proxy->var()->IsUnallocated(); | 8109 bool global_function = (proxy != NULL) && proxy->var()->IsUnallocated(); |
8112 if (global_function && | 8110 if (global_function && |
8113 info()->has_global_object() && | 8111 info()->has_global_object() && |
8114 !info()->global_object()->IsAccessCheckNeeded()) { | 8112 !info()->global_object()->IsAccessCheckNeeded()) { |
8115 Handle<String> name = proxy->name(); | 8113 Handle<String> name = proxy->name(); |
8116 Handle<GlobalObject> global(info()->global_object()); | 8114 Handle<GlobalObject> global(info()->global_object()); |
8117 LookupResult lookup(isolate()); | 8115 LookupResult lookup(isolate()); |
8118 global->Lookup(*name, &lookup); | 8116 global->Lookup(*name, &lookup); |
8119 if (lookup.IsFound() && | 8117 if (lookup.IsNormal() && lookup.GetValue()->IsJSFunction()) { |
8120 lookup.type() == NORMAL && | |
8121 lookup.GetValue()->IsJSFunction()) { | |
8122 Handle<JSFunction> candidate(JSFunction::cast(lookup.GetValue())); | 8118 Handle<JSFunction> candidate(JSFunction::cast(lookup.GetValue())); |
8123 // If the function is in new space we assume it's more likely to | 8119 // If the function is in new space we assume it's more likely to |
8124 // change and thus prefer the general IC code. | 8120 // change and thus prefer the general IC code. |
8125 if (!isolate()->heap()->InNewSpace(*candidate)) { | 8121 if (!isolate()->heap()->InNewSpace(*candidate)) { |
8126 target = candidate; | 8122 target = candidate; |
8127 } | 8123 } |
8128 } | 8124 } |
8129 } | 8125 } |
8130 | 8126 |
8131 // If the target is not null we have found a known global function that is | 8127 // If the target is not null we have found a known global function that is |
(...skipping 1308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9440 } | 9436 } |
9441 } | 9437 } |
9442 | 9438 |
9443 #ifdef DEBUG | 9439 #ifdef DEBUG |
9444 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 9440 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
9445 if (allocator_ != NULL) allocator_->Verify(); | 9441 if (allocator_ != NULL) allocator_->Verify(); |
9446 #endif | 9442 #endif |
9447 } | 9443 } |
9448 | 9444 |
9449 } } // namespace v8::internal | 9445 } } // namespace v8::internal |
OLD | NEW |