Chromium Code Reviews| 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 |