|  | // 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 === "") { | 
|  | // If filler is the empty String, return S. | 
|  | return ""; | 
|  | } | 
|  | } | 
|  |  | 
|  | 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(this); | 
|  |  | 
|  | return StringPad(thisString, maxLength, fillString) + thisString; | 
|  | } | 
|  | %FunctionSetLength(StringPadStart, 1); | 
|  |  | 
|  | function StringPadEnd(maxLength, fillString) { | 
|  | CHECK_OBJECT_COERCIBLE(this, "String.prototype.padEnd") | 
|  | var thisString = TO_STRING(this); | 
|  |  | 
|  | return thisString + StringPad(thisString, maxLength, fillString); | 
|  | } | 
|  | %FunctionSetLength(StringPadEnd, 1); | 
|  |  | 
|  | utils.InstallFunctions(GlobalString.prototype, DONT_ENUM, [ | 
|  | "padStart", StringPadStart, | 
|  | "padEnd", StringPadEnd | 
|  | ]); | 
|  |  | 
|  | }); |