2014-11-14 18:53:41 +00:00
|
|
|
// Copyright 2014 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.
|
|
|
|
|
2014-12-10 14:40:54 +00:00
|
|
|
"use strict";
|
2014-11-14 18:53:41 +00:00
|
|
|
|
2014-11-20 22:37:31 +00:00
|
|
|
var callSiteCache = new $Map;
|
|
|
|
|
|
|
|
function SameCallSiteElements(rawStrings, other) {
|
|
|
|
var length = rawStrings.length;
|
|
|
|
var other = other.raw;
|
|
|
|
|
|
|
|
if (length !== other.length) return false;
|
|
|
|
|
|
|
|
for (var i = 0; i < length; ++i) {
|
|
|
|
if (rawStrings[i] !== other[i]) return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function GetCachedCallSite(siteObj, hash) {
|
2015-04-07 00:11:48 +00:00
|
|
|
var obj = %_CallFunction(callSiteCache, hash, $MapGet);
|
2014-11-20 22:37:31 +00:00
|
|
|
|
|
|
|
if (IS_UNDEFINED(obj)) return;
|
|
|
|
|
|
|
|
var length = obj.length;
|
|
|
|
for (var i = 0; i < length; ++i) {
|
|
|
|
if (SameCallSiteElements(siteObj, obj[i])) return obj[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function SetCachedCallSite(siteObj, hash) {
|
2015-04-07 00:11:48 +00:00
|
|
|
var obj = %_CallFunction(callSiteCache, hash, $MapGet);
|
2014-11-20 22:37:31 +00:00
|
|
|
var array;
|
|
|
|
|
|
|
|
if (IS_UNDEFINED(obj)) {
|
|
|
|
array = new InternalArray(1);
|
|
|
|
array[0] = siteObj;
|
2015-04-07 00:11:48 +00:00
|
|
|
%_CallFunction(callSiteCache, hash, array, $MapSet);
|
2014-11-20 22:37:31 +00:00
|
|
|
} else {
|
|
|
|
obj.push(siteObj);
|
|
|
|
}
|
|
|
|
|
|
|
|
return siteObj;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function GetTemplateCallSite(siteObj, rawStrings, hash) {
|
|
|
|
var cached = GetCachedCallSite(rawStrings, hash);
|
|
|
|
|
|
|
|
if (!IS_UNDEFINED(cached)) return cached;
|
2014-11-14 18:53:41 +00:00
|
|
|
|
|
|
|
%AddNamedProperty(siteObj, "raw", %ObjectFreeze(rawStrings),
|
|
|
|
READ_ONLY | DONT_ENUM | DONT_DELETE);
|
|
|
|
|
2014-11-20 22:37:31 +00:00
|
|
|
return SetCachedCallSite(%ObjectFreeze(siteObj), hash);
|
2014-11-14 18:53:41 +00:00
|
|
|
}
|