| OLD | NEW | 
 | (Empty) | 
|   1 // Copyright 2014 the V8 project authors. All rights reserved. |  | 
|   2 // Use of this source code is governed by a BSD-style license that can be |  | 
|   3 // found in the LICENSE file. |  | 
|   4  |  | 
|   5 "use strict"; |  | 
|   6  |  | 
|   7 var callSiteCache = new $Map; |  | 
|   8  |  | 
|   9 function SameCallSiteElements(rawStrings, other) { |  | 
|  10   var length = rawStrings.length; |  | 
|  11   var other = other.raw; |  | 
|  12  |  | 
|  13   if (length !== other.length) return false; |  | 
|  14  |  | 
|  15   for (var i = 0; i < length; ++i) { |  | 
|  16     if (rawStrings[i] !== other[i]) return false; |  | 
|  17   } |  | 
|  18  |  | 
|  19   return true; |  | 
|  20 } |  | 
|  21  |  | 
|  22  |  | 
|  23 function GetCachedCallSite(siteObj, hash) { |  | 
|  24   var obj = %MapGet(callSiteCache, hash); |  | 
|  25  |  | 
|  26   if (IS_UNDEFINED(obj)) return; |  | 
|  27  |  | 
|  28   var length = obj.length; |  | 
|  29   for (var i = 0; i < length; ++i) { |  | 
|  30     if (SameCallSiteElements(siteObj, obj[i])) return obj[i]; |  | 
|  31   } |  | 
|  32 } |  | 
|  33  |  | 
|  34  |  | 
|  35 function SetCachedCallSite(siteObj, hash) { |  | 
|  36   var obj = %MapGet(callSiteCache, hash); |  | 
|  37   var array; |  | 
|  38  |  | 
|  39   if (IS_UNDEFINED(obj)) { |  | 
|  40     array = new InternalArray(1); |  | 
|  41     array[0] = siteObj; |  | 
|  42     %MapSet(callSiteCache, hash, array); |  | 
|  43   } else { |  | 
|  44     obj.push(siteObj); |  | 
|  45   } |  | 
|  46  |  | 
|  47   return siteObj; |  | 
|  48 } |  | 
|  49  |  | 
|  50  |  | 
|  51 function GetTemplateCallSite(siteObj, rawStrings, hash) { |  | 
|  52   var cached = GetCachedCallSite(rawStrings, hash); |  | 
|  53  |  | 
|  54   if (!IS_UNDEFINED(cached)) return cached; |  | 
|  55  |  | 
|  56   %AddNamedProperty(siteObj, "raw", %ObjectFreeze(rawStrings), |  | 
|  57       READ_ONLY | DONT_ENUM | DONT_DELETE); |  | 
|  58  |  | 
|  59   return SetCachedCallSite(%ObjectFreeze(siteObj), hash); |  | 
|  60 } |  | 
|  61  |  | 
|  62  |  | 
|  63 // ES6 Draft 10-14-2014, section 21.1.2.4 |  | 
|  64 function StringRaw(callSite) { |  | 
|  65   // TODO(caitp): Use rest parameters when implemented |  | 
|  66   var numberOfSubstitutions = %_ArgumentsLength(); |  | 
|  67   var cooked = ToObject(callSite); |  | 
|  68   var raw = ToObject(cooked.raw); |  | 
|  69   var literalSegments = ToLength(raw.length); |  | 
|  70   if (literalSegments <= 0) return ""; |  | 
|  71  |  | 
|  72   var result = ToString(raw[0]); |  | 
|  73  |  | 
|  74   for (var i = 1; i < literalSegments; ++i) { |  | 
|  75     if (i < numberOfSubstitutions) { |  | 
|  76       result += ToString(%_Arguments(i)); |  | 
|  77     } |  | 
|  78     result += ToString(raw[i]); |  | 
|  79   } |  | 
|  80  |  | 
|  81   return result; |  | 
|  82 } |  | 
|  83  |  | 
|  84  |  | 
|  85 function ExtendStringForTemplates() { |  | 
|  86   %CheckIsBootstrapping(); |  | 
|  87  |  | 
|  88   // Set up the non-enumerable functions on the String object. |  | 
|  89   InstallFunctions($String, DONT_ENUM, $Array( |  | 
|  90     "raw", StringRaw |  | 
|  91   )); |  | 
|  92 } |  | 
|  93  |  | 
|  94 ExtendStringForTemplates(); |  | 
| OLD | NEW |