Changeset 798 in webkit for trunk/JavaScriptCore/kjs/operations.cpp
- Timestamp:
- Mar 21, 2002, 4:31:57 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/operations.cpp
r6 r798 1 // -*- c-basic-offset: 2 -*- 1 2 /* 2 3 * This file is part of the KDE libraries … … 17 18 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 19 * Boston, MA 02111-1307, USA. 20 * 19 21 */ 20 22 … … 42 44 #endif 43 45 46 #include "operations.h" 44 47 #include "object.h" 45 #include "types.h"46 #include "operations.h"47 48 48 49 using namespace KJS; … … 72 73 } 73 74 75 bool KJS::isPosInf(double d) 76 { 77 #if defined(HAVE_FUNC_ISINF) 78 return (isinf(d) == 1); 79 #elif HAVE_FUNC_FINITE 80 return finite(d) == 0 && d == d; // ### can we distinguish between + and - ? 81 #elif HAVE_FUNC__FINITE 82 return _finite(d) == 0 && d == d; // ### 83 #else 84 return false; 85 #endif 86 } 87 88 bool KJS::isNegInf(double d) 89 { 90 #if defined(HAVE_FUNC_ISINF) 91 return (isinf(d) == -1); 92 #elif HAVE_FUNC_FINITE 93 return finite(d) == 0 && d == d; // ### 94 #elif HAVE_FUNC__FINITE 95 return _finite(d) == 0 && d == d; // ### 96 #else 97 return false; 98 #endif 99 } 100 74 101 // ECMA 11.9.3 75 bool KJS::equal( const KJSO& v1, const KJSO& v2)102 bool KJS::equal(ExecState *exec, const Value& v1, const Value& v2) 76 103 { 77 104 Type t1 = v1.type(); … … 82 109 return true; 83 110 if (t1 == NumberType) 84 return (v1.toNumber().value() == v2.toNumber().value()); /* TODO: NaN, -0 ? */ 111 { 112 double d1 = v1.toNumber(exec); 113 double d2 = v2.toNumber(exec); 114 if ( isNaN( d1 ) || isNaN( d2 ) ) 115 return false; 116 return ( d1 == d2 ); /* TODO: +0, -0 ? */ 117 } 85 118 if (t1 == StringType) 86 return (v1.toString( ).value() == v2.toString().value());119 return (v1.toString(exec) == v2.toString(exec)); 87 120 if (t1 == BooleanType) 88 return (v1.toBoolean().value() == v2.toBoolean().value()); 89 if (t1 == HostType) { 90 KJSO h1 = v1.get("[[==]]"); 91 KJSO h2 = v2.get("[[==]]"); 92 if (!h1.isA(UndefinedType) && !h2.isA(UndefinedType)) 93 return equal(h1, h2); 94 } 121 return (v1.toBoolean(exec) == v2.toBoolean(exec)); 122 123 // types are Object 95 124 return (v1.imp() == v2.imp()); 96 125 } … … 100 129 return true; 101 130 if (t1 == NumberType && t2 == StringType) { 102 Number n2 = v2.toNumber( );103 return equal( v1, n2);131 Number n2 = v2.toNumber(exec); 132 return equal(exec,v1, n2); 104 133 } 105 134 if ((t1 == StringType && t2 == NumberType) || t1 == BooleanType) { 106 Number n1 = v1.toNumber( );107 return equal( n1, v2);135 Number n1 = v1.toNumber(exec); 136 return equal(exec,n1, v2); 108 137 } 109 138 if (t2 == BooleanType) { 110 Number n2 = v2.toNumber( );111 return equal( v1, n2);139 Number n2 = v2.toNumber(exec); 140 return equal(exec,v1, n2); 112 141 } 113 142 if ((t1 == StringType || t1 == NumberType) && t2 >= ObjectType) { 114 KJSO p2 = v2.toPrimitive();115 return equal( v1, p2);143 Value p2 = v2.toPrimitive(exec); 144 return equal(exec,v1, p2); 116 145 } 117 146 if (t1 >= ObjectType && (t2 == StringType || t2 == NumberType)) { 118 KJSO p1 = v1.toPrimitive();119 return equal( p1, v2);120 } 121 122 return false; 123 } 124 125 bool KJS::strictEqual( const KJSO &v1, const KJSO&v2)147 Value p1 = v1.toPrimitive(exec); 148 return equal(exec,p1, v2); 149 } 150 151 return false; 152 } 153 154 bool KJS::strictEqual(ExecState *exec, const Value &v1, const Value &v2) 126 155 { 127 156 Type t1 = v1.type(); … … 133 162 return true; 134 163 if (t1 == NumberType) { 135 double n1 = v1.toNumber( ).value();136 double n2 = v2.toNumber( ).value();164 double n1 = v1.toNumber(exec); 165 double n2 = v2.toNumber(exec); 137 166 if (isNaN(n1) || isNaN(n2)) 138 167 return false; … … 142 171 return false; 143 172 } else if (t1 == StringType) { 144 return v1.toString( ).value() == v2.toString().value();173 return v1.toString(exec) == v2.toString(exec); 145 174 } else if (t2 == BooleanType) { 146 return v1.toBoolean( ).value() == v2.toBoolean().value();175 return v1.toBoolean(exec) == v2.toBoolean(exec); 147 176 } 148 177 if (v1.imp() == v2.imp()) … … 153 182 } 154 183 155 int KJS::relation(const KJSO& v1, const KJSO& v2) 156 { 157 KJSO p1 = v1.toPrimitive(NumberType); 158 KJSO p2 = v2.toPrimitive(NumberType); 159 160 if (p1.isA(StringType) && p2.isA(StringType)) 161 return p1.toString().value() < p2.toString().value() ? 1 : 0; 162 163 Number n1 = p1.toNumber(); 164 Number n2 = p2.toNumber(); 165 /* TODO: check for NaN */ 166 if (n1.value() == n2.value()) 184 int KJS::relation(ExecState *exec, const Value& v1, const Value& v2) 185 { 186 Value p1 = v1.toPrimitive(exec,NumberType); 187 Value p2 = v2.toPrimitive(exec,NumberType); 188 189 if (p1.type() == StringType && p2.type() == StringType) 190 return p1.toString(exec) < p2.toString(exec) ? 1 : 0; 191 192 double n1 = p1.toNumber(exec); 193 double n2 = p2.toNumber(exec); 194 if ( isNaN( n1 ) || isNaN( n2 ) ) 195 return -1; // means undefined 196 if (n1 == n2) 167 197 return 0; 168 /* TODO: +0, -0 and Infinity */ 169 return (n1.value() < n2.value()); 170 } 171 172 double KJS::max(double d1, double d2) 173 { 174 /* TODO: check for NaN */ 198 /* TODO: +0, -0 */ 199 if ( isPosInf( n1 ) ) 200 return 0; 201 if ( isPosInf( n2 ) ) 202 return 1; 203 if ( isNegInf( n2 ) ) 204 return 0; 205 if ( isNegInf( n1 ) ) 206 return 1; 207 return (n1 < n2) ? 1 : 0; 208 } 209 210 int KJS::maxInt(int d1, int d2) 211 { 175 212 return (d1 > d2) ? d1 : d2; 176 213 } 177 214 178 double KJS::min(double d1, double d2) 179 { 180 /* TODO: check for NaN */ 215 int KJS::minInt(int d1, int d2) 216 { 181 217 return (d1 < d2) ? d1 : d2; 182 218 } 183 219 184 220 // ECMA 11.6 185 KJSO KJS::add(const KJSO &v1, const KJSO &v2, char oper) 186 { 187 KJSO p1 = v1.toPrimitive(); 188 KJSO p2 = v2.toPrimitive(); 189 190 if ((p1.isA(StringType) || p2.isA(StringType)) && oper == '+') { 191 String s1 = p1.toString(); 192 String s2 = p2.toString(); 193 194 UString s = s1.value() + s2.value(); 195 196 return String(s); 197 } 198 199 Number n1 = p1.toNumber(); 200 Number n2 = p2.toNumber(); 221 Value KJS::add(ExecState *exec, const Value &v1, const Value &v2, char oper) 222 { 223 Value p1 = v1.toPrimitive(exec); 224 Value p2 = v2.toPrimitive(exec); 225 226 if ((p1.type() == StringType || p2.type() == StringType) && oper == '+') { 227 UString s1 = p1.toString(exec); 228 UString s2 = p2.toString(exec); 229 230 return String(s1 + s2); 231 } 232 233 double n1 = p1.toNumber(exec); 234 double n2 = p2.toNumber(exec); 201 235 202 236 if (oper == '+') 203 return Number(n1 .value() + n2.value());237 return Number(n1 + n2); 204 238 else 205 return Number(n1 .value() - n2.value());239 return Number(n1 - n2); 206 240 } 207 241 208 242 // ECMA 11.5 209 KJSO KJS::mult(const KJSO &v1, const KJSO&v2, char oper)210 { 211 Number n1 = v1.toNumber( );212 Number n2 = v2.toNumber( );243 Value KJS::mult(ExecState *exec, const Value &v1, const Value &v2, char oper) 244 { 245 Number n1 = v1.toNumber(exec); 246 Number n2 = v2.toNumber(exec); 213 247 214 248 double result;
Note:
See TracChangeset
for help on using the changeset viewer.