LCOV - code coverage report
Current view: top level - src/common - poliz.cpp (source / functions) Hit Total Coverage
Test: flower-f.info Lines: 66 124 53.2 %
Date: 2022-06-10 00:44:15 Functions: 15 18 83.3 %

          Line data    Source code
       1             : #include <iostream>
       2             : #include "common/poliz.hpp"
       3             : #include "common/obstacle.hpp"
       4             : 
       5         415 : POLIZ::POLIZ(int s) {
       6         415 :     iter = 0;
       7             : 
       8      425375 :     for (int i = 0; i < MAXCMD; i++) {
       9      424960 :         prog[i] = (op_t) NONE;
      10      424960 :         execBit[i] = false;
      11             :     }
      12             : 
      13         415 : }
      14             : 
      15           0 : POLIZ& POLIZ::operator=(const POLIZ& p) {
      16           0 :     if (this == &p) return *this;
      17           0 :     for (int i = 0; i < p.iter; i++) {
      18           0 :         prog[i] = p.prog[i];
      19           0 :         execBit[i] = p.execBit[i];
      20             :     }
      21           0 :     iter = p.iter;
      22           0 :     return *this;
      23             : }
      24             : 
      25          58 : POLIZ::POLIZ(const POLIZ& p) {
      26          58 :     if (this == &p) return;
      27          58 :     for (int i = 0; i < p.iter; i++) {
      28           0 :         prog[i] = p.prog[i];
      29           0 :         execBit[i] = p.execBit[i];
      30             :     }
      31          58 :     iter = p.iter;
      32             : }
      33             : 
      34          58 : void POLIZ::repr(bool dontBreak) {
      35          58 :     for (int i = 0; i < iter; i++) {
      36           0 :         std::cout << i << ") ";
      37           0 :         if (execBit[i]) interpretAsOp(prog[i]);
      38           0 :         else interpretAsVal(prog[i]);
      39           0 :         if (!dontBreak)
      40           0 :             std::cout << "\n";
      41             :         else
      42           0 :             std::cout << "\\n";
      43             :     }
      44          58 : }
      45             : 
      46         824 : void POLIZ::pushVal(IdentTable * val) {
      47             :     #ifdef DEBUG
      48             :     std::cout << "POLIZ pushVal";
      49             :     val->whoami();
      50             :     if (val->isReg())
      51             :         std::cout << " REGISTER";
      52             :     std::cout << std::endl;
      53             :     #endif
      54             : 
      55         824 :     if (val->isReg()) {
      56          38 :         IdentTable * mainIT = val->getMainTable();
      57          38 :         mainIT->pushType(_INT_);
      58          38 :         mainIT->pushVal(new int (val->getOrd()));
      59          38 :         pushVal(mainIT->confirm());
      60          38 :         pushOp(_NONE_, _INT_, LOAD);
      61          38 :         prog[iter - 1] = (char) val->getType() << 24 | (prog[iter - 1] & 0xFFF);
      62             :     } else {
      63         786 :         prog[iter] = (op_t) val;
      64         786 :         execBit[iter] = false;
      65         786 :         iter++;
      66             : 
      67         786 :         checkIter();
      68             :     }
      69         824 : }
      70             : 
      71         851 : void POLIZ::pushOp(type_t lval, type_t rval, operation_t op){
      72             :     #ifdef DEBUG
      73             :     std::cout << "POLIZ pushOp ";
      74             :     interpretAsOp(op);
      75             :     std::cout << std::endl;
      76             :     #endif
      77         851 :     type_t rest = expressionType(lval, rval, op);
      78         851 :     prog[iter] = (char) rest << 24 | (char) lval << 16 | (char) rval << 8 | (char) op;
      79         851 :     execBit[iter] = true;
      80         851 :     iter++;
      81             : 
      82         851 :     checkIter();
      83         851 : }
      84             : 
      85           0 : void POLIZ::interpretAsOp(op_t op) {
      86           0 :     switch (op & 0xFF) {
      87           0 :         case INV: std::cout << "INV "; break;
      88           0 :         case PLUS: std::cout << "PLUS "; break;
      89           0 :         case MINUS: std::cout << "MINUS "; break;
      90           0 :         case MUL: std::cout << "MUL "; break;
      91           0 :         case DIV: std::cout << "DIV "; break;
      92           0 :         case LOR: std::cout << "LOR "; break;
      93           0 :         case LAND: std::cout << "LAND "; break;
      94           0 :         case LNOT: std::cout << "LNOT "; break;
      95           0 :         case MOD: std::cout << "MOD "; break;
      96           0 :         case LESS: std::cout << "LESS "; break;
      97           0 :         case GRTR: std::cout << "GRTR "; break;
      98           0 :         case LESSEQ: std::cout << "LESSEQ "; break;
      99           0 :         case GRTREQ: std::cout << "GRTREQ "; break;
     100           0 :         case EQ: std::cout << "EQ "; break;
     101           0 :         case NEQ: std::cout << "NEQ "; break;
     102           0 :         case ASSIGN: std::cout << "ASSIGN "; break;
     103           0 :         case STOP: std::cout << "STOP "; break;
     104           0 :         case WRITE: std::cout << "WRITE "; break;
     105           0 :         case ENDL: std::cout << "ENDL "; break;
     106           0 :         case READ: std::cout << "READ "; break;
     107           0 :         case JIT: std::cout << "JIT "; break;
     108           0 :         case JMP: std::cout << "JMP "; break;
     109           0 :         case RET: std::cout << "RET "; break;
     110           0 :         case CALL: std::cout << "CALL "; break;
     111           0 :         case LOAD: std::cout << "LOAD "; break;
     112           0 :         case SHARE: std::cout << "SHARE "; break;
     113           0 :         case FORK: std::cout << "FORK "; break;
     114           0 :         case LOCK: std::cout << "LOCK "; break;
     115           0 :         case NONE: std::cout << "NONE "; break;
     116           0 :         case UNPACK: std::cout << "UNPACK "; break;
     117           0 :         default: throw Obstacle(PANIC);
     118             :     }
     119           0 :     std::cout << "["  << typetostr((type_t)((op >>  8) & 0xFF));
     120           0 :     std::cout << ", " << typetostr((type_t)((op >> 16) & 0xFF));
     121           0 :     std::cout << "]";
     122           0 : }
     123             : 
     124           0 : void POLIZ::interpretAsVal(op_t val) {
     125           0 :     reinterpret_cast<IdentTable *>(val)->whoami();
     126           0 : }
     127             : 
     128        9135 : op_t * POLIZ::getProg(void) {
     129        9135 :     return prog;
     130             : }
     131             : 
     132       12587 : bool * POLIZ::getEB(void) {
     133       12587 :     return execBit;
     134             : }
     135             : 
     136       15911 : int POLIZ::getSize(void) const {
     137       15911 :     return iter;
     138             : }
     139             : 
     140         558 : void POLIZ::pop(void) {
     141         558 :     iter = (iter <= 0) ? 0 : iter - 1;
     142         558 : }
     143             : 
     144          87 : void POLIZ::clear(void) {
     145          87 :     iter = 0;
     146          87 : }
     147             : 
     148        1239 : void POLIZ::incIter(void) {
     149        1239 :     iter++;
     150        1239 :     checkIter();
     151        1239 : }
     152             : 
     153        1753 : void POLIZ::push(op_t op, bool eb) {
     154             :     #ifdef DEBUG
     155             :     std::cout << "POLIZ push ";
     156             :     if (eb)
     157             :         interpretAsOp(op);
     158             :     else
     159             :         interpretAsVal(op);
     160             :     std::cout << std::endl;
     161             :     #endif
     162             : 
     163        1753 :     prog[iter] = op;
     164        1753 :     execBit[iter] = eb;
     165        1753 :     iter++;
     166        1753 :     checkIter();
     167        1753 : }
     168             : 
     169        4629 : void POLIZ::checkIter(void) const {
     170        4629 :     if (iter >= MAXCMD) {
     171           0 :         std::cout << "Слот для байткода переполнен. Текущее значение: ";
     172           0 :         std::cout << MAXCMD << ". Скомпилируйте с большим значением.\n";
     173           0 :         exit(1);
     174             :     }
     175        4629 : }
     176             : 
     177          58 : bool POLIZ::endsWithCall(void) const {
     178          58 :     bool call = (operation_t)(prog[iter - 1] & 0xFF) == CALL;
     179          58 :     bool exec = execBit[iter - 1];
     180          58 :     return call && exec;
     181             : }
     182             : 
     183          58 : bool POLIZ::endsWithRet(void) const {
     184          58 :     bool call = (operation_t)(prog[iter - 1] & 0xFF) == RET;
     185          58 :     bool exec = execBit[iter - 1];
     186          58 :     return call && exec;
     187             : }

Generated by: LCOV version 1.14