Changeset 27482 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp
- Timestamp:
- Nov 6, 2007, 10:56:05 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/nodes.cpp
r27407 r27482 1670 1670 // ------------------------------ Additive Nodes -------------------------------------- 1671 1671 1672 static JSValue* throwOutOfMemoryError(ExecState* exec) 1673 { 1674 JSObject* error = Error::create(exec, GeneralError, "Out of memory"); 1675 exec->setException(error); 1676 return error; 1677 } 1672 1678 1673 1679 // ECMA 11.6 1674 static inline JSValue *add(ExecState *exec, JSValue *v1, JSValue *v2)1680 static JSValue* addSlowCase(ExecState* exec, JSValue* v1, JSValue* v2) 1675 1681 { 1676 1682 // exception for the Date exception in defaultValue() … … 1680 1686 if (p1->isString() || p2->isString()) { 1681 1687 UString value = p1->toString(exec) + p2->toString(exec); 1682 if (value.isNull()) { 1683 JSObject *error = Error::create(exec, GeneralError, "Out of memory"); 1684 exec->setException(error); 1685 return error; 1686 } else 1687 return jsString(value); 1688 if (value.isNull()) 1689 return throwOutOfMemoryError(exec); 1690 return jsString(value); 1688 1691 } 1689 1692 1690 1693 return jsNumber(p1->toNumber(exec) + p2->toNumber(exec)); 1694 } 1695 1696 // Fast-path choices here are based on frequency data from SunSpider: 1697 // <times> Add case: <t1> <t2> 1698 // --------------------------- 1699 // 5627160 Add case: 1 1 1700 // 247427 Add case: 5 5 1701 // 20901 Add case: 5 6 1702 // 13978 Add case: 5 1 1703 // 4000 Add case: 1 5 1704 // 1 Add case: 3 5 1705 1706 static inline JSValue* add(ExecState* exec, JSValue* v1, JSValue *v2) 1707 { 1708 JSType t1 = v1->type(); 1709 JSType t2 = v2->type(); 1710 1711 if (t1 == NumberType && t2 == NumberType) 1712 return jsNumber(v1->toNumber(exec) + v2->toNumber(exec)); 1713 else if (t1 == StringType && t2 == StringType) { 1714 UString value = static_cast<StringImp*>(v1)->value() + static_cast<StringImp*>(v2)->value(); 1715 if (value.isNull()) 1716 return throwOutOfMemoryError(exec); 1717 return jsString(value); 1718 } else if (t1 == StringType) { // common js idiom "" + object 1719 UString value = static_cast<StringImp*>(v1)->value() + v2->toString(exec); 1720 if (value.isNull()) 1721 return throwOutOfMemoryError(exec); 1722 return jsString(value); 1723 } 1724 1725 // All other cases are pretty uncommon 1726 return addSlowCase(exec, v1, v2); 1691 1727 } 1692 1728
Note:
See TracChangeset
for help on using the changeset viewer.