/* ToString() on a number */ const char *jsV_numbertostring(js_State *J, char buf[32], double f) { char digits[32], *p = buf, *s = digits; int exp, ndigits, point; if (f == 0) return "0"; if (isnan(f)) return "NaN"; if (isinf(f)) return f < 0 ? "-Infinity" : "Infinity"; /* Fast case for integers. This only works assuming all integers can be * exactly represented by a float. This is true for 32-bit integers and * 64-bit floats. */ if (f >= INT_MIN && f <= INT_MAX) { int i = (int)f; if ((double)i == f) return js_itoa(buf, i); } ndigits = js_grisu2(f, digits, &exp); point = ndigits + exp; if (signbit(f)) *p++ = '-'; if (point < -5 || point > 21) { *p++ = *s++; if (ndigits > 1) { int n = ndigits - 1; *p++ = '.'; while (n--) *p++ = *s++; } js_fmtexp(p, point - 1); } else if (point <= 0) { *p++ = '0'; *p++ = '.'; while (point++ < 0) *p++ = '0'; while (ndigits-- > 0) *p++ = *s++; *p = 0; } else { while (ndigits-- > 0) { *p++ = *s++; if (--point == 0 && ndigits > 0) *p++ = '.'; } while (point-- > 0) *p++ = '0'; *p = 0; } return buf; }
static void itwalk(js_State *J, js_Object *io, js_Object *top, int own) { js_Object *obj = top; js_Iterator *tail = NULL; char buf[32]; int k; #define ITADD(x) \ js_Iterator *node = js_malloc(J, sizeof *node); \ node->name = x; \ node->next = NULL; \ if (!tail) { \ io->u.iter.head = tail = node; \ } else { \ tail->next = node; \ tail = node; \ } while (obj) { js_Property *prop = obj->head; while (prop) { if (!(prop->atts & JS_DONTENUM) && !itshadow(J, top, obj, prop->name)) { ITADD(prop->name); } prop = prop->next; } if (obj->type == JS_CSTRING) { for (k = 0; k < obj->u.s.length; ++k) { js_itoa(buf, k); if (!itshadow(J, top, obj, buf)) { ITADD(js_intern(J, buf)); } } } if (own) break; obj = obj->prototype; } }
void jsV_resizearray(js_State *J, js_Object *obj, int newlen) { char buf[32]; const char *s; int k; if (newlen < obj->u.a.length) { if (obj->u.a.length > obj->count * 2) { js_Object *it = jsV_newiterator(J, obj, 1); while ((s = jsV_nextiterator(J, it))) { k = jsV_numbertointeger(jsV_stringtonumber(J, s)); if (k >= newlen && !strcmp(s, jsV_numbertostring(J, buf, k))) jsV_delproperty(J, obj, s); } } else { for (k = newlen; k < obj->u.a.length; ++k) { jsV_delproperty(J, obj, js_itoa(buf, k)); } } } obj->u.a.length = newlen; }
void js_delindex(js_State *J, int idx, unsigned int i) { char buf[32]; js_delproperty(J, idx, js_itoa(buf, i)); }
int js_hasindex(js_State *J, int idx, unsigned int i) { char buf[32]; return js_hasproperty(J, idx, js_itoa(buf, i)); }
void js_setindex(js_State *J, int idx, int i) { char buf[32]; js_setproperty(J, idx, js_itoa(buf, i)); }