| Index: src/code-stubs.h
|
| diff --git a/src/code-stubs.h b/src/code-stubs.h
|
| index 1e1d3ccc34bc936c501aa704f3b0aa11a81c7de0..e9b4573b54f7a5f5a145eb7836836879626628e3 100644
|
| --- a/src/code-stubs.h
|
| +++ b/src/code-stubs.h
|
| @@ -2315,6 +2315,12 @@ class ToBooleanStub: public HydrogenCodeStub {
|
| NUMBER_OF_TYPES
|
| };
|
|
|
| + enum ResultMode {
|
| + RESULT_AS_SMI, // For Smi(1) on truthy value, Smi(0) otherwise.
|
| + RESULT_AS_ODDBALL, // For {true} on truthy value, {false} otherwise.
|
| + RESULT_AS_INVERSE_ODDBALL // For {false} on truthy value, {true} otherwise.
|
| + };
|
| +
|
| // At most 8 different types can be distinguished, because the Code object
|
| // only has room for a single byte to hold a set of these types. :-P
|
| STATIC_ASSERT(NUMBER_OF_TYPES <= 8);
|
| @@ -2333,13 +2339,16 @@ class ToBooleanStub: public HydrogenCodeStub {
|
| static Types Generic() { return Types((1 << NUMBER_OF_TYPES) - 1); }
|
| };
|
|
|
| - ToBooleanStub(Isolate* isolate, Types types = Types())
|
| - : HydrogenCodeStub(isolate), types_(types) { }
|
| + ToBooleanStub(Isolate* isolate, ResultMode mode, Types types = Types())
|
| + : HydrogenCodeStub(isolate), types_(types), mode_(mode) {}
|
| ToBooleanStub(Isolate* isolate, ExtraICState state)
|
| - : HydrogenCodeStub(isolate), types_(static_cast<byte>(state)) { }
|
| + : HydrogenCodeStub(isolate),
|
| + types_(static_cast<byte>(state)),
|
| + mode_(RESULT_AS_SMI) {}
|
|
|
| bool UpdateStatus(Handle<Object> object);
|
| Types GetTypes() { return types_; }
|
| + ResultMode GetMode() { return mode_; }
|
|
|
| virtual Handle<Code> GenerateCode() V8_OVERRIDE;
|
| virtual void InitializeInterfaceDescriptor(
|
| @@ -2351,7 +2360,7 @@ class ToBooleanStub: public HydrogenCodeStub {
|
| virtual bool SometimesSetsUpAFrame() { return false; }
|
|
|
| static void InstallDescriptors(Isolate* isolate) {
|
| - ToBooleanStub stub(isolate);
|
| + ToBooleanStub stub(isolate, RESULT_AS_SMI);
|
| stub.InitializeInterfaceDescriptor(
|
| isolate->code_stub_interface_descriptor(CodeStub::ToBoolean));
|
| }
|
| @@ -2371,13 +2380,19 @@ class ToBooleanStub: public HydrogenCodeStub {
|
| }
|
|
|
| private:
|
| + class TypesBits : public BitField<byte, 0, NUMBER_OF_TYPES> {};
|
| + class ResultModeBits : public BitField<ResultMode, NUMBER_OF_TYPES, 2> {};
|
| +
|
| Major MajorKey() const { return ToBoolean; }
|
| - int NotMissMinorKey() const { return GetExtraICState(); }
|
| + int NotMissMinorKey() const {
|
| + return TypesBits::encode(types_.ToByte()) | ResultModeBits::encode(mode_);
|
| + }
|
|
|
| - ToBooleanStub(Isolate* isolate, InitializationState init_state) :
|
| - HydrogenCodeStub(isolate, init_state) {}
|
| + ToBooleanStub(Isolate* isolate, InitializationState init_state)
|
| + : HydrogenCodeStub(isolate, init_state), mode_(RESULT_AS_SMI) {}
|
|
|
| Types types_;
|
| + ResultMode mode_;
|
| };
|
|
|
|
|
|
|