in erts/emulator/beam/erl_db_util.c [5445:5824]
void db_match_dis(Binary *bp)
{
MatchProg *prog = Binary2MatchProg(bp);
UWord *t = prog->text;
Uint n;
Eterm p;
int first;
ErlHeapFragment *tmp;
while (t < prog->prog_end) {
switch (*t) {
case matchTryMeElse:
++t;
n = *t;
++t;
erts_printf("TryMeElse\t%beu\n", n);
break;
case matchArray:
++t;
n = *t;
++t;
erts_printf("Array\t%beu\n", n);
break;
case matchArrayBind:
++t;
n = *t;
++t;
erts_printf("ArrayBind\t%beu\n", n);
break;
case matchTuple:
++t;
n = *t;
++t;
erts_printf("Tuple\t%beu\n", n);
break;
case matchMap:
++t;
n = *t;
++t;
erts_printf("Map\t%beu\n", n);
break;
case matchKey:
++t;
p = (Eterm) *t;
++t;
erts_printf("Key\t%p (%T)\n", t, p);
break;
case matchPushT:
++t;
n = *t;
++t;
erts_printf("PushT\t%beu\n", n);
break;
case matchPushL:
++t;
erts_printf("PushL\n");
break;
case matchPushM:
++t;
n = *t;
++t;
erts_printf("PushM\t%beu\n", n);
break;
case matchPop:
++t;
erts_printf("Pop\n");
break;
case matchSwap:
++t;
erts_printf("Swap\n");
break;
case matchBind:
++t;
n = *t;
++t;
erts_printf("Bind\t%beu\n", n);
break;
case matchCmp:
++t;
n = *t;
++t;
erts_printf("Cmp\t%beu\n", n);
break;
case matchEqBin:
++t;
p = (Eterm) *t;
++t;
erts_printf("EqBin\t%p (%T)\n", t, p);
break;
case matchEqRef:
++t;
{
Uint32 *num;
int ri;
if (is_ordinary_ref_thing(t)) {
ErtsORefThing *rt = (ErtsORefThing *) t;
num = rt->num;
t += TermWords(ERTS_REF_THING_SIZE);
}
else {
ErtsMRefThing *mrt = (ErtsMRefThing *) t;
ASSERT(is_magic_ref_thing(t));
num = mrt->mb->refn;
t += TermWords(ERTS_MAGIC_REF_THING_SIZE);
}
erts_printf("EqRef\t(%d) {", (int) ERTS_REF_NUMBERS);
first = 1;
for (ri = 0; ri < ERTS_REF_NUMBERS; ++ri) {
if (first)
first = 0;
else
erts_printf(", ");
#if defined(ARCH_64)
erts_printf("0x%016bex", num[ri]);
#else
erts_printf("0x%08bex", num[ri]);
#endif
}
}
erts_printf("}\n");
break;
case matchEqBig:
++t;
n = thing_arityval(*t);
{
Eterm *et = (Eterm *) t;
t += TermWords(n+1);
erts_printf("EqBig\t(%d) {", (int) n);
first = 1;
++n;
while (n--) {
if (first)
first = 0;
else
erts_printf(", ");
#if defined(ARCH_64)
erts_printf("0x%016bex", *et);
#else
erts_printf("0x%08bex", *et);
#endif
++et;
}
}
erts_printf("}\n");
break;
case matchEqFloat:
++t;
{
double num;
sys_memcpy(&num,t,sizeof(double));
t += TermWords(2);
erts_printf("EqFloat\t%f\n", num);
}
break;
case matchEq:
++t;
p = (Eterm) *t;
++t;
erts_printf("Eq \t%T\n", p);
break;
case matchList:
++t;
erts_printf("List\n");
break;
case matchHalt:
++t;
erts_printf("Halt\n");
break;
case matchSkip:
++t;
erts_printf("Skip\n");
break;
case matchPushC:
++t;
p = (Eterm) *t;
++t;
erts_printf("PushC\t%T\n", p);
break;
case matchConsA:
++t;
erts_printf("ConsA\n");
break;
case matchConsB:
++t;
erts_printf("ConsB\n");
break;
case matchMkTuple:
++t;
n = *t;
++t;
erts_printf("MkTuple\t%beu\n", n);
break;
case matchMkFlatMap:
++t;
n = *t;
++t;
erts_printf("MkFlatMap\t%beu\n", n);
break;
case matchMkHashMap:
++t;
n = *t;
++t;
erts_printf("MkHashMap\t%beu\n", n);
break;
case matchOr:
++t;
n = *t;
++t;
erts_printf("Or\t%beu\n", n);
break;
case matchAnd:
++t;
n = *t;
++t;
erts_printf("And\t%beu\n", n);
break;
case matchOrElse:
++t;
n = *t;
++t;
erts_printf("OrElse\t%beu\n", n);
break;
case matchAndAlso:
++t;
n = *t;
++t;
erts_printf("AndAlso\t%beu\n", n);
break;
case matchCall0:
++t;
p = dmc_lookup_bif_reversed((void *) *t);
++t;
erts_printf("Call0\t%T\n", p);
break;
case matchCall1:
++t;
p = dmc_lookup_bif_reversed((void *) *t);
++t;
erts_printf("Call1\t%T\n", p);
break;
case matchCall2:
++t;
p = dmc_lookup_bif_reversed((void *) *t);
++t;
erts_printf("Call2\t%T\n", p);
break;
case matchCall3:
++t;
p = dmc_lookup_bif_reversed((void *) *t);
++t;
erts_printf("Call3\t%T\n", p);
break;
case matchPushV:
++t;
n = (Uint) *t;
++t;
erts_printf("PushV\t%beu\n", n);
break;
case matchPushVResult:
n = (Uint) *++t;
++t;
erts_printf("PushVResult\t%beu\n", n);
break;
case matchTrue:
++t;
erts_printf("True\n");
break;
case matchPushExpr:
++t;
erts_printf("PushExpr\n");
break;
case matchPushArrayAsList:
++t;
erts_printf("PushArrayAsList\n");
break;
case matchPushArrayAsListU:
++t;
erts_printf("PushArrayAsListU\n");
break;
case matchSelf:
++t;
erts_printf("Self\n");
break;
case matchWaste:
++t;
erts_printf("Waste\n");
break;
case matchReturn:
++t;
erts_printf("Return\n");
break;
case matchProcessDump:
++t;
erts_printf("ProcessDump\n");
break;
case matchDisplay:
++t;
erts_printf("Display\n");
break;
case matchIsSeqTrace:
++t;
erts_printf("IsSeqTrace\n");
break;
case matchSetSeqToken:
++t;
erts_printf("SetSeqToken\n");
break;
case matchSetSeqTokenFake:
++t;
erts_printf("SetSeqTokenFake\n");
break;
case matchGetSeqToken:
++t;
erts_printf("GetSeqToken\n");
break;
case matchSetReturnTrace:
++t;
erts_printf("SetReturnTrace\n");
break;
case matchSetExceptionTrace:
++t;
erts_printf("SetReturnTrace\n");
break;
case matchCatch:
++t;
erts_printf("Catch\n");
break;
case matchEnableTrace:
++t;
erts_printf("EnableTrace\n");
break;
case matchDisableTrace:
++t;
erts_printf("DisableTrace\n");
break;
case matchEnableTrace2:
++t;
erts_printf("EnableTrace2\n");
break;
case matchDisableTrace2:
++t;
erts_printf("DisableTrace2\n");
break;
case matchTrace2:
++t;
erts_printf("Trace2\n");
break;
case matchTrace3:
++t;
erts_printf("Trace3\n");
break;
case matchCaller:
++t;
erts_printf("Caller\n");
break;
default:
erts_printf("??? (0x%bpx)\n", *t);
++t;
break;
}
}
erts_printf("\n\nterm_save: {");
first = 1;
for (tmp = prog->term_save; tmp; tmp = tmp->next) {
if (first)
first = 0;
else
erts_printf(", ");
erts_printf("%p", tmp);
}
erts_printf("}\n");
erts_printf("num_bindings: %d\n", prog->num_bindings);
erts_printf("heap_size: %beu\n", prog->heap_size);
erts_printf("stack_offset: %beu\n", prog->stack_offset);
erts_printf("text: %p\n", prog->text);
erts_printf("stack_size: %d (words)\n", prog->heap_size-prog->stack_offset);
}