Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Side by Side Diff: src/objects.cc

Issue 8111006: Allow new-space JSFunction objects as constant-function properties. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 1497 matching lines...) Expand 10 before | Expand all | Expand 10 after
1508 new_map->set_instance_descriptors(DescriptorArray::cast(new_descriptors)); 1508 new_map->set_instance_descriptors(DescriptorArray::cast(new_descriptors));
1509 set_map(new_map); 1509 set_map(new_map);
1510 return FastPropertyAtPut(index, value); 1510 return FastPropertyAtPut(index, value);
1511 } 1511 }
1512 1512
1513 1513
1514 MaybeObject* JSObject::AddConstantFunctionProperty( 1514 MaybeObject* JSObject::AddConstantFunctionProperty(
1515 String* name, 1515 String* name,
1516 JSFunction* function, 1516 JSFunction* function,
1517 PropertyAttributes attributes) { 1517 PropertyAttributes attributes) {
1518 ASSERT(!GetHeap()->InNewSpace(function));
1519
1520 // Allocate new instance descriptors with (name, function) added 1518 // Allocate new instance descriptors with (name, function) added
1521 ConstantFunctionDescriptor d(name, function, attributes); 1519 ConstantFunctionDescriptor d(name, function, attributes);
1522 Object* new_descriptors; 1520 Object* new_descriptors;
1523 { MaybeObject* maybe_new_descriptors = 1521 { MaybeObject* maybe_new_descriptors =
1524 map()->instance_descriptors()->CopyInsert(&d, REMOVE_TRANSITIONS); 1522 map()->instance_descriptors()->CopyInsert(&d, REMOVE_TRANSITIONS);
1525 if (!maybe_new_descriptors->ToObject(&new_descriptors)) { 1523 if (!maybe_new_descriptors->ToObject(&new_descriptors)) {
1526 return maybe_new_descriptors; 1524 return maybe_new_descriptors;
1527 } 1525 }
1528 } 1526 }
1529 1527
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1624 Handle<Object> args[1] = {Handle<String>(name)}; 1622 Handle<Object> args[1] = {Handle<String>(name)};
1625 return heap->isolate()->Throw( 1623 return heap->isolate()->Throw(
1626 *FACTORY->NewTypeError("object_not_extensible", 1624 *FACTORY->NewTypeError("object_not_extensible",
1627 HandleVector(args, 1))); 1625 HandleVector(args, 1)));
1628 } 1626 }
1629 } 1627 }
1630 if (HasFastProperties()) { 1628 if (HasFastProperties()) {
1631 // Ensure the descriptor array does not get too big. 1629 // Ensure the descriptor array does not get too big.
1632 if (map_of_this->instance_descriptors()->number_of_descriptors() < 1630 if (map_of_this->instance_descriptors()->number_of_descriptors() <
1633 DescriptorArray::kMaxNumberOfDescriptors) { 1631 DescriptorArray::kMaxNumberOfDescriptors) {
1634 if (value->IsJSFunction() && !heap->InNewSpace(value)) { 1632 if (value->IsJSFunction()) {
1635 return AddConstantFunctionProperty(name, 1633 return AddConstantFunctionProperty(name,
1636 JSFunction::cast(value), 1634 JSFunction::cast(value),
1637 attributes); 1635 attributes);
1638 } else { 1636 } else {
1639 return AddFastProperty(name, value, attributes); 1637 return AddFastProperty(name, value, attributes);
1640 } 1638 }
1641 } else { 1639 } else {
1642 // Normalize the object to prevent very large instance descriptors. 1640 // Normalize the object to prevent very large instance descriptors.
1643 // This eliminates unwanted N^2 allocation and lookup behavior. 1641 // This eliminates unwanted N^2 allocation and lookup behavior.
1644 Object* obj; 1642 Object* obj;
(...skipping 1109 matching lines...) Expand 10 before | Expand all | Expand 10 after
2754 case CONSTANT_TRANSITION: { 2752 case CONSTANT_TRANSITION: {
2755 // If the same constant function is being added we can simply 2753 // If the same constant function is being added we can simply
2756 // transition to the target map. 2754 // transition to the target map.
2757 Map* target_map = result->GetTransitionMap(); 2755 Map* target_map = result->GetTransitionMap();
2758 DescriptorArray* target_descriptors = target_map->instance_descriptors(); 2756 DescriptorArray* target_descriptors = target_map->instance_descriptors();
2759 int number = target_descriptors->SearchWithCache(name); 2757 int number = target_descriptors->SearchWithCache(name);
2760 ASSERT(number != DescriptorArray::kNotFound); 2758 ASSERT(number != DescriptorArray::kNotFound);
2761 ASSERT(target_descriptors->GetType(number) == CONSTANT_FUNCTION); 2759 ASSERT(target_descriptors->GetType(number) == CONSTANT_FUNCTION);
2762 JSFunction* function = 2760 JSFunction* function =
2763 JSFunction::cast(target_descriptors->GetValue(number)); 2761 JSFunction::cast(target_descriptors->GetValue(number));
2764 ASSERT(!HEAP->InNewSpace(function));
2765 if (value == function) { 2762 if (value == function) {
2766 set_map(target_map); 2763 set_map(target_map);
2767 return value; 2764 return value;
2768 } 2765 }
2769 // Otherwise, replace with a MAP_TRANSITION to a new map with a 2766 // Otherwise, replace with a MAP_TRANSITION to a new map with a
2770 // FIELD, even if the value is a constant function. 2767 // FIELD, even if the value is a constant function.
2771 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes); 2768 return ConvertDescriptorToFieldAndMapTransition(name, value, attributes);
2772 } 2769 }
2773 case NULL_DESCRIPTOR: 2770 case NULL_DESCRIPTOR:
2774 case ELEMENTS_TRANSITION: 2771 case ELEMENTS_TRANSITION:
(...skipping 9404 matching lines...) Expand 10 before | Expand all | Expand 10 after
12179 if (break_point_objects()->IsUndefined()) return 0; 12176 if (break_point_objects()->IsUndefined()) return 0;
12180 // Single break point. 12177 // Single break point.
12181 if (!break_point_objects()->IsFixedArray()) return 1; 12178 if (!break_point_objects()->IsFixedArray()) return 1;
12182 // Multiple break points. 12179 // Multiple break points.
12183 return FixedArray::cast(break_point_objects())->length(); 12180 return FixedArray::cast(break_point_objects())->length();
12184 } 12181 }
12185 #endif 12182 #endif
12186 12183
12187 12184
12188 } } // namespace v8::internal 12185 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698