Chromium Code Reviews| Index: src/js/harmony-string-padding.js |
| diff --git a/src/js/harmony-string-padding.js b/src/js/harmony-string-padding.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..eb747c45f91f044013ee2618dd135c870ebc816d |
| --- /dev/null |
| +++ b/src/js/harmony-string-padding.js |
| @@ -0,0 +1,77 @@ |
| +// Copyright 2016 the V8 project authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +(function(global, utils) { |
| + |
| +%CheckIsBootstrapping(); |
| + |
| +// ------------------------------------------------------------------- |
| +// Imports |
| + |
| +var GlobalString = global.String; |
| +var MakeTypeError; |
| + |
| +utils.Import(function(from) { |
| + MakeTypeError = from.MakeTypeError; |
| +}); |
| + |
| +// ------------------------------------------------------------------- |
| +// http://tc39.github.io/proposal-string-pad-start-end/ |
| + |
| +function StringPad(thisString, maxLength, fillString) { |
| + maxLength = TO_LENGTH(maxLength); |
| + var stringLength = thisString.length; |
| + |
| + if (maxLength <= stringLength) return ""; |
| + |
| + if (IS_UNDEFINED(fillString)) { |
| + fillString = " "; |
| + } else { |
| + fillString = TO_STRING(fillString); |
| + if (fillString === "") { |
| + fillString = " "; |
| + } |
| + } |
| + |
| + var fillLength = maxLength - stringLength; |
| + var repetitions = (fillLength / fillString.length) | 0; |
| + var remainingChars = (fillLength - fillString.length * repetitions) | 0; |
| + |
| + var filler = ""; |
| + while (true) { |
| + if (repetitions & 1) filler += fillString; |
| + repetitions >>= 1; |
| + if (repetitions === 0) break; |
| + fillString += fillString; |
| + } |
| + |
| + if (remainingChars) { |
| + filler += %_SubString(fillString, 0, remainingChars); |
| + } |
| + |
| + return filler; |
| +} |
| + |
| +function StringPadStart(maxLength, fillString) { |
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.padStart") |
| + var thisString = TO_STRING(TO_OBJECT(this)); |
|
Dan Ehrenberg
2016/03/24 15:25:12
I don't see the TO_OBJECT call in the spec, just T
|
| + |
| + return StringPad(thisString, maxLength, fillString) + thisString; |
| +} |
| +%FunctionSetLength(StringPadStart, 1); |
| + |
| +function StringPadEnd(maxLength, fillString) { |
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.padEnd") |
| + var thisString = TO_STRING(TO_OBJECT(this)); |
| + |
| + return thisString + StringPad(thisString, maxLength, fillString); |
| +} |
| +%FunctionSetLength(StringPadEnd, 1); |
| + |
| +utils.InstallFunctions(GlobalString.prototype, DONT_ENUM, [ |
| + "padStart", StringPadStart, |
| + "padEnd", StringPadEnd |
| +]); |
| + |
| +}); |