Add builtins for toLowerCase, toUpperCase and replace(str,str) (452885, r=mrbkap).

This commit is contained in:
Andreas Gal 2008-08-29 17:35:00 -07:00
parent f29178e950
commit 113ad8babe
6 changed files with 87 additions and 16 deletions

View File

@ -60,8 +60,11 @@ BUILTIN2(String_p_charCodeAt, LO, LO, LO, jsint, JSString*, jsint, 1,
BUILTIN3(String_p_concat_1int, LO, LO, LO, P, JSString*, JSContest*, JSString*, jsint, 1, 1)
BUILTIN4(String_p_match, LO, LO, LO, LO, P, JSObject*, JSContext*, JSString*, jsbytecode*, JSObject*, 1, 1)
BUILTIN4(String_p_replace_str, LO, LO, LO, LO, P, JSString*, JSContext*, JSString*, JSObject*, JSString*, 1, 1)
BUILTIN4(String_p_replace_str2, LO, LO, LO, LO, P, JSString*, JSContext*, JSString*, JSString*, JSString*, 1, 1)
BUILTIN5(String_p_replace_str3, LO, LO, LO, LO, LO, P, JSString*, JSContext*, JSString*, JSString*, JSString*, JSString*, 1, 1)
BUILTIN3(String_p_split, LO, LO, LO, P, JSObject*, JSContext*, JSString*, JSString*, 0, 0)
BUILTIN2(toLowerCase, LO, LO, P, JSString*, JSContext*, JSString*, 1, 1)
BUILTIN2(toUpperCase, LO, LO, P, JSString*, JSContext*, JSString*, 1, 1)
BUILTIN1(Math_random, LO, F, jsdouble, JSRuntime*, 0, 0)
BUILTIN2(EqualStrings, LO, LO, LO, bool, JSString*, JSString*, 1, 1)
BUILTIN2(CompareStrings, LO, LO, LO, bool, JSString*, JSString*, 1, 1)

View File

@ -295,6 +295,18 @@ js_String_p_replace_str(JSContext* cx, JSString* str, JSObject* regexp, JSString
return JSVAL_TO_STRING(vp[0]);
}
JSString* FASTCALL
js_String_p_replace_str2(JSContext* cx, JSString* str, JSString* patstr, JSString* repstr)
{
jsval vp[4] = {
JSVAL_NULL, STRING_TO_JSVAL(str), STRING_TO_JSVAL(patstr), STRING_TO_JSVAL(repstr)
};
if (!js_StringReplaceHelper(cx, 2, NULL, repstr, vp))
return NULL;
JS_ASSERT(JSVAL_IS_STRING(vp[0]));
return JSVAL_TO_STRING(vp[0]);
}
JSString* FASTCALL
js_String_p_replace_str3(JSContext* cx, JSString* str, JSString* patstr, JSString* repstr,
JSString* flagstr)

View File

@ -779,26 +779,36 @@ js_str_substring(JSContext *cx, uintN argc, jsval *vp)
return JS_TRUE;
}
static JSBool
str_toLowerCase(JSContext *cx, uintN argc, jsval *vp)
JSString* JS_FASTCALL
js_toLowerCase(JSContext *cx, JSString *str)
{
JSString *str;
size_t i, n;
jschar *s, *news;
NORMALIZE_THIS(cx, vp, str);
JSSTRING_CHARS_AND_LENGTH(str, s, n);
news = (jschar *) JS_malloc(cx, (n + 1) * sizeof(jschar));
if (!news)
return JS_FALSE;
return NULL;
for (i = 0; i < n; i++)
news[i] = JS_TOLOWER(s[i]);
news[n] = 0;
str = js_NewString(cx, news, n);
if (!str) {
JS_free(cx, news);
return JS_FALSE;
return NULL;
}
return str;
}
JSBool
js_str_toLowerCase(JSContext *cx, uintN argc, jsval *vp)
{
JSString *str;
NORMALIZE_THIS(cx, vp, str);
str = js_toLowerCase(cx, str);
if (!str)
return JS_FALSE;
*vp = STRING_TO_JSVAL(str);
return JS_TRUE;
}
@ -816,29 +826,39 @@ str_toLocaleLowerCase(JSContext *cx, uintN argc, jsval *vp)
NORMALIZE_THIS(cx, vp, str);
return cx->localeCallbacks->localeToLowerCase(cx, str, vp);
}
return str_toLowerCase(cx, 0, vp);
return js_str_toLowerCase(cx, 0, vp);
}
static JSBool
str_toUpperCase(JSContext *cx, uintN argc, jsval *vp)
JSString* JS_FASTCALL
js_toUpperCase(JSContext *cx, JSString *str)
{
JSString *str;
size_t i, n;
jschar *s, *news;
NORMALIZE_THIS(cx, vp, str);
JSSTRING_CHARS_AND_LENGTH(str, s, n);
news = (jschar *) JS_malloc(cx, (n + 1) * sizeof(jschar));
if (!news)
return JS_FALSE;
return NULL;
for (i = 0; i < n; i++)
news[i] = JS_TOUPPER(s[i]);
news[n] = 0;
str = js_NewString(cx, news, n);
if (!str) {
JS_free(cx, news);
return JS_FALSE;
return NULL;
}
return str;
}
JSBool
js_str_toUpperCase(JSContext *cx, uintN argc, jsval *vp)
{
JSString *str;
NORMALIZE_THIS(cx, vp, str);
str = js_toUpperCase(cx, str);
if (!str)
return JS_FALSE;
*vp = STRING_TO_JSVAL(str);
return JS_TRUE;
}
@ -856,7 +876,7 @@ str_toLocaleUpperCase(JSContext *cx, uintN argc, jsval *vp)
NORMALIZE_THIS(cx, vp, str);
return cx->localeCallbacks->localeToUpperCase(cx, str, vp);
}
return str_toUpperCase(cx, 0, vp);
return js_str_toUpperCase(cx, 0, vp);
}
static JSBool
@ -2255,8 +2275,8 @@ static JSFunctionSpec string_methods[] = {
JS_FN(js_toString_str, str_toString, 0,JSFUN_THISP_STRING),
JS_FN(js_valueOf_str, str_toString, 0,JSFUN_THISP_STRING),
JS_FN("substring", js_str_substring, 2,GENERIC_PRIMITIVE),
JS_FN("toLowerCase", str_toLowerCase, 0,GENERIC_PRIMITIVE),
JS_FN("toUpperCase", str_toUpperCase, 0,GENERIC_PRIMITIVE),
JS_FN("toLowerCase", js_str_toLowerCase, 0,GENERIC_PRIMITIVE),
JS_FN("toUpperCase", js_str_toUpperCase, 0,GENERIC_PRIMITIVE),
JS_FN("charAt", js_str_charAt, 1,GENERIC_PRIMITIVE),
JS_FN("charCodeAt", js_str_charCodeAt, 1,GENERIC_PRIMITIVE),
JS_FN("indexOf", str_indexOf, 1,GENERIC_PRIMITIVE),

View File

@ -249,6 +249,12 @@ js_UndependString(JSContext *cx, JSString *str);
extern JSBool
js_MakeStringImmutable(JSContext *cx, JSString *str);
extern JSString* JS_FASTCALL
js_toLowerCase(JSContext *cx, JSString *str);
extern JSString* JS_FASTCALL
js_toUpperCase(JSContext *cx, JSString *str);
typedef struct JSCharBuffer {
size_t length;
jschar *chars;
@ -629,6 +635,12 @@ js_StringReplaceHelper(JSContext *cx, uintN argc, JSObject *lambda,
extern JSBool
js_str_split(JSContext *cx, uintN argc, jsval *vp);
extern JSBool
js_str_toLowerCase(JSContext *cx, uintN argc, jsval *vp);
extern JSBool
js_str_toUpperCase(JSContext *cx, uintN argc, jsval *vp);
/*
* Convert one UCS-4 char and write it into a UTF-8 buffer, which must be at
* least 6 bytes long. Return the number of UTF-8 bytes of data written.

View File

@ -4334,10 +4334,13 @@ TraceRecorder::record_JSOP_CALL()
{ js_str_fromCharCode, F_String_fromCharCode, "C", "i", FAIL_NULL, NULL },
{ js_str_match, F_String_p_match, "PTC", "r", FAIL_VOID, NULL },
{ js_str_replace, F_String_p_replace_str, "TC", "sr", FAIL_NULL, NULL },
{ js_str_replace, F_String_p_replace_str2,"TC", "ss", FAIL_NULL, NULL },
{ js_str_replace, F_String_p_replace_str3,"TC","sss", FAIL_NULL, NULL },
{ js_str_split, F_String_p_split, "TC", "s", FAIL_NULL, NULL },
{ js_str_substring, F_String_p_substring, "TC", "ii", FAIL_NULL, NULL },
{ js_str_substring, F_String_p_substring_1, "TC", "i", FAIL_NULL, NULL },
{ js_str_toLowerCase, F_toLowerCase, "TC", "", FAIL_NULL, NULL },
{ js_str_toUpperCase, F_toUpperCase, "TC", "", FAIL_NULL, NULL },
};
for (uintN i = 0; i < JS_ARRAY_LENGTH(knownNatives); i++) {

View File

@ -1075,6 +1075,27 @@ function testDivisionFloat() {
testDivisionFloat.expected = true;
test(testDivisionFloat);
function testToUpperToLower() {
var s = "Hello", s1, s2;
for (i = 0; i < 100; ++i) {
s1 = s.toLowerCase();
s2 = s.toUpperCase();
}
return s1 + s2;
}
testToUpperToLower.expected = "helloHELLO";
test(testToUpperToLower);
function testReplace2() {
var s = "H e l l o", s1;
for (i = 0; i < 100; ++i) {
s1 = s.replace(" ", "");
}
return s1;
}
testReplace2.expected = "He l l o";
test(testReplace2);
/* Keep these at the end so that we can see the summary after the trace-debug spew. */
print("\npassed:", passes.length && passes.join(","));
print("\nFAILED:", fails.length && fails.join(","));