| Index: src/objects-inl.h
|
| ===================================================================
|
| --- src/objects-inl.h (revision 6800)
|
| +++ src/objects-inl.h (working copy)
|
| @@ -58,8 +58,7 @@
|
|
|
|
|
| PropertyDetails PropertyDetails::AsDeleted() {
|
| - PropertyDetails d(DONT_ENUM, NORMAL);
|
| - Smi* smi = Smi::FromInt(AsSmi()->value() | DeletedField::encode(1));
|
| + Smi* smi = Smi::FromInt(value_ | DeletedField::encode(1));
|
| return PropertyDetails(smi);
|
| }
|
|
|
| @@ -410,7 +409,7 @@
|
|
|
| bool MaybeObject::IsOutOfMemory() {
|
| return HAS_FAILURE_TAG(this)
|
| - && Failure::cast(this)->IsOutOfMemoryException();
|
| + && Failure::cast(this)->IsOutOfMemoryException();
|
| }
|
|
|
|
|
| @@ -432,26 +431,26 @@
|
|
|
| bool Object::IsJSObject() {
|
| return IsHeapObject()
|
| - && HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE;
|
| + && HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE;
|
| }
|
|
|
|
|
| bool Object::IsJSContextExtensionObject() {
|
| return IsHeapObject()
|
| - && (HeapObject::cast(this)->map()->instance_type() ==
|
| - JS_CONTEXT_EXTENSION_OBJECT_TYPE);
|
| + && (HeapObject::cast(this)->map()->instance_type() ==
|
| + JS_CONTEXT_EXTENSION_OBJECT_TYPE);
|
| }
|
|
|
|
|
| bool Object::IsMap() {
|
| return Object::IsHeapObject()
|
| - && HeapObject::cast(this)->map()->instance_type() == MAP_TYPE;
|
| + && HeapObject::cast(this)->map()->instance_type() == MAP_TYPE;
|
| }
|
|
|
|
|
| bool Object::IsFixedArray() {
|
| return Object::IsHeapObject()
|
| - && HeapObject::cast(this)->map()->instance_type() == FIXED_ARRAY_TYPE;
|
| + && HeapObject::cast(this)->map()->instance_type() == FIXED_ARRAY_TYPE;
|
| }
|
|
|
|
|
| @@ -497,19 +496,19 @@
|
|
|
| bool Object::IsCatchContext() {
|
| return Object::IsHeapObject()
|
| - && HeapObject::cast(this)->map() == Heap::catch_context_map();
|
| + && HeapObject::cast(this)->map() == Heap::catch_context_map();
|
| }
|
|
|
|
|
| bool Object::IsGlobalContext() {
|
| return Object::IsHeapObject()
|
| - && HeapObject::cast(this)->map() == Heap::global_context_map();
|
| + && HeapObject::cast(this)->map() == Heap::global_context_map();
|
| }
|
|
|
|
|
| bool Object::IsJSFunction() {
|
| return Object::IsHeapObject()
|
| - && HeapObject::cast(this)->map()->instance_type() == JS_FUNCTION_TYPE;
|
| + && HeapObject::cast(this)->map()->instance_type() == JS_FUNCTION_TYPE;
|
| }
|
|
|
|
|
| @@ -520,7 +519,7 @@
|
|
|
| bool Object::IsCode() {
|
| return Object::IsHeapObject()
|
| - && HeapObject::cast(this)->map()->instance_type() == CODE_TYPE;
|
| + && HeapObject::cast(this)->map()->instance_type() == CODE_TYPE;
|
| }
|
|
|
|
|
| @@ -546,10 +545,17 @@
|
|
|
| bool Object::IsJSValue() {
|
| return Object::IsHeapObject()
|
| - && HeapObject::cast(this)->map()->instance_type() == JS_VALUE_TYPE;
|
| + && HeapObject::cast(this)->map()->instance_type() == JS_VALUE_TYPE;
|
| }
|
|
|
|
|
| +bool Object::IsJSMessageObject() {
|
| + return Object::IsHeapObject()
|
| + && (HeapObject::cast(this)->map()->instance_type() ==
|
| + JS_MESSAGE_OBJECT_TYPE);
|
| +}
|
| +
|
| +
|
| bool Object::IsStringWrapper() {
|
| return IsJSValue() && JSValue::cast(this)->value()->IsString();
|
| }
|
| @@ -557,7 +563,7 @@
|
|
|
| bool Object::IsProxy() {
|
| return Object::IsHeapObject()
|
| - && HeapObject::cast(this)->map()->instance_type() == PROXY_TYPE;
|
| + && HeapObject::cast(this)->map()->instance_type() == PROXY_TYPE;
|
| }
|
|
|
|
|
| @@ -568,13 +574,13 @@
|
|
|
| bool Object::IsJSArray() {
|
| return Object::IsHeapObject()
|
| - && HeapObject::cast(this)->map()->instance_type() == JS_ARRAY_TYPE;
|
| + && HeapObject::cast(this)->map()->instance_type() == JS_ARRAY_TYPE;
|
| }
|
|
|
|
|
| bool Object::IsJSRegExp() {
|
| return Object::IsHeapObject()
|
| - && HeapObject::cast(this)->map()->instance_type() == JS_REGEXP_TYPE;
|
| + && HeapObject::cast(this)->map()->instance_type() == JS_REGEXP_TYPE;
|
| }
|
|
|
|
|
| @@ -585,7 +591,7 @@
|
|
|
| bool Object::IsHashTable() {
|
| return Object::IsHeapObject()
|
| - && HeapObject::cast(this)->map() == Heap::hash_table_map();
|
| + && HeapObject::cast(this)->map() == Heap::hash_table_map();
|
| }
|
|
|
|
|
| @@ -731,6 +737,11 @@
|
| }
|
|
|
|
|
| +bool Object::IsArgumentsMarker() {
|
| + return this == Heap::arguments_marker();
|
| +}
|
| +
|
| +
|
| double Object::Number() {
|
| ASSERT(IsNumber());
|
| return IsSmi()
|
| @@ -1155,6 +1166,8 @@
|
| return JSValue::kSize;
|
| case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
|
| return JSObject::kHeaderSize;
|
| + case JS_MESSAGE_OBJECT_TYPE:
|
| + return JSMessageObject::kSize;
|
| default:
|
| UNREACHABLE();
|
| return 0;
|
| @@ -1847,13 +1860,13 @@
|
|
|
|
|
| void JSFunctionResultCache::MakeZeroSize() {
|
| - set(kFingerIndex, Smi::FromInt(kEntriesIndex));
|
| - set(kCacheSizeIndex, Smi::FromInt(kEntriesIndex));
|
| + set_finger_index(kEntriesIndex);
|
| + set_size(kEntriesIndex);
|
| }
|
|
|
|
|
| void JSFunctionResultCache::Clear() {
|
| - int cache_size = Smi::cast(get(kCacheSizeIndex))->value();
|
| + int cache_size = size();
|
| Object** entries_start = RawField(this, OffsetOfElementAt(kEntriesIndex));
|
| MemsetPointer(entries_start,
|
| Heap::the_hole_value(),
|
| @@ -1862,6 +1875,26 @@
|
| }
|
|
|
|
|
| +int JSFunctionResultCache::size() {
|
| + return Smi::cast(get(kCacheSizeIndex))->value();
|
| +}
|
| +
|
| +
|
| +void JSFunctionResultCache::set_size(int size) {
|
| + set(kCacheSizeIndex, Smi::FromInt(size));
|
| +}
|
| +
|
| +
|
| +int JSFunctionResultCache::finger_index() {
|
| + return Smi::cast(get(kFingerIndex))->value();
|
| +}
|
| +
|
| +
|
| +void JSFunctionResultCache::set_finger_index(int finger_index) {
|
| + set(kFingerIndex, Smi::FromInt(finger_index));
|
| +}
|
| +
|
| +
|
| byte ByteArray::get(int index) {
|
| ASSERT(index >= 0 && index < this->length());
|
| return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
|
| @@ -2107,7 +2140,6 @@
|
|
|
|
|
| void Map::set_instance_type(InstanceType value) {
|
| - ASSERT(0 <= value && value < 256);
|
| WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value);
|
| }
|
|
|
| @@ -2266,6 +2298,12 @@
|
| }
|
|
|
|
|
| +Code::ExtraICState Code::extra_ic_state() {
|
| + ASSERT(is_inline_cache_stub());
|
| + return ExtractExtraICStateFromFlags(flags());
|
| +}
|
| +
|
| +
|
| PropertyType Code::type() {
|
| ASSERT(ic_state() == MONOMORPHIC);
|
| return ExtractTypeFromFlags(flags());
|
| @@ -2346,29 +2384,29 @@
|
| }
|
|
|
|
|
| -unsigned Code::safepoint_table_start() {
|
| +unsigned Code::safepoint_table_offset() {
|
| ASSERT(kind() == OPTIMIZED_FUNCTION);
|
| - return READ_UINT32_FIELD(this, kSafepointTableStartOffset);
|
| + return READ_UINT32_FIELD(this, kSafepointTableOffsetOffset);
|
| }
|
|
|
|
|
| -void Code::set_safepoint_table_start(unsigned offset) {
|
| +void Code::set_safepoint_table_offset(unsigned offset) {
|
| ASSERT(kind() == OPTIMIZED_FUNCTION);
|
| ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
|
| - WRITE_UINT32_FIELD(this, kSafepointTableStartOffset, offset);
|
| + WRITE_UINT32_FIELD(this, kSafepointTableOffsetOffset, offset);
|
| }
|
|
|
|
|
| -unsigned Code::stack_check_table_start() {
|
| +unsigned Code::stack_check_table_offset() {
|
| ASSERT(kind() == FUNCTION);
|
| - return READ_UINT32_FIELD(this, kStackCheckTableStartOffset);
|
| + return READ_UINT32_FIELD(this, kStackCheckTableOffsetOffset);
|
| }
|
|
|
|
|
| -void Code::set_stack_check_table_start(unsigned offset) {
|
| +void Code::set_stack_check_table_offset(unsigned offset) {
|
| ASSERT(kind() == FUNCTION);
|
| ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
|
| - WRITE_UINT32_FIELD(this, kStackCheckTableStartOffset, offset);
|
| + WRITE_UINT32_FIELD(this, kStackCheckTableOffsetOffset, offset);
|
| }
|
|
|
|
|
| @@ -2442,14 +2480,22 @@
|
| Code::Flags Code::ComputeFlags(Kind kind,
|
| InLoopFlag in_loop,
|
| InlineCacheState ic_state,
|
| + ExtraICState extra_ic_state,
|
| PropertyType type,
|
| int argc,
|
| InlineCacheHolderFlag holder) {
|
| + // Extra IC state is only allowed for monomorphic call IC stubs
|
| + // or for store IC stubs.
|
| + ASSERT(extra_ic_state == kNoExtraICState ||
|
| + (kind == CALL_IC && (ic_state == MONOMORPHIC ||
|
| + ic_state == MONOMORPHIC_PROTOTYPE_FAILURE)) ||
|
| + (kind == STORE_IC));
|
| // Compute the bit mask.
|
| int bits = kind << kFlagsKindShift;
|
| if (in_loop) bits |= kFlagsICInLoopMask;
|
| bits |= ic_state << kFlagsICStateShift;
|
| bits |= type << kFlagsTypeShift;
|
| + bits |= extra_ic_state << kFlagsExtraICStateShift;
|
| bits |= argc << kFlagsArgumentsCountShift;
|
| if (holder == PROTOTYPE_MAP) bits |= kFlagsCacheInPrototypeMapMask;
|
| // Cast to flags and validate result before returning it.
|
| @@ -2458,6 +2504,7 @@
|
| ASSERT(ExtractICStateFromFlags(result) == ic_state);
|
| ASSERT(ExtractICInLoopFromFlags(result) == in_loop);
|
| ASSERT(ExtractTypeFromFlags(result) == type);
|
| + ASSERT(ExtractExtraICStateFromFlags(result) == extra_ic_state);
|
| ASSERT(ExtractArgumentsCountFromFlags(result) == argc);
|
| return result;
|
| }
|
| @@ -2465,10 +2512,12 @@
|
|
|
| Code::Flags Code::ComputeMonomorphicFlags(Kind kind,
|
| PropertyType type,
|
| + ExtraICState extra_ic_state,
|
| InlineCacheHolderFlag holder,
|
| InLoopFlag in_loop,
|
| int argc) {
|
| - return ComputeFlags(kind, in_loop, MONOMORPHIC, type, argc, holder);
|
| + return ComputeFlags(
|
| + kind, in_loop, MONOMORPHIC, extra_ic_state, type, argc, holder);
|
| }
|
|
|
|
|
| @@ -2484,6 +2533,12 @@
|
| }
|
|
|
|
|
| +Code::ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
|
| + int bits = (flags & kFlagsExtraICStateMask) >> kFlagsExtraICStateShift;
|
| + return static_cast<ExtraICState>(bits);
|
| +}
|
| +
|
| +
|
| InLoopFlag Code::ExtractICInLoopFromFlags(Flags flags) {
|
| int bits = (flags & kFlagsICInLoopMask);
|
| return bits != 0 ? IN_LOOP : NOT_IN_LOOP;
|
| @@ -2568,6 +2623,22 @@
|
| }
|
|
|
|
|
| +MaybeObject* Map::GetPixelArrayElementsMap() {
|
| + if (has_pixel_array_elements()) return this;
|
| + // TODO(danno): Special case empty object map (or most common case)
|
| + // to return a pre-canned pixel array map.
|
| + Object* obj;
|
| + { MaybeObject* maybe_obj = CopyDropTransitions();
|
| + if (!maybe_obj->ToObject(&obj)) return maybe_obj;
|
| + }
|
| + Map* new_map = Map::cast(obj);
|
| + new_map->set_has_fast_elements(false);
|
| + new_map->set_has_pixel_array_elements(true);
|
| + Counters::map_to_pixel_array_elements.Increment();
|
| + return new_map;
|
| +}
|
| +
|
| +
|
| ACCESSORS(Map, instance_descriptors, DescriptorArray,
|
| kInstanceDescriptorsOffset)
|
| ACCESSORS(Map, code_cache, Object, kCodeCacheOffset)
|
| @@ -2814,6 +2885,18 @@
|
| }
|
|
|
|
|
| +bool SharedFunctionInfo::strict_mode() {
|
| + return BooleanBit::get(compiler_hints(), kStrictModeFunction);
|
| +}
|
| +
|
| +
|
| +void SharedFunctionInfo::set_strict_mode(bool value) {
|
| + set_compiler_hints(BooleanBit::set(compiler_hints(),
|
| + kStrictModeFunction,
|
| + value));
|
| +}
|
| +
|
| +
|
| ACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset)
|
| ACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset)
|
|
|
| @@ -2859,13 +2942,6 @@
|
|
|
|
|
| void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
|
| - // If optimization has been disabled for the shared function info,
|
| - // reflect that in the code object so it will not be counted as
|
| - // optimizable code.
|
| - ASSERT(value->kind() != Code::FUNCTION ||
|
| - !value->optimizable() ||
|
| - this->code() == Builtins::builtin(Builtins::Illegal) ||
|
| - this->allows_lazy_compilation());
|
| WRITE_FIELD(this, kCodeOffset, value);
|
| CONDITIONAL_WRITE_BARRIER(this, kCodeOffset, mode);
|
| }
|
| @@ -2915,12 +2991,6 @@
|
| }
|
|
|
|
|
| -bool SharedFunctionInfo::IsBuiltinMathFunction() {
|
| - return HasBuiltinFunctionId() &&
|
| - builtin_function_id() >= kFirstMathFunctionId;
|
| -}
|
| -
|
| -
|
| BuiltinFunctionId SharedFunctionInfo::builtin_function_id() {
|
| ASSERT(HasBuiltinFunctionId());
|
| return static_cast<BuiltinFunctionId>(Smi::cast(function_data())->value());
|
| @@ -3085,28 +3155,28 @@
|
|
|
|
|
| Object* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) {
|
| - ASSERT(0 <= id && id < kJSBuiltinsCount);
|
| + ASSERT(id < kJSBuiltinsCount); // id is unsigned.
|
| return READ_FIELD(this, OffsetOfFunctionWithId(id));
|
| }
|
|
|
|
|
| void JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id,
|
| Object* value) {
|
| - ASSERT(0 <= id && id < kJSBuiltinsCount);
|
| + ASSERT(id < kJSBuiltinsCount); // id is unsigned.
|
| WRITE_FIELD(this, OffsetOfFunctionWithId(id), value);
|
| WRITE_BARRIER(this, OffsetOfFunctionWithId(id));
|
| }
|
|
|
|
|
| Code* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) {
|
| - ASSERT(0 <= id && id < kJSBuiltinsCount);
|
| + ASSERT(id < kJSBuiltinsCount); // id is unsigned.
|
| return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id)));
|
| }
|
|
|
|
|
| void JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id,
|
| Code* value) {
|
| - ASSERT(0 <= id && id < kJSBuiltinsCount);
|
| + ASSERT(id < kJSBuiltinsCount); // id is unsigned.
|
| WRITE_FIELD(this, OffsetOfCodeWithId(id), value);
|
| ASSERT(!Heap::InNewSpace(value));
|
| }
|
| @@ -3132,6 +3202,22 @@
|
| }
|
|
|
|
|
| +ACCESSORS(JSMessageObject, type, String, kTypeOffset)
|
| +ACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset)
|
| +ACCESSORS(JSMessageObject, script, Object, kScriptOffset)
|
| +ACCESSORS(JSMessageObject, stack_trace, Object, kStackTraceOffset)
|
| +ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
|
| +SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
|
| +SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
|
| +
|
| +
|
| +JSMessageObject* JSMessageObject::cast(Object* obj) {
|
| + ASSERT(obj->IsJSMessageObject());
|
| + ASSERT(HeapObject::cast(obj)->Size() == JSMessageObject::kSize);
|
| + return reinterpret_cast<JSMessageObject*>(obj);
|
| +}
|
| +
|
| +
|
| INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset)
|
| ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset)
|
| ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset)
|
|
|