| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Mark Knichel @mknichel*/"use strict";let dualStringBufferCaching = true;/** * @returns {boolean} Whether the optimization to cache copies of both the * string and buffer version of source content is enabled. This is enabled by * default to improve performance but can consume more memory since values are * stored twice. */function isDualStringBufferCachingEnabled() {	return dualStringBufferCaching;}/** * Enables an optimization to save both string and buffer in memory to avoid * repeat conversions between the two formats when they are requested. This * is enabled by default. This option can improve performance but can consume * additional memory since values are stored twice. * @returns {void} */function enableDualStringBufferCaching() {	dualStringBufferCaching = true;}/** * Disables the optimization to save both string and buffer in memory. This * may increase performance but should reduce memory usage in the Webpack * compiler. * @returns {void} */function disableDualStringBufferCaching() {	dualStringBufferCaching = false;}const interningStringMap = new Map();let enableStringInterningRefCount = 0;/** * @returns {boolean} value */function isStringInterningEnabled() {	return enableStringInterningRefCount > 0;}/** * Starts a memory optimization to avoid repeat copies of the same string in * memory by caching a single reference to the string. This can reduce memory * usage if the same string is repeated many times in the compiler, such as * when Webpack layers are used with the same files. * * {@link exitStringInterningRange} should be called when string interning is * no longer necessary to free up the memory used by the interned strings. If * {@link enterStringInterningRange} has been called multiple times, then * this method may not immediately free all the memory until * {@link exitStringInterningRange} has been called to end all string * interning ranges. * @returns {void} */function enterStringInterningRange() {	enableStringInterningRefCount++;}/** * Stops the current string interning range. Once all string interning ranges * have been exited, this method will free all the memory used by the interned * strings. This method should be called once for each time that * {@link enterStringInterningRange} was called. * @returns {void} */function exitStringInterningRange() {	if (--enableStringInterningRefCount <= 0) {		interningStringMap.clear();		enableStringInterningRefCount = 0;	}}/** * Saves the string in a map to ensure that only one copy of the string exists * in memory at a given time. This is controlled by {@link enableStringInterning} * and {@link disableStringInterning}. Callers are expect to manage the memory * of the interned strings by calling {@link disableStringInterning} after the * compiler no longer needs to save the interned memory. * @param {string} str A string to be interned. * @returns {string} The original string or a reference to an existing string of the same value if it has already been interned. */function internString(str) {	if (		!isStringInterningEnabled() ||		!str ||		str.length < 128 ||		typeof str !== "string"	) {		return str;	}	let internedString = interningStringMap.get(str);	if (internedString === undefined) {		internedString = str;		interningStringMap.set(str, internedString);	}	return internedString;}module.exports = {	disableDualStringBufferCaching,	enableDualStringBufferCaching,	internString,	isDualStringBufferCachingEnabled,	enterStringInterningRange,	exitStringInterningRange,};
 |