void asCRestore::WriteFunction(asCScriptFunction* func) { char c; // If there is no function, then store a null char if( func == 0 ) { c = '\0'; WRITE_NUM(c); return; } // First check if the function has been saved already for( asUINT f = 0; f < savedFunctions.GetLength(); f++ ) { if( savedFunctions[f] == func ) { c = 'r'; WRITE_NUM(c); WRITE_NUM(f); return; } } // Keep a reference to the function in the list savedFunctions.PushLast(func); c = 'f'; WRITE_NUM(c); asUINT i, count; WriteFunctionSignature(func); count = (asUINT)func->byteCode.GetLength(); WRITE_NUM(count); WriteByteCode(func->byteCode.AddressOf(), count); count = (asUINT)func->objVariablePos.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteObjectType(func->objVariableTypes[i]); WRITE_NUM(func->objVariablePos[i]); } WRITE_NUM(func->stackNeeded); asUINT length = (asUINT)func->lineNumbers.GetLength(); WRITE_NUM(length); for( i = 0; i < length; ++i ) WRITE_NUM(func->lineNumbers[i]); WRITE_NUM(func->vfTableIdx); // TODO: Write variables // TODO: Store script section index }
void asCRestore::WriteUsedFunctions() { asUINT count = (asUINT)usedFunctions.GetLength(); WRITE_NUM(count); for( asUINT n = 0; n < usedFunctions.GetLength(); n++ ) { char c; // Write enough data to be able to uniquely identify the function upon load // Is the function from the module or the application? c = usedFunctions[n]->module ? 'm' : 'a'; WRITE_NUM(c); WriteFunctionSignature(usedFunctions[n]); } }