| Index: src/objects.h
|
| diff --git a/src/objects.h b/src/objects.h
|
| index 11b231f1335b3bef0e4c4ca6c293627f12d33c65..09e47b7ce75b449efb6393d78d1454d898864ba0 100644
|
| --- a/src/objects.h
|
| +++ b/src/objects.h
|
| @@ -869,6 +869,7 @@ class MaybeObject BASE_EMBEDDED {
|
| inline bool IsOutOfMemory();
|
| inline bool IsException();
|
| INLINE(bool IsTheHole());
|
| + INLINE(bool IsUninitialized());
|
| inline bool ToObject(Object** obj) {
|
| if (IsFailure()) return false;
|
| *obj = reinterpret_cast<Object*>(this);
|
| @@ -1046,6 +1047,7 @@ class Object : public MaybeObject {
|
| INLINE(bool IsUndefined());
|
| INLINE(bool IsNull());
|
| INLINE(bool IsTheHole()); // Shadows MaybeObject's implementation.
|
| + INLINE(bool IsUninitialized());
|
| INLINE(bool IsTrue());
|
| INLINE(bool IsFalse());
|
| inline bool IsArgumentsMarker();
|
| @@ -1060,16 +1062,24 @@ class Object : public MaybeObject {
|
| bool ToInt32(int32_t* value);
|
| bool ToUint32(uint32_t* value);
|
|
|
| - inline Representation OptimalRepresentation() {
|
| - if (FLAG_track_fields && IsSmi()) {
|
| + // Indicates whether OptimalRepresentation can do its work, or whether it
|
| + // always has to return Representation::Tagged().
|
| + enum ValueType {
|
| + OPTIMAL_REPRESENTATION,
|
| + FORCE_TAGGED
|
| + };
|
| +
|
| + inline Representation OptimalRepresentation(
|
| + ValueType type = OPTIMAL_REPRESENTATION) {
|
| + if (!FLAG_track_fields) return Representation::Tagged();
|
| + if (type == FORCE_TAGGED) return Representation::Tagged();
|
| + if (IsSmi()) {
|
| return Representation::Smi();
|
| } else if (FLAG_track_double_fields && IsHeapNumber()) {
|
| return Representation::Double();
|
| - } else if (FLAG_track_heap_object_fields && !IsUndefined()) {
|
| - // Don't track undefined as heapobject because it's also used as temporary
|
| - // value for computed fields that may turn out to be Smi. That combination
|
| - // will go tagged, so go tagged immediately.
|
| - // TODO(verwaest): Change once we track computed boilerplate fields.
|
| + } else if (FLAG_track_computed_fields && IsUninitialized()) {
|
| + return Representation::None();
|
| + } else if (FLAG_track_heap_object_fields) {
|
| ASSERT(IsHeapObject());
|
| return Representation::HeapObject();
|
| } else {
|
| @@ -1078,7 +1088,9 @@ class Object : public MaybeObject {
|
| }
|
|
|
| inline bool FitsRepresentation(Representation representation) {
|
| - if (FLAG_track_fields && representation.IsSmi()) {
|
| + if (FLAG_track_fields && representation.IsNone()) {
|
| + return false;
|
| + } else if (FLAG_track_fields && representation.IsSmi()) {
|
| return IsSmi();
|
| } else if (FLAG_track_double_fields && representation.IsDouble()) {
|
| return IsNumber();
|
| @@ -1827,7 +1839,8 @@ class JSObject: public JSReceiver {
|
| Handle<JSObject> object,
|
| Handle<Name> key,
|
| Handle<Object> value,
|
| - PropertyAttributes attributes);
|
| + PropertyAttributes attributes,
|
| + ValueType value_type = OPTIMAL_REPRESENTATION);
|
|
|
| static inline Handle<String> ExpectedTransitionKey(Handle<Map> map);
|
| static inline Handle<Map> ExpectedTransitionTarget(Handle<Map> map);
|
| @@ -1854,7 +1867,8 @@ class JSObject: public JSReceiver {
|
| MUST_USE_RESULT MaybeObject* SetLocalPropertyIgnoreAttributes(
|
| Name* key,
|
| Object* value,
|
| - PropertyAttributes attributes);
|
| + PropertyAttributes attributes,
|
| + ValueType value_type = OPTIMAL_REPRESENTATION);
|
|
|
| // Retrieve a value in a normalized object given a lookup result.
|
| // Handles the special representation of JS global objects.
|
| @@ -2216,7 +2230,8 @@ class JSObject: public JSReceiver {
|
| Name* name,
|
| Object* value,
|
| PropertyAttributes attributes,
|
| - StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED);
|
| + StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED,
|
| + ValueType value_type = OPTIMAL_REPRESENTATION);
|
|
|
| // Add a property to a slow-case object.
|
| MUST_USE_RESULT MaybeObject* AddSlowProperty(Name* name,
|
| @@ -2230,7 +2245,8 @@ class JSObject: public JSReceiver {
|
| PropertyAttributes attributes,
|
| StrictModeFlag strict_mode,
|
| StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED,
|
| - ExtensibilityCheck extensibility_check = PERFORM_EXTENSIBILITY_CHECK);
|
| + ExtensibilityCheck extensibility_check = PERFORM_EXTENSIBILITY_CHECK,
|
| + ValueType value_type = OPTIMAL_REPRESENTATION);
|
|
|
| // Convert the object to use the canonical dictionary
|
| // representation. If the object is expected to have additional properties
|
| @@ -8522,7 +8538,8 @@ class Oddball: public HeapObject {
|
| static const byte kNull = 3;
|
| static const byte kArgumentMarker = 4;
|
| static const byte kUndefined = 5;
|
| - static const byte kOther = 6;
|
| + static const byte kUninitialized = 6;
|
| + static const byte kOther = 7;
|
|
|
| typedef FixedBodyDescriptor<kToStringOffset,
|
| kToNumberOffset + kPointerSize,
|
|
|