bool CallPolicy::adjustInputs(MInstruction *ins) { MCall *call = ins->toCall(); MDefinition *func = call->getFunction(); if (func->type() == MIRType_Object) return true; // If the function is impossible to call, // bail out by causing a subsequent unbox to fail. if (func->type() != MIRType_Value) func = boxAt(call, func); MInstruction *unbox = MUnbox::New(func, MIRType_Object, MUnbox::Fallible); call->block()->insertBefore(call, unbox); call->replaceFunction(unbox); return true; }
bool CallPolicy::adjustInputs(TempAllocator &alloc, MInstruction *ins) { MCall *call = ins->toCall(); MDefinition *func = call->getFunction(); if (func->type() != MIRType_Object) { MInstruction *unbox = MUnbox::New(alloc, func, MIRType_Object, MUnbox::Fallible); call->block()->insertBefore(call, unbox); call->replaceFunction(unbox); if (!unbox->typePolicy()->adjustInputs(alloc, unbox)) return false; } for (uint32_t i = 0; i < call->numStackArgs(); i++) EnsureOperandNotFloat32(alloc, call, MCall::IndexOfStackArg(i)); return true; }
bool CallPolicy::adjustInputs(TempAllocator &alloc, MInstruction *ins) { MCall *call = ins->toCall(); MDefinition *func = call->getFunction(); if (func->type() != MIRType_Object) { // If the function is impossible to call, // bail out by causing a subsequent unbox to fail. if (func->type() != MIRType_Value) func = boxAt(alloc, call, func); MInstruction *unbox = MUnbox::New(alloc, func, MIRType_Object, MUnbox::Fallible); call->block()->insertBefore(call, unbox); call->replaceFunction(unbox); } for (uint32_t i = 0; i < call->numStackArgs(); i++) EnsureOperandNotFloat32(alloc, call, MCall::IndexOfStackArg(i)); return true; }