Bug 825599 - Specialize type of switch's conditions. r=h4writer

This commit is contained in:
Nicolas B. Pierron 2013-01-03 09:57:41 -08:00
Родитель 1e2c5f46c8
Коммит 4345e13559
3 изменённых файлов: 30 добавлений и 1 удалений

Просмотреть файл

@ -2376,6 +2376,8 @@ IonBuilder::processCondSwitchCase(CFGState &state)
MDefinition *caseOperand = current->pop();
MDefinition *switchOperand = current->peek(-1);
MCompare *cmpResult = MCompare::New(switchOperand, caseOperand, JSOP_STRICTEQ);
TypeOracle::BinaryTypes b = oracle->binaryTypes(script(), pc);
cmpResult->infer(b, cx);
JS_ASSERT(!cmpResult->isEffectful());
current->add(cmpResult);
current->end(MTest::New(cmpResult, bodyBlock, caseBlock));

Просмотреть файл

@ -133,7 +133,7 @@ IonSpewer::beginFunction(MIRGraph *graph, HandleScript function)
return;
if (!FilterContainsLocation(function->filename, function->lineno)) {
JS_ASSERT(!this->function);
JS_ASSERT(!this->graph);
// filter out logs during the compilation.
filteredOutCompilations++;
return;

Просмотреть файл

@ -0,0 +1,27 @@
var typedSwitch0 = function (a) {
switch (a) {
case null:
return 0;
case 1.1:
return 1;
case "2":
return 2;
case 3:
return 3;
}
return 4;
};
// reuse the same function for testing with different inputs & type.
var typedSwitch1 = eval(typedSwitch0.toSource());
var typedSwitch2 = eval(typedSwitch0.toSource());
var typedSwitch3 = eval(typedSwitch0.toSource());
var typedSwitch4 = eval(typedSwitch0.toSource());
for (var i = 0; i < 100; i++) {
assertEq(typedSwitch0(null), 0);
assertEq(typedSwitch1(1.1), 1);
assertEq(typedSwitch2("2"), 2);
assertEq(typedSwitch3(3), 3);
assertEq(typedSwitch4(undefined), 4);
}