This patch makes trace a little more useful.  It prints the constant
referred to, as well as the value of the register being accessed.

This string reverse program 

        trace   1
        set     S0,"Hello world"
        set     S1,""
        set     S2,""
        length  I0,S0
        dec     I0
$loop:  substr  S2,S0,I0,1
        concat  S1,S2
        dec     I0
        ge      I0,0,$loop
        set     S0,S1
        end

produces this output (I removed some spaces on PC=16 to stop the word
wrap in my mailer):

PC=2; OP=9 (set_s_sc); ARGS=(S0=(null), "Hello world")
PC=5; OP=9 (set_s_sc); ARGS=(S1=(null), "")
PC=8; OP=9 (set_s_sc); ARGS=(S2=(null), "")
PC=11; OP=115 (length_i_s); ARGS=(I0=0, S0="Hello world")
PC=14; OP=66 (dec_i); ARGS=(I0=11)
PC=16; OP=117 (substr_s_s_i_ic); ARGS=(S2="", S0="Hello world", I0=10,1)
PC=21; OP=110 (concat_s_s); ARGS=(S1="", S2="d")
PC=24; OP=66 (dec_i); ARGS=(I0=10)
PC=26; OP=43 (ge_i_ic_ic); ARGS=(I0=9, 0, -10)
PC=16; OP=117 (substr_s_s_i_ic); ARGS=(S2="d", S0="Hello world", I0=9,1)
PC=21; OP=110 (concat_s_s); ARGS=(S1="d", S2="l")
PC=24; OP=66 (dec_i); ARGS=(I0=9)
PC=26; OP=43 (ge_i_ic_ic); ARGS=(I0=8, 0, -10)
PC=16; OP=117 (substr_s_s_i_ic); ARGS=(S2="l", S0="Hello world", I0=8,1)
PC=21; OP=110 (concat_s_s); ARGS=(S1="dl", S2="r")
PC=24; OP=66 (dec_i); ARGS=(I0=8)
PC=26; OP=43 (ge_i_ic_ic); ARGS=(I0=7, 0, -10)
PC=16; OP=117 (substr_s_s_i_ic); ARGS=(S2="r", S0="Hello world", I0=7,1)
PC=21; OP=110 (concat_s_s); ARGS=(S1="dlr", S2="o")
PC=24; OP=66 (dec_i); ARGS=(I0=7)
PC=26; OP=43 (ge_i_ic_ic); ARGS=(I0=6, 0, -10)
PC=16; OP=117 (substr_s_s_i_ic); ARGS=(S2="o", S0="Hello world", I0=6,1)
PC=21; OP=110 (concat_s_s); ARGS=(S1="dlro", S2="w")
PC=24; OP=66 (dec_i); ARGS=(I0=6)
PC=26; OP=43 (ge_i_ic_ic); ARGS=(I0=5, 0, -10)
PC=16; OP=117 (substr_s_s_i_ic); ARGS=(S2="w", S0="Hello world", I0=5,1)
PC=21; OP=110 (concat_s_s); ARGS=(S1="dlrow", S2=" ")
PC=24; OP=66 (dec_i); ARGS=(I0=5)
PC=26; OP=43 (ge_i_ic_ic); ARGS=(I0=4, 0, -10)
PC=16; OP=117 (substr_s_s_i_ic); ARGS=(S2=" ", S0="Hello world", I0=4,1)
PC=21; OP=110 (concat_s_s); ARGS=(S1="dlrow ", S2="o")
PC=24; OP=66 (dec_i); ARGS=(I0=4)
PC=26; OP=43 (ge_i_ic_ic); ARGS=(I0=3, 0, -10)
PC=16; OP=117 (substr_s_s_i_ic); ARGS=(S2="o", S0="Hello world", I0=3 1)
PC=21; OP=110 (concat_s_s); ARGS=(S1="dlrow o", S2="l")
PC=24; OP=66 (dec_i); ARGS=(I0=3)
PC=26; OP=43 (ge_i_ic_ic); ARGS=(I0=2, 0, -10)
PC=16; OP=117 (substr_s_s_i_ic); ARGS=(S2="l", S0="Hello world", I0=2,1)
PC=21; OP=110 (concat_s_s); ARGS=(S1="dlrow ol", S2="l")
PC=24; OP=66 (dec_i); ARGS=(I0=2)
PC=26; OP=43 (ge_i_ic_ic); ARGS=(I0=1, 0, -10)
PC=16; OP=117 (substr_s_s_i_ic); ARGS=(S2="l", S0="Hello world", I0=1,1)
PC=21; OP=110 (concat_s_s); ARGS=(S1="dlrow oll", S2="e")
PC=24; OP=66 (dec_i); ARGS=(I0=1)
PC=26; OP=43 (ge_i_ic_ic); ARGS=(I0=0, 0, -10)
PC=16; OP=117 (substr_s_s_i_ic); ARGS=(S2="e", S0="Hello world", I0=0,1)
PC=21; OP=110 (concat_s_s); ARGS=(S1="dlrow olle", S2="H")
PC=24; OP=66 (dec_i); ARGS=(I0=0)
PC=26; OP=43 (ge_i_ic_ic); ARGS=(I0=-1, 0, -10)
PC=30; OP=8 (set_s_s); ARGS=(S0="Hello world", S1="dlrow olleH")
PC=33; OP=0 (end)


