Advertisement
sawyermade

vtable shits

Dec 1st, 2017
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.67 KB | None | 0 0
  1. //structs
  2. typedef struct pair{
  3.     int meth, submeth;
  4. }pair;
  5. typedef struct vstruct{
  6.     int sub;
  7.     int mic;
  8.     pair* methpairs;
  9. }vstruct;
  10.  
  11. void genVT() {
  12.     /* gen vtable */
  13.  
  14.     //get sub class counts
  15.     int **vt;
  16.     int i, j;
  17.     int *subClassCounts = (int*)malloc(sizeof(int)*numClasses);
  18.     memset(subClassCounts, 0, sizeof(int)*numClasses);
  19.     int nextClass;
  20.     for(i = 0; i < numClasses; i++) {
  21.  
  22.         nextClass = classesST[i].superclass;
  23.         while(nextClass >= 0) {
  24.             subClassCounts[nextClass]++;
  25.             nextClass = classesST[nextClass].superclass;
  26.         }
  27.     }
  28.     // //print subclass counts, DEBUG
  29.     // for(i = 0; i < numClasses; i++)
  30.     //  printf("\nClass %d has %d subclasses\n", i, subClassCounts[i]);
  31.  
  32.     //gets the actual classes that are subs
  33.     int **subClasses = (int**)malloc(sizeof(int*)*numClasses);
  34.     int temp;
  35.     for(i = 0; i < numClasses; i++) {
  36.         subClasses[i] = (int*)malloc(sizeof(int)*subClassCounts[i]);
  37.         temp = 0;
  38.         for(j = i+1; j < numClasses; j++) {
  39.  
  40.             if(isSubtype(j, i)) {
  41.                 subClasses[i][temp] = j;
  42.                 temp++;
  43.             }
  44.         }
  45.     }
  46.     //prints subtypes DEBUG
  47.     // for(i = 0; i < numClasses; i++) {
  48.  
  49.     //  printf("\nClass %d has subtypes: ", i);
  50.     //  for(j = 0; j < subClassCounts[i]; j++) {
  51.     //      printf("%d ", subClasses[i][j]);
  52.     //  }
  53.     // }
  54.     // printf("\n");
  55.  
  56.     //finds methods in common
  57.     int **numMethodsIC = (int**)malloc(sizeof(int*)*numClasses);
  58.     for(i = 0; i < numClasses; i++) {
  59.         numMethodsIC[i] = (int*)malloc(sizeof(int)*subClassCounts[i]);
  60.         memset(numMethodsIC[i], 0, sizeof(int)*subClassCounts[i]);
  61.     }
  62.  
  63.     int k, l;
  64.     for(i = 1; i < numClasses; i++) {
  65.  
  66.         for(j = 0; j < subClassCounts[i]; j++) {
  67.             temp = subClasses[i][j];
  68.  
  69.             for(k = 0; k < classesST[i].numMethods; k++) {
  70.  
  71.                 for(l = 0; l < classesST[temp].numMethods; l++) {
  72.                     if(!strcmp(classesST[i].methodList[k].methodName, classesST[temp].methodList[l].methodName)) {
  73.                         numMethodsIC[i][j]++;
  74.                     }
  75.                 }
  76.             }
  77.         }
  78.     }
  79.     // for(i = 0; i < numClasses; i++) {
  80.  
  81.     //  printf("\nClass %d has subtypes (st, mic): ", i);
  82.     //  for(j = 0; j < subClassCounts[i]; j++) {
  83.     //      printf("(%d, %d) ", subClasses[i][j], numMethodsIC[i][j]);
  84.     //  }
  85.     // }
  86.     // printf("\n");
  87.  
  88.     //malloc final shit
  89.     vstruct **vtable = (vstruct**)malloc(sizeof(vstruct*)*numClasses);
  90.     for(i = 0; i < numClasses; i++) {
  91.        
  92.         vtable[i] = (vstruct*)malloc(sizeof(vstruct)*subClassCounts[i]);
  93.         for(j = 0; j < subClassCounts[i]; j++) {
  94.             vtable[i][j].sub = subClasses[i][j];
  95.             vtable[i][j].mic = numMethodsIC[i][j];
  96.  
  97.             if(vtable[i][j].mic) {
  98.                
  99.                 vtable[i][j].methpairs = (pair*)malloc(sizeof(pair)*vtable[i][j].mic);
  100.  
  101.                 temp = 0;
  102.                 for(k = 0; k < classesST[i].numMethods; k++) {
  103.  
  104.                     for(l = 0; l < classesST[subClasses[i][j]].numMethods; l++) {
  105.                         if(!strcmp(classesST[i].methodList[k].methodName, classesST[subClasses[i][j]].methodList[l].methodName)) {
  106.                             vtable[i][j].methpairs[temp].meth = k;
  107.                             vtable[i][j].methpairs[temp].submeth = l;
  108.                             temp++;
  109.                             break;
  110.                         }
  111.                     }
  112.                 }
  113.             }
  114.         }
  115.     }
  116.     //prints vtable info DEBUG
  117.     // for(i = 0; i < numClasses; i++) {
  118.  
  119.     //  printf("\nClass %d:\n", i);
  120.     //  for(j = 0; j < subClassCounts[i]; j++) {
  121.            
  122.     //      printf("\t%d. Sub %d Meths In Common (meth, submeth):\n", j+1, vtable[i][j].sub);
  123.     //      for(k = 0; k < vtable[i][j].mic; k++) {
  124.     //          printf("\t\t%d. (%d, %d)\n", k+1, vtable[i][j].methpairs[k].meth, vtable[i][j].methpairs[k].submeth);
  125.     //      }
  126.     //  }
  127.     // }
  128.  
  129.     //create vtable logic using vstruct vtable and subClassesCounts
  130.     int vtsize = 0;
  131.     for(i = 0; i < numClasses; i++) {
  132.         vtsize += (1 + subClassCounts[i]) * classesST[i].numMethods;
  133.     }
  134.     //printf("\nvtsize = %d\n", vtsize);
  135.  
  136.     vt = (int**)malloc(sizeof(int*)*vtsize);
  137.     for(i = 0; i < vtsize; i++) {
  138.         vt[i] = (int*)malloc(sizeof(int)*5);
  139.         memset(vt[i], 0, sizeof(int)*5);
  140.     }
  141.  
  142.     int class, meth, flag;
  143.     temp = 0;
  144.     for(i = 0; i < numClasses; i++) {
  145.  
  146.         for(j = 0; j < classesST[i].numMethods; j++) {
  147.  
  148.             vt[temp][0] = i;
  149.             vt[temp][1] = j;
  150.             vt[temp][2] = i;
  151.             vt[temp][3] = i;
  152.             vt[temp][4] = j;
  153.             temp++;
  154.             for(k = 0; k < subClassCounts[i]; k++) {
  155.  
  156.                 vt[temp][0] = i;
  157.                 vt[temp][1] = j;
  158.                 vt[temp][2] = subClasses[i][k];
  159.  
  160.                 flag = 0;
  161.                 if(vtable[i][k].mic) {
  162.                     for(l = 0; l < vtable[i][k].mic; l++) {
  163.                         if(j == vtable[i][k].methpairs[l].meth) {
  164.                             flag = 1;
  165.                             class = subClasses[i][k];
  166.                             meth = vtable[i][k].methpairs[l].submeth;
  167.                             break;
  168.                         }
  169.                     }
  170.                 }
  171.                 if(flag) {
  172.                     vt[temp][3] = class;
  173.                     vt[temp][4] = meth;
  174.                 }
  175.                 else {
  176.                     vt[temp][3] = i;
  177.                     vt[temp][4] = j;
  178.                 }
  179.  
  180.                 temp++;
  181.             }
  182.         }
  183.     }
  184.     //prints vt DEBUG
  185.     // printf("VTABLE:\n");
  186.     // for(i = 0; i < vtsize; i++) {
  187.  
  188.     //  printf("%d. ", i+1);
  189.     //  for(j = 0; j < 5; j++) {
  190.     //      printf("%d ", vt[i][j]);
  191.     //  }
  192.     //  printf("\n");
  193.     // }
  194.  
  195.     //gets num static classes in vt
  196.     int check = -1, scCount = 0;
  197.     for(i = 0; i < vtsize; i++) {
  198.         if(check != vt[i][0]) {
  199.             scCount++;
  200.             check = vt[i][0];
  201.         }
  202.     }
  203.     //printf("\nStatic Class Count = %d\n", scCount);
  204.    
  205.     int *vtclist = (int*)malloc(sizeof(int)*scCount);
  206.     check = -1;
  207.     temp = 0;
  208.     for(i = 0; i < vtsize; i++) {
  209.         if(check != vt[i][0]) {
  210.             vtclist[temp++] = vt[i][0];
  211.             check = vt[i][0];
  212.         }  
  213.     }
  214.     // //debug
  215.     // printf("\nClasses in vt: ");
  216.     // for(i = 0; i < scCount; i++) {
  217.     //  printf("%d ", vtclist[i]);
  218.     // }
  219.     // printf("\n");
  220.  
  221.  
  222.  
  223.     //codegens vtable
  224.     int count = 0;
  225.     fprintf(fout, "#VTABLE: mov 0 0 ;VTABLE-START\n");
  226.    
  227.     //gets position on stack
  228.     fprintf(fout, "add 4 6 0\n");
  229.     fprintf(fout, "mov 1 1\n");
  230.     fprintf(fout, "add 4 4 1\n"); //r4 = #arg addr
  231.     fprintf(fout, "lod 1 4 0\n"); //r1 = #args
  232.     //fprintf(fout, "ptn 1\n"); //ptns num args debug
  233.     fprintf(fout, "add 4 4 1\n");
  234.  
  235.     //sets r3 = static method
  236.     fprintf(fout, "lod 3 4 1\n");
  237.  
  238.     //sets r2 = static class
  239.     fprintf(fout, "lod 2 4 2\n");
  240.  
  241.     //sets r1 = dyn type
  242.     fprintf(fout, "lod 1 4 3\n");
  243.     fprintf(fout, "lod 1 1 0\n");
  244.  
  245.     //debug
  246.     // fprintf(fout, "ptn 1\n");
  247.     // fprintf(fout, "ptn 2\n");
  248.     // fprintf(fout, "ptn 3\n");
  249.  
  250.     for(i = 0; i < scCount; i++) {
  251.         fprintf(fout, "mov 4 %d\n", vtclist[i]);
  252.         fprintf(fout, "beq 2 4 #VTCLASS%d  ;vt-class-branch\n", vtclist[i]);
  253.     }
  254.     fprintf(fout, "mov 4 777  ;vt-class-dne\n");
  255.     fprintf(fout, "ptn 4\n");
  256.     fprintf(fout, "jmp 0 #END\n");
  257.  
  258.  
  259.  
  260.     for(i = 0; i < scCount; i++) {
  261.  
  262.         fprintf(fout, "#VTCLASS%d: mov 0 0\n", vtclist[i]);
  263.         for(j = 0; j < classesST[vtclist[i]].numMethods; j++) {
  264.  
  265.             fprintf(fout, "mov 4 %d\n", j);
  266.             fprintf(fout, "beq 3 4 #VTCLASS%dMETH%d\n", vtclist[i], j);
  267.         }
  268.     }
  269.     fprintf(fout, "mov 4 777  ;vt-class-dne\n");
  270.     fprintf(fout, "ptn 4\n");
  271.     fprintf(fout, "jmp 0 #END  ;vt-meth-dne\n");
  272.  
  273.  
  274.  
  275.     count = 0;
  276.     for(i = 0; i < scCount; i++) {
  277.  
  278.         for(j = 0; j < classesST[vtclist[i]].numMethods; j++) {
  279.  
  280.             fprintf(fout, "#VTCLASS%dMETH%d: mov 0 0 \n", vtclist[i], j);
  281.  
  282.             for(k = 0; k < (1 + subClassCounts[vtclist[i]]); k++) {
  283.  
  284.                 count += k;
  285.  
  286.                 fprintf(fout, "mov 4 %d\n", vt[count][2]);
  287.                 fprintf(fout, "beq 1 4 #Class%dMethod%d\n", vt[count][3], vt[count][4]);
  288.             }
  289.             count++;
  290.         }
  291.     }
  292.     fprintf(fout, "mov 4 777  ;vt-class-dne\n");
  293.     fprintf(fout, "ptn 4\n");
  294.     fprintf(fout, "jmp 0 #END\n");
  295. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement