зеркало из https://github.com/mozilla/gecko-dev.git
Bug 822340. Disable the Ion optimization for DOM method calls. r=jandem, a=bbajaj
This commit is contained in:
Родитель
5aad7419bd
Коммит
fefb8bff6a
|
@ -0,0 +1,11 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<script>
|
||||||
|
var xhr = new XMLHttpRequest;
|
||||||
|
function f() {
|
||||||
|
var x = xhr.getResponseHeader;
|
||||||
|
x("abc");
|
||||||
|
}
|
||||||
|
for (var i = 0; i < 20000; ++i) {
|
||||||
|
try { f(); } catch (e) {}
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<script>
|
||||||
|
var l = document.getElementsByTagName("*");
|
||||||
|
var count = 20000;
|
||||||
|
for (var i = 0; i < count; ++i) {
|
||||||
|
l.item(0);
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -1 +1,3 @@
|
||||||
asserts-if(cocoaWidget,0-1) load 769464.html
|
asserts-if(cocoaWidget,0-1) load 769464.html
|
||||||
|
load 822340-1.html
|
||||||
|
load 822340-2.html
|
||||||
|
|
|
@ -5567,66 +5567,6 @@ TestShouldDOMCall(JSContext *cx, types::TypeSet *inTypes, HandleFunction func,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
TestAreKnownDOMTypes(JSContext *cx, types::TypeSet *inTypes)
|
|
||||||
{
|
|
||||||
if (inTypes->unknown())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// First iterate to make sure they all are DOM objects, then freeze all of
|
|
||||||
// them as such if they are.
|
|
||||||
for (unsigned i = 0; i < inTypes->getObjectCount(); i++) {
|
|
||||||
types::TypeObject *curType = inTypes->getTypeObject(i);
|
|
||||||
|
|
||||||
if (!curType) {
|
|
||||||
JSObject *curObj = inTypes->getSingleObject(i);
|
|
||||||
|
|
||||||
// Skip holes in TypeSets.
|
|
||||||
if (!curObj)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
curType = curObj->getType(cx);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (curType->unknownProperties())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Unlike TypeSet::HasObjectFlags, TypeObject::hasAnyFlags doesn't add a
|
|
||||||
// freeze.
|
|
||||||
if (curType->hasAnyFlags(types::OBJECT_FLAG_NON_DOM))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we didn't check anything, no reason to say yes.
|
|
||||||
if (inTypes->getObjectCount() > 0)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
FreezeDOMTypes(JSContext *cx, types::StackTypeSet *inTypes)
|
|
||||||
{
|
|
||||||
for (unsigned i = 0; i < inTypes->getObjectCount(); i++) {
|
|
||||||
types::TypeObject *curType = inTypes->getTypeObject(i);
|
|
||||||
|
|
||||||
if (!curType) {
|
|
||||||
JSObject *curObj = inTypes->getSingleObject(i);
|
|
||||||
|
|
||||||
// Skip holes in TypeSets.
|
|
||||||
if (!curObj)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
curType = curObj->getType(cx);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add freeze by asking the question.
|
|
||||||
DebugOnly<bool> wasntDOM =
|
|
||||||
types::HeapTypeSet::HasObjectFlags(cx, curType, types::OBJECT_FLAG_NON_DOM);
|
|
||||||
JS_ASSERT(!wasntDOM);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
IonBuilder::annotateGetPropertyCache(JSContext *cx, MDefinition *obj, MGetPropertyCache *getPropCache,
|
IonBuilder::annotateGetPropertyCache(JSContext *cx, MDefinition *obj, MGetPropertyCache *getPropCache,
|
||||||
types::StackTypeSet *objTypes, types::StackTypeSet *pushedTypes)
|
types::StackTypeSet *objTypes, types::StackTypeSet *pushedTypes)
|
||||||
|
@ -5835,15 +5775,6 @@ IonBuilder::jsop_getprop(HandlePropertyName name)
|
||||||
MConstant *known = MConstant::New(ObjectValue(*singleton));
|
MConstant *known = MConstant::New(ObjectValue(*singleton));
|
||||||
current->add(known);
|
current->add(known);
|
||||||
current->push(known);
|
current->push(known);
|
||||||
if (singleton->isFunction()) {
|
|
||||||
RootedFunction singletonFunc(cx, singleton->toFunction());
|
|
||||||
if (TestAreKnownDOMTypes(cx, unaryTypes.inTypes) &&
|
|
||||||
TestShouldDOMCall(cx, unaryTypes.inTypes, singletonFunc, JSJitInfo::Method))
|
|
||||||
{
|
|
||||||
FreezeDOMTypes(cx, unaryTypes.inTypes);
|
|
||||||
known->setDOMFunction();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче