OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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_ |
OLD | NEW |