ref: ce0a690a04a172b183020b650ac5e6742885a095
dir: /jsbstring.c/
#include "js.h"
#include "jsobject.h"
#include "jsrun.h"
#include "jsstate.h"
#include "jsutf.h"
static int jsB_new_String(js_State *J, int n)
{
js_pushobject(J, jsR_newstring(J, n > 0 ? js_tostring(J, 0) : ""));
return 1;
}
static int jsB_String(js_State *J, int n)
{
js_pushliteral(J, n > 0 ? js_tostring(J, 1) : "");
return 1;
}
static int Sp_toString(js_State *J, int n)
{
js_Object *self = js_toobject(J, 0);
if (self->type != JS_CSTRING) jsR_error(J, "TypeError");
js_pushliteral(J, self->u.string);
return 1;
}
static int Sp_valueOf(js_State *J, int n)
{
js_Object *self = js_toobject(J, 0);
if (self->type != JS_CSTRING) jsR_error(J, "TypeError");
js_pushliteral(J, self->u.string);
return 1;
}
static int S_fromCharCode(js_State *J, int n)
{
int i;
Rune c;
char *s = malloc(n * UTFmax + 1), *p = s;
// TODO: guard malloc with try/catch
for (i = 0; i < n; i++) {
c = js_tonumber(J, i + 1); // TODO: ToUInt16()
p += runetochar(p, &c);
}
*p = 0;
js_pushstring(J, s);
free(s);
return 1;
}
void jsB_initstring(js_State *J)
{
J->String_prototype->u.string = "";
js_pushobject(J, jsR_newcconstructor(J, jsB_String, jsB_new_String));
{
jsB_propn(J, "length", 1);
js_pushobject(J, J->String_prototype);
{
js_copy(J, -2);
js_setproperty(J, -2, "constructor");
jsB_propf(J, "toString", Sp_toString, 0);
jsB_propf(J, "valueOf", Sp_valueOf, 0);
}
js_setproperty(J, -2, "prototype");
jsB_propf(J, "fromCharCode", S_fromCharCode, 1);
}
js_setglobal(J, "String");
}