Changeset 26961 in webkit
- Timestamp:
- Oct 24, 2007 1:53:45 AM (17 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r26960 r26961 1 2007-10-24 Oliver Hunt <oliver@apple.com> 2 3 Reviewed by Darin. 4 5 Remove old relation method, replace with specialised LessThan and lessThenEq functions for a 0.5-0.6% improvement in SunSpider 6 7 * kjs/nodes.cpp: 8 (KJS::lessThan): 9 (KJS::lessThanEq): 10 (KJS::LessNode::evaluate): 11 (KJS::GreaterNode::evaluate): 12 (KJS::LessEqNode::evaluate): 13 (KJS::GreaterEqNode::evaluate): 14 * kjs/operations.cpp: 15 * kjs/operations.h: 16 1 17 2007-10-24 Eric Seidel <eric@webkit.org> 2 18 -
trunk/JavaScriptCore/kjs/nodes.cpp
r26957 r26961 1327 1327 // ------------------------------ Relational Nodes ------------------------------- 1328 1328 1329 static inline JSValue* lessThan(ExecState *exec, JSValue* v1, JSValue* v2) 1330 { 1331 JSValue *p1 = v1->toPrimitive(exec, NumberType); 1332 JSValue *p2 = v2->toPrimitive(exec, NumberType); 1333 1334 if (p1->isString() && p2->isString()) 1335 return jsBoolean(p1->toString(exec) < p2->toString(exec)); 1336 1337 return jsBoolean(p1->toNumber(exec) < p2->toNumber(exec)); 1338 } 1339 1340 static inline JSValue* lessThanEq(ExecState *exec, JSValue* v1, JSValue* v2) 1341 { 1342 JSValue *p1 = v1->toPrimitive(exec, NumberType); 1343 JSValue *p2 = v2->toPrimitive(exec, NumberType); 1344 1345 if (p1->isString() && p2->isString()) 1346 return jsBoolean(!(p2->toString(exec) < p1->toString(exec))); 1347 1348 return jsBoolean(p1->toNumber(exec) <= p2->toNumber(exec)); 1349 } 1350 1329 1351 // ECMA 11.8.1 1330 1352 JSValue *LessNode::evaluate(ExecState *exec) … … 1334 1356 JSValue *v2 = expr2->evaluate(exec); 1335 1357 KJS_CHECKEXCEPTIONVALUE 1336 int r = relation(exec, v1, v2); 1337 if (r < 0) 1338 return jsBoolean(false); 1339 return jsBoolean(r == 1); 1358 return lessThan(exec, v1, v2); 1340 1359 } 1341 1360 … … 1347 1366 JSValue *v2 = expr2->evaluate(exec); 1348 1367 KJS_CHECKEXCEPTIONVALUE 1349 int r = relation(exec, v2, v1); 1350 if (r < 0) 1351 return jsBoolean(false); 1352 return jsBoolean(r == 1); 1368 return lessThan(exec, v2, v1); 1353 1369 } 1354 1370 … … 1360 1376 JSValue *v2 = expr2->evaluate(exec); 1361 1377 KJS_CHECKEXCEPTIONVALUE 1362 int r = relation(exec, v2, v1); 1363 if (r < 0) 1364 return jsBoolean(false); 1365 return jsBoolean(r == 0); 1378 return lessThanEq(exec, v1, v2); 1366 1379 } 1367 1380 … … 1373 1386 JSValue *v2 = expr2->evaluate(exec); 1374 1387 KJS_CHECKEXCEPTIONVALUE 1375 int r = relation(exec, v1, v2); 1376 if (r < 0) 1377 return jsBoolean(false); 1378 return jsBoolean(r == 0); 1388 return lessThanEq(exec, v2, v1); 1379 1389 } 1380 1390 -
trunk/JavaScriptCore/kjs/operations.cpp
r26945 r26961 190 190 } 191 191 192 int relation(ExecState *exec, JSValue *v1, JSValue *v2)193 {194 JSValue *p1 = v1->toPrimitive(exec,NumberType);195 JSValue *p2 = v2->toPrimitive(exec,NumberType);196 197 if (p1->isString() && p2->isString())198 return p1->toString(exec) < p2->toString(exec) ? 1 : 0;199 200 double n1 = p1->toNumber(exec);201 double n2 = p2->toNumber(exec);202 if (n1 < n2)203 return 1;204 if (n1 >= n2)205 return 0;206 return -1; // must be NaN, so undefined207 }208 209 192 int maxInt(int d1, int d2) 210 193 { -
trunk/JavaScriptCore/kjs/operations.h
r26945 r26961 45 45 bool equal(ExecState *exec, JSValue *v1, JSValue *v2); 46 46 bool strictEqual(ExecState *exec, JSValue *v1, JSValue *v2); 47 /**48 * This operator performs an abstract relational comparison of the two49 * arguments that can be of arbitrary type. If possible, conversions to the50 * string or number type will take place before the comparison.51 *52 * @return 1 if v1 is "less-than" v2, 0 if the relation is "greater-than-or-53 * equal". -1 if the result is undefined.54 */55 int relation(ExecState *exec, JSValue *v1, JSValue *v2);56 47 int maxInt(int d1, int d2); 57 48 int minInt(int d1, int d2);
Note: See TracChangeset
for help on using the changeset viewer.