Attachment #669531: add String.prototype.toArray for bug #799499

View | Details | Raw Unified | Return to bug 799499
Collapse All | Expand All

(-)a/js/src/jit-test/tests/basic/string-toArray.js (+7 lines)
Line     Link Here 
Line 0    Link Here 
1
load(libdir + "eqArrayHelper.js");
2
3
assertEqArray("".toArray(), []);
4
assertEqArray("a".toArray(), ["a"]);
5
assertEqArray("abcdef".toArray(), ["a", "b", "c", "d", "e", "f"]);
6
var myobj = {toString : (function () "abc"), toArray : String.prototype.toArray};
7
assertEqArray(myobj.toArray(myobj), ["a", "b", "c"]);
(-)a/js/src/js.msg (-1 / +1 lines)
Line     Link Here 
 Lines 191-207   MSG_DEF(JSMSG_OUT_OF_MEMORY, 13 Link Here 
191
MSG_DEF(JSMSG_UNTERMINATED_STRING,    138, 0, JSEXN_SYNTAXERR, "unterminated string literal")
191
MSG_DEF(JSMSG_UNTERMINATED_STRING,    138, 0, JSEXN_SYNTAXERR, "unterminated string literal")
192
MSG_DEF(JSMSG_TOO_MANY_PARENS,        139, 0, JSEXN_INTERNALERR, "too many parentheses in regular expression")
192
MSG_DEF(JSMSG_TOO_MANY_PARENS,        139, 0, JSEXN_INTERNALERR, "too many parentheses in regular expression")
193
MSG_DEF(JSMSG_UNTERMINATED_COMMENT,   140, 0, JSEXN_SYNTAXERR, "unterminated comment")
193
MSG_DEF(JSMSG_UNTERMINATED_COMMENT,   140, 0, JSEXN_SYNTAXERR, "unterminated comment")
194
MSG_DEF(JSMSG_UNTERMINATED_REGEXP,    141, 0, JSEXN_SYNTAXERR, "unterminated regular expression literal")
194
MSG_DEF(JSMSG_UNTERMINATED_REGEXP,    141, 0, JSEXN_SYNTAXERR, "unterminated regular expression literal")
195
MSG_DEF(JSMSG_BAD_CLONE_FUNOBJ_SCOPE, 142, 0, JSEXN_TYPEERR, "bad cloned function scope chain")
195
MSG_DEF(JSMSG_BAD_CLONE_FUNOBJ_SCOPE, 142, 0, JSEXN_TYPEERR, "bad cloned function scope chain")
196
MSG_DEF(JSMSG_SHARPVAR_TOO_BIG,       143, 0, JSEXN_SYNTAXERR, "overlarge sharp variable number")
196
MSG_DEF(JSMSG_SHARPVAR_TOO_BIG,       143, 0, JSEXN_SYNTAXERR, "overlarge sharp variable number")
197
MSG_DEF(JSMSG_ILLEGAL_CHARACTER,      144, 0, JSEXN_SYNTAXERR, "illegal character")
197
MSG_DEF(JSMSG_ILLEGAL_CHARACTER,      144, 0, JSEXN_SYNTAXERR, "illegal character")
198
MSG_DEF(JSMSG_BAD_OCTAL,              145, 1, JSEXN_SYNTAXERR, "{0} is not a legal ECMA-262 octal constant")
198
MSG_DEF(JSMSG_BAD_OCTAL,              145, 1, JSEXN_SYNTAXERR, "{0} is not a legal ECMA-262 octal constant")
199
MSG_DEF(JSMSG_UNUSED146,              146, 0, JSEXN_NONE, "")
199
MSG_DEF(JSMSG_STRING_TOO_LONG_FOR_ARRAY, 146, 0, JSEXN_RANGEERR, "string too long to fit in array")
200
MSG_DEF(JSMSG_UNCAUGHT_EXCEPTION,     147, 1, JSEXN_INTERNALERR, "uncaught exception: {0}")
200
MSG_DEF(JSMSG_UNCAUGHT_EXCEPTION,     147, 1, JSEXN_INTERNALERR, "uncaught exception: {0}")
201
MSG_DEF(JSMSG_INVALID_BACKREF,        148, 0, JSEXN_SYNTAXERR, "non-octal digit in an escape sequence that doesn't match a back-reference")
201
MSG_DEF(JSMSG_INVALID_BACKREF,        148, 0, JSEXN_SYNTAXERR, "non-octal digit in an escape sequence that doesn't match a back-reference")
202
MSG_DEF(JSMSG_BAD_BACKREF,            149, 0, JSEXN_SYNTAXERR, "back-reference exceeds number of capturing parentheses")
202
MSG_DEF(JSMSG_BAD_BACKREF,            149, 0, JSEXN_SYNTAXERR, "back-reference exceeds number of capturing parentheses")
203
MSG_DEF(JSMSG_PRECISION_RANGE,        150, 1, JSEXN_RANGEERR, "precision {0} out of range")
203
MSG_DEF(JSMSG_PRECISION_RANGE,        150, 1, JSEXN_RANGEERR, "precision {0} out of range")
204
MSG_DEF(JSMSG_BAD_GETTER_OR_SETTER,   151, 1, JSEXN_TYPEERR, "invalid {0} usage")
204
MSG_DEF(JSMSG_BAD_GETTER_OR_SETTER,   151, 1, JSEXN_TYPEERR, "invalid {0} usage")
205
MSG_DEF(JSMSG_BAD_ARRAY_LENGTH,       152, 0, JSEXN_RANGEERR, "invalid array length")
205
MSG_DEF(JSMSG_BAD_ARRAY_LENGTH,       152, 0, JSEXN_RANGEERR, "invalid array length")
206
MSG_DEF(JSMSG_CANT_DESCRIBE_PROPS,    153, 1, JSEXN_TYPEERR, "can't describe non-native properties of class {0}")
206
MSG_DEF(JSMSG_CANT_DESCRIBE_PROPS,    153, 1, JSEXN_TYPEERR, "can't describe non-native properties of class {0}")
207
MSG_DEF(JSMSG_BAD_APPLY_ARGS,         154, 1, JSEXN_TYPEERR, "second argument to Function.prototype.{0} must be an array")
207
MSG_DEF(JSMSG_BAD_APPLY_ARGS,         154, 1, JSEXN_TYPEERR, "second argument to Function.prototype.{0} must be an array")
(-)a/js/src/jsstr.cpp (+42 lines)
Line     Link Here 
 Lines 557-572   ValueToIntegerRange(JSContext *cx, const Link Here 
557
            *out = INT32_MIN;
557
            *out = INT32_MIN;
558
        else
558
        else
559
            *out = int32_t(d);
559
            *out = int32_t(d);
560
    }
560
    }
