mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Add builtins for toLowerCase, toUpperCase and replace(str,str) (452885, r=mrbkap).
This commit is contained in:
parent
f29178e950
commit
113ad8babe
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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),
|
||||
|
@ -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.
|
||||
|
@ -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++) {
|
||||
|
@ -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(","));
|
||||
|
Loading…
Reference in New Issue
Block a user