Deprecate several unchecked accessors.
R=hpayer@google.com BUG=v8:1490 Review URL: https://codereview.chromium.org/16663009 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15123 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
4ac1aa533d
commit
fede5231bc
@ -1495,15 +1495,13 @@ class MarkCompactMarkingVisitor
|
|||||||
FIXED_ARRAY_TYPE) return;
|
FIXED_ARRAY_TYPE) return;
|
||||||
|
|
||||||
// Make sure this is a RegExp that actually contains code.
|
// Make sure this is a RegExp that actually contains code.
|
||||||
if (re->TypeTagUnchecked() != JSRegExp::IRREGEXP) return;
|
if (re->TypeTag() != JSRegExp::IRREGEXP) return;
|
||||||
|
|
||||||
Object* code = re->DataAtUnchecked(JSRegExp::code_index(is_ascii));
|
Object* code = re->DataAt(JSRegExp::code_index(is_ascii));
|
||||||
if (!code->IsSmi() &&
|
if (!code->IsSmi() &&
|
||||||
HeapObject::cast(code)->map()->instance_type() == CODE_TYPE) {
|
HeapObject::cast(code)->map()->instance_type() == CODE_TYPE) {
|
||||||
// Save a copy that can be reinstated if we need the code again.
|
// Save a copy that can be reinstated if we need the code again.
|
||||||
re->SetDataAtUnchecked(JSRegExp::saved_code_index(is_ascii),
|
re->SetDataAt(JSRegExp::saved_code_index(is_ascii), code);
|
||||||
code,
|
|
||||||
heap);
|
|
||||||
|
|
||||||
// Saving a copy might create a pointer into compaction candidate
|
// Saving a copy might create a pointer into compaction candidate
|
||||||
// that was not observed by marker. This might happen if JSRegExp data
|
// that was not observed by marker. This might happen if JSRegExp data
|
||||||
@ -1515,9 +1513,8 @@ class MarkCompactMarkingVisitor
|
|||||||
RecordSlot(slot, slot, code);
|
RecordSlot(slot, slot, code);
|
||||||
|
|
||||||
// Set a number in the 0-255 range to guarantee no smi overflow.
|
// Set a number in the 0-255 range to guarantee no smi overflow.
|
||||||
re->SetDataAtUnchecked(JSRegExp::code_index(is_ascii),
|
re->SetDataAt(JSRegExp::code_index(is_ascii),
|
||||||
Smi::FromInt(heap->sweep_generation() & 0xff),
|
Smi::FromInt(heap->sweep_generation() & 0xff));
|
||||||
heap);
|
|
||||||
} else if (code->IsSmi()) {
|
} else if (code->IsSmi()) {
|
||||||
int value = Smi::cast(code)->value();
|
int value = Smi::cast(code)->value();
|
||||||
// The regexp has not been compiled yet or there was a compilation error.
|
// The regexp has not been compiled yet or there was a compilation error.
|
||||||
@ -1528,12 +1525,10 @@ class MarkCompactMarkingVisitor
|
|||||||
|
|
||||||
// Check if we should flush now.
|
// Check if we should flush now.
|
||||||
if (value == ((heap->sweep_generation() - kRegExpCodeThreshold) & 0xff)) {
|
if (value == ((heap->sweep_generation() - kRegExpCodeThreshold) & 0xff)) {
|
||||||
re->SetDataAtUnchecked(JSRegExp::code_index(is_ascii),
|
re->SetDataAt(JSRegExp::code_index(is_ascii),
|
||||||
Smi::FromInt(JSRegExp::kUninitializedValue),
|
Smi::FromInt(JSRegExp::kUninitializedValue));
|
||||||
heap);
|
re->SetDataAt(JSRegExp::saved_code_index(is_ascii),
|
||||||
re->SetDataAtUnchecked(JSRegExp::saved_code_index(is_ascii),
|
Smi::FromInt(JSRegExp::kUninitializedValue));
|
||||||
Smi::FromInt(JSRegExp::kUninitializedValue),
|
|
||||||
heap);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2448,7 +2443,7 @@ void MarkCompactCollector::ClearNonLiveReferences() {
|
|||||||
// This map is used for inobject slack tracking and has been detached
|
// This map is used for inobject slack tracking and has been detached
|
||||||
// from SharedFunctionInfo during the mark phase.
|
// from SharedFunctionInfo during the mark phase.
|
||||||
// Since it survived the GC, reattach it now.
|
// Since it survived the GC, reattach it now.
|
||||||
map->unchecked_constructor()->shared()->AttachInitialMap(map);
|
JSFunction::cast(map->constructor())->shared()->AttachInitialMap(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClearNonLivePrototypeTransitions(map);
|
ClearNonLivePrototypeTransitions(map);
|
||||||
@ -2479,13 +2474,11 @@ void MarkCompactCollector::ClearNonLivePrototypeTransitions(Map* map) {
|
|||||||
int proto_index = proto_offset + new_number_of_transitions * step;
|
int proto_index = proto_offset + new_number_of_transitions * step;
|
||||||
int map_index = map_offset + new_number_of_transitions * step;
|
int map_index = map_offset + new_number_of_transitions * step;
|
||||||
if (new_number_of_transitions != i) {
|
if (new_number_of_transitions != i) {
|
||||||
prototype_transitions->set_unchecked(
|
prototype_transitions->set(
|
||||||
heap_,
|
|
||||||
proto_index,
|
proto_index,
|
||||||
prototype,
|
prototype,
|
||||||
UPDATE_WRITE_BARRIER);
|
UPDATE_WRITE_BARRIER);
|
||||||
prototype_transitions->set_unchecked(
|
prototype_transitions->set(
|
||||||
heap_,
|
|
||||||
map_index,
|
map_index,
|
||||||
cached_map,
|
cached_map,
|
||||||
SKIP_WRITE_BARRIER);
|
SKIP_WRITE_BARRIER);
|
||||||
|
@ -2091,30 +2091,6 @@ void FixedArray::set_the_hole(int index) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void FixedArray::set_unchecked(int index, Smi* value) {
|
|
||||||
ASSERT(reinterpret_cast<Object*>(value)->IsSmi());
|
|
||||||
int offset = kHeaderSize + index * kPointerSize;
|
|
||||||
WRITE_FIELD(this, offset, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FixedArray::set_unchecked(Heap* heap,
|
|
||||||
int index,
|
|
||||||
Object* value,
|
|
||||||
WriteBarrierMode mode) {
|
|
||||||
int offset = kHeaderSize + index * kPointerSize;
|
|
||||||
WRITE_FIELD(this, offset, value);
|
|
||||||
CONDITIONAL_WRITE_BARRIER(heap, this, offset, value, mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FixedArray::set_null_unchecked(Heap* heap, int index) {
|
|
||||||
ASSERT(index >= 0 && index < this->length());
|
|
||||||
ASSERT(!heap->InNewSpace(heap->null_value()));
|
|
||||||
WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
double* FixedDoubleArray::data_start() {
|
double* FixedDoubleArray::data_start() {
|
||||||
return reinterpret_cast<double*>(FIELD_ADDR(this, kHeaderSize));
|
return reinterpret_cast<double*>(FIELD_ADDR(this, kHeaderSize));
|
||||||
}
|
}
|
||||||
@ -3577,11 +3553,6 @@ bool Map::is_dictionary_map() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JSFunction* Map::unchecked_constructor() {
|
|
||||||
return reinterpret_cast<JSFunction*>(READ_FIELD(this, kConstructorOffset));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Code::Flags Code::flags() {
|
Code::Flags Code::flags() {
|
||||||
return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset));
|
return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset));
|
||||||
}
|
}
|
||||||
@ -4744,11 +4715,6 @@ Code* SharedFunctionInfo::code() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Code* SharedFunctionInfo::unchecked_code() {
|
|
||||||
return reinterpret_cast<Code*>(READ_FIELD(this, kCodeOffset));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
|
void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
|
||||||
WRITE_FIELD(this, kCodeOffset, value);
|
WRITE_FIELD(this, kCodeOffset, value);
|
||||||
CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value, mode);
|
CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value, mode);
|
||||||
@ -5285,12 +5251,6 @@ int Code::body_size() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FixedArray* Code::unchecked_deoptimization_data() {
|
|
||||||
return reinterpret_cast<FixedArray*>(
|
|
||||||
READ_FIELD(this, kDeoptimizationDataOffset));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ByteArray* Code::unchecked_relocation_info() {
|
ByteArray* Code::unchecked_relocation_info() {
|
||||||
return reinterpret_cast<ByteArray*>(READ_FIELD(this, kRelocationInfoOffset));
|
return reinterpret_cast<ByteArray*>(READ_FIELD(this, kRelocationInfoOffset));
|
||||||
}
|
}
|
||||||
@ -5366,12 +5326,6 @@ JSRegExp::Type JSRegExp::TypeTag() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
JSRegExp::Type JSRegExp::TypeTagUnchecked() {
|
|
||||||
Smi* smi = Smi::cast(DataAtUnchecked(kTagIndex));
|
|
||||||
return static_cast<JSRegExp::Type>(smi->value());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int JSRegExp::CaptureCount() {
|
int JSRegExp::CaptureCount() {
|
||||||
switch (TypeTag()) {
|
switch (TypeTag()) {
|
||||||
case ATOM:
|
case ATOM:
|
||||||
@ -5407,13 +5361,6 @@ Object* JSRegExp::DataAt(int index) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Object* JSRegExp::DataAtUnchecked(int index) {
|
|
||||||
FixedArray* fa = reinterpret_cast<FixedArray*>(data());
|
|
||||||
int offset = FixedArray::kHeaderSize + index * kPointerSize;
|
|
||||||
return READ_FIELD(fa, offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void JSRegExp::SetDataAt(int index, Object* value) {
|
void JSRegExp::SetDataAt(int index, Object* value) {
|
||||||
ASSERT(TypeTag() != NOT_COMPILED);
|
ASSERT(TypeTag() != NOT_COMPILED);
|
||||||
ASSERT(index >= kDataIndex); // Only implementation data can be set this way.
|
ASSERT(index >= kDataIndex); // Only implementation data can be set this way.
|
||||||
@ -5421,18 +5368,6 @@ void JSRegExp::SetDataAt(int index, Object* value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void JSRegExp::SetDataAtUnchecked(int index, Object* value, Heap* heap) {
|
|
||||||
ASSERT(index >= kDataIndex); // Only implementation data can be set this way.
|
|
||||||
FixedArray* fa = reinterpret_cast<FixedArray*>(data());
|
|
||||||
if (value->IsSmi()) {
|
|
||||||
fa->set_unchecked(index, Smi::cast(value));
|
|
||||||
} else {
|
|
||||||
// We only do this during GC, so we don't need to notify the write barrier.
|
|
||||||
fa->set_unchecked(heap, index, value, SKIP_WRITE_BARRIER);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ElementsKind JSObject::GetElementsKind() {
|
ElementsKind JSObject::GetElementsKind() {
|
||||||
ElementsKind kind = map()->elements_kind();
|
ElementsKind kind = map()->elements_kind();
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
@ -2571,7 +2571,7 @@ class FixedArray: public FixedArrayBase {
|
|||||||
inline void set(int index, Object* value);
|
inline void set(int index, Object* value);
|
||||||
inline bool is_the_hole(int index);
|
inline bool is_the_hole(int index);
|
||||||
|
|
||||||
// Setter that doesn't need write barrier).
|
// Setter that doesn't need write barrier.
|
||||||
inline void set(int index, Smi* value);
|
inline void set(int index, Smi* value);
|
||||||
// Setter with explicit barrier mode.
|
// Setter with explicit barrier mode.
|
||||||
inline void set(int index, Object* value, WriteBarrierMode mode);
|
inline void set(int index, Object* value, WriteBarrierMode mode);
|
||||||
@ -2585,12 +2585,6 @@ class FixedArray: public FixedArrayBase {
|
|||||||
inline void set_null(Heap* heap, int index);
|
inline void set_null(Heap* heap, int index);
|
||||||
inline void set_the_hole(int index);
|
inline void set_the_hole(int index);
|
||||||
|
|
||||||
// Setters with less debug checks for the GC to use.
|
|
||||||
inline void set_unchecked(int index, Smi* value);
|
|
||||||
inline void set_null_unchecked(Heap* heap, int index);
|
|
||||||
inline void set_unchecked(Heap* heap, int index, Object* value,
|
|
||||||
WriteBarrierMode mode);
|
|
||||||
|
|
||||||
inline Object** GetFirstElementAddress();
|
inline Object** GetFirstElementAddress();
|
||||||
inline bool ContainsOnlySmisOrHoles();
|
inline bool ContainsOnlySmisOrHoles();
|
||||||
|
|
||||||
@ -4553,7 +4547,6 @@ class Code: public HeapObject {
|
|||||||
|
|
||||||
// Unchecked accessors to be used during GC.
|
// Unchecked accessors to be used during GC.
|
||||||
inline ByteArray* unchecked_relocation_info();
|
inline ByteArray* unchecked_relocation_info();
|
||||||
inline FixedArray* unchecked_deoptimization_data();
|
|
||||||
|
|
||||||
inline int relocation_size();
|
inline int relocation_size();
|
||||||
|
|
||||||
@ -5320,8 +5313,6 @@ class Map: public HeapObject {
|
|||||||
// [constructor]: points back to the function responsible for this map.
|
// [constructor]: points back to the function responsible for this map.
|
||||||
DECL_ACCESSORS(constructor, Object)
|
DECL_ACCESSORS(constructor, Object)
|
||||||
|
|
||||||
inline JSFunction* unchecked_constructor();
|
|
||||||
|
|
||||||
// [instance descriptors]: describes the object.
|
// [instance descriptors]: describes the object.
|
||||||
DECL_ACCESSORS(instance_descriptors, DescriptorArray)
|
DECL_ACCESSORS(instance_descriptors, DescriptorArray)
|
||||||
inline void InitializeDescriptors(DescriptorArray* descriptors);
|
inline void InitializeDescriptors(DescriptorArray* descriptors);
|
||||||
@ -5373,8 +5364,7 @@ class Map: public HeapObject {
|
|||||||
inline void SetNumberOfProtoTransitions(int value) {
|
inline void SetNumberOfProtoTransitions(int value) {
|
||||||
FixedArray* cache = GetPrototypeTransitions();
|
FixedArray* cache = GetPrototypeTransitions();
|
||||||
ASSERT(cache->length() != 0);
|
ASSERT(cache->length() != 0);
|
||||||
cache->set_unchecked(kProtoTransitionNumberOfEntriesOffset,
|
cache->set(kProtoTransitionNumberOfEntriesOffset, Smi::FromInt(value));
|
||||||
Smi::FromInt(value));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lookup in the map's instance descriptors and fill out the result
|
// Lookup in the map's instance descriptors and fill out the result
|
||||||
@ -5940,8 +5930,6 @@ class SharedFunctionInfo: public HeapObject {
|
|||||||
// [construct stub]: Code stub for constructing instances of this function.
|
// [construct stub]: Code stub for constructing instances of this function.
|
||||||
DECL_ACCESSORS(construct_stub, Code)
|
DECL_ACCESSORS(construct_stub, Code)
|
||||||
|
|
||||||
inline Code* unchecked_code();
|
|
||||||
|
|
||||||
// Returns if this function has been compiled to native code yet.
|
// Returns if this function has been compiled to native code yet.
|
||||||
inline bool is_compiled();
|
inline bool is_compiled();
|
||||||
|
|
||||||
@ -7132,11 +7120,6 @@ class JSRegExp: public JSObject {
|
|||||||
// Set implementation data after the object has been prepared.
|
// Set implementation data after the object has been prepared.
|
||||||
inline void SetDataAt(int index, Object* value);
|
inline void SetDataAt(int index, Object* value);
|
||||||
|
|
||||||
// Used during GC when flushing code or setting age.
|
|
||||||
inline Object* DataAtUnchecked(int index);
|
|
||||||
inline void SetDataAtUnchecked(int index, Object* value, Heap* heap);
|
|
||||||
inline Type TypeTagUnchecked();
|
|
||||||
|
|
||||||
static int code_index(bool is_ascii) {
|
static int code_index(bool is_ascii) {
|
||||||
if (is_ascii) {
|
if (is_ascii) {
|
||||||
return kIrregexpASCIICodeIndex;
|
return kIrregexpASCIICodeIndex;
|
||||||
|
Loading…
Reference in New Issue
Block a user