示例#1
0
        internal MethodEntry(MonoSymbolFile file, CompileUnitEntry comp_unit, int token, ScopeVariable[] scope_vars, LocalVariableEntry[] locals, LineNumberEntry[] lines, CodeBlockEntry[] code_blocks, string real_name, MethodEntry.Flags flags, int namespace_id)
        {
            this.SymbolFile       = file;
            this.real_name        = real_name;
            this.locals           = locals;
            this.code_blocks      = code_blocks;
            this.scope_vars       = scope_vars;
            this.flags            = flags;
            this.index            = -1;
            this.Token            = token;
            this.CompileUnitIndex = comp_unit.Index;
            this.CompileUnit      = comp_unit;
            this.NamespaceID      = namespace_id;
            this.CheckLineNumberTable(lines);
            this.lnt             = new LineNumberTable(file, lines);
            file.NumLineNumbers += lines.Length;
            int num_locals = (locals != null) ? locals.Length : 0;

            if (num_locals <= 32)
            {
                for (int i = 0; i < num_locals; i++)
                {
                    string nm = locals[i].Name;
                    for (int j = i + 1; j < num_locals; j++)
                    {
                        if (locals[j].Name == nm)
                        {
                            flags |= MethodEntry.Flags.LocalNamesAmbiguous;
                            goto IL_108;
                        }
                    }
                }
                IL_108 :;
            }
            else
            {
                Dictionary <string, LocalVariableEntry> local_names = new Dictionary <string, LocalVariableEntry>();
                for (int k = 0; k < locals.Length; k++)
                {
                    LocalVariableEntry local = locals[k];
                    if (local_names.ContainsKey(local.Name))
                    {
                        flags |= MethodEntry.Flags.LocalNamesAmbiguous;
                        break;
                    }
                    local_names.Add(local.Name, local);
                }
            }
        }
示例#2
0
		internal MethodEntry(MonoSymbolFile file, CompileUnitEntry comp_unit, int token, ScopeVariable[] scope_vars, LocalVariableEntry[] locals, LineNumberEntry[] lines, CodeBlockEntry[] code_blocks, string real_name, MethodEntry.Flags flags, int namespace_id)
		{
			this.SymbolFile = file;
			this.real_name = real_name;
			this.locals = locals;
			this.code_blocks = code_blocks;
			this.scope_vars = scope_vars;
			this.flags = flags;
			this.index = -1;
			this.Token = token;
			this.CompileUnitIndex = comp_unit.Index;
			this.CompileUnit = comp_unit;
			this.NamespaceID = namespace_id;
			this.CheckLineNumberTable(lines);
			this.lnt = new LineNumberTable(file, lines);
			file.NumLineNumbers += lines.Length;
			int num_locals = (locals != null) ? locals.Length : 0;
			if (num_locals <= 32)
			{
				for (int i = 0; i < num_locals; i++)
				{
					string nm = locals[i].Name;
					for (int j = i + 1; j < num_locals; j++)
					{
						if (locals[j].Name == nm)
						{
							flags |= MethodEntry.Flags.LocalNamesAmbiguous;
							goto IL_108;
						}
					}
				}
				IL_108:;
			}
			else
			{
				Dictionary<string, LocalVariableEntry> local_names = new Dictionary<string, LocalVariableEntry>();
				for (int k = 0; k < locals.Length; k++)
				{
					LocalVariableEntry local = locals[k];
					if (local_names.ContainsKey(local.Name))
					{
						flags |= MethodEntry.Flags.LocalNamesAmbiguous;
						break;
					}
					local_names.Add(local.Name, local);
				}
			}
		}
        public MethodEntry DefineMethod(CompileUnitEntry comp_unit, int token,
                                        ScopeVariable[] scope_vars, LocalVariableEntry[] locals,
                                        LineNumberEntry[] lines, CodeBlockEntry[] code_blocks,
                                        string real_name, MethodEntry.Flags flags,
                                        int namespace_id)
        {
            if (reader != null)
            {
                throw new InvalidOperationException();
            }

            MethodEntry method = new MethodEntry(
                this, comp_unit, token, scope_vars, locals, lines, code_blocks,
                real_name, flags, namespace_id);

            AddMethod(method);
            return(method);
        }
示例#4
0
		internal MethodEntry(MonoSymbolFile file, MyBinaryReader reader, int index)
		{
			this.SymbolFile = file;
			this.index = index;
			this.Token = reader.ReadInt32();
			this.DataOffset = reader.ReadInt32();
			this.LineNumberTableOffset = reader.ReadInt32();
			long old_pos = reader.BaseStream.Position;
			reader.BaseStream.Position = (long)this.DataOffset;
			this.CompileUnitIndex = reader.ReadLeb128();
			this.LocalVariableTableOffset = reader.ReadLeb128();
			this.NamespaceID = reader.ReadLeb128();
			this.CodeBlockTableOffset = reader.ReadLeb128();
			this.ScopeVariableTableOffset = reader.ReadLeb128();
			this.RealNameOffset = reader.ReadLeb128();
			this.flags = (MethodEntry.Flags)reader.ReadLeb128();
			reader.BaseStream.Position = old_pos;
			this.CompileUnit = file.GetCompileUnit(this.CompileUnitIndex);
		}
示例#5
0
        internal MethodEntry(MonoSymbolFile file, MyBinaryReader reader, int index)
        {
            this.SymbolFile            = file;
            this.index                 = index;
            this.Token                 = reader.ReadInt32();
            this.DataOffset            = reader.ReadInt32();
            this.LineNumberTableOffset = reader.ReadInt32();
            long old_pos = reader.BaseStream.Position;

            reader.BaseStream.Position    = (long)this.DataOffset;
            this.CompileUnitIndex         = reader.ReadLeb128();
            this.LocalVariableTableOffset = reader.ReadLeb128();
            this.NamespaceID              = reader.ReadLeb128();
            this.CodeBlockTableOffset     = reader.ReadLeb128();
            this.ScopeVariableTableOffset = reader.ReadLeb128();
            this.RealNameOffset           = reader.ReadLeb128();
            this.flags = (MethodEntry.Flags)reader.ReadLeb128();
            reader.BaseStream.Position = old_pos;
            this.CompileUnit           = file.GetCompileUnit(this.CompileUnitIndex);
        }