diff options
| author | Ben Murdoch <benm@google.com> | 2011-11-30 16:03:39 +0000 |
|---|---|---|
| committer | Ben Murdoch <benm@google.com> | 2011-12-02 17:28:02 +0000 |
| commit | 69a99ed0b2b2ef69d393c371b03db3a98aaf880e (patch) | |
| tree | 6438154d0f3ab526b9206f8860fa4db5cf073c11 /src/code-stubs.cc | |
| parent | 3fb3ca8c7ca439d408449a395897395c0faae8d1 (diff) | |
| download | android_external_v8-69a99ed0b2b2ef69d393c371b03db3a98aaf880e.tar.gz android_external_v8-69a99ed0b2b2ef69d393c371b03db3a98aaf880e.tar.bz2 android_external_v8-69a99ed0b2b2ef69d393c371b03db3a98aaf880e.zip | |
Upgrade to V8 3.5
Merge V8 3.5.10.24
Simple merge required updates to makefiles only.
Bug: 5688872
Change-Id: I0acdb9a1a53919d84e9a7525308e8371739d2f06
Diffstat (limited to 'src/code-stubs.cc')
| -rw-r--r-- | src/code-stubs.cc | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/code-stubs.cc b/src/code-stubs.cc index 1d1128f2..5535d171 100644 --- a/src/code-stubs.cc +++ b/src/code-stubs.cc @@ -329,4 +329,84 @@ void CallFunctionStub::PrintName(StringStream* stream) { stream->Add("CallFunctionStub_Args%d%s%s", argc_, in_loop_name, flags_name); } + +void ToBooleanStub::PrintName(StringStream* stream) { + stream->Add("ToBooleanStub_"); + types_.Print(stream); +} + + +void ToBooleanStub::Types::Print(StringStream* stream) const { + if (IsEmpty()) stream->Add("None"); + if (Contains(UNDEFINED)) stream->Add("Undefined"); + if (Contains(BOOLEAN)) stream->Add("Bool"); + if (Contains(NULL_TYPE)) stream->Add("Null"); + if (Contains(SMI)) stream->Add("Smi"); + if (Contains(SPEC_OBJECT)) stream->Add("SpecObject"); + if (Contains(STRING)) stream->Add("String"); + if (Contains(HEAP_NUMBER)) stream->Add("HeapNumber"); +} + + +void ToBooleanStub::Types::TraceTransition(Types to) const { + if (!FLAG_trace_ic) return; + char buffer[100]; + NoAllocationStringAllocator allocator(buffer, + static_cast<unsigned>(sizeof(buffer))); + StringStream stream(&allocator); + stream.Add("[ToBooleanIC ("); + Print(&stream); + stream.Add("->"); + to.Print(&stream); + stream.Add(")]\n"); + stream.OutputToStdOut(); +} + + +bool ToBooleanStub::Types::Record(Handle<Object> object) { + if (object->IsUndefined()) { + Add(UNDEFINED); + return false; + } else if (object->IsBoolean()) { + Add(BOOLEAN); + return object->IsTrue(); + } else if (object->IsNull()) { + Add(NULL_TYPE); + return false; + } else if (object->IsSmi()) { + Add(SMI); + return Smi::cast(*object)->value() != 0; + } else if (object->IsSpecObject()) { + Add(SPEC_OBJECT); + return !object->IsUndetectableObject(); + } else if (object->IsString()) { + Add(STRING); + return !object->IsUndetectableObject() && + String::cast(*object)->length() != 0; + } else if (object->IsHeapNumber()) { + ASSERT(!object->IsUndetectableObject()); + Add(HEAP_NUMBER); + double value = HeapNumber::cast(*object)->value(); + return value != 0 && !isnan(value); + } else { + // We should never see an internal object at runtime here! + UNREACHABLE(); + return true; + } +} + + +bool ToBooleanStub::Types::NeedsMap() const { + return Contains(ToBooleanStub::SPEC_OBJECT) + || Contains(ToBooleanStub::STRING) + || Contains(ToBooleanStub::HEAP_NUMBER); +} + + +bool ToBooleanStub::Types::CanBeUndetectable() const { + return Contains(ToBooleanStub::SPEC_OBJECT) + || Contains(ToBooleanStub::STRING); +} + + } } // namespace v8::internal |
