/* ToString() on a value */ const char *jsV_tostring(js_State *J, js_Value *v) { char buf[32]; const char *p; switch (v->type) { default: case JS_TSHRSTR: return v->u.shrstr; case JS_TUNDEFINED: return "undefined"; case JS_TNULL: return "null"; case JS_TBOOLEAN: return v->u.boolean ? "true" : "false"; case JS_TLITSTR: return v->u.litstr; case JS_TMEMSTR: return v->u.memstr->p; case JS_TNUMBER: p = jsV_numbertostring(J, buf, v->u.number); if (p == buf) { unsigned int n = strlen(p); if (n <= offsetof(js_Value, type)) { char *s = v->u.shrstr; while (n--) *s++ = *p++; *s = 0; v->type = JS_TSHRSTR; return v->u.shrstr; } else { v->type = JS_TMEMSTR; v->u.memstr = jsV_newmemstring(J, p, n); return v->u.memstr->p; } } return p; case JS_TOBJECT: jsV_toprimitive(J, v, JS_HSTRING); return jsV_tostring(J, v); } }
static void checkdup(JF, js_Ast *list, js_Ast *end) { char nbuf[32], sbuf[32]; const char *needle, *straw; if (end->a->type == EXP_NUMBER) needle = jsV_numbertostring(J, nbuf, end->a->number); else needle = end->a->string; while (list->a != end) { if (list->a->type == end->type) { js_Ast *prop = list->a->a; if (prop->type == EXP_NUMBER) straw = jsV_numbertostring(J, sbuf, prop->number); else straw = prop->string; if (!strcmp(needle, straw)) jsC_error(J, list, "duplicate property '%s' in object literal", needle); } list = list->b; } }
/* ToString() on a value */ const char *jsV_tostring(js_State *J, const js_Value *v) { switch (v->type) { default: case JS_TUNDEFINED: return "undefined"; case JS_TNULL: return "null"; case JS_TBOOLEAN: return v->u.boolean ? "true" : "false"; case JS_TNUMBER: return jsV_numbertostring(J, v->u.number); case JS_TSTRING: return v->u.string; case JS_TOBJECT: { js_Value vv = jsV_toprimitive(J, v, JS_HSTRING); return jsV_tostring(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; }