(Decompiler d, int args, int registers)
| 108 | } |
| 109 | |
| 110 | public static Declaration[] process(Decompiler d, int args, int registers) { |
| 111 | Code code = d.code; |
| 112 | RegisterStates states = new RegisterStates(registers, code.length()); |
| 113 | boolean[] skip = new boolean[code.length()]; |
| 114 | for(int line = 1; line <= code.length(); line++) { |
| 115 | states.nextLine(line); |
| 116 | if(skip[line - 1]) continue; |
| 117 | int A = code.A(line); |
| 118 | int B = code.B(line); |
| 119 | int C = code.C(line); |
| 120 | switch(code.op(line)) { |
| 121 | case MOVE: |
| 122 | states.setWritten(A, line); |
| 123 | states.setRead(B, line); |
| 124 | if(A < B) { |
| 125 | states.setLocalWrite(A, A, line); |
| 126 | } else if(B < A) { |
| 127 | states.setLocalRead(B, line); |
| 128 | } |
| 129 | break; |
| 130 | case LOADK: |
| 131 | case LOADBOOL: |
| 132 | case GETUPVAL: |
| 133 | case GETGLOBAL: |
| 134 | case NEWTABLE: |
| 135 | case NEWTABLE50: |
| 136 | states.setWritten(A, line); |
| 137 | break; |
| 138 | case LOADNIL: { |
| 139 | int maximum = B; |
| 140 | int register = code.A(line); |
| 141 | while(register <= maximum) { |
| 142 | states.setWritten(register, line); |
| 143 | register++; |
| 144 | } |
| 145 | break; |
| 146 | } |
| 147 | case LOADNIL52: { |
| 148 | int maximum = A + B; |
| 149 | int register = code.A(line); |
| 150 | while(register <= maximum) { |
| 151 | states.setWritten(register, line); |
| 152 | register++; |
| 153 | } |
| 154 | break; |
| 155 | } |
| 156 | case GETTABLE: |
| 157 | states.setWritten(A, line); |
| 158 | if(!isConstantReference(d, code.B(line))) states.setRead(B, line); |
| 159 | if(!isConstantReference(d, code.C(line))) states.setRead(C, line); |
| 160 | break; |
| 161 | case SETGLOBAL: |
| 162 | case SETUPVAL: |
| 163 | states.setRead(A, line); |
| 164 | break; |
| 165 | case SETTABLE: |
| 166 | case ADD: |
| 167 | case SUB: |
no test coverage detected