]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - prvm_execprogram.h
re-optimize the IQM model loader somewhat by not allocating and copying
[xonotic/darkplaces.git] / prvm_execprogram.h
index d8d3e14071145c3906e46f2a20d1ae9c9ad3713c..4d872f64bf4e72c09d0afba93c0910e6b24aa488 100644 (file)
@@ -1,10 +1,12 @@
 #ifdef PRVMTIMEPROFILING 
 #define PreError() \
+       prog->xstatement = st - prog->statements; \
        tm = Sys_DoubleTime(); \
        prog->xfunction->profile += (st - startst); \
        prog->xfunction->tprofile += (tm - starttm);
 #else
 #define PreError() \
+       prog->xstatement = st - prog->statements; \
        prog->xfunction->profile += (st - startst);
 #endif
 
                                        PRVM_ERROR("%s attempted to write to an out of bounds edict (%i)", PRVM_NAME, OPB->_int);
                                        goto cleanup;
                                }
-                               if (OPB->_int < prog->progs->entityfields && !prog->allowworldwrites)
-                                       Con_DPrintf("WARNING: assignment to world.%s (field %i) in %s\n", PRVM_GetString(PRVM_ED_FieldAtOfs(OPB->_int)->s_name), OPB->_int, PRVM_NAME);
+                               if (OPB->_int < prog->entityfields && !prog->allowworldwrites)
+                               {
+                                       prog->xstatement = st - prog->statements;
+                                       VM_Warning("assignment to world.%s (field %i) in %s\n", PRVM_GetString(PRVM_ED_FieldAtOfs(OPB->_int)->s_name), OPB->_int, PRVM_NAME);
+                               }
                                ptr = (prvm_eval_t *)(prog->edictsfields + OPB->_int);
                                ptr->_int = OPA->_int;
                                break;
                                        PRVM_ERROR("%s attempted to write to an out of bounds edict (%i)", PRVM_NAME, OPB->_int);
                                        goto cleanup;
                                }
-                               if (OPB->_int < prog->progs->entityfields && !prog->allowworldwrites)
-                                       Con_DPrintf("WARNING: assignment to world.%s (field %i) in %s\n", PRVM_GetString(PRVM_ED_FieldAtOfs(OPB->_int)->s_name), OPB->_int, PRVM_NAME);
+                               if (OPB->_int < prog->entityfields && !prog->allowworldwrites)
+                               {
+                                       prog->xstatement = st - prog->statements;
+                                       VM_Warning("assignment to world.%s (field %i) in %s\n", PRVM_GetString(PRVM_ED_FieldAtOfs(OPB->_int)->s_name), OPB->_int, PRVM_NAME);
+                               }
                                ptr = (prvm_eval_t *)(prog->edictsfields + OPB->_int);
                                ptr->ivector[0] = OPA->ivector[0];
                                ptr->ivector[1] = OPA->ivector[1];
                                        PRVM_ERROR ("%s Progs attempted to address an out of bounds edict number", PRVM_NAME);
                                        goto cleanup;
                                }
-                               if ((unsigned int)(OPB->_int) >= (unsigned int)(prog->progs->entityfields))
+                               if ((unsigned int)(OPB->_int) >= (unsigned int)(prog->entityfields))
                                {
                                        PreError();
                                        PRVM_ERROR("%s attempted to address an invalid field (%i) in an edict", PRVM_NAME, OPB->_int);
                                        PRVM_ERROR ("%s Progs attempted to read an out of bounds edict number", PRVM_NAME);
                                        goto cleanup;
                                }
-                               if ((unsigned int)(OPB->_int) >= (unsigned int)(prog->progs->entityfields))
+                               if ((unsigned int)(OPB->_int) >= (unsigned int)(prog->entityfields))
                                {
                                        PreError();
                                        PRVM_ERROR("%s attempted to read an invalid field in an edict (%i)", PRVM_NAME, OPB->_int);
                                        PRVM_ERROR ("%s Progs attempted to read an out of bounds edict number", PRVM_NAME);
                                        goto cleanup;
                                }