If it looks reasonable, I'll commit it.

Brian

Index: interpreter.c
===================================================================
RCS file: /home/perlcvs/parrot/interpreter.c,v
retrieving revision 1.29
diff -u -r1.29 interpreter.c
--- interpreter.c       2001/10/14 23:47:39     1.29
+++ interpreter.c       2001/10/17 20:15:42
@@ -81,7 +81,38 @@
         fprintf(stderr, "; ARGS=(");
         for(i = 1; i < interpreter->opcode_info[*pc].arg_count; i++) {
             if (i > 1) { fprintf(stderr, ", "); }
-            fprintf(stderr, "%ld", (long) *(pc + i));
+            switch(interpreter->opcode_info[*pc].types[i]) {
+            case PARROT_ARG_IC:
+                fprintf(stderr, "%ld", (long) *(pc + i));
+                break;
+            case PARROT_ARG_NC:
+                fprintf(stderr, "%f", interpreter->code->const_table->constants[*(pc 
++ i)]->number);
+                break;
+            case PARROT_ARG_PC:
+                /* what is a PMC constant look like? */
+                fprintf(stderr, "%ld", (long) *(pc + i));
+                break;
+            case PARROT_ARG_SC:
+                fprintf(stderr, "\"%s\"", 
+interpreter->code->const_table->constants[*(pc + i)]->string->bufstart);
+                break;
+            case PARROT_ARG_I:
+                fprintf(stderr, "I%ld=%ld", (long) *(pc + i), (long) 
+interpreter->int_reg->registers[*(pc + i)]);
+                break;
+            case PARROT_ARG_N:
+                fprintf(stderr, "N%ld=%f", (long) *(pc + i), 
+interpreter->num_reg->registers[*(pc + i)]);
+                break;
+            case PARROT_ARG_P:
+                /* what does a PMC constant look like? */
+                fprintf(stderr, "P%ld=???", (long) *(pc + i));
+                break;
+            case PARROT_ARG_S:
+                if(interpreter->string_reg->registers[*(pc + i)]) {
+                    fprintf(stderr, "S%ld=\"%s\"", (long) *(pc + i), 
+interpreter->string_reg->registers[*(pc + i)]->bufstart);
+                } else {
+                    fprintf(stderr, "S%ld=(null)", (long) *(pc + i));
+                }
+                break;
+            }
         }
         fprintf(stderr, ")");
     }
@@ -115,7 +146,38 @@
             fprintf(stderr, "; ARGS=(");
             for(i = 1; i < interpreter->opcode_info[*pc].arg_count; i++) {
                 if (i > 1) { fprintf(stderr, ", "); }
-                fprintf(stderr, "%ld", (long) *(pc + i));
+                switch(interpreter->opcode_info[*pc].types[i]) {
+                case PARROT_ARG_IC:
+                    fprintf(stderr, "%ld", (long) *(pc + i));
+                    break;
+                case PARROT_ARG_NC:
+                    fprintf(stderr, "%f", 
+interpreter->code->const_table->constants[*(pc + i)]->number);
+                    break;
+                case PARROT_ARG_PC:
+                    /* what is a PMC constant look like? */
+                    fprintf(stderr, "%ld", (long) *(pc + i));
+                    break;
+                case PARROT_ARG_SC:
+                    fprintf(stderr, "\"%s\"", 
+interpreter->code->const_table->constants[*(pc + i)]->string->bufstart);
+                    break;
+                case PARROT_ARG_I:
+                    fprintf(stderr, "I%ld=%ld", (long) *(pc + i), (long) 
+interpreter->int_reg->registers[*(pc + i)]);
+                    break;
+                case PARROT_ARG_N:
+                    fprintf(stderr, "N%ld=%f", (long) *(pc + i), 
+interpreter->num_reg->registers[*(pc + i)]);
+                    break;
+                case PARROT_ARG_P:
+                    /* what does a PMC constant look like? */
+                    fprintf(stderr, "P%ld=???", (long) *(pc + i));
+                    break;
+                case PARROT_ARG_S:
+                    if(interpreter->string_reg->registers[*(pc + i)]) {
+                        fprintf(stderr, "S%ld=\"%s\"", (long) *(pc + i), 
+interpreter->string_reg->registers[*(pc + i)]->bufstart);
+                    } else {
+                        fprintf(stderr, "S%ld=(null)", (long) *(pc + i));
+                    }
+                    break;
+                }
             }
             fprintf(stderr, ")");
         }

Reply via email to