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

Side by Side Diff: src/objects.h

Issue 3329019: Dynamically determine optimal instance size.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 3 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 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 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 1558 matching lines...) Expand 10 before | Expand all | Expand 10 after
1569 inline Object* InObjectPropertyAt(int index); 1569 inline Object* InObjectPropertyAt(int index);
1570 inline Object* InObjectPropertyAtPut(int index, 1570 inline Object* InObjectPropertyAtPut(int index,
1571 Object* value, 1571 Object* value,
1572 WriteBarrierMode mode 1572 WriteBarrierMode mode
1573 = UPDATE_WRITE_BARRIER); 1573 = UPDATE_WRITE_BARRIER);
1574 1574
1575 // initializes the body after properties slot, properties slot is 1575 // initializes the body after properties slot, properties slot is
1576 // initialized by set_properties 1576 // initialized by set_properties
1577 // Note: this call does not update write barrier, it is caller's 1577 // Note: this call does not update write barrier, it is caller's
1578 // reponsibility to ensure that *v* can be collected without WB here. 1578 // reponsibility to ensure that *v* can be collected without WB here.
1579 inline void InitializeBody(int object_size); 1579 inline void InitializeBody(int object_size, Object* value);
1580 1580
1581 // Check whether this object references another object 1581 // Check whether this object references another object
1582 bool ReferencesObject(Object* obj); 1582 bool ReferencesObject(Object* obj);
1583 1583
1584 // Casting. 1584 // Casting.
1585 static inline JSObject* cast(Object* obj); 1585 static inline JSObject* cast(Object* obj);
1586 1586
1587 // Disalow further properties to be added to the object. 1587 // Disalow further properties to be added to the object.
1588 MUST_USE_RESULT Object* PreventExtensions(); 1588 MUST_USE_RESULT Object* PreventExtensions();
1589 1589
(...skipping 1554 matching lines...) Expand 10 before | Expand all | Expand 10 after
3144 set_bit_field2(bit_field2() | (1 << kHasFastElements)); 3144 set_bit_field2(bit_field2() | (1 << kHasFastElements));
3145 } else { 3145 } else {
3146 set_bit_field2(bit_field2() & ~(1 << kHasFastElements)); 3146 set_bit_field2(bit_field2() & ~(1 << kHasFastElements));
3147 } 3147 }
3148 } 3148 }
3149 3149
3150 inline bool has_fast_elements() { 3150 inline bool has_fast_elements() {
3151 return ((1 << kHasFastElements) & bit_field2()) != 0; 3151 return ((1 << kHasFastElements) & bit_field2()) != 0;
3152 } 3152 }
3153 3153
3154 // Tells whether the map is attached to SharedFunctionInfo
3155 // (for inobject slack tracking).
3156 inline void set_attached_to_shared_function_info(bool value);
3157
3158 inline bool attached_to_shared_function_info();
3159
3154 // Tells whether the instance needs security checks when accessing its 3160 // Tells whether the instance needs security checks when accessing its
3155 // properties. 3161 // properties.
3156 inline void set_is_access_check_needed(bool access_check_needed); 3162 inline void set_is_access_check_needed(bool access_check_needed);
3157 inline bool is_access_check_needed(); 3163 inline bool is_access_check_needed();
3158 3164
3159 // [prototype]: implicit prototype object. 3165 // [prototype]: implicit prototype object.
3160 DECL_ACCESSORS(prototype, Object) 3166 DECL_ACCESSORS(prototype, Object)
3161 3167
3162 // [constructor]: points back to the function responsible for this map. 3168 // [constructor]: points back to the function responsible for this map.
3163 DECL_ACCESSORS(constructor, Object) 3169 DECL_ACCESSORS(constructor, Object)
3164 3170
3171 inline JSFunction* unchecked_constructor();
3172
3165 // [instance descriptors]: describes the object. 3173 // [instance descriptors]: describes the object.
3166 DECL_ACCESSORS(instance_descriptors, DescriptorArray) 3174 DECL_ACCESSORS(instance_descriptors, DescriptorArray)
3167 3175
3168 // [stub cache]: contains stubs compiled for this map. 3176 // [stub cache]: contains stubs compiled for this map.
3169 DECL_ACCESSORS(code_cache, Object) 3177 DECL_ACCESSORS(code_cache, Object)
3170 3178
3171 MUST_USE_RESULT Object* CopyDropDescriptors(); 3179 MUST_USE_RESULT Object* CopyDropDescriptors();
3172 3180
3173 MUST_USE_RESULT Object* CopyNormalized(PropertyNormalizationMode mode); 3181 MUST_USE_RESULT Object* CopyNormalized(PropertyNormalizationMode mode);
3174 3182
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
3233 // Dispatched behavior. 3241 // Dispatched behavior.
3234 #ifdef DEBUG 3242 #ifdef DEBUG
3235 void MapPrint(); 3243 void MapPrint();
3236 void MapVerify(); 3244 void MapVerify();
3237 void NormalizedMapVerify(); 3245 void NormalizedMapVerify();
3238 #endif 3246 #endif
3239 3247
3240 inline int visitor_id(); 3248 inline int visitor_id();
3241 inline void set_visitor_id(int visitor_id); 3249 inline void set_visitor_id(int visitor_id);
3242 3250
3251 typedef void (*TraverseCallback)(Map* map, void* data);
3252
3253 void TraverseTransitionTree(TraverseCallback callback, void* data);
3254
3243 static const int kMaxPreAllocatedPropertyFields = 255; 3255 static const int kMaxPreAllocatedPropertyFields = 255;
3244 3256
3245 // Layout description. 3257 // Layout description.
3246 static const int kInstanceSizesOffset = HeapObject::kHeaderSize; 3258 static const int kInstanceSizesOffset = HeapObject::kHeaderSize;
3247 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; 3259 static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize;
3248 static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize; 3260 static const int kPrototypeOffset = kInstanceAttributesOffset + kIntSize;
3249 static const int kConstructorOffset = kPrototypeOffset + kPointerSize; 3261 static const int kConstructorOffset = kPrototypeOffset + kPointerSize;
3250 static const int kInstanceDescriptorsOffset = 3262 static const int kInstanceDescriptorsOffset =
3251 kConstructorOffset + kPointerSize; 3263 kConstructorOffset + kPointerSize;
3252 static const int kCodeCacheOffset = kInstanceDescriptorsOffset + kPointerSize; 3264 static const int kCodeCacheOffset = kInstanceDescriptorsOffset + kPointerSize;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
3286 static const int kHasIndexedInterceptor = 4; 3298 static const int kHasIndexedInterceptor = 4;
3287 static const int kIsUndetectable = 5; 3299 static const int kIsUndetectable = 5;
3288 static const int kHasInstanceCallHandler = 6; 3300 static const int kHasInstanceCallHandler = 6;
3289 static const int kIsAccessCheckNeeded = 7; 3301 static const int kIsAccessCheckNeeded = 7;
3290 3302
3291 // Bit positions for bit field 2 3303 // Bit positions for bit field 2
3292 static const int kIsExtensible = 0; 3304 static const int kIsExtensible = 0;
3293 static const int kFunctionWithPrototype = 1; 3305 static const int kFunctionWithPrototype = 1;
3294 static const int kHasFastElements = 2; 3306 static const int kHasFastElements = 2;
3295 static const int kStringWrapperSafeForDefaultValueOf = 3; 3307 static const int kStringWrapperSafeForDefaultValueOf = 3;
3308 static const int kAttachedToSharedFunctionInfo = 4;
3296 3309
3297 // Layout of the default cache. It holds alternating name and code objects. 3310 // Layout of the default cache. It holds alternating name and code objects.
3298 static const int kCodeCacheEntrySize = 2; 3311 static const int kCodeCacheEntrySize = 2;
3299 static const int kCodeCacheEntryNameOffset = 0; 3312 static const int kCodeCacheEntryNameOffset = 0;
3300 static const int kCodeCacheEntryCodeOffset = 1; 3313 static const int kCodeCacheEntryCodeOffset = 1;
3301 3314
3302 typedef FixedBodyDescriptor<kPointerFieldsBeginOffset, 3315 typedef FixedBodyDescriptor<kPointerFieldsBeginOffset,
3303 kPointerFieldsEndOffset, 3316 kPointerFieldsEndOffset,
3304 kSize> BodyDescriptor; 3317 kSize> BodyDescriptor;
3305 3318
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
3440 inline void set_formal_parameter_count(int value); 3453 inline void set_formal_parameter_count(int value);
3441 3454
3442 // Set the formal parameter count so the function code will be 3455 // Set the formal parameter count so the function code will be
3443 // called without using argument adaptor frames. 3456 // called without using argument adaptor frames.
3444 inline void DontAdaptArguments(); 3457 inline void DontAdaptArguments();
3445 3458
3446 // [expected_nof_properties]: Expected number of properties for the function. 3459 // [expected_nof_properties]: Expected number of properties for the function.
3447 inline int expected_nof_properties(); 3460 inline int expected_nof_properties();
3448 inline void set_expected_nof_properties(int value); 3461 inline void set_expected_nof_properties(int value);
3449 3462
3463 // Inobject slack tracking is the way to reclaim unused inobject space.
3464 //
3465 // The instance size is initially determined by adding some slack to
3466 // expected_nof_properties (to allow for a few extra properties added
3467 // after the constructor). There is no guarantee that the extra space
3468 // will not be wasted.
3469 //
3470 // Here is the algorithm to reclaim the unused inobject space:
3471 // - Detect the first constructor call for this SharedFunctionInfo.
3472 // When it happens enter the "in progress" state: remember the
3473 // constructor's initial_map and install a special construct stub that
3474 // counts constructor calls.
3475 // - While the tracking is in progress create objects filled with
3476 // one_pointer_filler_map instead of undefined_value. This way they can be
3477 // resized quickly and safely.
3478 // - Once enough (kGenerousAllocationCount) objects have been created
3479 // compute the 'slack' (traverse the map transition tree starting from the
3480 // initial_map and find the lowest value of unused_property_fields).
3481 // - Traverse the transition tree again and decrease the instance size
3482 // of every map. Existing objects will resize automatically (they are
3483 // filled with one_pointer_filler_map). All further allocations will
3484 // use the adjusted instance size.
3485 // - Decrease expected_nof_properties so that an allocations made from
3486 // another context will use the adjusted instance size too.
3487 // - Exit "in progress" state by clearing the reference to the initial_map
3488 // and setting the regular construct stub (generic or inline).
3489 //
3490 // The above is the main event sequence. Two special cases are possible
3491 // while the tracking is in progress:
3492 //
3493 // - GC occurs.
3494 // Check if the initial_map is referenced by any live objects (except this
3495 // SharedFunctionInfo). If it is, continue tracking as usual.
3496 // If it is not, clear the reference and reset the tracking state. The
3497 // tracking will be initiated again on the next constructor call.
3498 //
3499 // - The constructor is called from another context.
Vitaly Repeshko 2010/09/22 14:40:25 As we discussed this probably applies also to the
Vladislav Kaznacheev 2010/09/23 08:38:16 Done.
3500 // Immediately complete the tracking, perform all the necessary changes
3501 // to maps. This is necessary because there is no efficient way to track
3502 // object creation in multiple contexts.
3503 // Proceed to create an object in the current context (with the adjusted
3504 // size).
3505 //
3506 // Important: inobject slack tracking is not attempted during the snapshot
3507 // creation.
3508
3509 static const int kGenerousAllocationCount = 16;
3510
3511 // [construction_count]: Counter for constructor calls made during
3512 // the tracking phase.
3513 inline int construction_count();
3514 inline void set_construction_count(int value);
3515
3516 // [initial_map]: initial map of the first function called as a constructor.
3517 // Saved for the duration of the tracking phase.
3518 // This is a weak link (GC resets it to undefined_value if no other live
3519 // object reference this map).
3520 DECL_ACCESSORS(initial_map, Object)
3521
3522 // True if the initial_map is not undefined and the countdown stub is
3523 // installed.
3524 inline bool IsInobjectSlackTrackingInProgress();
3525
3526 // Starts the tracking.
3527 // Stores the initial map and installs the countdown stub.
3528 // IsInobjectSlackTrackingInProgress is normally true after this call,
3529 // except when tracking have not been started (e.g. the map has no unused
3530 // properties or the snapshot is being built).
3531 void StartInobjectSlackTracking(Map* map);
3532
3533 // Completes the tracking.
3534 // IsInobjectSlackTrackingInProgress is false after this call.
3535 void CompleteInobjectSlackTracking();
3536
3537 // Clears the initial_map before the GC marking phase to ensure the reference
3538 // is weak. IsInobjectSlackTrackingInProgress is false after this call.
3539 void DetachInitialMap();
3540
3541 // Restores the link to the initial map after the GC marking phase.
3542 // IsInobjectSlackTrackingInProgress is true after this call.
3543 void AttachInitialMap(Map* map);
3544
3545 // False if there are definitely no live objects created from this function.
3546 // True if live objects _may_ exist (existence not guaranteed).
3547 // May go back from true to false after GC.
3548 inline bool live_objects_may_exist();
3549
3550 inline void set_live_objects_may_exist(bool value);
3551
3450 // [instance class name]: class name for instances. 3552 // [instance class name]: class name for instances.
3451 DECL_ACCESSORS(instance_class_name, Object) 3553 DECL_ACCESSORS(instance_class_name, Object)
3452 3554
3453 // [function data]: This field holds some additional data for function. 3555 // [function data]: This field holds some additional data for function.
3454 // Currently it either has FunctionTemplateInfo to make benefit the API 3556 // Currently it either has FunctionTemplateInfo to make benefit the API
3455 // or Smi identifying a custom call generator. 3557 // or Smi identifying a custom call generator.
3456 // In the long run we don't want all functions to have this field but 3558 // In the long run we don't want all functions to have this field but
3457 // we can fix that when we have a better model for storing hidden data 3559 // we can fix that when we have a better model for storing hidden data
3458 // on objects. 3560 // on objects.
3459 DECL_ACCESSORS(function_data, Object) 3561 DECL_ACCESSORS(function_data, Object)
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
3591 static const int kCodeOffset = kNameOffset + kPointerSize; 3693 static const int kCodeOffset = kNameOffset + kPointerSize;
3592 static const int kScopeInfoOffset = kCodeOffset + kPointerSize; 3694 static const int kScopeInfoOffset = kCodeOffset + kPointerSize;
3593 static const int kConstructStubOffset = kScopeInfoOffset + kPointerSize; 3695 static const int kConstructStubOffset = kScopeInfoOffset + kPointerSize;
3594 static const int kInstanceClassNameOffset = 3696 static const int kInstanceClassNameOffset =
3595 kConstructStubOffset + kPointerSize; 3697 kConstructStubOffset + kPointerSize;
3596 static const int kFunctionDataOffset = 3698 static const int kFunctionDataOffset =
3597 kInstanceClassNameOffset + kPointerSize; 3699 kInstanceClassNameOffset + kPointerSize;
3598 static const int kScriptOffset = kFunctionDataOffset + kPointerSize; 3700 static const int kScriptOffset = kFunctionDataOffset + kPointerSize;
3599 static const int kDebugInfoOffset = kScriptOffset + kPointerSize; 3701 static const int kDebugInfoOffset = kScriptOffset + kPointerSize;
3600 static const int kInferredNameOffset = kDebugInfoOffset + kPointerSize; 3702 static const int kInferredNameOffset = kDebugInfoOffset + kPointerSize;
3703 static const int kInitialMapOffset =
3704 kInferredNameOffset + kPointerSize;
3601 static const int kThisPropertyAssignmentsOffset = 3705 static const int kThisPropertyAssignmentsOffset =
3602 kInferredNameOffset + kPointerSize; 3706 kInitialMapOffset + kPointerSize;
3603 #if V8_HOST_ARCH_32_BIT 3707 #if V8_HOST_ARCH_32_BIT
3604 // Smi fields. 3708 // Smi fields.
3605 static const int kLengthOffset = 3709 static const int kLengthOffset =
3606 kThisPropertyAssignmentsOffset + kPointerSize; 3710 kThisPropertyAssignmentsOffset + kPointerSize;
3607 static const int kFormalParameterCountOffset = kLengthOffset + kPointerSize; 3711 static const int kFormalParameterCountOffset = kLengthOffset + kPointerSize;
3608 static const int kExpectedNofPropertiesOffset = 3712 static const int kExpectedNofPropertiesOffset =
3609 kFormalParameterCountOffset + kPointerSize; 3713 kFormalParameterCountOffset + kPointerSize;
3610 static const int kNumLiteralsOffset = 3714 static const int kNumLiteralsOffset =
3611 kExpectedNofPropertiesOffset + kPointerSize; 3715 kExpectedNofPropertiesOffset + kPointerSize;
3612 static const int kStartPositionAndTypeOffset = 3716 static const int kStartPositionAndTypeOffset =
3613 kNumLiteralsOffset + kPointerSize; 3717 kNumLiteralsOffset + kPointerSize;
3614 static const int kEndPositionOffset = 3718 static const int kEndPositionOffset =
3615 kStartPositionAndTypeOffset + kPointerSize; 3719 kStartPositionAndTypeOffset + kPointerSize;
3616 static const int kFunctionTokenPositionOffset = 3720 static const int kFunctionTokenPositionOffset =
3617 kEndPositionOffset + kPointerSize; 3721 kEndPositionOffset + kPointerSize;
3618 static const int kCompilerHintsOffset = 3722 static const int kCompilerHintsOffset =
3619 kFunctionTokenPositionOffset + kPointerSize; 3723 kFunctionTokenPositionOffset + kPointerSize;
3620 static const int kThisPropertyAssignmentsCountOffset = 3724 static const int kThisPropertyAssignmentsCountOffset =
3621 kCompilerHintsOffset + kPointerSize; 3725 kCompilerHintsOffset + kPointerSize;
3622 // Total size. 3726 // Total size.
3623 static const int kSize = kThisPropertyAssignmentsCountOffset + kPointerSize; 3727 static const int kSize = kThisPropertyAssignmentsCountOffset + kPointerSize;
3624 #else 3728 #else
3625 // The only reason to use smi fields instead of int fields 3729 // The only reason to use smi fields instead of int fields
3626 // is to allow interation without maps decoding during 3730 // is to allow iteration without maps decoding during
3627 // garbage collections. 3731 // garbage collections.
3628 // To avoid wasting space on 64-bit architectures we use 3732 // To avoid wasting space on 64-bit architectures we use
3629 // the following trick: we group integer fields into pairs 3733 // the following trick: we group integer fields into pairs
3630 // First integer in each pair is shifted left by 1. 3734 // First integer in each pair is shifted left by 1.
3631 // By doing this we guarantee that LSB of each kPointerSize aligned 3735 // By doing this we guarantee that LSB of each kPointerSize aligned
3632 // word is not set and thus this word cannot be treated as pointer 3736 // word is not set and thus this word cannot be treated as pointer
3633 // to HeapObject during old space traversal. 3737 // to HeapObject during old space traversal.
3634 static const int kLengthOffset = 3738 static const int kLengthOffset =
3635 kThisPropertyAssignmentsOffset + kPointerSize; 3739 kThisPropertyAssignmentsOffset + kPointerSize;
3636 static const int kFormalParameterCountOffset = 3740 static const int kFormalParameterCountOffset =
(...skipping 14 matching lines...) Expand all
3651 static const int kCompilerHintsOffset = 3755 static const int kCompilerHintsOffset =
3652 kFunctionTokenPositionOffset + kIntSize; 3756 kFunctionTokenPositionOffset + kIntSize;
3653 3757
3654 static const int kThisPropertyAssignmentsCountOffset = 3758 static const int kThisPropertyAssignmentsCountOffset =
3655 kCompilerHintsOffset + kIntSize; 3759 kCompilerHintsOffset + kIntSize;
3656 3760
3657 // Total size. 3761 // Total size.
3658 static const int kSize = kThisPropertyAssignmentsCountOffset + kIntSize; 3762 static const int kSize = kThisPropertyAssignmentsCountOffset + kIntSize;
3659 3763
3660 #endif 3764 #endif
3765
3766 // The construction counter for inobject slack tracking is stored in the
3767 // most significant byte of compiler_hints which is otherwise unused.
3768 // Its offset depends on the endian-ness of the architecture.
3769 #if __BYTE_ORDER == __LITTLE_ENDIAN
3770 static const int kConstructionCountOffset = kCompilerHintsOffset + 3;
3771 #elif __BYTE_ORDER == __BIG_ENDIAN
3772 static const int kConstructionCountOffset = kCompilerHintsOffset + 0;
3773 #else
3774 #error Unknown byte ordering
3775 #endif
3776
3661 static const int kAlignedSize = POINTER_SIZE_ALIGN(kSize); 3777 static const int kAlignedSize = POINTER_SIZE_ALIGN(kSize);
3662 3778
3663 typedef FixedBodyDescriptor<kNameOffset, 3779 typedef FixedBodyDescriptor<kNameOffset,
3664 kThisPropertyAssignmentsOffset + kPointerSize, 3780 kThisPropertyAssignmentsOffset + kPointerSize,
3665 kSize> BodyDescriptor; 3781 kSize> BodyDescriptor;
3666 3782
3667 private: 3783 private:
3668 // Bit positions in start_position_and_type. 3784 // Bit positions in start_position_and_type.
3669 // The source code start position is in the 30 most significant bits of 3785 // The source code start position is in the 30 most significant bits of
3670 // the start_position_and_type field. 3786 // the start_position_and_type field.
3671 static const int kIsExpressionBit = 0; 3787 static const int kIsExpressionBit = 0;
3672 static const int kIsTopLevelBit = 1; 3788 static const int kIsTopLevelBit = 1;
3673 static const int kStartPositionShift = 2; 3789 static const int kStartPositionShift = 2;
3674 static const int kStartPositionMask = ~((1 << kStartPositionShift) - 1); 3790 static const int kStartPositionMask = ~((1 << kStartPositionShift) - 1);
3675 3791
3676 // Bit positions in compiler_hints. 3792 // Bit positions in compiler_hints.
3677 static const int kHasOnlySimpleThisPropertyAssignments = 0; 3793 static const int kHasOnlySimpleThisPropertyAssignments = 0;
3678 static const int kTryFullCodegen = 1; 3794 static const int kTryFullCodegen = 1;
3679 static const int kAllowLazyCompilation = 2; 3795 static const int kAllowLazyCompilation = 2;
3680 static const int kCodeAgeShift = 3; 3796 static const int kLiveObjectsMayExist = 3;
3797 static const int kCodeAgeShift = 4;
3681 static const int kCodeAgeMask = 7; 3798 static const int kCodeAgeMask = 7;
3682 3799
3683 DISALLOW_IMPLICIT_CONSTRUCTORS(SharedFunctionInfo); 3800 DISALLOW_IMPLICIT_CONSTRUCTORS(SharedFunctionInfo);
3684 }; 3801 };
3685 3802
3686 3803
3687 // JSFunction describes JavaScript functions. 3804 // JSFunction describes JavaScript functions.
3688 class JSFunction: public JSObject { 3805 class JSFunction: public JSObject {
3689 public: 3806 public:
3690 // [prototype_or_initial_map]: 3807 // [prototype_or_initial_map]:
(...skipping 1880 matching lines...) Expand 10 before | Expand all | Expand 10 after
5571 } else { 5688 } else {
5572 value &= ~(1 << bit_position); 5689 value &= ~(1 << bit_position);
5573 } 5690 }
5574 return value; 5691 return value;
5575 } 5692 }
5576 }; 5693 };
5577 5694
5578 } } // namespace v8::internal 5695 } } // namespace v8::internal
5579 5696
5580 #endif // V8_OBJECTS_H_ 5697 #endif // V8_OBJECTS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698