-                               if (OPB->_int < 0 || OPB->_int + 2 >= prog->progs->entityfields)
+                               if (OPB->_int < 0 || OPB->_int + 2 >= prog->entityfields)
                                {
                                        PreError();
                                        PRVM_ERROR("%s attempted to read an invalid field in an edict (%i)", PRVM_NAME, OPB->_int);
                                // and entity, string, field values can never have that value
                                {
                                        prog->xfunction->profile += (st - startst);
-                                       st += st->b - 1;        // offset the s++
+                                       st = prog->statements + st->jumpabsolute - 1;   // offset the st++
                                        startst = st;
                                        // no bounds check needed, it is done when loading progs
                                        if (++jumpcount == 10000000 && prvm_runawaycheck)
                                // and entity, string, field values can never have that value
                                {
                                        prog->xfunction->profile += (st - startst);
-                                       st += st->b - 1;        // offset the s++
+                                       st = prog->statements + st->jumpabsolute - 1;   // offset the st++
                                        startst = st;
                                        // no bounds check needed, it is done when loading progs
                                        if (++jumpcount == 10000000 && prvm_runawaycheck)
 
                        case OP_GOTO:
                                prog->xfunction->profile += (st - startst);
-                               st += st->a - 1;        // offset the s++
+                               st = prog->statements + st->jumpabsolute - 1;   // offset the st++
                                startst = st;
                                // no bounds check needed, it is done when loading progs
                                if (++jumpcount == 10000000 && prvm_runawaycheck)
                                if (!OPA->function)
                                        PRVM_ERROR("NULL function in %s", PRVM_NAME);
 
-                               if(!OPA->function || OPA->function >= (unsigned int)prog->progs->numfunctions)
+                               if(!OPA->function || OPA->function >= (unsigned int)prog->numfunctions)
                                {
                                        PreError();
                                        PRVM_ERROR("%s CALL outside the program", PRVM_NAME);
                                prog->xfunction->profile += (st - startst);
                                prog->xstatement = st - prog->statements;
 
-                               prog->globals.generic[OFS_RETURN] = prog->globals.generic[(unsigned short) st->a];
-                               prog->globals.generic[OFS_RETURN+1] = prog->globals.generic[(unsigned short) st->a+1];
-                               prog->globals.generic[OFS_RETURN+2] = prog->globals.generic[(unsigned short) st->a+2];
+                               prog->globals.generic[OFS_RETURN] = prog->globals.generic[st->operand[0]];
+                               prog->globals.generic[OFS_RETURN+1] = prog->globals.generic[st->operand[0]+1];
+                               prog->globals.generic[OFS_RETURN+2] = prog->globals.generic[st->operand[0]+2];
 
                                st = prog->statements + PRVM_LeaveFunction();
                                startst = st;
                        case OP_STATE:
                                if(prog->flag & PRVM_OP_STATE)
                                {
-                                       ed = PRVM_PROG_TO_EDICT(PRVM_GLOBALFIELDVALUE(prog->globaloffsets.self)->edict);
-                                       PRVM_EDICTFIELDVALUE(ed,prog->fieldoffsets.nextthink)->_float = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.time)->_float + 0.1;
-                                       PRVM_EDICTFIELDVALUE(ed,prog->fieldoffsets.frame)->_float = OPA->_float;
-                                       PRVM_EDICTFIELDVALUE(ed,prog->fieldoffsets.think)->function = OPB->function;
+                                       ed = PRVM_PROG_TO_EDICT(PRVM_gameglobaledict(self));
+                                       PRVM_gameedictfloat(ed,nextthink) = PRVM_gameglobalfloat(time) + 0.1;
+                                       PRVM_gameedictfloat(ed,frame) = OPA->_float;
+                                       PRVM_gameedictfunction(ed,think) = OPB->function;
                                }
                                else
                                {