Ignore:
Timestamp:
Mar 21, 2002, 4:31:57 PM (23 years ago)
Author:
mjs
Message:

Merged changes from LABYRINTH_KDE_3_MERGE branch.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/operations.cpp

    r6 r798  
     1// -*- c-basic-offset: 2 -*-
    12/*
    23 *  This file is part of the KDE libraries
     
    1718 *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    1819 *  Boston, MA 02111-1307, USA.
     20 *
    1921 */
    2022
     
    4244#endif
    4345
     46#include "operations.h"
    4447#include "object.h"
    45 #include "types.h"
    46 #include "operations.h"
    4748
    4849using namespace KJS;
     
    7273}
    7374
     75bool 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
     88bool 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
    74101// ECMA 11.9.3
    75 bool KJS::equal(const KJSO& v1, const KJSO& v2)
     102bool KJS::equal(ExecState *exec, const Value& v1, const Value& v2)
    76103{
    77104  Type t1 = v1.type();
     
    82109      return true;
    83110    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    }
    85118    if (t1 == StringType)
    86       return (v1.toString().value() == v2.toString().value());
     119      return (v1.toString(exec) == v2.toString(exec));
    87120    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
    95124    return (v1.imp() == v2.imp());
    96125  }
     
    100129    return true;
    101130  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);
    104133  }
    105134  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);
    108137  }
    109138  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);
    112141  }
    113142  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);
    116145  }
    117146  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
     154bool KJS::strictEqual(ExecState *exec, const Value &v1, const Value &v2)
    126155{
    127156  Type t1 = v1.type();
     
    133162    return true;
    134163  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);
    137166    if (isNaN(n1) || isNaN(n2))
    138167      return false;
     
    142171    return false;
    143172  } else if (t1 == StringType) {
    144     return v1.toString().value() == v2.toString().value();
     173    return v1.toString(exec) == v2.toString(exec);
    145174  } else if (t2 == BooleanType) {
    146     return v1.toBoolean().value() == v2.toBoolean().value();
     175    return v1.toBoolean(exec) == v2.toBoolean(exec);
    147176  }
    148177  if (v1.imp() == v2.imp())
     
    153182}
    154183
    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())
     184int 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)
    167197    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
     210int KJS::maxInt(int d1, int d2)
     211{
    175212  return (d1 > d2) ? d1 : d2;
    176213}
    177214
    178 double KJS::min(double d1, double d2)
    179 {
    180   /* TODO: check for NaN */
     215int KJS::minInt(int d1, int d2)
     216{
    181217  return (d1 < d2) ? d1 : d2;
    182218}
    183219
    184220// 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();
     221Value 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);
    201235
    202236  if (oper == '+')
    203     return Number(n1.value() + n2.value());
     237    return Number(n1 + n2);
    204238  else
    205     return Number(n1.value() - n2.value());
     239    return Number(n1 - n2);
    206240}
    207241
    208242// 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();
     243Value 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);
    213247
    214248  double result;
Note: See TracChangeset for help on using the changeset viewer.