/[jscoverage]/trunk/js/jsnum.cpp
ViewVC logotype

Diff of /trunk/js/jsnum.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 398 by siliconforks, Thu Oct 23 19:03:33 2008 UTC revision 399 by siliconforks, Tue Dec 9 03:37:47 2008 UTC
# Line 54  Line 54 
54  #include "jsutil.h" /* Added by JSIFY */  #include "jsutil.h" /* Added by JSIFY */
55  #include "jsapi.h"  #include "jsapi.h"
56  #include "jsatom.h"  #include "jsatom.h"
57    #include "jsbuiltins.h"
58  #include "jscntxt.h"  #include "jscntxt.h"
59  #include "jsversion.h"  #include "jsversion.h"
60  #include "jsdtoa.h"  #include "jsdtoa.h"
# Line 98  Line 99 
99      return JS_TRUE;      return JS_TRUE;
100  }  }
101    
102  JSBool  static JSBool
103  js_num_parseFloat(JSContext *cx, uintN argc, jsval *vp)  num_parseFloat(JSContext *cx, uintN argc, jsval *vp)
104  {  {
105      JSString *str;      JSString *str;
106      jsdouble d;      jsdouble d;
# Line 122  Line 123 
123      return js_NewNumberInRootedValue(cx, d, vp);      return js_NewNumberInRootedValue(cx, d, vp);
124  }  }
125    
126    #ifdef JS_TRACER
127    static jsdouble FASTCALL
128    ParseFloat(JSContext* cx, JSString* str)
129    {
130        const jschar* bp;
131        const jschar* end;
132        const jschar* ep;
133        jsdouble d;
134    
135        JSSTRING_CHARS_AND_END(str, bp, end);
136        if (!js_strtod(cx, bp, end, &ep, &d) || ep == bp)
137            return js_NaN;
138        return d;
139    }
140    #endif
141    
142  /* See ECMA 15.1.2.2. */  /* See ECMA 15.1.2.2. */
143  JSBool  static JSBool
144  js_num_parseInt(JSContext *cx, uintN argc, jsval *vp)  num_parseInt(JSContext *cx, uintN argc, jsval *vp)
145  {  {
146      jsint radix;      jsint radix;
147      JSString *str;      JSString *str;
# Line 165  Line 182 
182      return js_NewNumberInRootedValue(cx, d, vp);      return js_NewNumberInRootedValue(cx, d, vp);
183  }  }
184    
185    #ifdef JS_TRACER
186    static jsdouble FASTCALL
187    ParseInt(JSContext* cx, JSString* str)
188    {
189        const jschar* bp;
190        const jschar* end;
191        const jschar* ep;
192        jsdouble d;
193    
194        JSSTRING_CHARS_AND_END(str, bp, end);
195        if (!js_strtointeger(cx, bp, end, &ep, 0, &d) || ep == bp)
196            return js_NaN;
197        return d;
198    }
199    
200    static jsdouble FASTCALL
201    ParseIntDouble(jsdouble d)
202    {
203        if (!JSDOUBLE_IS_FINITE(d))
204            return js_NaN;
205        return floor(d);
206    }
207    #endif
208    
209  const char js_Infinity_str[]   = "Infinity";  const char js_Infinity_str[]   = "Infinity";
210  const char js_NaN_str[]        = "NaN";  const char js_NaN_str[]        = "NaN";
211  const char js_isNaN_str[]      = "isNaN";  const char js_isNaN_str[]      = "isNaN";
# Line 172  Line 213 
213  const char js_parseFloat_str[] = "parseFloat";  const char js_parseFloat_str[] = "parseFloat";
214  const char js_parseInt_str[]   = "parseInt";  const char js_parseInt_str[]   = "parseInt";
215    
216    #ifdef JS_TRACER
217    
218    JS_DEFINE_TRCINFO_2(num_parseInt,
219        (2, (static, DOUBLE, ParseInt, CONTEXT, STRING,     1, 1)),
220        (1, (static, DOUBLE, ParseIntDouble, DOUBLE,        1, 1)))
221    
222    JS_DEFINE_TRCINFO_1(num_parseFloat,
223        (2, (static, DOUBLE, ParseFloat, CONTEXT, STRING,   1, 1)))
224    
225    #endif /* JS_TRACER */
226    
227  static JSFunctionSpec number_functions[] = {  static JSFunctionSpec number_functions[] = {
228      JS_FN(js_isNaN_str,         num_isNaN,              1,0),      JS_FN(js_isNaN_str,         num_isNaN,           1,0),
229      JS_FN(js_isFinite_str,      num_isFinite,           1,0),      JS_FN(js_isFinite_str,      num_isFinite,        1,0),
230      JS_FN(js_parseFloat_str,    js_num_parseFloat,      1,0),      JS_TN(js_parseFloat_str,    num_parseFloat,      1,0, num_parseFloat_trcinfo),
231      JS_FN(js_parseInt_str,      js_num_parseInt,        2,0),      JS_TN(js_parseInt_str,      num_parseInt,        2,0, num_parseInt_trcinfo),
232      JS_FS_END      JS_FS_END
233  };  };
234    
# Line 247  Line 299 
299    
300  /* The buf must be big enough for MIN_INT to fit including '-' and '\0'. */  /* The buf must be big enough for MIN_INT to fit including '-' and '\0'. */
301  char *  char *
302  js_IntToCString(jsint i, char *buf, size_t bufSize)  js_IntToCString(jsint i, jsint base, char *buf, size_t bufSize)
303  {  {
304      char *cp;      char *cp;
305      jsuint u;      jsuint u;
# Line 261  Line 313 
313       * Build the string from behind. We use multiply and subtraction       * Build the string from behind. We use multiply and subtraction
314       * instead of modulus because that's much faster.       * instead of modulus because that's much faster.
315       */       */
316      do {      switch (base) {
317          jsuint newu = u / 10;      case 10:
318          *--cp = (char)(u - newu * 10) + '0';        do {
319          u = newu;            jsuint newu = u / 10;
320      } while (u != 0);            *--cp = (char)(u - newu * 10) + '0';
321              u = newu;
322          } while (u != 0);
323          break;
324        case 16:
325          do {
326              jsuint newu = u / 16;
327              *--cp = "0123456789abcdef"[u - newu * 16];
328              u = newu;
329          } while (u != 0);
330          break;
331        default:
332          JS_ASSERT(base >= 2 && base <= 36);
333          do {
334              jsuint newu = u / base;
335              *--cp = "0123456789abcdefghijklmnopqrstuvwxyz"[u - newu * base];
336              u = newu;
337          } while (u != 0);
338          break;
339        }
340      if (i < 0)      if (i < 0)
341          *--cp = '-';          *--cp = '-';
342    
# Line 274  Line 344 
344      return cp;      return cp;
345  }  }
346    
347  JSBool  static JSBool
348  js_num_toString(JSContext *cx, uintN argc, jsval *vp)  num_toString(JSContext *cx, uintN argc, jsval *vp)
349  {  {
350      jsval v;      jsval v;
351      jsdouble d;      jsdouble d;
# Line 293  Line 363 
363              return JS_FALSE;              return JS_FALSE;
364          if (base < 2 || base > 36) {          if (base < 2 || base > 36) {
365              char numBuf[12];              char numBuf[12];
366              char *numStr = js_IntToCString(base, numBuf, sizeof numBuf);              char *numStr = js_IntToCString(base, 10, numBuf, sizeof numBuf);
367              JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_RADIX,              JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_RADIX,
368                                   numStr);                                   numStr);
369              return JS_FALSE;              return JS_FALSE;
# Line 332  Line 402 
402       * Create the string, move back to bytes to make string twiddling       * Create the string, move back to bytes to make string twiddling
403       * a bit easier and so we can insert platform charset seperators.       * a bit easier and so we can insert platform charset seperators.
404       */       */
405      if (!js_num_toString(cx, 0, vp))      if (!num_toString(cx, 0, vp))
406          return JS_FALSE;          return JS_FALSE;
407      JS_ASSERT(JSVAL_IS_STRING(*vp));      JS_ASSERT(JSVAL_IS_STRING(*vp));
408      numStr = JSVAL_TO_STRING(*vp);      numStr = JSVAL_TO_STRING(*vp);
# Line 515  Line 585 
585  num_toPrecision(JSContext *cx, uintN argc, jsval *vp)  num_toPrecision(JSContext *cx, uintN argc, jsval *vp)
586  {  {
587      if (argc == 0 || JSVAL_IS_VOID(vp[2]))      if (argc == 0 || JSVAL_IS_VOID(vp[2]))
588          return js_num_toString(cx, 0, vp);          return num_toString(cx, 0, vp);
589      return num_to(cx, DTOSTR_STANDARD, DTOSTR_PRECISION, 1, MAX_PRECISION, 0,      return num_to(cx, DTOSTR_STANDARD, DTOSTR_PRECISION, 1, MAX_PRECISION, 0,
590                    argc, vp);                    argc, vp);
591  }  }
592    
593    #ifdef JS_TRACER
594    
595    JS_DEFINE_TRCINFO_2(num_toString,
596        (3, (static, STRING, NumberToStringWithBase, CONTEXT, THIS_DOUBLE, INT32, 1, 1)),
597        (2, (extern, STRING, js_NumberToString,      CONTEXT, THIS_DOUBLE,        1, 1)))
598    
599    #endif /* JS_TRACER */
600    
601  static JSFunctionSpec number_methods[] = {  static JSFunctionSpec number_methods[] = {
602  #if JS_HAS_TOSOURCE  #if JS_HAS_TOSOURCE
603      JS_FN(js_toSource_str,       num_toSource,       0,JSFUN_THISP_NUMBER),      JS_FN(js_toSource_str,       num_toSource,          0,JSFUN_THISP_NUMBER),
604  #endif  #endif
605      JS_FN(js_toString_str,       js_num_toString,    1,JSFUN_THISP_NUMBER),      JS_TN(js_toString_str,       num_toString,          1,JSFUN_THISP_NUMBER,
606      JS_FN(js_toLocaleString_str, num_toLocaleString, 0,JSFUN_THISP_NUMBER),            num_toString_trcinfo),
607      JS_FN(js_valueOf_str,        num_valueOf,        0,JSFUN_THISP_NUMBER),      JS_FN(js_toLocaleString_str, num_toLocaleString,    0,JSFUN_THISP_NUMBER),
608      JS_FN("toFixed",             num_toFixed,        1,JSFUN_THISP_NUMBER),      JS_FN(js_valueOf_str,        num_valueOf,           0,JSFUN_THISP_NUMBER),
609      JS_FN("toExponential",       num_toExponential,  1,JSFUN_THISP_NUMBER),      JS_FN(js_toJSON_str,         num_valueOf,           0,JSFUN_THISP_NUMBER),
610      JS_FN("toPrecision",         num_toPrecision,    1,JSFUN_THISP_NUMBER),      JS_FN("toFixed",             num_toFixed,           1,JSFUN_THISP_NUMBER),
611        JS_FN("toExponential",       num_toExponential,     1,JSFUN_THISP_NUMBER),
612        JS_FN("toPrecision",         num_toPrecision,       1,JSFUN_THISP_NUMBER),
613      JS_FS_END      JS_FS_END
614  };  };
615    
# Line 708  Line 788 
788  }  }
789    
790  char *  char *
791  js_NumberToCString(JSContext *cx, jsdouble d, char *buf, size_t bufSize)  js_NumberToCString(JSContext *cx, jsdouble d, jsint base, char *buf, size_t bufSize)
792  {  {
793      jsint i;      jsint i;
794      char *numStr;      char *numStr;
795    
796      JS_ASSERT(bufSize >= DTOSTR_STANDARD_BUFFER_SIZE);      JS_ASSERT(bufSize >= DTOSTR_STANDARD_BUFFER_SIZE);
797      if (JSDOUBLE_IS_INT(d, i)) {      if (JSDOUBLE_IS_INT(d, i)) {
798          numStr = js_IntToCString(i, buf, bufSize);          numStr = js_IntToCString(i, base, buf, bufSize);
799      } else {      } else {
800          numStr = JS_dtostr(buf, bufSize, DTOSTR_STANDARD, 0, d);          if (base == 10)
801                numStr = JS_dtostr(buf, bufSize, DTOSTR_STANDARD, 0, d);
802            else
803                numStr = JS_dtobasestr(base, d);
804          if (!numStr) {          if (!numStr) {
805              JS_ReportOutOfMemory(cx);              JS_ReportOutOfMemory(cx);
806              return NULL;              return NULL;
# Line 726  Line 809 
809      return numStr;      return numStr;
810  }  }
811    
812  JSString * JS_FASTCALL  static JSString * JS_FASTCALL
813  js_NumberToString(JSContext *cx, jsdouble d)  NumberToStringWithBase(JSContext *cx, jsdouble d, jsint base)
814  {  {
815      char buf[DTOSTR_STANDARD_BUFFER_SIZE];      char buf[DTOSTR_STANDARD_BUFFER_SIZE];
816      char *numStr;      char *numStr;
817    
818      numStr = js_NumberToCString(cx, d, buf, sizeof buf);      if (base < 2 || base > 36)
819            return NULL;
820        numStr = js_NumberToCString(cx, d, base, buf, sizeof buf);
821      if (!numStr)      if (!numStr)
822          return NULL;          return NULL;
823      return JS_NewStringCopyZ(cx, numStr);      return JS_NewStringCopyZ(cx, numStr);
824  }  }
825    
826    JSString * JS_FASTCALL
827    js_NumberToString(JSContext *cx, jsdouble d)
828    {
829        return NumberToStringWithBase(cx, d, 10);
830    }
831    
832  jsdouble  jsdouble
833  js_ValueToNumber(JSContext *cx, jsval *vp)  js_ValueToNumber(JSContext *cx, jsval *vp)
834  {  {

Legend:
Removed from v.398  
changed lines
  Added in v.399

  ViewVC Help
Powered by ViewVC 1.1.24