int asCRestore::Save() { unsigned long i, count; // structTypes[] count = module->structTypes.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteObjectTypeDeclaration(module->structTypes[i]); } // usedTypeIndices[] count = module->usedTypes.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteObjectType(module->usedTypes[i]); } // scriptGlobals[] count = module->scriptGlobals.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) WriteProperty(module->scriptGlobals[i]); // globalMem size (can restore data using @init()) count = module->globalMem.GetLength(); WRITE_NUM(count); // globalVarPointers[] WriteGlobalVarPointers(); // initFunction WriteFunction(&module->initFunction); // scriptFunctions[] count = module->scriptFunctions.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) WriteFunction(module->scriptFunctions[i]); // stringConstants[] count = module->stringConstants.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) WriteString(module->stringConstants[i]); // importedFunctions[] and bindInformations[] count = module->importedFunctions.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteFunction(module->importedFunctions[i]); WRITE_NUM(module->bindInformations[i].importFrom); } // usedTypeIds[] WriteUsedTypeIds(); return asSUCCESS; }
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); WriteGlobalVarPointers(func); // TODO: Write variables // TODO: Store script section index }
int asCRestore::Save() { unsigned long i, count; // Store everything in the same order that the builder parses scripts // Store enums count = (asUINT)module->enumTypes.GetLength(); WRITE_NUM(count); for( i = 0; i < count; i++ ) { WriteObjectTypeDeclaration(module->enumTypes[i], false); WriteObjectTypeDeclaration(module->enumTypes[i], true); } // Store type declarations first count = (asUINT)module->classTypes.GetLength(); WRITE_NUM(count); for( i = 0; i < count; i++ ) { // Store only the name of the class/interface types WriteObjectTypeDeclaration(module->classTypes[i], false); } // Now store all interface methods for( i = 0; i < count; i++ ) { if( module->classTypes[i]->IsInterface() ) WriteObjectTypeDeclaration(module->classTypes[i], true); } // Then store the class methods, properties, and behaviours for( i = 0; i < count; ++i ) { if( !module->classTypes[i]->IsInterface() ) WriteObjectTypeDeclaration(module->classTypes[i], true); } // Store typedefs count = (asUINT)module->typeDefs.GetLength(); WRITE_NUM(count); for( i = 0; i < count; i++ ) { WriteObjectTypeDeclaration(module->typeDefs[i], false); WriteObjectTypeDeclaration(module->typeDefs[i], true); } // scriptGlobals[] count = (asUINT)module->scriptGlobals.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) WriteGlobalProperty(module->scriptGlobals[i]); // globalVarPointers[] WriteGlobalVarPointers(); // scriptFunctions[] count = 0; for( i = 0; i < module->scriptFunctions.GetLength(); i++ ) if( module->scriptFunctions[i]->objectType == 0 ) count++; WRITE_NUM(count); for( i = 0; i < module->scriptFunctions.GetLength(); ++i ) if( module->scriptFunctions[i]->objectType == 0 ) WriteFunction(module->scriptFunctions[i]); // globalFunctions[] count = (int)module->globalFunctions.GetLength(); WRITE_NUM(count); for( i = 0; i < count; i++ ) { WriteFunction(module->globalFunctions[i]); } // initFunction count = module->initFunction ? 1 : 0; WRITE_NUM(count); if( module->initFunction ) WriteFunction(module->initFunction); // stringConstants[] count = (asUINT)module->stringConstants.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) WriteString(module->stringConstants[i]); // importedFunctions[] and bindInformations[] count = (asUINT)module->importedFunctions.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteFunction(module->importedFunctions[i]); WriteString(&module->bindInformations[i]->importFromModule); } // usedTypes[] count = (asUINT)usedTypes.GetLength(); WRITE_NUM(count); for( i = 0; i < count; ++i ) { WriteObjectType(usedTypes[i]); } // usedTypeIds[] WriteUsedTypeIds(); // usedFunctions[] WriteUsedFunctions(); // usedGlobalProperties[] WriteUsedGlobalProps(); // TODO: Store script section names return asSUCCESS; }