| Index: src/string.js
|
| diff --git a/src/string.js b/src/string.js
|
| index 067578c1414d0e422e17b19354f9ae1497b69304..9547900a2b782b0401d4ebcac977feb1eaec27b0 100644
|
| --- a/src/string.js
|
| +++ b/src/string.js
|
| @@ -719,16 +719,26 @@ function StringTrimRight() {
|
| return %StringTrim(TO_STRING_INLINE(this), false, true);
|
| }
|
|
|
| +var static_charcode_array = new $Array(4);
|
| +
|
| // ECMA-262, section 15.5.3.2
|
| function StringFromCharCode(code) {
|
| var n = %_ArgumentsLength();
|
| - if (n == 1) return %_CharFromCode(ToNumber(code) & 0xffff)
|
| + if (n == 1) {
|
| + if (!%_IsSmi(code)) code = ToNumber(code);
|
| + return %_CharFromCode(code & 0xffff);
|
| + }
|
|
|
| // NOTE: This is not super-efficient, but it is necessary because we
|
| // want to avoid converting to numbers from within the virtual
|
| // machine. Maybe we can find another way of doing this?
|
| - var codes = new $Array(n);
|
| - for (var i = 0; i < n; i++) codes[i] = ToNumber(%_Arguments(i));
|
| + var codes = static_charcode_array;
|
| + for (var i = 0; i < n; i++) {
|
| + var code = %_Arguments(i);
|
| + if (!%_IsSmi(code)) code = ToNumber(code);
|
| + codes[i] = code;
|
| + }
|
| + codes.length = n;
|
| return %StringFromCharCodeArray(codes);
|
| }
|
|
|
|
|