+ HANDLE_OPCODE(OP_IFNOT):
+ if(!FLOAT_IS_TRUE_FOR_INT(OPA->_int))
+ // TODO add an "int-if", and change this one to OPA->_float
+ // although mostly unneeded, thanks to the only float being false being 0x0 and 0x80000000 (negative zero)
+ // and entity, string, field values can never have that value
+ {
+ ADVANCE_PROFILE_BEFORE_JUMP();
+ st = cached_statements + st->jumpabsolute - 1; // offset the st++
+ startst = st;
+ // no bounds check needed, it is done when loading progs
+ if (++jumpcount == 10000000 && prvm_runawaycheck)
+ {
+ prog->xstatement = st - cached_statements;
+ PRVM_Profile(prog, 1<<30, 1000000, 0);
+ prog->error_cmd("%s runaway loop counter hit limit of %d jumps\ntip: read above for list of most-executed functions", prog->name, jumpcount);
+ }
+ }
+ DISPATCH_OPCODE();
+
+ HANDLE_OPCODE(OP_IF):
+ if(FLOAT_IS_TRUE_FOR_INT(OPA->_int))
+ // TODO add an "int-if", and change this one, as well as the FLOAT_IS_TRUE_FOR_INT usages, to OPA->_float
+ // although mostly unneeded, thanks to the only float being false being 0x0 and 0x80000000 (negative zero)
+ // and entity, string, field values can never have that value
+ {
+ ADVANCE_PROFILE_BEFORE_JUMP();
+ st = cached_statements + st->jumpabsolute - 1; // offset the st++
+ startst = st;
+ // no bounds check needed, it is done when loading progs
+ if (++jumpcount == 10000000 && prvm_runawaycheck)
+ {
+ prog->xstatement = st - cached_statements;
+ PRVM_Profile(prog, 1<<30, 0.01, 0);
+ prog->error_cmd("%s runaway loop counter hit limit of %d jumps\ntip: read above for list of most-executed functions", prog->name, jumpcount);
+ }
+ }
+ DISPATCH_OPCODE();
+
+ HANDLE_OPCODE(OP_GOTO):
+ ADVANCE_PROFILE_BEFORE_JUMP();
+ st = cached_statements + st->jumpabsolute - 1; // offset the st++
+ startst = st;
+ // no bounds check needed, it is done when loading progs
+ if (++jumpcount == 10000000 && prvm_runawaycheck)
+ {
+ prog->xstatement = st - cached_statements;
+ PRVM_Profile(prog, 1<<30, 0.01, 0);
+ prog->error_cmd("%s runaway loop counter hit limit of %d jumps\ntip: read above for list of most-executed functions", prog->name, jumpcount);
+ }
+ DISPATCH_OPCODE();
+
+ HANDLE_OPCODE(OP_CALL0):
+ HANDLE_OPCODE(OP_CALL1):
+ HANDLE_OPCODE(OP_CALL2):
+ HANDLE_OPCODE(OP_CALL3):
+ HANDLE_OPCODE(OP_CALL4):
+ HANDLE_OPCODE(OP_CALL5):
+ HANDLE_OPCODE(OP_CALL6):
+ HANDLE_OPCODE(OP_CALL7):
+ HANDLE_OPCODE(OP_CALL8):
+#ifdef PRVMTIMEPROFILING
+ tm = Sys_DirtyTime();
+ prog->xfunction->tprofile += (tm - starttm >= 0 && tm - starttm < 1800) ? (tm - starttm) : 0;
+ starttm = tm;
+#endif
+ ADVANCE_PROFILE_BEFORE_JUMP();
+ startst = st;
+ prog->xstatement = st - cached_statements;