561
561
562
    return true;
562
    return true;
563
}
563
}
564
564
565
/* ES6 20121009 draft 15.5.4.25. */
566
static JSBool
567
str_toArray(JSContext *cx, unsigned argc, Value *vp)
568
{
569
    CallArgs args = CallArgsFromVp(argc, vp);
570
571
    // Steps 1-2
572
    Rooted<JSString *> str(cx, ThisToStringForStringProto(cx, args));
573
    if (!str)
574
        return false;
575
576
    if (str->length() > UINT32_MAX) {
577
        JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_STRING_TOO_LONG_FOR_ARRAY);
578
        return false;
579
    }
580
581
    // Step 3
582
    RootedObject result(cx, NewDenseAllocatedArray(cx, str->length(), NULL));
583
    if (!result)
584
        return false;
585
    result->setDenseArrayInitializedLength(str->length());
586
    js::types::AddTypePropertyId(cx, result, JSID_VOID, Type::StringType());
587
588
    // Steps 4, 5, 6
589
    Rooted<JSLinearString *> c(cx);
590
    for (size_t n = 0; n < str->length(); n++) {
591
        // Step 6a
592
        c = cx->runtime->staticStrings.getUnitStringForElement(cx, str, n);
593
        if (!c)
594
            return false;
595
596
        // Step 6b
597
        result->initDenseArrayElement(n, StringValue(c));
598
    }
599
600
    // Step 7
601
    args.rval().setObject(*result.get());
602
603
    return true;
604
}
605
565
static JSBool
606
static JSBool
566
str_substring(JSContext *cx, unsigned argc, Value *vp)
607
str_substring(JSContext *cx, unsigned argc, Value *vp)
567
{
608
{
568
    CallArgs args = CallArgsFromVp(argc, vp);
609
    CallArgs args = CallArgsFromVp(argc, vp);
569
610
570
    RootedString str(cx, ThisToStringForStringProto(cx, args));
611
    RootedString str(cx, ThisToStringForStringProto(cx, args));
571
    if (!str)
612
    if (!str)
572
        return false;
613
        return false;
 Lines 3119-3134   static JSFunctionSpec string_methods[] = Link Here 
3119
    JS_FN("localeCompare",     str_localeCompare,     1,JSFUN_GENERIC_NATIVE),
3160
    JS_FN("localeCompare",     str_localeCompare,     1,JSFUN_GENERIC_NATIVE),
3120
3161
3121
    /* Perl-ish methods (search is actually Python-esque). */
3162
    /* Perl-ish methods (search is actually Python-esque). */
3122
    JS_FN("match",             str_match,             1,JSFUN_GENERIC_NATIVE),
3163
    JS_FN("match",             str_match,             1,JSFUN_GENERIC_NATIVE),
3123
    JS_FN("search",            str_search,            1,JSFUN_GENERIC_NATIVE),
3164
    JS_FN("search",            str_search,            1,JSFUN_GENERIC_NATIVE),
3124
    JS_FN("replace",           str_replace,           2,JSFUN_GENERIC_NATIVE),
3165
    JS_FN("replace",           str_replace,           2,JSFUN_GENERIC_NATIVE),
3125
    JS_FN("split",             str_split,             2,JSFUN_GENERIC_NATIVE),
3166
    JS_FN("split",             str_split,             2,JSFUN_GENERIC_NATIVE),
3126
    JS_FN("substr",            str_substr,            2,JSFUN_GENERIC_NATIVE),
3167
    JS_FN("substr",            str_substr,            2,JSFUN_GENERIC_NATIVE),
3168
    JS_FN("toArray",           str_toArray,           1,JSFUN_GENERIC_NATIVE),
3127
3169
3128
    /* Python-esque sequence methods. */
3170
    /* Python-esque sequence methods. */
3129
    JS_FN("concat",            str_concat,            1,JSFUN_GENERIC_NATIVE),
3171
    JS_FN("concat",            str_concat,            1,JSFUN_GENERIC_NATIVE),
3130
    JS_FN("slice",             str_slice,             2,JSFUN_GENERIC_NATIVE),
3172
    JS_FN("slice",             str_slice,             2,JSFUN_GENERIC_NATIVE),
3131
3173
3132
    /* HTML string methods. */
3174
    /* HTML string methods. */
3133
#if JS_HAS_STR_HTML_HELPERS
3175
#if JS_HAS_STR_HTML_HELPERS
3134
    JS_FN("bold",              str_bold,              0,0),
3176
    JS_FN("bold",              str_bold,              0,0),

Return to bug 799499