[njs] Relative addresses have been added to disassembler output.

Igor Sysoev igor at sysoev.ru
Tue Oct 18 13:00:31 UTC 2016


details:   http://hg.nginx.org/njs/rev/d055824ff0f7
branches:  
changeset: 204:d055824ff0f7
user:      Igor Sysoev <igor at sysoev.ru>
date:      Mon Oct 17 23:29:15 2016 +0300
description:
Relative addresses have been added to disassembler output.

diffstat:

 njs/njs_disassembler.c   |  125 +++++++++++++++++++++++++++-------------------
 njs/test/njs_unit_test.c |    1 +
 2 files changed, 75 insertions(+), 51 deletions(-)

diffs (273 lines):

diff -r 6fc0e6b7f797 -r d055824ff0f7 njs/njs_disassembler.c
--- a/njs/njs_disassembler.c	Mon Oct 17 17:03:22 2016 +0300
+++ b/njs/njs_disassembler.c	Mon Oct 17 23:29:15 2016 +0300
@@ -196,149 +196,171 @@ njs_disassemble(u_char *start, u_char *e
 
         if (operation == njs_vmcode_array) {
             array = (njs_vmcode_array_t *) p;
-            p += sizeof(njs_vmcode_array_t);
 
-            printf("ARRAY             %04zX %zd\n",
-                   (size_t) array->retval, (size_t) array->length);
+            printf("%05zd ARRAY             %04zX %zd\n",
+                   p - start, (size_t) array->retval, (size_t) array->length);
+
+            p += sizeof(njs_vmcode_array_t);
 
             continue;
         }
 
         if (operation == njs_vmcode_if_true_jump) {
             cond_jump = (njs_vmcode_cond_jump_t *) p;
-            p += sizeof(njs_vmcode_cond_jump_t);
             sign = (cond_jump->offset >= 0) ? "+" : "";
 
-            printf("JUMP IF TRUE      %04zX %s%zd\n",
-                   (size_t) cond_jump->cond, sign, (size_t) cond_jump->offset);
+            printf("%05zd JUMP IF TRUE      %04zX %s%zd\n",
+                   p - start, (size_t) cond_jump->cond, sign,
+                   (size_t) cond_jump->offset);
+
+            p += sizeof(njs_vmcode_cond_jump_t);
 
             continue;
         }
 
         if (operation == njs_vmcode_if_false_jump) {
             cond_jump = (njs_vmcode_cond_jump_t *) p;
-            p += sizeof(njs_vmcode_cond_jump_t);
             sign = (cond_jump->offset >= 0) ? "+" : "";
 
-            printf("JUMP IF FALSE     %04zX %s%zd\n",
-                   (size_t) cond_jump->cond, sign, (size_t) cond_jump->offset);
+            printf("%05zd JUMP IF FALSE     %04zX %s%zd\n",
+                   p - start, (size_t) cond_jump->cond, sign,
+                   (size_t) cond_jump->offset);
+
+            p += sizeof(njs_vmcode_cond_jump_t);
 
             continue;
         }
 
         if (operation == njs_vmcode_jump) {
             jump = (njs_vmcode_jump_t *) p;
-            p += sizeof(njs_vmcode_jump_t);
             sign = (jump->offset >= 0) ? "+" : "";
 
-            printf("JUMP              %s%zd\n", sign, (size_t) jump->offset);
+            printf("%05zd JUMP              %s%zd\n",
+                   p - start, sign, (size_t) jump->offset);
+
+            p += sizeof(njs_vmcode_jump_t);
 
             continue;
         }
 
         if (operation == njs_vmcode_if_equal_jump) {
             equal = (njs_vmcode_equal_jump_t *) p;
-            p += sizeof(njs_vmcode_equal_jump_t);
 
-            printf("JUMP IF EQUAL     %04zX %04zX +%zd\n",
-                   (size_t) equal->value1, (size_t) equal->value2,
+            printf("%05zd JUMP IF EQUAL     %04zX %04zX +%zd\n",
+                   p - start, (size_t) equal->value1, (size_t) equal->value2,
                    (size_t) equal->offset);
 
+            p += sizeof(njs_vmcode_equal_jump_t);
+
             continue;
         }
 
         if (operation == njs_vmcode_test_if_true) {
             test_jump = (njs_vmcode_test_jump_t *) p;
-            p += sizeof(njs_vmcode_test_jump_t);
 
-            printf("TEST IF TRUE      %04zX %04zX +%zd\n",
-                   (size_t) test_jump->retval, (size_t) test_jump->value,
-                   (size_t) test_jump->offset);
+            printf("%05zd TEST IF TRUE      %04zX %04zX +%zd\n",
+                   p - start, (size_t) test_jump->retval,
+                   (size_t) test_jump->value, (size_t) test_jump->offset);
+
+            p += sizeof(njs_vmcode_test_jump_t);
 
             continue;
         }
 
         if (operation == njs_vmcode_test_if_false) {
             test_jump = (njs_vmcode_test_jump_t *) p;
-            p += sizeof(njs_vmcode_test_jump_t);
 
-            printf("TEST IF FALSE     %04zX %04zX +%zd\n",
-                   (size_t) test_jump->retval, (size_t) test_jump->value,
-                   (size_t) test_jump->offset);
+            printf("%05zd TEST IF FALSE     %04zX %04zX +%zd\n",
+                   p - start, (size_t) test_jump->retval,
+                   (size_t) test_jump->value, (size_t) test_jump->offset);
+
+            p += sizeof(njs_vmcode_test_jump_t);
 
             continue;
         }
 
         if (operation == njs_vmcode_function_frame) {
             function = (njs_vmcode_function_frame_t *) p;
-            p += sizeof(njs_vmcode_function_frame_t);
 
-            printf("FUNCTION FRAME    %04zX %zd%s\n",
-                   (size_t) function->name, function->nargs,
+            printf("%05zd FUNCTION FRAME    %04zX %zd%s\n",
+                   p - start, (size_t) function->name, function->nargs,
                    function->code.ctor ? " CTOR" : "");
 
+            p += sizeof(njs_vmcode_function_frame_t);
+
             continue;
         }
 
         if (operation == njs_vmcode_method_frame) {
             method = (njs_vmcode_method_frame_t *) p;
-            p += sizeof(njs_vmcode_method_frame_t);
 
-            printf("METHOD FRAME      %04zX %04zX %zd%s\n",
-                   (size_t) method->object, (size_t) method->method,
+            printf("%05zd METHOD FRAME      %04zX %04zX %zd%s\n",
+                   p - start, (size_t) method->object, (size_t) method->method,
                    method->nargs, method->code.ctor ? " CTOR" : "");
 
+
+            p += sizeof(njs_vmcode_method_frame_t);
             continue;
         }
 
         if (operation == njs_vmcode_property_foreach) {
             prop_foreach = (njs_vmcode_prop_foreach_t *) p;
-            p += sizeof(njs_vmcode_prop_foreach_t);
 
-            printf("PROPERTY FOREACH  %04zX %04zX +%zd\n",
-                   (size_t) prop_foreach->next, (size_t) prop_foreach->object,
+            printf("%05zd PROPERTY FOREACH  %04zX %04zX +%zd\n",
+                   p - start, (size_t) prop_foreach->next,
+                   (size_t) prop_foreach->object,
                    (size_t) prop_foreach->offset);
 
+
+            p += sizeof(njs_vmcode_prop_foreach_t);
             continue;
         }
 
         if (operation == njs_vmcode_property_next) {
             prop_next = (njs_vmcode_prop_next_t *) p;
-            p += sizeof(njs_vmcode_prop_next_t);
 
-            printf("PROPERTY NEXT     %04zX %04zX %04zX %zd\n",
-                   (size_t) prop_next->retval, (size_t) prop_next->object,
-                   (size_t) prop_next->next, (size_t) prop_next->offset);
+            printf("%05zd PROPERTY NEXT     %04zX %04zX %04zX %zd\n",
+                   p - start, (size_t) prop_next->retval,
+                   (size_t) prop_next->object, (size_t) prop_next->next,
+                   (size_t) prop_next->offset);
+
+            p += sizeof(njs_vmcode_prop_next_t);
 
             continue;
         }
 
         if (operation == njs_vmcode_try_start) {
             try_start = (njs_vmcode_try_start_t *) p;
-            p += sizeof(njs_vmcode_try_start_t);
 
-            printf("TRY START         %04zX +%zd\n",
-                   (size_t) try_start->value, (size_t) try_start->offset);
+            printf("%05zd TRY START         %04zX +%zd\n",
+                   p - start, (size_t) try_start->value,
+                   (size_t) try_start->offset);
+
+            p += sizeof(njs_vmcode_try_start_t);
 
             continue;
         }
 
         if (operation == njs_vmcode_catch) {
             catch = (njs_vmcode_catch_t *) p;
-            p += sizeof(njs_vmcode_catch_t);
 
-            printf("CATCH             %04zX +%zd\n",
-                   (size_t) catch->exception, (size_t) catch->offset);
+            printf("%05zd CATCH             %04zX +%zd\n",
+                   p - start, (size_t) catch->exception,
+                   (size_t) catch->offset);
+
+            p += sizeof(njs_vmcode_catch_t);
 
             continue;
         }
 
         if (operation == njs_vmcode_try_end) {
             try_end = (njs_vmcode_try_end_t *) p;
+
+            printf("%05zd TRY END           +%zd\n",
+                   p - start, (size_t) try_end->offset);
+
             p += sizeof(njs_vmcode_try_end_t);
 
-            printf("TRY END           +%zd\n", (size_t) try_end->offset);
-
             continue;
         }
 
@@ -352,23 +374,23 @@ njs_disassemble(u_char *start, u_char *e
                  if (code_name->size == sizeof(njs_vmcode_3addr_t)) {
                      code3 = (njs_vmcode_3addr_t *) p;
 
-                     printf("%*s  %04zX %04zX %04zX\n",
-                            (int) name->length, name->start,
+                     printf("%05zd %*s  %04zX %04zX %04zX\n",
+                            p - start, (int) name->length, name->start,
                             (size_t) code3->dst, (size_t) code3->src1,
                             (size_t) code3->src2);
 
                  } else if (code_name->size == sizeof(njs_vmcode_2addr_t)) {
                      code2 = (njs_vmcode_2addr_t *) p;
 
-                     printf("%*s  %04zX %04zX\n",
-                            (int) name->length, name->start,
+                     printf("%05zd %*s  %04zX %04zX\n",
+                            p - start, (int) name->length, name->start,
                             (size_t) code2->dst, (size_t) code2->src);
 
                  } else if (code_name->size == sizeof(njs_vmcode_1addr_t)) {
                      code1 = (njs_vmcode_1addr_t *) p;
 
-                     printf("%*s  %04zX\n",
-                            (int) name->length, name->start,
+                     printf("%05zd %*s  %04zX\n",
+                            p - start, (int) name->length, name->start,
                             (size_t) code1->index);
                  }
 
@@ -382,10 +404,11 @@ njs_disassemble(u_char *start, u_char *e
 
         } while (n != 0);
 
+        printf("%05zd UNKNOWN           %04zX\n",
+               p - start, (size_t) (uintptr_t) operation);
+
         p += sizeof(njs_vmcode_operation_t);
 
-        printf("UNKNOWN           %04zX\n", (size_t) (uintptr_t) operation);
-
     next:
 
         continue;
diff -r 6fc0e6b7f797 -r d055824ff0f7 njs/test/njs_unit_test.c
--- a/njs/test/njs_unit_test.c	Mon Oct 17 17:03:22 2016 +0300
+++ b/njs/test/njs_unit_test.c	Mon Oct 17 23:29:15 2016 +0300
@@ -5602,6 +5602,7 @@ njs_unit_test(nxt_bool_t disassemble)
         if (ret == NXT_OK) {
             if (disassemble) {
                 njs_disassembler(vm);
+                fflush(stdout);
             }
 
             nvm = njs_vm_clone(vm, NULL, &ext_object);



More information about the nginx-devel mailing list