Revision: 15044
Author:   [email protected]
Date:     Mon Jun 10 08:43:40 2013
Log:      revert accidental dcommit
http://code.google.com/p/v8/source/detail?r=15044

Modified:
 /branches/bleeding_edge/src/arm/full-codegen-arm.cc
 /branches/bleeding_edge/src/code-stubs-hydrogen.cc
 /branches/bleeding_edge/src/code-stubs.cc
 /branches/bleeding_edge/src/code-stubs.h
 /branches/bleeding_edge/src/hydrogen.cc
 /branches/bleeding_edge/src/hydrogen.h
 /branches/bleeding_edge/src/ia32/full-codegen-ia32.cc
 /branches/bleeding_edge/src/ic.cc
 /branches/bleeding_edge/src/ic.h
 /branches/bleeding_edge/src/mips/full-codegen-mips.cc
 /branches/bleeding_edge/src/stub-cache.cc
 /branches/bleeding_edge/src/v8.h
 /branches/bleeding_edge/src/x64/full-codegen-x64.cc
 /branches/bleeding_edge/test/cctest/test-compare-nil-ic-stub.cc

=======================================
--- /branches/bleeding_edge/src/arm/full-codegen-arm.cc Mon Jun 10 08:30:17 2013 +++ /branches/bleeding_edge/src/arm/full-codegen-arm.cc Mon Jun 10 08:43:40 2013
@@ -4765,7 +4765,9 @@

   VisitForAccumulatorValue(sub_expr);
   PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
