public void Emit(Token errorAt, OpCode opcode, ScriptObjWriter method) { if (method == null) { throw new ArgumentNullException("method"); } objFileWriter.Write((byte)ScriptObjWriterCode.EmitMethodInt); WriteOpCode(errorAt, opcode); objFileWriter.Write(method.methName); }
public void Emit(Token errorAt, OpCode opcode, ScriptObjWriter method) { }
/** * @brief Fill in ScriptObjCode from an YEngine object file. * 'objFileReader' is a serialized form of the CIL code we generated * 'asmFileWriter' is where we write the disassembly to (or null if not wanted) * 'srcFileWriter' is where we write the decompilation to (or null if not wanted) * Throws an exception if there is any error (theoretically). */ public ScriptObjCode(BinaryReader objFileReader, TextWriter asmFileWriter, TextWriter srcFileWriter) { // Check version number to make sure we know how to process file contents. char[] ocm = objFileReader.ReadChars(ScriptCodeGen.OBJECT_CODE_MAGIC.Length); if (new String(ocm) != ScriptCodeGen.OBJECT_CODE_MAGIC) { throw new CVVMismatchException("Not an Yengine object file (bad magic)"); } int cvv = objFileReader.ReadInt32(); if (cvv != ScriptCodeGen.COMPILED_VERSION_VALUE) { throw new CVVMismatchException( "Object version is " + cvv.ToString() + " but accept only " + ScriptCodeGen.COMPILED_VERSION_VALUE.ToString()); } // Fill in simple parts of scriptObjCode object. sourceHash = objFileReader.ReadString(); glblSizes.ReadFromFile(objFileReader); int nStates = objFileReader.ReadInt32(); stateNames = new string[nStates]; for (int i = 0; i < nStates; i++) { stateNames[i] = objFileReader.ReadString(); if (asmFileWriter != null) { asmFileWriter.WriteLine(" state[{0}] = {1}", i, stateNames[i]); } } if (asmFileWriter != null) { glblSizes.WriteAsmFile(asmFileWriter, "numGbl"); } string gblName; while ((gblName = objFileReader.ReadString()) != "") { string gblType = objFileReader.ReadString(); int gblIndex = objFileReader.ReadInt32(); Dictionary <int, string> names; if (!globalVarNames.TryGetValue(gblType, out names)) { names = new Dictionary <int, string>(); globalVarNames.Add(gblType, names); } names.Add(gblIndex, gblName); if (asmFileWriter != null) { asmFileWriter.WriteLine(" {0} = {1}[{2}]", gblName, gblType, gblIndex); } } // Read in script-defined types. sdObjTypesName = new Dictionary <string, TokenDeclSDType>(); sdDelTypes = new Dictionary <Type, string>(); int maxIndex = -1; while ((gblName = objFileReader.ReadString()) != "") { TokenDeclSDType sdt = TokenDeclSDType.ReadFromFile(sdObjTypesName, gblName, objFileReader, asmFileWriter); sdObjTypesName.Add(gblName, sdt); if (maxIndex < sdt.sdTypeIndex) { maxIndex = sdt.sdTypeIndex; } if (sdt is TokenDeclSDTypeDelegate) { sdDelTypes.Add(sdt.GetSysType(), gblName); } } sdObjTypesIndx = new TokenDeclSDType[maxIndex + 1]; foreach (TokenDeclSDType sdt in sdObjTypesName.Values) { sdObjTypesIndx[sdt.sdTypeIndex] = sdt; } // Now fill in the methods (the hard part). scriptEventHandlerTable = new ScriptEventHandler[nStates, (int)ScriptEventCode.Size]; dynamicMethods = new Dictionary <string, DynamicMethod>(); scriptSrcLocss = new Dictionary <string, KeyValuePair <int, ScriptSrcLoc>[]>(); ObjectTokens objectTokens = null; if (asmFileWriter != null) { objectTokens = new OTDisassemble(this, asmFileWriter); } else if (srcFileWriter != null) { objectTokens = new OTDecompile(this, srcFileWriter); } try { ScriptObjWriter.CreateObjCode(sdObjTypesName, objFileReader, this, objectTokens); } finally { if (objectTokens != null) { objectTokens.Close(); } } // We enter all script event handler methods in the ScriptEventHandler table. // They are named: <statename> <eventname> foreach (KeyValuePair <string, DynamicMethod> kvp in dynamicMethods) { string methName = kvp.Key; int i = methName.IndexOf(' '); if (i < 0) { continue; } string stateName = methName.Substring(0, i); string eventName = methName.Substring(++i); int stateCode; for (stateCode = stateNames.Length; --stateCode >= 0;) { if (stateNames[stateCode] == stateName) { break; } } int eventCode = (int)Enum.Parse(typeof(ScriptEventCode), eventName); scriptEventHandlerTable[stateCode, eventCode] = (ScriptEventHandler)kvp.Value.CreateDelegate(typeof(ScriptEventHandler)); } // Fill in all script-defined class vtables. foreach (TokenDeclSDType sdt in sdObjTypesIndx) { if ((sdt != null) && (sdt is TokenDeclSDTypeClass)) { TokenDeclSDTypeClass sdtc = (TokenDeclSDTypeClass)sdt; sdtc.FillVTables(this); } } }