Reviewers: rossberg,
Description:
Type handling for special cases and optimization
[email protected]
Please review this at https://codereview.chromium.org/18078002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/types.h
M src/types.cc
Index: src/types.cc
diff --git a/src/types.cc b/src/types.cc
index
b8febc2a149ad4e7e488a8cfc4e6a59f6c896da6..3044d31a7bc4922855f4cac3f0a82ef7aaa933df
100644
--- a/src/types.cc
+++ b/src/types.cc
@@ -131,6 +131,7 @@ int Type::LubBitset() {
if (value->IsUndefined()) return kUndefined;
if (value->IsNull()) return kNull;
if (value->IsTrue() || value->IsFalse()) return kBoolean;
+ if (value->IsTheHole() || value->IsFalse()) return kAny;
}
}
switch (map->instance_type()) {
@@ -200,6 +201,10 @@ int Type::LubBitset() {
// We ought to find a cleaner solution for compiling stubs
parameterised
// over type or class variables, esp ones with bounds...
return kDetectable;
+ case DECLARED_ACCESSOR_INFO_TYPE:
+ case EXECUTABLE_ACCESSOR_INFO_TYPE:
+ case ACCESSOR_PAIR_TYPE:
+ return kInternal;
default:
UNREACHABLE();
return kNone;
@@ -222,7 +227,7 @@ int Type::GlbBitset() {
// Check this <= that.
-bool Type::Is(Type* that) {
+bool Type::IsSlowCase(Type* that) {
// Fast path for bitsets.
if (that->is_bitset()) {
return (this->LubBitset() | that->as_bitset()) == that->as_bitset();
Index: src/types.h
diff --git a/src/types.h b/src/types.h
index
25ed6e8f5612ca8667cf261d691f526ad377321c..a2bcda65791646c57464a5d85a908564efc5587a
100644
--- a/src/types.h
+++ b/src/types.h
@@ -126,6 +126,7 @@ class Type : public Object {
static Type* Function() { return from_bitset(kFunction); }
static Type* RegExp() { return from_bitset(kRegExp); }
static Type* Proxy() { return from_bitset(kProxy); }
+ static Type* Internal() { return from_bitset(kInternal); }
static Type* Class(Handle<Map> map) { return from_handle(map); }
static Type* Constant(Handle<HeapObject> value) {
@@ -139,7 +140,7 @@ class Type : public Object {
static Type* Intersect(Handle<Type> type1, Handle<Type> type2);
static Type* Optional(Handle<Type> type); // type \/ Undefined
- bool Is(Type* that);
+ bool Is(Type* that) { return (this == that) ? true : IsSlowCase(that); }
bool Is(Handle<Type> that) { return this->Is(*that); }
bool Maybe(Type* that);
bool Maybe(Handle<Type> that) { return this->Maybe(*that); }
@@ -207,6 +208,7 @@ class Type : public Object {
kRegExp = 1 << 13,
kOtherObject = 1 << 14,
kProxy = 1 << 15,
+ kInternal = 1 << 16,
kOddball = kBoolean | kNull | kUndefined,
kSigned32 = kSmi | kOtherSigned32,
@@ -218,7 +220,7 @@ class Type : public Object {
kObject = kUndetectable | kArray | kFunction | kRegExp | kOtherObject,
kReceiver = kObject | kProxy,
kAllocated = kDouble | kName | kReceiver,
- kAny = kOddball | kNumber | kAllocated,
+ kAny = kOddball | kNumber | kAllocated | kInternal,
kDetectable = kAllocated - kUndetectable,
kNone = 0
};
@@ -228,6 +230,8 @@ class Type : public Object {
bool is_constant() { return this->IsBox(); }
bool is_union() { return this->IsFixedArray(); }
+ bool IsSlowCase(Type* that);
+
int as_bitset() { return Smi::cast(this)->value(); }
Handle<Map> as_class() { return Handle<Map>::cast(handle()); }
Handle<v8::internal::Object> as_constant() {
--
--
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.