int js_isarrayindex(js_State *J, const char *str, unsigned int *idx) { char buf[32]; *idx = jsV_numbertouint32(jsV_stringtonumber(J, str)); sprintf(buf, "%u", *idx); return !strcmp(buf, str); }
/* ToNumber() on a value */ double jsV_tonumber(js_State *J, js_Value *v) { switch (v->type) { default: case JS_TSHRSTR: return jsV_stringtonumber(J, v->u.shrstr); case JS_TUNDEFINED: return NAN; case JS_TNULL: return 0; case JS_TBOOLEAN: return v->u.boolean; case JS_TNUMBER: return v->u.number; case JS_TLITSTR: return jsV_stringtonumber(J, v->u.litstr); case JS_TMEMSTR: return jsV_stringtonumber(J, v->u.memstr->p); case JS_TOBJECT: jsV_toprimitive(J, v, JS_HNUMBER); return jsV_tonumber(J, v); } }
/* ToNumber() on a value */ double jsV_tonumber(js_State *J, const js_Value *v) { switch (v->type) { default: case JS_TUNDEFINED: return NAN; case JS_TNULL: return 0; case JS_TBOOLEAN: return v->u.boolean; case JS_TNUMBER: return v->u.number; case JS_TSTRING: return jsV_stringtonumber(J, v->u.string); case JS_TOBJECT: { js_Value vv = jsV_toprimitive(J, v, JS_HNUMBER); return jsV_tonumber(J, &vv); } } }
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; }