(* :Name: Decompile` *) (* :Title: Decompiler *) (* :Author: Terry Robb *) (* tdr@vaxc.cc.monash.edu.au *) (* :Copyright: Copyright 1993 T.D.Robb *) (* :Summary: Decompiler for CompileFunction. See ?Decompile *) (* :Keywords: Decompile, Compile, Trace *) (* :Discussion: f = Compile[x, x*Exp[x]]; Decompile[f]//InputForm f = Compile[{{c, _Complex}, {lim, _Integer}}, Module[{z=I, n=0}, z=0; While[Abs[z]<2 && nGOTO[o+#1])&, Position[body,_JUMP], 2]; line = Union[Cases[body,GOTO[i_]:>{i},-1]]; u=1; body = Insert[body,LABEL,line] /. GOTO->Goto; body = body /. SWITCH[i_,{j___}] :> Switch[i,j]; body = body /. PRINT[{j___}] :> Print[j]; body = body /. LABEL :> EVAL[Label @@ line[[u++]]]; body = body /. SLOT[n_] :> EVAL[HOLD[args][[{n}]]]; Apply[ (body[[##]]=body[[##]])&, Position[body,_EVAL], 2]; func = Replace[ body /. HOLD[arg_]->arg, Hold[c___] -> FUNCTION[{args},MODULE[{rB,rI,rR,rC},CompoundExpression[c]]] ]; Return[func /. FUNCTION->Function /. MODULE->Block] ] (* Use MODULE->Block not MODULE->Module, so can trace regs: On[rR] etc *) Attributes[Decompile] = {ReadProtected,Protected} CASE[{io___}] :=(Partition[{io},2] /. {i_,offset_} :>{i,JUMP[offset]})//Flatten; ARGS[{tr___}] := Partition[{tr},2] /. { {1,r_}:>rB[r],{2,r_}:>rI[r],{3,r_}:>rR[r],{4,r_}:>rC[r] }; PRNT[{tr___}] := Partition[{tr},2] /. { {1,r_}:>rB[r],{2,r_}:>rI[r],{3,r_}:>rR[r],{4,r_}:>rC[r], {5,r_}:>Null }//PRINT; EVAL[e_] := e; {JUMP,GOTO,SLOT,SWITCH,LABEL,PRINT}; DECOMPILErules = Module[{v,n,r,r1,r2,e,tr,rs,io,offset}, Dispatch[ { {0} :> Null, {1,v_} :> Null, {2,n_,r_} :> (rB[r] = SLOT[n]), {3,n_,r_} :> (rI[r] = SLOT[n]), (* //N//Round *) {4,n_,r_} :> (rR[r] = SLOT[n]), (* //N//Re *) {5,n_,r_} :> (rC[r] = SLOT[n]), (* //N *) {6,r_} :> rB[r], (* Return not needed *) {7,r_} :> rI[r], (* Return not needed *) {8,r_} :> rR[r], (* Return not needed *) {9,r_} :> rC[r], (* Return not needed *) {10,___} :> Null, (* Return not needed *) {11,v_,r_} :> (rB[r] = v), {12,v_,r_} :> (rI[r] = v), (* //N//Round *) {13,v_,r_} :> (rR[r] = v), (* //N//Re *) {14,v_,r_} :> (rC[r] = v), (* //N *) {15,r1_,r_} :> (rB[r] = rB[r1]), {16,r1_,r_} :> (rI[r] = rI[r1]), {17,r1_,r_} :> (rR[r] = rR[r1]), {18,r1_,r_} :> (rC[r] = rC[r1]), {19,r1_,r_} :> (rI[r] = If[rB[r1],1,0]), {20,r1_,r_} :> (rR[r] = rI[r1]), {21,r1_,r2_,r_} :> (rC[r] = rR[r1] + I*rR[r2]), {22,e_,r_} :> (rB[r] = e), {23,e_,r_} :> (rI[r] = e), {24,e_,r_} :> (rR[r] = e), {25,e_,r_} :> (rC[r] = e), {26,e_,___} :> e, {27,e_,tr___,r_} :> (rB[r] = e @@ EVAL[ ARGS[{tr}] ]), {28,e_,tr___,r_} :> (rI[r] = e @@ EVAL[ ARGS[{tr}] ]), {29,e_,tr___,r_} :> (rR[r] = e @@ EVAL[ ARGS[{tr}] ]), {30,e_,tr___,r_} :> (rC[r] = e @@ EVAL[ ARGS[{tr}] ]), {31,e_,tr___ } :> e @@ EVAL[ ARGS[{tr}] ], {32,rs___,r_} :> (rI[r] = EVAL[ Plus @@ Map[rI,{rs}] ]), {33,rs___,r_} :> (rR[r] = EVAL[ Plus @@ Map[rR,{rs}] ]), {34,rs___,r_} :> (rC[r] = EVAL[ Plus @@ Map[rC,{rs}] ]), {35,rs___,r_} :> (rI[r] = EVAL[ Times @@ Map[rI,{rs}] ]), {36,rs___,r_} :> (rR[r] = EVAL[ Times @@ Map[rR,{rs}] ]), {37,rs___,r_} :> (rC[r] = EVAL[ Times @@ Map[rC,{rs}] ]), {38,r1_,r_} :> (rI[r] = - rI[r1]), {39,r1_,r_} :> (rR[r] = - rR[r1]), {40,r1_,r_} :> (rC[r] = - rC[r1]), {41,r1_,r_} :> (rR[r] = 1/rR[r1]), {42,r1_,r_} :> (rC[r] = 1/rC[r1]), {43,r1_,r2_,r_} :> (rR[r] = rR[r1]^rI[r2]), {44,r1_,r2_,r_} :> (rR[r] = rR[r1]^rR[r2]), {45,r1_,r2_,r_} :> (rC[r] = rC[r1]^rC[r2]), {46,r1_,r_} :> (rR[r] = Sqrt[rR[r1]]), {47,r1_,r_} :> (rR[r] = Exp[rR[r1]]), {48,r1_,r_} :> (rR[r] = Log[rR[r1]]), {49,r1_,r_} :> (rR[r] = Sin[rR[r1]]), {50,r1_,r_} :> (rR[r] = Cos[rR[r1]]), {51,r1_,r_} :> (rR[r] = Tan[rR[r1]]), {52,r1_,r_} :> (rR[r] = ArcSin[rR[r1]]), {53,r1_,r_} :> (rR[r] = ArcCos[rR[r1]]), {54,r1_,r_} :> (rR[r] = ArcTan[rR[r1]]), {55,r1_,r_} :> (rC[r] = Exp[rC[r1]]), {56,r1_,r_} :> (rC[r] = Log[rC[r1]]), {57,r1_,r_} :> (rC[r] = Sin[rC[r1]]), {58,r1_,r_} :> (rC[r] = Cos[rC[r1]]), {59,r1_,r_} :> (rC[r] = Tan[rC[r1]]), {60,r1_,r_} :> (rC[r] = ArcSin[rC[r1]]), {61,r1_,r_} :> (rC[r] = ArcCos[rC[r1]]), {62,r1_,r_} :> (rC[r] = ArcTan[rC[r1]]), {63,r1_,r_} :> (rI[r] = Floor[rR[r1]]), {64,r1_,r_} :> (rR[r] = Re[rC[r1]]), {65,r1_,r_} :> (rR[r] = Im[rC[r1]]), {66,r1_,r_} :> (rC[r] = Conjugate[rC[r1]]), {67,r1_,r_} :> (rR[r] = Abs[rC[r1]]), {68,r1_,r2_,r_} :> (rI[r] = Mod[rI[r1],rI[r2]]), {69,r_,offset_} :> If[!rB[r], JUMP[offset]], {70,offset_} :> JUMP[offset], {71,r_,io___} :> SWITCH[rI[r], EVAL[ CASE[{io}] ]], {72,r1_,r2_,r_} :> (rB[r] = rI[r1]==rI[r2]), {73,r1_,r2_,r_} :> (rB[r] = rR[r1]==rR[r2]), {74,r1_,r2_,r_} :> (rB[r] = rI[r1]< rI[r2]), {75,r1_,r2_,r_} :> (rB[r] = rR[r1]< rR[r2]), {76,r1_,r2_,r_} :> (rB[r] = rI[r1]<=rI[r2]), {77,r1_,r2_,r_} :> (rB[r] = rR[r1]<=rR[r2]), {78,r1_,r2_,r_} :> (rB[r] = rB[r1]&&rB[r2]), {79,r1_,r2_,r_} :> (rB[r] = rB[r1]||rB[r2]), {80,r1_,r_} :> (rB[r] = ! rB[r1]), {81} :> Throw[Null], {82,r1_,r2_,r_} :> (rB[r1][[rI[r2]]] = rB[r]), {83,r1_,r2_,r_} :> (rI[r1][[rI[r2]]] = rI[r]), {84,r1_,r2_,r_} :> (rR[r1][[rI[r2]]] = rR[r]), {85,r1_,r2_,r_} :> (rC[r1][[rI[r2]]] = rC[r]), {86,r1_,r2_,r_} :> (rB[r] = rB[r1][[rI[r2]]]), {87,r1_,r2_,r_} :> (rI[r] = rI[r1][[rI[r2]]]), {88,r1_,r2_,r_} :> (rR[r] = rR[r1][[rI[r2]]]), {89,r1_,r2_,r_} :> (rC[r] = rC[r1][[rI[r2]]]), {90,tr___,r_} :> EVAL[ PRNT[{tr}] ], {} :> Null } ] ]; (******************************************************************************) End[] (* end of Begin["`Private`"] *) EndPackage[] (* end of BeginPackage["Decompile`"] *) Null;