#include <CodeTool.h>
Collaboration diagram for CodeTool:
Public Member Functions | |
CodeTool (RobotXMLFile &ref) | |
~CodeTool () | |
void | SetRobot (Robot *x) |
bool | Sane () |
void | Call (const std::string &method) |
int | GetOpsize (unsigned char op) |
const std::string & | GetOpcode (unsigned char op) |
unsigned char | GetCode (int ptr) |
size_t | GetCodesize () |
const unsigned char * | GetBuf () |
unsigned char | Execute () |
void | Jump (short) |
long | get_property (int, int) |
void | set_property (int, int, long) |
long | call_method (int, int) |
Private Attributes | |
RobotXMLFile & | m_config |
Robot * | m_robot |
size_t | m_codesize |
unsigned char * | m_code |
std::map< std::string, int > | m_methodmap |
std::string | m_opcode [256] |
int | m_opsize [256] |
std::vector< VARIABLE * > | m_variables |
size_t | m_ptr |
long | m_register1 |
long | m_register2 |
stack_v | m_stack |
std::vector< MapObject * > * | m_loop |
std::vector< MapObject * >::iterator | m_loop_iterator |
bool | m_loop_init |
Definition at line 14 of file CodeTool.h.
CodeTool::CodeTool | ( | RobotXMLFile & | ref | ) |
Definition at line 10 of file CodeTool.cpp.
References RobotXMLFile::GetMethods(), RobotXMLFile::GetString(), RobotXMLFile::GetVariables(), m_code, m_codesize, m_config, m_methodmap, m_opcode, m_opsize, and m_variables.
00010 : m_config(ref) 00011 ,m_robot(NULL) 00012 ,m_codesize(0) 00013 ,m_code(NULL) 00014 // code runner 00015 ,m_ptr(0) 00016 ,m_register1(0) 00017 ,m_register2(0) 00018 ,m_loop(NULL) 00019 ,m_loop_init(false) 00020 { 00021 Base64 bb; 00022 std::string codestr64 = m_config.GetString("code"); 00023 bb.decode(codestr64, NULL, m_codesize); 00024 m_code = new unsigned char[m_codesize + 1]; 00025 bb.decode(codestr64, m_code, m_codesize); 00026 m_config.GetMethods( m_methodmap ); 00027 m_config.GetVariables( m_variables ); 00028 00029 m_opcode[0x01] = "ld "; 00030 m_opcode[0x02] = "push "; 00031 m_opcode[0x03] = "ld "; 00032 m_opcode[0x04] = "pop "; 00033 m_opcode[0x05] = "add "; 00034 m_opcode[0x06] = "sub "; 00035 m_opcode[0x07] = "mul "; 00036 m_opcode[0x08] = "div "; 00037 m_opcode[0x09] = "eq "; 00038 m_opcode[0x0a] = "jz "; 00039 m_opcode[0x0b] = "jnz "; 00040 m_opcode[0x0c] = "ld "; 00041 m_opcode[0x0d] = "st "; 00042 m_opcode[0x0e] = "call "; 00043 m_opcode[0x0f] = "st "; 00044 00045 m_opcode[0x10] = "ld "; 00046 m_opcode[0x11] = "init "; 00047 m_opcode[0x12] = "not "; 00048 m_opcode[0x13] = "neq "; 00049 m_opcode[0x14] = "and "; 00050 m_opcode[0x15] = "or "; 00051 00052 m_opcode[0x21] = "ld "; 00053 m_opcode[0x22] = "push "; 00054 m_opcode[0x23] = "ld "; 00055 m_opcode[0x24] = "pop "; 00056 m_opcode[0x25] = "add "; 00057 m_opcode[0x26] = "sub "; 00058 m_opcode[0x27] = "mul "; 00059 m_opcode[0x28] = "div "; 00060 m_opcode[0x29] = "eq "; 00061 m_opcode[0x2a] = "jz "; 00062 m_opcode[0x2b] = "jnz "; 00063 m_opcode[0x2c] = "ld "; 00064 m_opcode[0x2d] = "st "; 00065 m_opcode[0x2e] = "call "; 00066 m_opcode[0x2f] = "st "; 00067 00068 m_opcode[0x32] = "not "; 00069 m_opcode[0x33] = "neq "; 00070 m_opcode[0x34] = "and "; 00071 m_opcode[0x35] = "or "; 00072 00073 m_opcode[0x81] = "jmp "; 00074 m_opcode[0x82] = "init "; // loop 00075 m_opcode[0x83] = "loop "; 00076 m_opcode[0x84] = "ret "; 00077 00078 for (int opcode = 0; opcode < 256; opcode++) 00079 { 00080 int opsize = -1; 00081 switch (opcode) 00082 { 00083 // register1 00084 case 0x01: 00085 opsize = 2; 00086 break; 00087 case 0x02: 00088 opsize = 0; 00089 break; 00090 case 0x03: 00091 opsize = 4; 00092 break; 00093 case 0x04: 00094 case 0x05: 00095 case 0x06: 00096 case 0x07: 00097 case 0x08: 00098 case 0x09: 00099 opsize = 0; 00100 break; 00101 case 0x0a: 00102 case 0x0b: 00103 case 0x0c: 00104 case 0x0d: 00105 case 0x0e: 00106 case 0x0f: 00107 opsize = 2; 00108 break; 00109 case 0x10: // ... 00110 case 0x11: // loop init 00111 opsize = -2; 00112 break; 00113 case 0x12: 00114 case 0x13: 00115 case 0x14: 00116 case 0x15: 00117 opsize = 0; 00118 break; 00119 // register2 00120 case 0x21: 00121 opsize = 2; 00122 break; 00123 case 0x22: 00124 opsize = 0; 00125 break; 00126 case 0x23: 00127 opsize = 4; 00128 break; 00129 case 0x24: 00130 case 0x25: 00131 case 0x26: 00132 case 0x27: 00133 case 0x28: 00134 case 0x29: 00135 opsize = 0; 00136 break; 00137 case 0x2a: 00138 case 0x2b: 00139 case 0x2c: 00140 case 0x2d: 00141 case 0x2e: 00142 case 0x2f: 00143 opsize = 2; 00144 break; 00145 00146 case 0x32: 00147 case 0x33: 00148 case 0x34: 00149 case 0x35: 00150 opsize = 0; 00151 break; 00152 00153 case 0x81: // jmp 00154 case 0x82: // loop init 00155 case 0x83: // loop 00156 opsize = 2; 00157 break; 00158 case 0x84: // ret 00159 opsize = 0; 00160 break; 00161 00162 } 00163 m_opsize[opcode] = opsize; 00164 } 00165 }
CodeTool::~CodeTool | ( | ) |
Definition at line 168 of file CodeTool.cpp.
References m_code, and m_variables.
00169 { 00170 delete m_code; 00171 for (std::vector<VARIABLE *>::iterator it = m_variables.begin(); it != m_variables.end(); it++) 00172 { 00173 VARIABLE *p = *it; 00174 delete p; 00175 } 00176 }
void CodeTool::SetRobot | ( | Robot * | x | ) | [inline] |
bool CodeTool::Sane | ( | ) |
Definition at line 199 of file CodeTool.cpp.
References m_code, m_codesize, and m_opsize.
00200 { 00201 size_t ptr = 0; 00202 while (ptr < m_codesize) 00203 { 00204 unsigned char opcode = m_code[ptr++]; 00205 int opsize = m_opsize[opcode]; 00206 if (opsize == -1) 00207 { 00208 return false; 00209 } 00210 else 00211 if (opsize == -2) 00212 { 00213 ptr += 2; 00214 unsigned char len = m_code[ptr++]; 00215 ptr += len; 00216 } 00217 else 00218 { 00219 ptr += opsize; 00220 } 00221 if (opcode == 0x11 || opcode == 0x82) 00222 { 00223 ptr += 2; // loop body length 00224 } 00225 } 00226 return true; 00227 }
void CodeTool::Call | ( | const std::string & | method | ) |
Definition at line 179 of file CodeTool.cpp.
References Execute(), m_methodmap, and m_ptr.
00180 { 00181 for (std::map<std::string,int>::iterator it = m_methodmap.begin(); it != m_methodmap.end(); it++) 00182 { 00183 std::string name = (*it).first; 00184 int entry = (*it).second; 00185 if (name == method) 00186 { 00187 // ok to call 00188 m_ptr = entry; 00189 unsigned char c = Execute(); 00190 while (c && c != 0x84) // ret 00191 { 00192 c = Execute(); 00193 } 00194 } 00195 } 00196 }
int CodeTool::GetOpsize | ( | unsigned char | op | ) | [inline] |
const std::string& CodeTool::GetOpcode | ( | unsigned char | op | ) | [inline] |
unsigned char CodeTool::GetCode | ( | int | ptr | ) | [inline] |
Definition at line 25 of file CodeTool.h.
References m_code, and m_codesize.
00025 { return (ptr >= 0 && ptr < (int)m_codesize) ? m_code[ptr] : 0; }
size_t CodeTool::GetCodesize | ( | ) | [inline] |
const unsigned char* CodeTool::GetBuf | ( | ) | [inline] |
unsigned char CodeTool::Execute | ( | ) |
Definition at line 230 of file CodeTool.cpp.
References call_method(), get_property(), Jump(), m_code, m_codesize, m_loop, m_loop_init, m_loop_iterator, m_opsize, m_ptr, m_register1, m_register2, m_robot, m_stack, m_variables, ROBOTOBJECT_ROBOT, and set_property().
Referenced by Call().
00231 { 00232 if (m_ptr >= m_codesize) 00233 return 0; // outside program limits 00234 unsigned char opcode = m_code[m_ptr++]; 00235 int opsize = m_opsize[opcode]; 00236 if (opsize == -1) 00237 { 00238 return 0; // illegal instruction 00239 } 00240 std::string tmpstr; 00241 short tmpvals = 0; 00242 long tmpvall = 0; 00243 short bodylen = 0; 00244 if (opsize == -2) 00245 { 00246 tmpvals = m_code[m_ptr++]; 00247 tmpvals *= 256; 00248 tmpvals += m_code[m_ptr++]; 00249 unsigned char tmplen = m_code[m_ptr++]; 00250 char slask[256]; 00251 memcpy(slask,m_code + m_ptr,tmplen); 00252 slask[tmplen] = 0; 00253 tmpstr = slask; 00254 m_ptr += tmplen; 00255 } 00256 else 00257 if (opsize == 2) 00258 { 00259 tmpvals = m_code[m_ptr++]; 00260 tmpvals *= 256; 00261 tmpvals += m_code[m_ptr++]; 00262 } 00263 else 00264 if (opsize == 4) 00265 { 00266 tmpvall = m_code[m_ptr++]; 00267 tmpvall *= 256; 00268 tmpvall += m_code[m_ptr++]; 00269 tmpvall *= 256; 00270 tmpvall += m_code[m_ptr++]; 00271 tmpvall *= 256; 00272 tmpvall += m_code[m_ptr++]; 00273 } 00274 if (opcode == 0x11 || opcode == 0x82) 00275 { 00276 bodylen = m_code[m_ptr++]; 00277 bodylen *= 256; 00278 bodylen += m_code[m_ptr++]; 00279 } 00280 int objx = tmpvals / 256; 00281 int prop = tmpvals % 256; 00282 int stacksize = m_stack.size(); 00283 switch (opcode) 00284 { 00285 case 0x01: // 01 xx yy register1 = property yy from object type xx 00286 m_register1 = get_property(objx, prop); 00287 break; 00288 case 0x02: // 02 Push register1 00289 m_stack.push_back(m_register1); 00290 break; 00291 case 0x03: // 03 zz zz zz zz register1 = long integer ( zz zz zz zz == %08X ) 00292 m_register1 = tmpvall; 00293 break; 00294 case 0x04: // 04 Pop register1 00295 if (stacksize) 00296 { 00297 m_register1 = m_stack[stacksize - 1]; 00298 for (stack_v::iterator it = m_stack.begin(); it != m_stack.end(); it++) 00299 { 00300 if (stacksize-- == 1) 00301 { 00302 m_stack.erase(it); 00303 break; 00304 } 00305 } 00306 } 00307 break; 00308 case 0x05: // 05 Add register1 (register1 = register1 + register1) 00309 m_register1 += m_register1; 00310 break; 00311 case 0x06: // 06 Sub register1 00312 m_register1 -= m_register1; 00313 break; 00314 case 0x07: // 07 Mul register1 00315 m_register1 *= m_register1; 00316 break; 00317 case 0x08: // 08 Div register1 00318 if (m_register1) 00319 { 00320 m_register1 /= m_register1; 00321 } 00322 break; 00323 case 0x09: // 09 Eq register1 00324 m_register1 = m_register1 == m_register1; 00325 break; 00326 case 0x0a: // 0a zz zz Jz +/- zz zz bytes ( zz zz == %04X ) if register1 == 0 00327 if (!m_register1) 00328 { 00329 Jump(tmpvals); 00330 } 00331 break; 00332 case 0x0b: // 0b zz zz Jnz +/- zz zz bytes if register1 != 0 00333 if (m_register1) 00334 { 00335 Jump(tmpvals); 00336 } 00337 break; 00338 case 0x0c: // 0c zz zz register1 = variable[zz zz] 00339 if (tmpvals >= 0 && tmpvals < (int)m_variables.size()) 00340 { 00341 m_register1 = m_variables[tmpvals] -> value; 00342 } 00343 else 00344 { 00345 printf("Bad variable index: %d\n",tmpvals); 00346 } 00347 break; 00348 case 0x0d: // 0d zz zz variable[zz zz] = register1 00349 if (tmpvals >= 0 && tmpvals < (int)m_variables.size()) 00350 { 00351 m_variables[tmpvals] -> value = m_register1; 00352 } 00353 else 00354 { 00355 printf("Bad variable index: %d\n",tmpvals); 00356 } 00357 break; 00358 case 0x0e: // 0e xx yy register1 = call method yy on object type xx 00359 m_register1 = call_method(objx, prop); 00360 break; 00361 case 0x0f: // 0f xx yy assign property yy on object xx the value of register1 00362 set_property(objx, prop, m_register1); 00363 break; 00364 00365 case 0x10: // 10 zz zz ll nn register1 = property nn[ll] on object variable[zz zz] 00366 if (tmpvals >= 0 && tmpvals < (int)m_variables.size()) 00367 { 00368 VARIABLE *p = m_variables[tmpvals]; 00369 if (p -> type == 2) 00370 { 00371 MapObject *p2 = dynamic_cast<MapObject *>(p -> object); 00372 if (p2) 00373 { 00374 m_register1 = p2 -> get_property( tmpstr ); 00375 } 00376 } 00377 } 00378 else 00379 { 00380 printf("Bad variable index: %d\n",tmpvals); 00381 } 00382 break; 00383 case 0x11: // 11 zz zz ll nn loop init: get list nn[ll] from object variable[zz zz] 00384 // m_loop 00385 // m_loop_iterator = m_loop -> begin() 00386 // m_loop_init 00387 // bodylen 00388 // loop end = m_ptr + bodylen 00389 break; 00390 case 0x12: // not 00391 m_register1 = !m_register1; 00392 break; 00393 case 0x13: // neq 00394 m_register1 = m_register1 != m_register1; 00395 break; 00396 case 0x14: // and 00397 m_register1 = m_register1 && m_register1; 00398 break; 00399 case 0x15: // or 00400 m_register1 = m_register1 || m_register1; 00401 break; 00402 00403 case 0x21: // 01 xx yy register2 = property yy from object type xx 00404 m_register2 = get_property(objx, prop); 00405 break; 00406 case 0x22: // 02 Push register2 00407 m_stack.push_back(m_register2); 00408 break; 00409 case 0x23: // 03 zz zz zz zz register2 = long integer ( zz zz zz zz == %08X ) 00410 m_register2 = tmpvall; 00411 break; 00412 case 0x24: // 04 Pop register2 00413 if (stacksize) 00414 { 00415 m_register2 = m_stack[stacksize - 1]; 00416 for (stack_v::iterator it = m_stack.begin(); it != m_stack.end(); it++) 00417 { 00418 if (stacksize-- == 1) 00419 { 00420 m_stack.erase(it); 00421 break; 00422 } 00423 } 00424 } 00425 break; 00426 case 0x25: // 05 Add register2 (register1 = register1 + register2) 00427 m_register1 += m_register2; 00428 break; 00429 case 0x26: // 06 Sub register2 00430 m_register1 -= m_register2; 00431 break; 00432 case 0x27: // 07 Mul register2 00433 m_register1 *= m_register2; 00434 break; 00435 case 0x28: // 08 Div register2 00436 if (m_register2) 00437 { 00438 m_register1 /= m_register2; 00439 } 00440 else 00441 { 00442 m_register1 = 0; 00443 } 00444 break; 00445 case 0x29: // 09 Eq register2 00446 m_register1 = m_register1 == m_register2; 00447 break; 00448 case 0x2a: // 0a zz zz Jz +/- zz zz bytes ( zz zz == %04X ) if register2 == 0 00449 if (!m_register2) 00450 { 00451 Jump(tmpvals); 00452 } 00453 break; 00454 case 0x2b: // 0b zz zz Jnz +/- zz zz bytes if register2 != 0 00455 if (m_register2) 00456 { 00457 Jump(tmpvals); 00458 } 00459 break; 00460 case 0x2c: // 0c zz zz register2 = variable[zz zz] 00461 if (tmpvals >= 0 && tmpvals < (int)m_variables.size()) 00462 { 00463 m_register2 = m_variables[tmpvals] -> value; 00464 } 00465 else 00466 { 00467 printf("Bad variable index: %d\n",tmpvals); 00468 } 00469 break; 00470 case 0x2d: // 0d zz zz variable[zz zz] = register2 00471 if (tmpvals >= 0 && tmpvals < (int)m_variables.size()) 00472 { 00473 m_variables[tmpvals] -> value = m_register2; 00474 } 00475 else 00476 { 00477 printf("Bad variable index: %d\n",tmpvals); 00478 } 00479 break; 00480 case 0x2e: // 0e xx yy register2 = call method yy on object type xx 00481 m_register2 = call_method(objx, prop); 00482 break; 00483 case 0x2f: // 0f xx yy assign property yy on object xx the value of register2 00484 set_property(objx, prop, m_register2); 00485 break; 00486 00487 case 0x32: 00488 m_register1 = !m_register2; 00489 break; 00490 case 0x33: // neq 00491 m_register1 = m_register1 != m_register2; 00492 break; 00493 case 0x34: // and 00494 m_register1 = m_register1 && m_register2; 00495 break; 00496 case 0x35: // or 00497 m_register1 = m_register1 || m_register2; 00498 break; 00499 00500 case 0x81: // 81 zz zz Jmp +/- zz zz bytes ( zz zz == %04X ) 00501 Jump(tmpvals); 00502 break; 00503 case 0x82: // 82 xx yy loop init: get list yy from object xx 00504 // m_loop 00505 // m_loop_iterator = m_loop -> begin() 00506 // m_loop_init 00507 // bodylen 00508 // loop end = m_ptr + bodylen 00509 if (objx == ROBOTOBJECT_ROBOT && prop == 4) 00510 { 00511 if (m_robot) 00512 { 00513 m_loop = &m_robot -> GetInventory(); 00514 m_loop_iterator = m_loop -> begin(); 00515 m_loop_init = true; 00516 } 00517 } 00518 break; 00519 case 0x83: // 83 zz zz variable[zz zz] = loop object, increase loop iterator 00520 if (m_loop_init) 00521 { 00522 if (tmpvals >= 0 && tmpvals < (int)m_variables.size()) 00523 { 00524 if (m_loop_iterator != m_loop -> end()) 00525 { 00526 m_variables[tmpvals] -> object = *m_loop_iterator; 00527 m_loop_iterator++; 00528 m_register1 = 1; 00529 } 00530 else 00531 { 00532 m_register1 = 0; 00533 m_loop_init = false; 00534 } 00535 } 00536 else 00537 { 00538 printf("Bad variable index: %d\n",tmpvals); 00539 } 00540 } 00541 break; 00542 case 0x84: // 84 ret - End of Program 00543 break; 00544 00545 default: 00546 return 0; 00547 } 00548 return opcode; 00549 }
void CodeTool::Jump | ( | short | ) |
long CodeTool::get_property | ( | int | , | |
int | ||||
) |
Definition at line 567 of file CodeTool.cpp.
References Robot::get_property(), m_robot, ROBOTOBJECT_GUN, ROBOTOBJECT_RADAR, ROBOTOBJECT_ROBOT, ROBOTOBJECT_SHIELDS, and ROBOTOBJECT_TURRET.
Referenced by Execute().
00568 { 00569 if (!m_robot) 00570 return 0; 00571 switch (obj) 00572 { 00573 case ROBOTOBJECT_ROBOT: 00574 return m_robot -> get_property( prop ); 00575 case ROBOTOBJECT_RADAR: 00576 return m_robot -> PartRadar().get_property( prop ); 00577 case ROBOTOBJECT_TURRET: 00578 return m_robot -> PartTurret().get_property( prop ); 00579 case ROBOTOBJECT_GUN: 00580 return m_robot -> PartGun().get_property( prop ); 00581 case ROBOTOBJECT_SHIELDS: 00582 return m_robot -> PartShields().get_property( prop ); 00583 } 00584 printf("Bad object: %d\n",obj); 00585 return 0; 00586 }
void CodeTool::set_property | ( | int | , | |
int | , | |||
long | ||||
) |
Definition at line 589 of file CodeTool.cpp.
References m_robot, ROBOTOBJECT_GUN, ROBOTOBJECT_RADAR, ROBOTOBJECT_ROBOT, ROBOTOBJECT_SHIELDS, ROBOTOBJECT_TURRET, and Robot::set_property().
Referenced by Execute().
00590 { 00591 if (!m_robot) 00592 return; 00593 switch (obj) 00594 { 00595 case ROBOTOBJECT_ROBOT: 00596 m_robot -> set_property( prop, value ); 00597 break; 00598 case ROBOTOBJECT_RADAR: 00599 m_robot -> PartRadar().set_property( prop, value ); 00600 break; 00601 case ROBOTOBJECT_TURRET: 00602 m_robot -> PartTurret().set_property( prop, value ); 00603 break; 00604 case ROBOTOBJECT_GUN: 00605 m_robot -> PartGun().set_property( prop, value ); 00606 break; 00607 case ROBOTOBJECT_SHIELDS: 00608 m_robot -> PartShields().set_property( prop, value ); 00609 break; 00610 default: 00611 printf("Bad object: %d\n",obj); 00612 } 00613 }
long CodeTool::call_method | ( | int | , | |
int | ||||
) |
Definition at line 616 of file CodeTool.cpp.
References Robot::call_method(), m_robot, m_stack, ROBOTOBJECT_GUN, ROBOTOBJECT_RADAR, ROBOTOBJECT_ROBOT, ROBOTOBJECT_SHIELDS, and ROBOTOBJECT_TURRET.
Referenced by Execute().
00617 { 00618 if (!m_robot) 00619 return 0; 00620 switch (obj) 00621 { 00622 case ROBOTOBJECT_ROBOT: 00623 return m_robot -> call_method( method, m_stack ); 00624 case ROBOTOBJECT_RADAR: 00625 return m_robot -> PartRadar().call_method( method, m_stack ); 00626 case ROBOTOBJECT_TURRET: 00627 return m_robot -> PartTurret().call_method( method, m_stack ); 00628 case ROBOTOBJECT_GUN: 00629 return m_robot -> PartGun().call_method( method, m_stack ); 00630 case ROBOTOBJECT_SHIELDS: 00631 return m_robot -> PartShields().call_method( method, m_stack ); 00632 } 00633 printf("Bad object: %d\n",obj); 00634 return 0; 00635 }
RobotXMLFile& CodeTool::m_config [private] |
Robot* CodeTool::m_robot [private] |
Definition at line 38 of file CodeTool.h.
Referenced by call_method(), Execute(), get_property(), set_property(), and SetRobot().
size_t CodeTool::m_codesize [private] |
Definition at line 39 of file CodeTool.h.
Referenced by CodeTool(), Execute(), GetCode(), GetCodesize(), and Sane().
unsigned char* CodeTool::m_code [private] |
Definition at line 40 of file CodeTool.h.
Referenced by CodeTool(), Execute(), GetBuf(), GetCode(), Sane(), and ~CodeTool().
std::map<std::string,int> CodeTool::m_methodmap [private] |
std::string CodeTool::m_opcode[256] [private] |
int CodeTool::m_opsize[256] [private] |
Definition at line 43 of file CodeTool.h.
Referenced by CodeTool(), Execute(), GetOpsize(), and Sane().
std::vector<VARIABLE *> CodeTool::m_variables [private] |
size_t CodeTool::m_ptr [private] |
long CodeTool::m_register1 [private] |
long CodeTool::m_register2 [private] |
stack_v CodeTool::m_stack [private] |
std::vector<MapObject *>* CodeTool::m_loop [private] |
std::vector<MapObject *>::iterator CodeTool::m_loop_iterator [private] |
bool CodeTool::m_loop_init [private] |