blob: 7236d5c130a72840188c2868b193a5276ded75a6 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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// Called from a desugaring in the parser.
6
7(function(global, utils) {
8
9"use strict";
10
11%CheckIsBootstrapping();
12
13// -------------------------------------------------------------------
14// Imports
15
16var GlobalMap = global.Map;
17var InternalArray = utils.InternalArray;
18
19// -------------------------------------------------------------------
20
21var callSiteCache = new GlobalMap;
22var mapGetFn = GlobalMap.prototype.get;
23var mapSetFn = GlobalMap.prototype.set;
24
25
26function SameCallSiteElements(rawStrings, other) {
27 var length = rawStrings.length;
28 var other = other.raw;
29
30 if (length !== other.length) return false;
31
32 for (var i = 0; i < length; ++i) {
33 if (rawStrings[i] !== other[i]) return false;
34 }
35
36 return true;
37}
38
39
40function GetCachedCallSite(siteObj, hash) {
41 var obj = %_Call(mapGetFn, callSiteCache, hash);
42
43 if (IS_UNDEFINED(obj)) return;
44
45 var length = obj.length;
46 for (var i = 0; i < length; ++i) {
47 if (SameCallSiteElements(siteObj, obj[i])) return obj[i];
48 }
49}
50
51
52function SetCachedCallSite(siteObj, hash) {
53 var obj = %_Call(mapGetFn, callSiteCache, hash);
54 var array;
55
56 if (IS_UNDEFINED(obj)) {
57 array = new InternalArray(1);
58 array[0] = siteObj;
59 %_Call(mapSetFn, callSiteCache, hash, array);
60 } else {
61 obj.push(siteObj);
62 }
63
64 return siteObj;
65}
66
67
68function GetTemplateCallSite(siteObj, rawStrings, hash) {
69 var cached = GetCachedCallSite(rawStrings, hash);
70
71 if (!IS_UNDEFINED(cached)) return cached;
72
73 %AddNamedProperty(siteObj, "raw", %object_freeze(rawStrings),
74 READ_ONLY | DONT_ENUM | DONT_DELETE);
75
76 return SetCachedCallSite(%object_freeze(siteObj), hash);
77}
78
79// ----------------------------------------------------------------------------
80// Exports
81
82%InstallToContext(["get_template_call_site", GetTemplateCallSite]);
83
84})