| Index: Source/core/xml/XPathPredicate.cpp
|
| diff --git a/Source/core/xml/XPathPredicate.cpp b/Source/core/xml/XPathPredicate.cpp
|
| index a73b3018e5990c650c7598d144b7a11a17ad82bb..6719e6510010d837033f4968f314a32d62e99a8d 100644
|
| --- a/Source/core/xml/XPathPredicate.cpp
|
| +++ b/Source/core/xml/XPathPredicate.cpp
|
| @@ -28,12 +28,13 @@
|
| #include "config.h"
|
| #include "core/xml/XPathPredicate.h"
|
|
|
| -#include <math.h>
|
| #include "core/xml/XPathFunctions.h"
|
| #include "core/xml/XPathUtil.h"
|
| #include "wtf/MathExtras.h"
|
| +#include <math.h>
|
|
|
| namespace WebCore {
|
| +
|
| namespace XPath {
|
|
|
| Number::Number(double value)
|
| @@ -90,16 +91,16 @@ Value NumericOp::evaluate() const
|
| double rightVal = rhs.toNumber();
|
|
|
| switch (m_opcode) {
|
| - case OP_Add:
|
| - return leftVal + rightVal;
|
| - case OP_Sub:
|
| - return leftVal - rightVal;
|
| - case OP_Mul:
|
| - return leftVal * rightVal;
|
| - case OP_Div:
|
| - return leftVal / rightVal;
|
| - case OP_Mod:
|
| - return fmod(leftVal, rightVal);
|
| + case OP_Add:
|
| + return leftVal + rightVal;
|
| + case OP_Sub:
|
| + return leftVal - rightVal;
|
| + case OP_Mul:
|
| + return leftVal * rightVal;
|
| + case OP_Div:
|
| + return leftVal / rightVal;
|
| + case OP_Mod:
|
| + return fmod(leftVal, rightVal);
|
| }
|
| ASSERT_NOT_REACHED();
|
| return 0.0;
|
| @@ -117,38 +118,51 @@ bool EqTestOp::compare(const Value& lhs, const Value& rhs) const
|
| if (lhs.isNodeSet()) {
|
| const NodeSet& lhsSet = lhs.toNodeSet();
|
| if (rhs.isNodeSet()) {
|
| - // If both objects to be compared are node-sets, then the comparison will be true if and only if
|
| - // there is a node in the first node-set and a node in the second node-set such that the result of
|
| - // performing the comparison on the string-values of the two nodes is true.
|
| + // If both objects to be compared are node-sets, then the comparison
|
| + // will be true if and only if there is a node in the first node-set
|
| + // and a node in the second node-set such that the result of
|
| + // performing the comparison on the string-values of the two nodes
|
| + // is true.
|
| const NodeSet& rhsSet = rhs.toNodeSet();
|
| - for (unsigned lindex = 0; lindex < lhsSet.size(); ++lindex)
|
| - for (unsigned rindex = 0; rindex < rhsSet.size(); ++rindex)
|
| + for (unsigned lindex = 0; lindex < lhsSet.size(); ++lindex) {
|
| + for (unsigned rindex = 0; rindex < rhsSet.size(); ++rindex) {
|
| if (compare(stringValue(lhsSet[lindex]), stringValue(rhsSet[rindex])))
|
| return true;
|
| + }
|
| + }
|
| return false;
|
| }
|
| if (rhs.isNumber()) {
|
| - // If one object to be compared is a node-set and the other is a number, then the comparison will be true
|
| - // if and only if there is a node in the node-set such that the result of performing the comparison on the number
|
| - // to be compared and on the result of converting the string-value of that node to a number using the number function is true.
|
| - for (unsigned lindex = 0; lindex < lhsSet.size(); ++lindex)
|
| + // If one object to be compared is a node-set and the other is a
|
| + // number, then the comparison will be true if and only if there is
|
| + // a node in the node-set such that the result of performing the
|
| + // comparison on the number to be compared and on the result of
|
| + // converting the string-value of that node to a number using the
|
| + // number function is true.
|
| + for (unsigned lindex = 0; lindex < lhsSet.size(); ++lindex) {
|
| if (compare(Value(stringValue(lhsSet[lindex])).toNumber(), rhs))
|
| return true;
|
| + }
|
| return false;
|
| }
|
| if (rhs.isString()) {
|
| - // If one object to be compared is a node-set and the other is a string, then the comparison will be true
|
| - // if and only if there is a node in the node-set such that the result of performing the comparison on
|
| - // the string-value of the node and the other string is true.
|
| - for (unsigned lindex = 0; lindex < lhsSet.size(); ++lindex)
|
| + // If one object to be compared is a node-set and the other is a
|
| + // string, then the comparison will be true if and only if there is
|
| + // a node in the node-set such that the result of performing the
|
| + // comparison on the string-value of the node and the other string
|
| + // is true.
|
| + for (unsigned lindex = 0; lindex < lhsSet.size(); ++lindex) {
|
| if (compare(stringValue(lhsSet[lindex]), rhs))
|
| return true;
|
| + }
|
| return false;
|
| }
|
| if (rhs.isBoolean()) {
|
| - // If one object to be compared is a node-set and the other is a boolean, then the comparison will be true
|
| - // if and only if the result of performing the comparison on the boolean and on the result of converting
|
| - // the node-set to a boolean using the boolean function is true.
|
| + // If one object to be compared is a node-set and the other is a
|
| + // boolean, then the comparison will be true if and only if the
|
| + // result of performing the comparison on the boolean and on the
|
| + // result of converting the node-set to a boolean using the boolean
|
| + // function is true.
|
| return compare(lhs.toBoolean(), rhs);
|
| }
|
| ASSERT(0);
|
| @@ -156,15 +170,17 @@ bool EqTestOp::compare(const Value& lhs, const Value& rhs) const
|
| if (rhs.isNodeSet()) {
|
| const NodeSet& rhsSet = rhs.toNodeSet();
|
| if (lhs.isNumber()) {
|
| - for (unsigned rindex = 0; rindex < rhsSet.size(); ++rindex)
|
| + for (unsigned rindex = 0; rindex < rhsSet.size(); ++rindex) {
|
| if (compare(lhs, Value(stringValue(rhsSet[rindex])).toNumber()))
|
| return true;
|
| + }
|
| return false;
|
| }
|
| if (lhs.isString()) {
|
| - for (unsigned rindex = 0; rindex < rhsSet.size(); ++rindex)
|
| + for (unsigned rindex = 0; rindex < rhsSet.size(); ++rindex) {
|
| if (compare(lhs, stringValue(rhsSet[rindex])))
|
| return true;
|
| + }
|
| return false;
|
| }
|
| if (lhs.isBoolean())
|
| @@ -174,27 +190,27 @@ bool EqTestOp::compare(const Value& lhs, const Value& rhs) const
|
|
|
| // Neither side is a NodeSet.
|
| switch (m_opcode) {
|
| - case OP_EQ:
|
| - case OP_NE:
|
| - bool equal;
|
| - if (lhs.isBoolean() || rhs.isBoolean())
|
| - equal = lhs.toBoolean() == rhs.toBoolean();
|
| - else if (lhs.isNumber() || rhs.isNumber())
|
| - equal = lhs.toNumber() == rhs.toNumber();
|
| - else
|
| - equal = lhs.toString() == rhs.toString();
|
| -
|
| - if (m_opcode == OP_EQ)
|
| - return equal;
|
| - return !equal;
|
| - case OP_GT:
|
| - return lhs.toNumber() > rhs.toNumber();
|
| - case OP_GE:
|
| - return lhs.toNumber() >= rhs.toNumber();
|
| - case OP_LT:
|
| - return lhs.toNumber() < rhs.toNumber();
|
| - case OP_LE:
|
| - return lhs.toNumber() <= rhs.toNumber();
|
| + case OpcodeEqual:
|
| + case OpcodeNotEqual:
|
| + bool equal;
|
| + if (lhs.isBoolean() || rhs.isBoolean())
|
| + equal = lhs.toBoolean() == rhs.toBoolean();
|
| + else if (lhs.isNumber() || rhs.isNumber())
|
| + equal = lhs.toNumber() == rhs.toNumber();
|
| + else
|
| + equal = lhs.toString() == rhs.toString();
|
| +
|
| + if (m_opcode == OpcodeEqual)
|
| + return equal;
|
| + return !equal;
|
| + case OpcodeGreaterThan:
|
| + return lhs.toNumber() > rhs.toNumber();
|
| + case OpcodeGreaterOrEqual:
|
| + return lhs.toNumber() >= rhs.toNumber();
|
| + case OpcodeLessThan:
|
| + return lhs.toNumber() < rhs.toNumber();
|
| + case OpcodeLessOrEqual:
|
| + return lhs.toNumber() <= rhs.toNumber();
|
| }
|
| ASSERT(0);
|
| return false;
|
| @@ -217,10 +233,7 @@ LogicalOp::LogicalOp(Opcode opcode, PassOwnPtrWillBeRawPtr<Expression> lhs, Pass
|
|
|
| bool LogicalOp::shortCircuitOn() const
|
| {
|
| - if (m_opcode == OP_And)
|
| - return false; //false and foo
|
| -
|
| - return true; //true or bar
|
| + return m_opcode != OP_And;
|
| }
|
|
|
| Value LogicalOp::evaluate() const
|
| @@ -254,8 +267,9 @@ Value Union::evaluate() const
|
| resultSet.append(node);
|
| }
|
|
|
| - // It is also possible to use merge sort to avoid making the result unsorted;
|
| - // but this would waste the time in cases when order is not important.
|
| + // It is also possible to use merge sort to avoid making the result
|
| + // unsorted; but this would waste the time in cases when order is not
|
| + // important.
|
| resultSet.markSorted(false);
|
| return lhsResult;
|
| }
|
| @@ -280,7 +294,7 @@ bool Predicate::evaluate() const
|
|
|
| // foo[3] means foo[position()=3]
|
| if (result.isNumber())
|
| - return EqTestOp(EqTestOp::OP_EQ, adoptPtrWillBeNoop(createFunction("position")), adoptPtrWillBeNoop(new Number(result.toNumber()))).evaluate().toBoolean();
|
| + return EqTestOp(EqTestOp::OpcodeEqual, adoptPtrWillBeNoop(createFunction("position")), adoptPtrWillBeNoop(new Number(result.toNumber()))).evaluate().toBoolean();
|
|
|
| return result.toBoolean();
|
| }
|
|
|