void select(NoImm) { if(controlStack.back().isReachable) { validateStackAccess(3); ValueType operandType = stack[stack.size() - 3]; popAndValidateOperands(operandType,ValueType::i32); } }
void call_indirect(CallIndirectImm imm) { VALIDATE_INDEX(imm.typeIndex,module.types.size()); VALIDATE_UNLESS("call_indirect in module without default function table: ",moduleContext.numTables==0); const FunctionType* calleeType = module.types[imm.typeIndex]; popAndValidateOperand(ValueType::i32); popAndValidateOperands(calleeType->parameters.data(),calleeType->parameters.size()); push(calleeType->ret); }
void call_indirect(CallIndirectImm imm) { VALIDATE_INDEX(imm.type.index,module.types.size()); VALIDATE_UNLESS("call_indirect is only valid if there is a default function table: ",module.tables.size()==0); const FunctionType* calleeType = module.types[imm.type.index]; popAndValidateOperand("call_indirect function index",ValueType::i32); popAndValidateOperands("call_indirect arguments",calleeType->parameters.data(),(Uptr)calleeType->parameters.size()); pushOperand(calleeType->ret); }
void popAndValidateResultType(ResultType expectedType) { if(expectedType != ResultType::none) { popAndValidateOperands(asValueType(expectedType)); } }
void popAndValidateOperands(OperandTypes... operands) { ValueType operandTypes[] = {operands...}; popAndValidateOperands(operandTypes); }
void popAndValidateOperands(const ValueType (&expectedTypes)[num]) { popAndValidateOperands(expectedTypes,num); }
void call(CallImm imm) { const FunctionType* calleeType = moduleContext.validateFunctionIndex(imm.functionIndex); popAndValidateOperands(calleeType->parameters.data(),calleeType->parameters.size()); push(calleeType->ret); }
void popAndValidateOperands(const char* context,OperandTypes... operands) { ValueType operandTypes[] = {operands...}; popAndValidateOperands(context,operandTypes); }
void popAndValidateOperands(const char* context,const ValueType (&expectedTypes)[num]) { popAndValidateOperands(context,expectedTypes,num); }
void call(CallImm imm) { const FunctionType* calleeType = validateFunctionIndex(module,imm.functionIndex); popAndValidateOperands("call arguments",calleeType->parameters.data(),(Uptr)calleeType->parameters.size()); pushOperand(calleeType->ret); }