-  if (expr->op() == Token::EQ_STRICT) {
+  EqualityKind kind = expr->op() == Token::EQ_STRICT
+      ? kStrictEquality : kNonStrictEquality;
+  if (kind == kStrictEquality) {
     Heap::RootListIndex nil_value = nil == kNullValue ?
         Heap::kNullValueRootIndex :
         Heap::kUndefinedValueRootIndex;
@@ -4774,6 +4776,7 @@
     Split(eq, if_true, if_false, fall_through);
   } else {
     Handle<Code> ic = CompareNilICStub::GetUninitialized(isolate(),
+ kNonStrictEquality,
                                                          nil);
     CallIC(ic, RelocInfo::CODE_TARGET, expr->CompareOperationFeedbackId());
     __ cmp(r0, Operand(0));
=======================================
--- /branches/bleeding_edge/src/code-stubs-hydrogen.cc Mon Jun 10 08:30:02 2013 +++ /branches/bleeding_edge/src/code-stubs-hydrogen.cc Mon Jun 10 08:43:40 2013
@@ -736,7 +736,7 @@
   CompareNilICStub* stub = casted_stub();
   HIfContinuation continuation;
   Handle<Map> sentinel_map(graph()->isolate()->heap()->meta_map());
-  BuildCompareNil(GetParameter(0),
+  BuildCompareNil(GetParameter(0), stub->GetKind(),
                   stub->GetTypes(), sentinel_map,
                   RelocInfo::kNoPosition, &continuation);
   IfBuilder if_nil(this, &continuation);
=======================================
--- /branches/bleeding_edge/src/code-stubs.cc   Mon Jun 10 08:30:02 2013
+++ /branches/bleeding_edge/src/code-stubs.cc   Mon Jun 10 08:43:40 2013
@@ -432,18 +432,25 @@

 void CompareNilICStub::Record(Handle<Object> object) {
   ASSERT(types_ != Types::FullCompare());
-  if (object->IsNull()) {
-    types_.Add(NULL_TYPE);
-  } else if (object->IsUndefined()) {
-    types_.Add(UNDEFINED);
-  } else if (object->IsUndetectableObject() ||
-             object->IsOddball() ||
-             !object->IsHeapObject()) {
-    types_ = Types::FullCompare();
-  } else if (IsMonomorphic()) {
-    types_ = Types::FullCompare();
+  if (equality_kind_ == kStrictEquality) {
+ // When testing for strict equality only one value will evaluate to true
+    types_.RemoveAll();
+    types_.Add((nil_value_ == kNullValue) ? NULL_TYPE:
+                                            UNDEFINED);
   } else {
-    types_.Add(MONOMORPHIC_MAP);
+    if (object->IsNull()) {
+      types_.Add(NULL_TYPE);
+    } else if (object->IsUndefined()) {
+      types_.Add(UNDEFINED);
+    } else if (object->IsUndetectableObject() ||
+               object->IsOddball() ||
+               !object->IsHeapObject()) {
+      types_ = Types::FullCompare();
+    } else if (IsMonomorphic()) {
+      types_ = Types::FullCompare();
+    } else {
+      types_.Add(MONOMORPHIC_MAP);
+    }
   }
 }

@@ -470,6 +477,8 @@
   types_.Print(stream);
   stream->Add((nil_value_ == kNullValue) ? "(NullValue|":
                                            "(UndefinedValue|");
+  stream->Add((equality_kind_ == kStrictEquality) ? "StrictEquality)":
+                                                    "NonStrictEquality)");
 }


=======================================
--- /branches/bleeding_edge/src/code-stubs.h    Mon Jun 10 08:30:02 2013
+++ /branches/bleeding_edge/src/code-stubs.h    Mon Jun 10 08:43:40 2013
@@ -1154,21 +1154,24 @@
   // boolean flags we need to store. :-P
   STATIC_ASSERT(NUMBER_OF_TYPES <= 6);

-  CompareNilICStub(NilValue nil, Types types = Types())
+  CompareNilICStub(EqualityKind kind, NilValue nil, Types types = Types())
       : types_(types) {
+    equality_kind_ = kind;
     nil_value_ = nil;
   }

   CompareNilICStub(Code::ExtraICState ic_state,
                    InitializationState init_state = INITIALIZED)
       : HydrogenCodeStub(init_state) {
+    equality_kind_ = EqualityKindField::decode(ic_state);
     nil_value_ = NilValueField::decode(ic_state);
     types_ = Types(ExtractTypesFromExtraICState(ic_state));
   }

   static Handle<Code> GetUninitialized(Isolate* isolate,
+                                       EqualityKind kind,
                                        NilValue nil) {
-    return CompareNilICStub(nil, UNINITIALIZED).GetCode(isolate);
+    return CompareNilICStub(kind, nil, UNINITIALIZED).GetCode(isolate);
   }

   virtual void InitializeInterfaceDescriptor(
@@ -1176,7 +1179,7 @@
       CodeStubInterfaceDescriptor* descriptor);

   static void InitializeForIsolate(Isolate* isolate) {
-    CompareNilICStub compare_stub(kNullValue, UNINITIALIZED);
+ CompareNilICStub compare_stub(kStrictEquality, kNullValue, UNINITIALIZED);
     compare_stub.InitializeInterfaceDescriptor(
         isolate,
         isolate->code_stub_interface_descriptor(CodeStub::CompareNilIC));
@@ -1196,9 +1199,10 @@

   Handle<Code> GenerateCode();

-  // extra ic state = nil_value | type_n-1 | ... | type_0
+  // extra ic state = nil_value | equality_kind | type_n-1 | ... | type_0
   virtual Code::ExtraICState GetExtraICState() {
     return NilValueField::encode(nil_value_)         |
+           EqualityKindField::encode(equality_kind_) |
            types_.ToIntegral();
   }
   static byte ExtractTypesFromExtraICState(
@@ -1209,26 +1213,32 @@
   void Record(Handle<Object> object);

   bool IsMonomorphic() const { return types_.Contains(MONOMORPHIC_MAP); }
+  EqualityKind GetKind() const { return equality_kind_; }
   NilValue GetNilValue() const { return nil_value_; }
   Types GetTypes() const { return types_; }
   void ClearTypes() { types_.RemoveAll(); }
+  void SetKind(EqualityKind kind) { equality_kind_ = kind; }

   virtual void PrintName(StringStream* stream);

  private:
   friend class CompareNilIC;

-  CompareNilICStub(NilValue nil,
+  CompareNilICStub(EqualityKind kind, NilValue nil,
                    InitializationState init_state)
       : HydrogenCodeStub(init_state) {
+    equality_kind_ = kind;
     nil_value_ = nil;
   }

-  class NilValueField : public BitField<NilValue, NUMBER_OF_TYPES, 1> {};
+ class EqualityKindField : public BitField<EqualityKind, NUMBER_OF_TYPES, 1> {
+  };
+  class NilValueField : public BitField<NilValue, NUMBER_OF_TYPES+1, 1> {};

   virtual CodeStub::Major MajorKey() { return CompareNilIC; }
   virtual int NotMissMinorKey() { return GetExtraICState(); }

+  EqualityKind equality_kind_;
   NilValue nil_value_;
   Types types_;

=======================================
--- /branches/bleeding_edge/src/hydrogen.cc     Mon Jun 10 08:30:17 2013
+++ /branches/bleeding_edge/src/hydrogen.cc     Mon Jun 10 08:43:40 2013
@@ -1698,6 +1698,7 @@

 void HGraphBuilder::BuildCompareNil(
     HValue* value,
+    EqualityKind kind,
     CompareNilICStub::Types types,
     Handle<Map> map,
     int position,
@@ -1732,7 +1733,9 @@
       // emitted below is the actual monomorphic map.
       BuildCheckMap(value, map);
     } else {
-      if_nil.Deopt();
+      if (kind == kNonStrictEquality) {
+        if_nil.Deopt();
+      }
     }
   }

@@ -9918,22 +9921,19 @@
   ASSERT(!HasStackOverflow());
   ASSERT(current_block() != NULL);
   ASSERT(current_block()->HasPredecessor());
+  EqualityKind kind =
+ expr->op() == Token::EQ_STRICT ? kStrictEquality : kNonStrictEquality;
   HIfContinuation continuation;
   CompareNilICStub::Types types;
-  if (expr->op() == Token::EQ_STRICT) {
-    IfBuilder if_nil(this);
-    if_nil.If<HCompareObjectEqAndBranch>(
-        value, (nil== kNullValue) ? graph()->GetConstantNull()
-                                  : graph()->GetConstantUndefined());
-    if_nil.Then();
-    if_nil.Else();
-    if_nil.CaptureContinuation(&continuation);
-    return ast_context()->ReturnContinuation(&continuation, expr->id());
+  if (kind == kStrictEquality) {
+    types.Add((nil == kNullValue) ? CompareNilICStub::NULL_TYPE :
+                                    CompareNilICStub::UNDEFINED);
+  } else {
+    types = CompareNilICStub::Types(expr->compare_nil_types());
+    if (types.IsEmpty()) types = CompareNilICStub::Types::FullCompare();
   }
-  types = CompareNilICStub::Types(expr->compare_nil_types());
-  if (types.IsEmpty()) types = CompareNilICStub::Types::FullCompare();
   Handle<Map> map_handle = expr->map();
-  BuildCompareNil(value, types, map_handle,
+  BuildCompareNil(value, kind, types, map_handle,
                   expr->position(), &continuation);
   return ast_context()->ReturnContinuation(&continuation, expr->id());
 }
=======================================
--- /branches/bleeding_edge/src/hydrogen.h      Mon Jun 10 08:30:02 2013
+++ /branches/bleeding_edge/src/hydrogen.h      Mon Jun 10 08:43:40 2013
@@ -1353,6 +1353,7 @@

   void BuildCompareNil(
       HValue* value,
+      EqualityKind kind,
       CompareNilICStub::Types types,
       Handle<Map> map,
       int position,
=======================================
--- /branches/bleeding_edge/src/ia32/full-codegen-ia32.cc Mon Jun 10 08:30:17 2013 +++ /branches/bleeding_edge/src/ia32/full-codegen-ia32.cc Mon Jun 10 08:43:40 2013
@@ -4768,14 +4768,17 @@
   VisitForAccumulatorValue(sub_expr);
   PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);

+  EqualityKind kind = expr->op() == Token::EQ_STRICT
+      ? kStrictEquality : kNonStrictEquality;
   Handle<Object> nil_value = nil == kNullValue
       ? isolate()->factory()->null_value()
       : isolate()->factory()->undefined_value();
-  if (expr->op() == Token::EQ_STRICT) {
+  if (kind == kStrictEquality) {
     __ cmp(eax, nil_value);
     Split(equal, if_true, if_false, fall_through);
   } else {
     Handle<Code> ic = CompareNilICStub::GetUninitialized(isolate(),
+ kNonStrictEquality,
                                                          nil);
     CallIC(ic, RelocInfo::CODE_TARGET, expr->CompareOperationFeedbackId());
     __ test(eax, eax);
=======================================
--- /branches/bleeding_edge/src/ic.cc   Mon Jun 10 08:30:02 2013
+++ /branches/bleeding_edge/src/ic.cc   Mon Jun 10 08:43:40 2013
@@ -2943,8 +2943,16 @@
 }


-MaybeObject* CompareNilIC::DoCompareNilSlow(NilValue nil,
+MaybeObject* CompareNilIC::DoCompareNilSlow(EqualityKind kind,
+                                            NilValue nil,
                                             Handle<Object> object) {
+  if (kind == kStrictEquality) {
+    if (nil == kNullValue) {
+      return Smi::FromInt(object->IsNull());
+    } else {
+      return Smi::FromInt(object->IsUndefined());
+    }
+  }
   if (object->IsNull() || object->IsUndefined()) {
     return Smi::FromInt(true);
   }
@@ -2965,6 +2973,7 @@
   stub.Record(object);
   old_types.TraceTransition(stub.GetTypes());

+  EqualityKind kind = stub.GetKind();
   NilValue nil = stub.GetNilValue();

   // Find or create the specialized stub to support the new set of types.
@@ -2978,7 +2987,7 @@
     code = stub.GetCode(isolate());
   }
   set_target(*code);
-  return DoCompareNilSlow(nil, object);
+  return DoCompareNilSlow(kind, nil, object);
 }


=======================================
--- /branches/bleeding_edge/src/ic.h    Mon Jun 10 08:30:02 2013
+++ /branches/bleeding_edge/src/ic.h    Mon Jun 10 08:43:40 2013
@@ -789,7 +789,8 @@

   static void Clear(Address address, Code* target);

-  static MUST_USE_RESULT MaybeObject* DoCompareNilSlow(NilValue nil,
+  static MUST_USE_RESULT MaybeObject* DoCompareNilSlow(EqualityKind kind,
+                                                       NilValue nil,
Handle<Object> object);
 };

=======================================
--- /branches/bleeding_edge/src/mips/full-codegen-mips.cc Mon Jun 10 08:30:17 2013 +++ /branches/bleeding_edge/src/mips/full-codegen-mips.cc Mon Jun 10 08:43:40 2013
@@ -4805,8 +4805,10 @@

   VisitForAccumulatorValue(sub_expr);
   PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
+  EqualityKind kind = expr->op() == Token::EQ_STRICT
+      ? kStrictEquality : kNonStrictEquality;
   __ mov(a0, result_register());
-  if (expr->op() == Token::EQ_STRICT) {
+  if (kind == kStrictEquality) {
     Heap::RootListIndex nil_value = nil == kNullValue ?
         Heap::kNullValueRootIndex :
         Heap::kUndefinedValueRootIndex;
@@ -4814,6 +4816,7 @@
     Split(eq, a0, Operand(a1), if_true, if_false, fall_through);
   } else {
     Handle<Code> ic = CompareNilICStub::GetUninitialized(isolate(),
+ kNonStrictEquality,
                                                          nil);
     CallIC(ic, RelocInfo::CODE_TARGET, expr->CompareOperationFeedbackId());
     Split(ne, v0, Operand(zero_reg), if_true, if_false, fall_through);
=======================================
--- /branches/bleeding_edge/src/stub-cache.cc   Mon Jun 10 08:30:02 2013
+++ /branches/bleeding_edge/src/stub-cache.cc   Mon Jun 10 08:43:40 2013
@@ -909,6 +909,8 @@

 Handle<Code> StubCache::ComputeCompareNil(Handle<Map> receiver_map,
                                           CompareNilICStub& stub) {
+  stub.SetKind(kNonStrictEquality);
+
   Handle<String> name(isolate_->heap()->empty_string());
   if (!receiver_map->is_shared()) {
Handle<Code> cached_ic = FindIC(name, receiver_map, Code::COMPARE_NIL_IC,
=======================================
--- /branches/bleeding_edge/src/v8.h    Mon Jun 10 08:30:17 2013
+++ /branches/bleeding_edge/src/v8.h    Mon Jun 10 08:43:40 2013
@@ -146,6 +146,10 @@
 enum NilValue { kNullValue, kUndefinedValue };


+// JavaScript defines two kinds of equality.
+enum EqualityKind { kStrictEquality, kNonStrictEquality };
+
+
 } }  // namespace v8::internal

 namespace i = v8::internal;
=======================================
--- /branches/bleeding_edge/src/x64/full-codegen-x64.cc Mon Jun 10 08:30:17 2013 +++ /branches/bleeding_edge/src/x64/full-codegen-x64.cc Mon Jun 10 08:43:40 2013
@@ -4754,7 +4754,9 @@

   VisitForAccumulatorValue(sub_expr);
   PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
-  if (expr->op() == Token::EQ_STRICT) {
+  EqualityKind kind = expr->op() == Token::EQ_STRICT
+      ? kStrictEquality : kNonStrictEquality;
+  if (kind == kStrictEquality) {
     Heap::RootListIndex nil_value = nil == kNullValue ?
         Heap::kNullValueRootIndex :
         Heap::kUndefinedValueRootIndex;
@@ -4762,6 +4764,7 @@
     Split(equal, if_true, if_false, fall_through);
   } else {
     Handle<Code> ic = CompareNilICStub::GetUninitialized(isolate(),
+ kNonStrictEquality,
                                                          nil);
     CallIC(ic, RelocInfo::CODE_TARGET, expr->CompareOperationFeedbackId());
     __ testq(rax, rax);
=======================================
--- /branches/bleeding_edge/test/cctest/test-compare-nil-ic-stub.cc Mon Jun 10 08:30:02 2013 +++ /branches/bleeding_edge/test/cctest/test-compare-nil-ic-stub.cc Mon Jun 10 08:43:40 2013
@@ -46,8 +46,9 @@
 TEST(ExternalICStateParsing) {
   Types types;
   types.Add(CompareNilICStub::UNDEFINED);
-  CompareNilICStub stub(kUndefinedValue, types);
+  CompareNilICStub stub(kNonStrictEquality, kUndefinedValue, types);
   CompareNilICStub stub2(stub.GetExtraICState());
+  CHECK_EQ(stub.GetKind(), stub2.GetKind());
   CHECK_EQ(stub.GetNilValue(), stub2.GetNilValue());
   CHECK_EQ(stub.GetTypes().ToIntegral(), stub2.GetTypes().ToIntegral());
 }

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to