MVM_STATIC_INLINE const MVMOpInfo * get_info(Validator *val, MVMuint16 opcode) { const MVMOpInfo *info; if (opcode < MVM_OP_EXT_BASE) { info = MVM_op_get_op(opcode); if (!info) fail(val, MSG(val, "invalid opcode %u"), opcode); } else { MVMuint16 index = opcode - MVM_OP_EXT_BASE; MVMExtOpRecord *record; if (index >= val->cu->body.num_extops) fail(val, MSG(val, "invalid extension opcode %u - should be less than %u"), opcode, MVM_OP_EXT_BASE + val->cu->body.num_extops); record = &val->cu->body.extops[index]; info = MVM_ext_resolve_extop_record(val->tc, record); if (!info) fail(val, MSG(val, "extension op '%s' not registered"), MVM_string_utf8_encode_C_string(val->tc, record->name)); } return info; }
/* Looks up op info; doesn't sanity check, since we should be working on code * that already pass validation. */ static const MVMOpInfo * get_op_info(MVMThreadContext *tc, MVMCompUnit *cu, MVMuint16 opcode) { if (opcode < MVM_OP_EXT_BASE) { return MVM_op_get_op(opcode); } else { MVMuint16 index = opcode - MVM_OP_EXT_BASE; MVMExtOpRecord *record = &cu->body.extops[index]; return MVM_ext_resolve_extop_record(tc, record); } }