OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2005 Frerich Raabe <raabe@kde.org> | 2 * Copyright 2005 Frerich Raabe <raabe@kde.org> |
3 * Copyright (C) 2006 Apple Computer, Inc. | 3 * Copyright (C) 2006 Apple Computer, Inc. |
4 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 4 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * | 9 * |
10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 return leftVal + rightVal; | 94 return leftVal + rightVal; |
95 case OP_Sub: | 95 case OP_Sub: |
96 return leftVal - rightVal; | 96 return leftVal - rightVal; |
97 case OP_Mul: | 97 case OP_Mul: |
98 return leftVal * rightVal; | 98 return leftVal * rightVal; |
99 case OP_Div: | 99 case OP_Div: |
100 return leftVal / rightVal; | 100 return leftVal / rightVal; |
101 case OP_Mod: | 101 case OP_Mod: |
102 return fmod(leftVal, rightVal); | 102 return fmod(leftVal, rightVal); |
103 } | 103 } |
104 ASSERT_NOT_REACHED(); | 104 NOTREACHED(); |
105 return 0.0; | 105 return 0.0; |
106 } | 106 } |
107 | 107 |
108 EqTestOp::EqTestOp(Opcode opcode, Expression* lhs, Expression* rhs) | 108 EqTestOp::EqTestOp(Opcode opcode, Expression* lhs, Expression* rhs) |
109 : m_opcode(opcode) | 109 : m_opcode(opcode) |
110 { | 110 { |
111 addSubExpression(lhs); | 111 addSubExpression(lhs); |
112 addSubExpression(rhs); | 112 addSubExpression(rhs); |
113 } | 113 } |
114 | 114 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 return false; | 157 return false; |
158 } | 158 } |
159 if (rhs.isBoolean()) { | 159 if (rhs.isBoolean()) { |
160 // If one object to be compared is a node-set and the other is a | 160 // If one object to be compared is a node-set and the other is a |
161 // boolean, then the comparison will be true if and only if the | 161 // boolean, then the comparison will be true if and only if the |
162 // result of performing the comparison on the boolean and on the | 162 // result of performing the comparison on the boolean and on the |
163 // result of converting the node-set to a boolean using the boolean | 163 // result of converting the node-set to a boolean using the boolean |
164 // function is true. | 164 // function is true. |
165 return compare(context, lhs.toBoolean(), rhs); | 165 return compare(context, lhs.toBoolean(), rhs); |
166 } | 166 } |
167 ASSERT(0); | 167 NOTREACHED(); |
168 } | 168 } |
169 if (rhs.isNodeSet()) { | 169 if (rhs.isNodeSet()) { |
170 const NodeSet& rhsSet = rhs.toNodeSet(&context); | 170 const NodeSet& rhsSet = rhs.toNodeSet(&context); |
171 if (lhs.isNumber()) { | 171 if (lhs.isNumber()) { |
172 for (unsigned rindex = 0; rindex < rhsSet.size(); ++rindex) { | 172 for (unsigned rindex = 0; rindex < rhsSet.size(); ++rindex) { |
173 if (compare(context, lhs, Value(stringValue(rhsSet[rindex])).toN
umber())) | 173 if (compare(context, lhs, Value(stringValue(rhsSet[rindex])).toN
umber())) |
174 return true; | 174 return true; |
175 } | 175 } |
176 return false; | 176 return false; |
177 } | 177 } |
178 if (lhs.isString()) { | 178 if (lhs.isString()) { |
179 for (unsigned rindex = 0; rindex < rhsSet.size(); ++rindex) { | 179 for (unsigned rindex = 0; rindex < rhsSet.size(); ++rindex) { |
180 if (compare(context, lhs, stringValue(rhsSet[rindex]))) | 180 if (compare(context, lhs, stringValue(rhsSet[rindex]))) |
181 return true; | 181 return true; |
182 } | 182 } |
183 return false; | 183 return false; |
184 } | 184 } |
185 if (lhs.isBoolean()) | 185 if (lhs.isBoolean()) |
186 return compare(context, lhs, rhs.toBoolean()); | 186 return compare(context, lhs, rhs.toBoolean()); |
187 ASSERT(0); | 187 NOTREACHED(); |
188 } | 188 } |
189 | 189 |
190 // Neither side is a NodeSet. | 190 // Neither side is a NodeSet. |
191 switch (m_opcode) { | 191 switch (m_opcode) { |
192 case OpcodeEqual: | 192 case OpcodeEqual: |
193 case OpcodeNotEqual: | 193 case OpcodeNotEqual: |
194 bool equal; | 194 bool equal; |
195 if (lhs.isBoolean() || rhs.isBoolean()) | 195 if (lhs.isBoolean() || rhs.isBoolean()) |
196 equal = lhs.toBoolean() == rhs.toBoolean(); | 196 equal = lhs.toBoolean() == rhs.toBoolean(); |
197 else if (lhs.isNumber() || rhs.isNumber()) | 197 else if (lhs.isNumber() || rhs.isNumber()) |
198 equal = lhs.toNumber() == rhs.toNumber(); | 198 equal = lhs.toNumber() == rhs.toNumber(); |
199 else | 199 else |
200 equal = lhs.toString() == rhs.toString(); | 200 equal = lhs.toString() == rhs.toString(); |
201 | 201 |
202 if (m_opcode == OpcodeEqual) | 202 if (m_opcode == OpcodeEqual) |
203 return equal; | 203 return equal; |
204 return !equal; | 204 return !equal; |
205 case OpcodeGreaterThan: | 205 case OpcodeGreaterThan: |
206 return lhs.toNumber() > rhs.toNumber(); | 206 return lhs.toNumber() > rhs.toNumber(); |
207 case OpcodeGreaterOrEqual: | 207 case OpcodeGreaterOrEqual: |
208 return lhs.toNumber() >= rhs.toNumber(); | 208 return lhs.toNumber() >= rhs.toNumber(); |
209 case OpcodeLessThan: | 209 case OpcodeLessThan: |
210 return lhs.toNumber() < rhs.toNumber(); | 210 return lhs.toNumber() < rhs.toNumber(); |
211 case OpcodeLessOrEqual: | 211 case OpcodeLessOrEqual: |
212 return lhs.toNumber() <= rhs.toNumber(); | 212 return lhs.toNumber() <= rhs.toNumber(); |
213 } | 213 } |
214 ASSERT(0); | 214 NOTREACHED(); |
215 return false; | 215 return false; |
216 } | 216 } |
217 | 217 |
218 Value EqTestOp::evaluate(EvaluationContext& context) const | 218 Value EqTestOp::evaluate(EvaluationContext& context) const |
219 { | 219 { |
220 Value lhs(subExpr(0)->evaluate(context)); | 220 Value lhs(subExpr(0)->evaluate(context)); |
221 Value rhs(subExpr(1)->evaluate(context)); | 221 Value rhs(subExpr(1)->evaluate(context)); |
222 | 222 |
223 return compare(context, lhs, rhs); | 223 return compare(context, lhs, rhs); |
224 } | 224 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 { | 278 { |
279 } | 279 } |
280 | 280 |
281 DEFINE_TRACE(Predicate) | 281 DEFINE_TRACE(Predicate) |
282 { | 282 { |
283 visitor->trace(m_expr); | 283 visitor->trace(m_expr); |
284 } | 284 } |
285 | 285 |
286 bool Predicate::evaluate(EvaluationContext& context) const | 286 bool Predicate::evaluate(EvaluationContext& context) const |
287 { | 287 { |
288 ASSERT(m_expr); | 288 DCHECK(m_expr); |
289 | 289 |
290 Value result(m_expr->evaluate(context)); | 290 Value result(m_expr->evaluate(context)); |
291 | 291 |
292 // foo[3] means foo[position()=3] | 292 // foo[3] means foo[position()=3] |
293 if (result.isNumber()) | 293 if (result.isNumber()) |
294 return EqTestOp(EqTestOp::OpcodeEqual, createFunction("position"), new N
umber(result.toNumber())).evaluate(context).toBoolean(); | 294 return EqTestOp(EqTestOp::OpcodeEqual, createFunction("position"), new N
umber(result.toNumber())).evaluate(context).toBoolean(); |
295 | 295 |
296 return result.toBoolean(); | 296 return result.toBoolean(); |
297 } | 297 } |
298 | 298 |
299 } // namespace XPath | 299 } // namespace XPath |
300 | 300 |
301 } // namespace blink | 301 } // namespace blink |
OLD | NEW |