Esempio n. 1
0
		public PInvokeInfo (MethodDefinition meth, PInvokeAttributes attrs,
			string entryPoint, ModuleReference mod) : this (meth)
		{
			m_attributes = attrs;
			m_entryPoint = entryPoint;
			m_module = mod;
		}
Esempio n. 2
0
 internal static CilModuleReference Create(ModuleReference moduleReference, ref CilReaders readers, int token)
 {
     CilModuleReference reference = new CilModuleReference();
     reference._readers = readers;
     reference._moduleReference = moduleReference;
     reference._token = token;
     return reference;
 }
Esempio n. 3
0
File: DDG.cs Progetto: pdiemi/PTVS
        private bool TryImportModule(string modName, bool forceAbsolute, out ModuleReference moduleRef, out IReadOnlyList <string> remainingParts)
        {
            moduleRef      = null;
            remainingParts = null;

            if (ProjectState.Limits.CrossModule > 0 &&
                ProjectState.ModulesByFilename.Count > ProjectState.Limits.CrossModule)
            {
                // too many modules loaded, disable cross module analysis by blocking
                // scripts from seeing other modules.
                return(false);
            }

            var candidates = ModuleResolver.ResolvePotentialModuleNames(_unit.ProjectEntry, modName, forceAbsolute).ToArray();

            foreach (var name in candidates)
            {
                if (ProjectState.Modules.TryImport(name, out moduleRef))
                {
                    return(true);
                }
            }

            foreach (var name in candidates)
            {
                moduleRef = null;
                foreach (var part in ModulePath.GetParents(name, includeFullName: true))
                {
                    if (ProjectState.Modules.TryImport(part, out var mref))
                    {
                        moduleRef = mref;
                        if (part.Length < name.Length)
                        {
                            moduleRef.Module?.Imported(_unit);
                        }
                    }
                    else if (moduleRef != null)
                    {
                        Debug.Assert(moduleRef.Name.Length + 1 < name.Length, $"Expected {name} to be a child of {moduleRef.Name}");
                        if (moduleRef.Name.Length + 1 < name.Length)
                        {
                            remainingParts = name.Substring(moduleRef.Name.Length + 1).Split('.');
                        }
                        return(true);
                    }
                    else
                    {
                        break;
                    }
                }
            }
            return(moduleRef?.Module != null);
        }
        public override string GetModuleDocumentation(ModuleReference modRef)
        {
            var contents = $"module {modRef.Name}";
            var doc      = modRef.Module?.Documentation;

            if (!string.IsNullOrEmpty(doc))
            {
                doc       = LimitLines(modRef.Module.Documentation);
                contents += $"{Environment.NewLine}{Environment.NewLine}{doc}";
            }
            return(contents);
        }
Esempio n. 5
0
        /// <summary>
        /// Adds a single module reference to the buffer.
        /// </summary>
        /// <param name="reference">The reference to add.</param>
        /// <returns>The new metadata token assigned to the module reference.</returns>
        public MetadataToken GetModuleReferenceToken(ModuleReference reference)
        {
            AssertIsImported(reference);

            var table = Metadata.TablesStream.GetTable <ModuleReferenceRow>(TableIndex.ModuleRef);

            var row   = new ModuleReferenceRow(Metadata.StringsStream.GetStringIndex(reference.Name));
            var token = table.Add(row);

            AddCustomAttributes(token, reference);
            return(token);
        }
Esempio n. 6
0
 internal void WriteModuleRef(ModuleReference moduleRef)
 {
     if (moduleRef.UpdateRowOnRebuild)
     {
         object[] parts = new object[]
         {
             GetHeapOffset(newStringsHeap, newStringsHeap.GetStringOffset(moduleRef.Name)),
         };
         moduleRef.MetaDataRow = new MetaDataRow(parts);
     }
     writer.Write(moduleRef.MetaDataRow.GenerateBytes());
 }
Esempio n. 7
0
        private bool TryImportModule(string modName, bool forceAbsolute, out ModuleReference moduleRef, out IReadOnlyList <string> remainingParts)
        {
            moduleRef      = null;
            remainingParts = null;

            if (ProjectState.Limits.CrossModule > 0 &&
                ProjectState.ModulesByFilename.Count > ProjectState.Limits.CrossModule)
            {
                // too many modules loaded, disable cross module analysis by blocking
                // scripts from seeing other modules.
                return(false);
            }

            var candidates = ModuleResolver.ResolvePotentialModuleNames(_unit.ProjectEntry, modName, forceAbsolute).ToArray();

            foreach (var name in candidates)
            {
                ModuleReference modRef;

                bool          gotAllParents = true;
                AnalysisValue lastParent    = null;
                remainingParts = name.Split('.');
                foreach (var part in ModulePath.GetParents(name, includeFullName: false))
                {
                    if (!ProjectState.Modules.TryImport(part, out modRef))
                    {
                        gotAllParents = false;
                        break;
                    }
                    moduleRef = modRef;
                    (lastParent as BuiltinModule)?.AddChildModule(remainingParts[0], moduleRef.AnalysisModule);
                    lastParent     = moduleRef.AnalysisModule;
                    remainingParts = remainingParts.Skip(1).ToArray();
                }

                if (gotAllParents && ProjectState.Modules.TryImport(name, out modRef))
                {
                    moduleRef = modRef;
                    (lastParent as BuiltinModule)?.AddChildModule(remainingParts[0], moduleRef.AnalysisModule);
                    _unit.DeclaringModule.AddModuleReference(moduleRef);
                    remainingParts = null;
                    return(true);
                }
            }

            if (moduleRef?.Module != null)
            {
                _unit.DeclaringModule.AddModuleReference(moduleRef);
                return(true);
            }
            return(false);
        }
Esempio n. 8
0
        private CodeFrame ReadObjectFile(ModuleReference mod, FileInfo fi)
        {
            var obj = new ObjectFileReader(fi.ToModuleFileInfo());

            try
            {
                return(obj.Read());
            }
            catch
            {
                return(null);
            }
        }
Esempio n. 9
0
        public override string GetModuleDocumentation(ModuleReference modRef)
        {
            var prefix   = modRef.AnalysisModule?.PythonType?.IsBuiltin == true ? "built-in module " : "module ";
            var contents = $"{prefix} {modRef.Name}";
            var doc      = modRef.Module?.Documentation;

            if (!string.IsNullOrEmpty(doc))
            {
                doc       = LimitLines(modRef.Module.Documentation);
                contents += $"{Environment.NewLine}{Environment.NewLine}{doc}";
            }
            return(contents);
        }
Esempio n. 10
0
        public void ImportModuleReference()
        {
            var assembly = NetAssemblyFactory.CreateAssembly(DummyAssemblyName, true);
            var image    = assembly.NetDirectory.MetadataHeader.LockMetadata();
            var importer = new ReferenceImporter(image);

            var module    = new ModuleReference("SomeModule");
            var newModule = importer.ImportModule(module);

            Assert.NotSame(module, newModule);
            Assert.Equal(image, newModule.Image);
            Assert.Equal(newModule.Name, newModule.Name);
        }
Esempio n. 11
0
        /// <summary>
        /// Determines whether two module references are considered equal according to their signature.
        /// </summary>
        /// <param name="reference1">The first module to compare.</param>
        /// <param name="reference2">The second module to compare.</param>
        /// <returns><c>True</c> if the module references are considered equal, <c>False</c> otherwise.</returns>
        public bool Equals(ModuleReference reference1, ModuleReference reference2)
        {
            if (reference1 == null && reference2 == null)
            {
                return(true);
            }
            if (reference1 == null || reference2 == null)
            {
                return(false);
            }

            return(reference1.Name == reference2.Name);
        }
Esempio n. 12
0
        private static ModuleReference GetOrAddModuleReference(ModuleDefinition module, string name)
        {
            var alreadyExistingModule = module.ModuleReferences.FirstOrDefault(x => x.Name == name);

            if (alreadyExistingModule != null)
            {
                return(alreadyExistingModule);
            }
            var newModule = new ModuleReference(name);

            module.ModuleReferences.Add(newModule);
            return(newModule);
        }
Esempio n. 13
0
        public void PersistentScope()
        {
            var map = Lookup(nameof(PlatformInvoke.ExternalMethod));

            var newModule = new ModuleReference("SomeOtherDll.dll");

            map.MemberForwarded.Module.ModuleReferences.Add(newModule);
            map.Scope = newModule;

            var newMap = RebuildAndLookup(map);

            Assert.Equal(newModule.Name, newMap.Scope.Name);
        }
Esempio n. 14
0
        public override object Deserialize(Cell _data, ConversionContext _context = null)
        {
            if (_context == null)
            {
                throw new ArgumentNullException("_context");
            }

            object          data      = base.Deserialize(_data);
            ModuleReference moduleRef = null;

            if (data == null)
            {
                moduleRef = new ModuleReference();
            }
            else
            {
                moduleRef = data as ModuleReference;

                if (moduleRef == null)
                {
                    moduleRef = new ModuleReference();
                }
            }

            if (!_context.Field.Metadata.IsLoaded)
            {
                _context.Field.Metadata.Load();
            }
            // grab the module id from the field metadata
            var fieldMetadata = _context.Field.Metadata.FirstOrDefault(m => m.Key == ModuleRepository.ModuleReferenceMetadataKey);

            if (fieldMetadata == null ||
                String.IsNullOrWhiteSpace(fieldMetadata.Value))
            {
                // metadata not found
                return(null);
            }

            // at this point, we should have a JSON string containing the referenced module id
            int id;

            if (!Int32.TryParse(fieldMetadata.Value.Trim("\"".ToCharArray()), out id))
            {
                // unable to parse the referenced module id
                return(null);
            }

            moduleRef.ModuleId = id;

            return(moduleRef);
        }
Esempio n. 15
0
    private MethodDefinition CopyMethod(MethodDefinition templateMethod, bool makePrivate = false)
    {
        var attributes = templateMethod.Attributes;

        if (makePrivate)
        {
            attributes &= ~Mono.Cecil.MethodAttributes.Public;
            attributes |= Mono.Cecil.MethodAttributes.Private;
        }
        var returnType = Resolve(templateMethod.ReturnType);
        var newMethod  = new MethodDefinition(templateMethod.Name, attributes, returnType)
        {
            IsPInvokeImpl = templateMethod.IsPInvokeImpl,
            IsPreserveSig = templateMethod.IsPreserveSig,
        };

        if (templateMethod.IsPInvokeImpl)
        {
            var moduleRef = ModuleDefinition.ModuleReferences.FirstOrDefault(mr => mr.Name == templateMethod.PInvokeInfo.Module.Name);
            if (moduleRef == null)
            {
                moduleRef = new ModuleReference(templateMethod.PInvokeInfo.Module.Name);
                ModuleDefinition.ModuleReferences.Add(moduleRef);
            }
            newMethod.PInvokeInfo = new PInvokeInfo(templateMethod.PInvokeInfo.Attributes, templateMethod.PInvokeInfo.EntryPoint, moduleRef);
        }

        if (templateMethod.Body != null)
        {
            newMethod.Body.InitLocals = templateMethod.Body.InitLocals;
            foreach (var variableDefinition in templateMethod.Body.Variables)
            {
                var newVariableDefinition = new VariableDefinition(Resolve(variableDefinition.VariableType));
                //newVariableDefinition.Name = variableDefinition.Name;
                newMethod.Body.Variables.Add(newVariableDefinition);
            }
            CopyInstructions(templateMethod, newMethod);
            CopyExceptionHandlers(templateMethod, newMethod);
        }
        foreach (var parameterDefinition in templateMethod.Parameters)
        {
            var newParameterDefinition = new ParameterDefinition(Resolve(parameterDefinition.ParameterType))
            {
                Name = parameterDefinition.Name
            };
            newMethod.Parameters.Add(newParameterDefinition);
        }

        _targetType.Methods.Add(newMethod);
        return(newMethod);
    }
Esempio n. 16
0
        MethodDefinition CreateExternalMethod(MethodReference mr, string library, ModuleReference referredLibrary)
        {
            MethodDefinition md = new MethodDefinition(mr.Name,
                                                       MethodAttributes.PInvokeImpl | MethodAttributes.HideBySig | MethodAttributes.Private |
                                                       MethodAttributes.Static, mr.ReturnType.ReturnType);

            foreach (ParameterDefinition pd in mr.Parameters)
            {
                md.Parameters.Add(pd);
            }
            md.PInvokeInfo = new PInvokeInfo(md,
                                             PInvokeAttributes.CharSetAnsi | PInvokeAttributes.CallConvCdecl, md.Name, referredLibrary);
            return(md);
        }
        public PlatformSpecificHelpersTypeAdder(IMetadataHost host, ITypeDefinition typeDef, ITypeReference marshalClass)
        {
            var libc = new ModuleReference
            {
                ModuleIdentity = new ModuleIdentity(host.NameTable.GetNameFor("libc"), "unknown://location")
            };

            var libdl = new ModuleReference
            {
                ModuleIdentity = new ModuleIdentity(host.NameTable.GetNameFor("libdl"), "unknown://location")
            };

            var libSystem = new ModuleReference
            {
                ModuleIdentity = new ModuleIdentity(host.NameTable.GetNameFor("libSystem"), "unknown://location")
            };

            var kernel32 = new ModuleReference
            {
                ModuleIdentity = new ModuleIdentity(host.NameTable.GetNameFor("kernel32"), "unknown://location")
            };

            var linux   = CreateUnixSpecificHelpers(host, typeDef, "linux_", "dlopen", "dlclose", "dlsym", libdl, PInvokeCallingConvention.CDecl);
            var darwin  = CreateUnixSpecificHelpers(host, typeDef, "darwin_", "dlopen", "dlclose", "dlsym", libSystem, PInvokeCallingConvention.CDecl);
            var bsd     = CreateUnixSpecificHelpers(host, typeDef, "bsd_", "dlopen", "dlclose", "dlsym", libc, PInvokeCallingConvention.CDecl);
            var windows = CreateWindowsHelpers(host, typeDef, "windows_", "LoadLibrary", "FreeLibrary", "GetProcAddress", kernel32, PInvokeCallingConvention.WinApi);
            var unix    = CreateUnixHelpers(host, typeDef, marshalClass, linux, darwin, bsd, libc);

            this.WindowsLoaderMethods = new WindowsLoaderMethods
            {
                LoadLibrary    = windows[0],
                FreeLibrary    = windows[1],
                GetProcAddress = windows[2]
            };

            this.UnixLoaderMethods = new UnixLoaderMethods
            {
                LoadLibrary    = unix[0],
                FreeLibrary    = unix[1],
                GetProcAddress = unix[2]
            };

            this.Methods = new List <IMethodDefinition>();
            this.Methods.AddRange(linux);
            this.Methods.AddRange(darwin);
            this.Methods.AddRange(bsd);
            this.Methods.AddRange(windows);
            this.Methods.AddRange(unix);
        }
Esempio n. 18
0
        public Uri?TryGetLocalModuleEntryPointPath(Uri parentModuleUri, ModuleReference reference, out DiagnosticBuilder.ErrorBuilderDelegate?failureBuilder)
        {
            var typed = ConvertReference(reference);

            var localUri = fileResolver.TryResolveFilePath(parentModuleUri, typed.Path);

            if (localUri is not null)
            {
                failureBuilder = null;
                return(localUri);
            }

            failureBuilder = x => x.FilePathCouldNotBeResolved(typed.Path, parentModuleUri.LocalPath);
            return(null);
        }
Esempio n. 19
0
        public ModuleReference convert(ModuleReference modRef)
        {
            foreach (var modModRef in module.ModuleReferences)
            {
                if (modModRef.Name == modRef.Name)
                {
                    return(modModRef);
                }
            }

            var newModRef = new ModuleReference(modRef.Name);

            module.ModuleReferences.Add(newModRef);
            return(newModRef);
        }
Esempio n. 20
0
        private ModuleReference ModuleReferenceFor(string name)
        {
            foreach (var reference in _module_definition.ModuleReferences)
            {
                if (reference.Name == name)
                {
                    return(reference);
                }
            }

            var module = new ModuleReference(name);

            _module_definition.ModuleReferences.Add(module);
            return(module);
        }
Esempio n. 21
0
 public static ModuleReference lookup(ModuleDefinition module, ModuleReference other, string errorMessage)
 {
     if (other == null)
     {
         return(null);
     }
     foreach (var modRef in module.ModuleReferences)
     {
         if (modRef.MetadataToken.ToInt32() == other.MetadataToken.ToInt32())
         {
             return(modRef);
         }
     }
     throw new ApplicationException(errorMessage);
 }
Esempio n. 22
0
 /// <summary>
 /// Finishes importing a module or module member.
 /// </summary>
 /// <param name="module">
 /// The imported module, as returned from TryImportModule.
 /// </param>
 /// <param name="attribute">
 /// Attribute within the module to resolve, already split at
 /// dots, as returned from TryImportModule.
 /// </param>
 /// <param name="importAs">
 /// The name to save the imported module or member under.
 /// </param>
 /// <param name="node">
 /// If <paramref name="addRef"/> is true, this node will be
 /// added as a reference of the imported value.
 /// </param>
 /// <param name="addRef">
 /// True to add <paramref name="node"/> as a reference of the
 /// imported value.
 /// </param>
 private void FinishImportModuleOrMember(ModuleReference module, IReadOnlyList <string> attribute, string name, bool addRef, Node node, NameExpression nameReference)
 {
     if (AssignImportedModuleOrMember(
             name,
             GetImportedModuleOrMember(module, attribute, addRef, node, nameReference, attribute?.Count == 1 ? name : null),
             addRef,
             node,
             nameReference
             ))
     {
         // Imports into our global scope need to enqueue modules that have imported us
         if (Scope == GlobalScope.Scope)
         {
             GlobalScope.ModuleDefinition.EnqueueDependents();
         }
     }
 }
Esempio n. 23
0
        public static ICollection <ModuleReference> GetModulesDependingOn(ICollection <TypeReference> typesDependingOn)
        {
            HashSet <ModuleReference> result = new HashSet <ModuleReference>();

            foreach (TypeReference type in typesDependingOn)
            {
                if (type.Scope is ModuleReference && !(type.Scope is AssemblyNameReference || type.Scope is ModuleDefinition))
                {
                    ModuleReference module = type.Scope as ModuleReference;
                    if (!result.Contains(module))
                    {
                        result.Add(module);
                    }
                }
            }

            return(result);
        }
Esempio n. 24
0
        internal AssemblyInformation GetOrAddAssembly(
            ModuleReference moduleReference)
        {
            if (moduleReference == null)
            {
                return(default(AssemblyInformation));
            }

            lock (assemblyByModule)
            {
                if (!assemblyByModule.TryGetValue(moduleReference, out var assemblyDefinition))
                {
                    assemblyDefinition = ((ModuleDefinition)moduleReference).Assembly;
                    assemblyByModule.Add(moduleReference, assemblyDefinition);
                }
                return(this.GetOrAddAssembly(assemblyDefinition));
            }
        }
Esempio n. 25
0
        public static Reflector.CodeModel.IModuleReference Cecil2Reflector(ModuleReference mr, ModuleDefinition md)
        {
            Reflector.CodeModel.IModule m = Cecil2Reflector(md);
            if (m == null)
            {
                return(null);
            }

            string mrName = mr.Name;

            foreach (Reflector.CodeModel.IModuleReference mrTmp in m.ModuleReferences)
            {
                if (mrTmp.Name == mrName)
                {
                    return(mrTmp);
                }
            }
            return(null);
        }
Esempio n. 26
0
        public override void VisitModuleReference(ModuleReference module)
        {
            string name = module.Name;

            name = name.ToLower();
            if (!BaseAssemblyResolver.OnMono())
            {
                if (!name.EndsWith(".dll"))
                {
                    name += ".dll";
                }
            }

            if (!ModuleReferencesContains(target.MainModule.ModuleReferences, name))
            {
                module.Name = name;
                target.MainModule.ModuleReferences.Add(module);
            }
        }
Esempio n. 27
0
        internal ModuleInformation GetOrAddModule(
            ModuleReference moduleReference)
        {
            if (moduleReference == null)
            {
                return(default(ModuleInformation));
            }

            lock (modules)
            {
                if (!modules.TryGetValue(moduleReference, out var module))
                {
                    var assembly = this.GetOrAddAssembly(moduleReference);
                    module = new ModuleInformation(moduleReference, assembly);
                    modules.Add(moduleReference, module);
                }
                return(module);
            }
        }
Esempio n. 28
0
        public override PInvokeMetadata GetPInvokeMethodMetadata()
        {
            if (!IsPInvoke)
            {
                return(default(PInvokeMetadata));
            }

            MetadataReader metadataReader = MetadataReader;
            MethodImport   import         = metadataReader.GetMethodDefinition(_handle).GetImport();
            string         name           = metadataReader.GetString(import.Name);

            ModuleReference moduleRef  = metadataReader.GetModuleReference(import.Module);
            string          moduleName = metadataReader.GetString(moduleRef.Name);

            // Spot check the enums match
            Debug.Assert((int)MethodImportAttributes.CallingConventionStdCall == (int)PInvokeAttributes.CallingConventionStdCall);
            Debug.Assert((int)MethodImportAttributes.CharSetAuto == (int)PInvokeAttributes.CharSetAuto);
            Debug.Assert((int)MethodImportAttributes.CharSetUnicode == (int)PInvokeAttributes.CharSetUnicode);

            return(new PInvokeMetadata(moduleName, name, (PInvokeAttributes)import.Attributes));
        }
Esempio n. 29
0
        ModuleReference GetModuleReference(ModuleReferenceCollection members, ModuleReference module)
        {
            string name = module.Name;

            name = name.ToLower();
            if (!BaseAssemblyResolver.OnMono())
            {
                if (!name.EndsWith(".dll"))
                {
                    name += ".dll";
                }
            }

            foreach (ModuleReference mr in members)
            {
                if (mr.Name == name)
                {
                    return(mr);
                }
            }
            return(null);
        }
Esempio n. 30
0
        /// <summary>
        /// Checks if the operand calls a native library, via PInvoke.
        /// </summary>
        /// <param name="operand">The operand in question.</param>
        /// <returns>True if the operand is a PInvoke, otherwise false.</returns>
        static bool IsPInvoke(object operand, out ModuleReference nativeLib)
        {
            nativeLib = null;
            // try to cast operand to method definition and check for PInvoke
            var mdef = operand as MethodDefinition;

            if (mdef != null)
            {
                if (mdef.IsPInvokeImpl)
                {
                    logger.Debug("Is PInvoke? {0}", true);
                    if (mdef.PInvokeInfo != null)
                    {
                        nativeLib = mdef.PInvokeInfo.Module;
                        logger.Debug("Native library: {0}", nativeLib.Name);
                    }
                    return(true);
                }
            }

            return(false);
        }
Esempio n. 31
0
        public void Test_Deserialize_ModuleReference()
        {
            // Arrange
            var fakeRepo = new FakeModuleRepository();
            var rowField = fakeRepo.GetRandomCell();

            rowField.Field.Metadata.Add(new FieldMetadata {
                Key   = ModuleRepository.ModuleReferenceMetadataKey,
                Value = "\"" + rowField.Field.Module.Id + "\""
            });

            var value = new ModuleReference()
            {
                Id = rowField.ID
            };
            var converter = FieldValueConversion.GetConverter(value.GetType());
            var field     = new DynamicModuleField {
                Data = value
            };
            var rf = new Cell()
            {
                Data = converter.Serialize(field)
            };

            var retData = converter.Deserialize(rf, new ConversionContext {
                Repository = fakeRepo,
                Field      = rowField.Field,
                Module     = rowField.Field.Module
            });

            // Assert
            Assert.IsNotNull(retData);
            Assert.IsInstanceOfType(retData, typeof(ModuleReference));

            ModuleReference result = (ModuleReference)retData;

            Assert.AreEqual(rowField.Row.ID, result.Id);
        }
Esempio n. 32
0
File: DDG.cs Progetto: xNUTs/PTVS
        private bool TryImportModule(string modName, bool forceAbsolute, out ModuleReference moduleRef)
        {
            if (ProjectState.Limits.CrossModule != null &&
                ProjectState.ModulesByFilename.Count > ProjectState.Limits.CrossModule)
            {
                // too many modules loaded, disable cross module analysis by blocking
                // scripts from seeing other modules.
                moduleRef = null;
                return(false);
            }

            foreach (var name in PythonAnalyzer.ResolvePotentialModuleNames(_unit.ProjectEntry, modName, forceAbsolute))
            {
                foreach (var part in ModulePath.GetParents(name, includeFullName: false))
                {
                    ModuleReference parentRef;
                    if (ProjectState.Modules.TryImport(part, out parentRef))
                    {
                        var bi = parentRef.Module as BuiltinModule;
                        if (bi == null)
                        {
                            break;
                        }
                        bi.Imported(_unit);
                    }
                }

                if (ProjectState.Modules.TryImport(name, out moduleRef))
                {
                    return(true);
                }
            }

            _unit.DeclaringModule.AddUnresolvedModule(modName, forceAbsolute);

            moduleRef = null;
            return(false);
        }
Esempio n. 33
0
    MethodDefinition CopyMethod(MethodDefinition templateMethod, bool makePrivate = false)
    {
        var attributes = templateMethod.Attributes;
        if (makePrivate)
        {
            attributes &= ~Mono.Cecil.MethodAttributes.Public;
            attributes |= Mono.Cecil.MethodAttributes.Private;
        }
        var returnType = Resolve(templateMethod.ReturnType);
        var newMethod = new MethodDefinition(templateMethod.Name, attributes, returnType)
                            {
                                IsPInvokeImpl = templateMethod.IsPInvokeImpl,
                                IsPreserveSig = templateMethod.IsPreserveSig,
                            };
        if (templateMethod.IsPInvokeImpl)
        {
            var moduleRef = ModuleDefinition.ModuleReferences.FirstOrDefault(mr => mr.Name == templateMethod.PInvokeInfo.Module.Name);
            if (moduleRef == null)
            {
                moduleRef = new ModuleReference(templateMethod.PInvokeInfo.Module.Name);
                ModuleDefinition.ModuleReferences.Add(moduleRef);
            }
            newMethod.PInvokeInfo = new PInvokeInfo(templateMethod.PInvokeInfo.Attributes, templateMethod.PInvokeInfo.EntryPoint, moduleRef);
        }

        if (templateMethod.Body != null)
        {
            newMethod.Body.InitLocals = templateMethod.Body.InitLocals;
            foreach (var variableDefinition in templateMethod.Body.Variables)
            {
                var newVariableDefinition = new VariableDefinition(Resolve(variableDefinition.VariableType));
                newVariableDefinition.Name = variableDefinition.Name;
                newMethod.Body.Variables.Add(newVariableDefinition);
            }
            CopyInstructions(templateMethod, newMethod);
            CopyExceptionHandlers(templateMethod, newMethod);
        }
        foreach (var parameterDefinition in templateMethod.Parameters)
        {
            var newParameterDefinition = new ParameterDefinition(Resolve(parameterDefinition.ParameterType));
            newParameterDefinition.Name = parameterDefinition.Name;
            newMethod.Parameters.Add(newParameterDefinition);
        }

        targetType.Methods.Add(newMethod);
        return newMethod;
    }
Esempio n. 34
0
 public void RemoveModuleReference(ModuleReference moduleRef) {
     if (_referencedModules.Remove(moduleRef)) {
         moduleRef.RemoveReference(this);
     }
 }
    MethodDefinition CopyMethod(MethodDefinition templateMethod)
    {
        var returnType = Resolve(templateMethod.ReturnType);
        var newMethod = new MethodDefinition(templateMethod.Name, templateMethod.Attributes, returnType)
                            {
                                IsPInvokeImpl = templateMethod.IsPInvokeImpl,
                                IsPreserveSig = templateMethod.IsPreserveSig,
                            };
        if (templateMethod.IsPInvokeImpl)
        {
            var moduleRef = new ModuleReference(templateMethod.PInvokeInfo.Module.Name);
            Module.ModuleReferences.Add(moduleRef);
            newMethod.PInvokeInfo = new PInvokeInfo(templateMethod.PInvokeInfo.Attributes, templateMethod.PInvokeInfo.EntryPoint, moduleRef);
        }

        if (templateMethod.Body != null)
        {
            newMethod.Body.InitLocals = templateMethod.Body.InitLocals;
            foreach (var variableDefinition in templateMethod.Body.Variables)
            {
                newMethod.Body.Variables.Add(new VariableDefinition(Resolve(variableDefinition.VariableType)));
            }
            CopyInstructions(templateMethod, newMethod);
            CopyExceptionHandlers(templateMethod, newMethod);

        }
        foreach (var parameterDefinition in templateMethod.Parameters)
        {
            newMethod.Parameters.Add(new ParameterDefinition(Resolve(parameterDefinition.ParameterType)));
        }

        targetType.Methods.Add(newMethod);
        return newMethod;
    }
Esempio n. 36
0
        public void Write(ModuleWriter writer)
        {
            // Create the header.
            ModuleHeader header = new ModuleHeader();

            // Populate it.

            // Store the module type.
            header.moduleType = (uint)moduleType;

            // Write the header.
            header.Write(writer);

            // Prepare the members.
            globalNamespace.PrepareSerialization();
            foreach(ScopeMember instance in genericInstances)
                instance.PrepareSerialization();

            // Prepare type referemnces.
            PrepareTypeReferences();

            // Prepare resource writing.
            PrepareResources();

            // Prepare debug information.
            DebugEmitter debugEmitter = null;
            if(debugBuild)
            {
                debugEmitter = new DebugEmitter(this);
                debugEmitter.Prepare();
                globalNamespace.PrepareDebug(debugEmitter);
            }

            // Don't allow registering members.
            writingModule = true;

            // Write the members.
            header.memberTableOffset = writer.GetPosition();
            foreach(ScopeMember member in memberTable)
            {
                // Write local members, and a pointer for the externals.
                ChelaModule memberModule = member.GetModule();
                if(memberModule == this)
                {
                    member.Write(writer);
                }
                else
                {
                    // Don't write external generic instances.
                    if(member.GetGenericInstance() != null)
                        throw new ModuleException("Write external generic instance.");

                    // Create the member reference header.
                    MemberHeader mheader = new MemberHeader();
                    mheader.memberSize = 1;
                    mheader.memberName = RegisterString(member.GetFullName()); // TODO: Use mangled name.
                    mheader.memberType = (byte)MemberHeaderType.Reference;

                    // Write the reference header and module id.
                    mheader.Write(writer);
                    writer.Write((byte)AddReference(memberModule));
                }
            }
            header.memberTableSize = writer.GetPosition() - header.memberTableOffset;

            // Write module references.
            header.moduleRefTableOffset = writer.GetPosition();
            header.moduleRefTableEntries = (uint) (referencedModules.Count + 1);

            // Write myself.
            ModuleReference modRef = new ModuleReference();
            modRef.moduleName = RegisterString(GetName());
            modRef.Write(writer);

            // Write module references.
            foreach(ChelaModule mod in referencedModules)
            {
                modRef.moduleName = RegisterString(mod.GetName());
                modRef.Write(writer);
            }

            // Write the libraries table.
            header.libTableOffset = writer.GetPosition();
            header.libTableEntries = (uint)nativeLibraries.Count;
            foreach(string libname in nativeLibraries)
                writer.Write(RegisterString(libname));

            // Write the anonymous types.
            header.anonTypeTableOffset = writer.GetPosition();
            WriteAnonType(writer);
            header.anonTypeTableSize = writer.GetPosition() - header.anonTypeTableOffset;

            // Write the type table.
            header.typeTableOffset = writer.GetPosition();
            header.typeTableEntries = (uint)typeTable.Count;
            TypeReference typeRef = new TypeReference();
            foreach(IChelaType type in typeTable)
            {
                // Write the type kind.
                if(type.IsTypeInstance())
                    typeRef.typeKind = (byte)TypeKind.Instance;
                else if(type.IsStructure())
                    typeRef.typeKind = (byte)TypeKind.Structure;
                else if(type.IsClass())
                    typeRef.typeKind = (byte)TypeKind.Class;
                else if(type.IsInterface())
                    typeRef.typeKind = (byte)TypeKind.Interface;
                else if(type.IsFunction())
                    typeRef.typeKind = (byte)TypeKind.Function;
                else if(type.IsReference())
                    typeRef.typeKind = (byte)TypeKind.Reference;
                else if(type.IsPointer())
                    typeRef.typeKind = (byte)TypeKind.Pointer;
                else if(type.IsConstant())
                    typeRef.typeKind = (byte)TypeKind.Constant;
                else if(type.IsArray())
                    typeRef.typeKind = (byte)TypeKind.Array;
                else if(type.IsVector())
                    typeRef.typeKind = (byte)TypeKind.Vector;
                else if(type.IsMatrix())
                    typeRef.typeKind = (byte)TypeKind.Matrix;
                else if(type.IsPlaceHolderType())
                    typeRef.typeKind = (byte)TypeKind.PlaceHolder;

                if(!type.IsStructure() && !type.IsClass() && !type.IsInterface() &&
                   !type.IsTypeInstance())
                {
                    // Write a reference into the anonymous types.
                    typeRef.memberId = (uint)anonymousTypeMap[type];
                    typeRef.typeName = 0;//RegisterString(type.GetName());
                }
                else
                {
                    // Write the type member reference.
                    ScopeMember member = (ScopeMember)type;
                    typeRef.memberId = RegisterMember(member);
                    typeRef.typeName = 0;//RegisterString(type.GetName());
                }

                // Write the type reference.
                typeRef.Write(writer);
            }

            // Write the string table.
            header.stringTableOffset = writer.GetPosition();
            header.stringTableEntries = (uint)stringTable.Count;
            foreach(string s in stringTable)
                writer.Write(s);

            // Write the debug info
            if(debugBuild)
            {
                header.debugInfoOffset = writer.GetPosition();
                debugEmitter.Write(writer);
                header.debugInfoSize = writer.GetPosition() - header.debugInfoOffset;
            }

            // Write the resources.
            header.resourceDataOffset = writer.GetPosition();
            WriteResources(writer);
            header.resourceDataSize = writer.GetPosition() - header.resourceDataOffset;

            // Store the module size.
            header.moduleSize = writer.GetPosition();

            // Store the entry point.
            if(mainFunction != null)
                header.entryPoint = mainFunction.GetSerialId();

            // Write the header again.
            writer.MoveBegin();
            header.Write(writer);

            // Allow more modifications from here.
            writingModule = false;
        }
Esempio n. 37
0
 public PInvokeInfo(PInvokeAttributes attributes, string entryPoint, ModuleReference module)
 {
     this.attributes = (ushort) attributes;
     this.entry_point = entryPoint;
     this.module = module;
 }
Esempio n. 38
0
        public void MatchModuleReferencesTest()
        {
            const string name = "somemodule";

            var module1 = new ModuleReference(name);
            var module2 = new ModuleReference(name);
            var module3 = new ModuleReference(name + "1");
            Assert.IsTrue(_comparer.MatchModules(module1, module2));
            Assert.IsFalse(_comparer.MatchModules(module1, module3));
        }
Esempio n. 39
0
 protected virtual void AddReferenceToModule(CompilerOptions options, Module module, string name, string aliases, ErrorNodeList errorNodes, TrivialHashtable previousReferences,
   bool giveErrorsForDuplicateReferences, bool assemblyReference){
   this.AllocateAssemblyCacheIfNeeded();
   Error e = assemblyReference ? Error.NotAnAssembly : Error.NotAModule;
   string aname = name;
   string fname = System.IO.Path.GetFileName(aname);
   string ext = System.IO.Path.GetExtension(fname);
   bool providedDefaultExtension = false;
   if (assemblyReference){
     if (ext.ToLower(CultureInfo.InvariantCulture) != ".dll" && ext.ToLower(CultureInfo.InvariantCulture) != ".exe"){ 
       aname = aname+".dll";
       fname = fname+".dll";
       providedDefaultExtension = true;
     }
   }else{
     if (ext.ToLower(CultureInfo.InvariantCulture) != ".netmodule"){ 
       aname = aname+".netmodule";
       fname = fname+".netmodule";
       providedDefaultExtension = true;
     }
   }
   Module rModule = null;
   if (providedDefaultExtension)
     rModule = this.GetModuleFromReferencedCompilation(name);
   if (rModule == null)
     rModule = this.GetModuleFromReferencedCompilation(aname);
   if (rModule == null){
     e = Error.NoSuchFile;
     if (fname == aname){//Simple name, let compiler probe for it
       if (providedDefaultExtension) {
         aname = this.GetFullyQualifiedNameForReferencedLibrary(options, name);
         if (aname == null)
           aname = this.GetFullyQualifiedNameForReferencedLibrary(options, aname);
       }else
         aname = this.GetFullyQualifiedNameForReferencedLibrary(options, aname);
       if (aname == null) goto error;
     }else{
       if (!System.IO.File.Exists(aname)){
         if (!System.IO.File.Exists(name)) goto error;
         aname = name;
       }
     }
     rModule = Module.GetModule(aname, this.AssemblyCache, !options.MayLockFiles, options.LoadDebugSymbolsForReferencedAssemblies, true);
     if (rModule == null) goto error;
     e = assemblyReference ? Error.NotAnAssembly : Error.NotAModule;
   }
   AssemblyNode rAssem = rModule as AssemblyNode;
   if (rAssem != null){
     if (!assemblyReference) goto error;
   }else{
     if (assemblyReference) goto error;
   }
   Node prevRef = previousReferences[rModule.UniqueKey] as Node;
   AssemblyReference aref = prevRef as AssemblyReference;
   if (prevRef != null) {
     if (aref == null || aliases == null || aliases.Length == 0){
       if (!giveErrorsForDuplicateReferences) return;
       e = assemblyReference ? Error.DuplicateAssemblyReference : Error.DuplicateModuleReference;
       goto error;
     }
   }
   if (assemblyReference){
     if (aref == null) aref = new AssemblyReference(rAssem);
     if (aliases != null && aliases.Length > 0){
       if (aref.Aliases == null) aref.Aliases = new IdentifierList();
       string[] aliasArr = aliases.Split(',');
       foreach (string alias in aliasArr)
         if (alias != null && alias.Length > 0) aref.Aliases.Add(Identifier.For(alias));
     }
     module.AssemblyReferences.Add(aref);
     previousReferences[rModule.UniqueKey] = aref;
   }else{
     ModuleReference mref = new ModuleReference(name, rModule);
     module.ModuleReferences.Add(mref);
     previousReferences[rModule.UniqueKey] = mref;
   }
   return;
 error:
   errorNodes.Add(this.CreateErrorNode(e, name));
 }
 public override ModuleReference VisitModuleReference(ModuleReference moduleReference)
 {
   throw new ApplicationException("unimplemented");
 }
        internal Microsoft.Cci.IModuleReference Translate(ModuleSymbol module)
        {
            if (ReferenceEquals(sourceModule, module))
            {
                return this;
            }

            object reference;

            if (SymbolsMap.TryGetValue(module, out reference))
            {
                return (Microsoft.Cci.IModuleReference)reference;
            }

            Microsoft.Cci.IModuleReference moduleRef;
            AssemblySymbol container = module.ContainingAssembly;

            if (container != null && ReferenceEquals(container.Modules[0], module))
            {
                moduleRef = new AssemblyReference(container);
                SymbolsMap.Add(container, moduleRef);
            }
            else
            {
                moduleRef = new ModuleReference(this, module);
            }

            SymbolsMap.Add(module, moduleRef);

            return moduleRef;
        }
    MethodDefinition CopyMethod(MethodDefinition sourceMethod, TypeDefinition source, TypeDefinition target, bool signatureOnly, bool makePrivate = false)
    {
        var newMethod = (from method in target.Methods
                         where string.Equals(sourceMethod.Name, method.Name)
                         select method).FirstOrDefault();

        var isExistingMethod = (newMethod != null);
        if (!isExistingMethod)
        {
            var attributes = sourceMethod.Attributes;
            if (makePrivate)
            {
                attributes &= ~Mono.Cecil.MethodAttributes.Public;
                attributes |= Mono.Cecil.MethodAttributes.Private;
            }
            var returnType = Resolve(sourceMethod.ReturnType);

            newMethod = new MethodDefinition(sourceMethod.Name, attributes, returnType)
            {
                IsPInvokeImpl = sourceMethod.IsPInvokeImpl,
                IsPreserveSig = sourceMethod.IsPreserveSig,
            };

            if (sourceMethod.IsPInvokeImpl)
            {
                var moduleRef = ModuleDefinition.ModuleReferences.FirstOrDefault(mr => mr.Name == sourceMethod.PInvokeInfo.Module.Name);
                if (moduleRef == null)
                {
                    moduleRef = new ModuleReference(sourceMethod.PInvokeInfo.Module.Name);
                    ModuleDefinition.ModuleReferences.Add(moduleRef);
                }
                newMethod.PInvokeInfo = new PInvokeInfo(sourceMethod.PInvokeInfo.Attributes, sourceMethod.PInvokeInfo.EntryPoint, moduleRef);
            }
        }

        if (!signatureOnly && sourceMethod.Body != null)
        {
            newMethod.Body.InitLocals = sourceMethod.Body.InitLocals;
            foreach (var variableDefinition in sourceMethod.Body.Variables)
            {
                var newVariableDefinition = new VariableDefinition(Resolve(variableDefinition.VariableType));
                newVariableDefinition.Name = variableDefinition.Name;
                newMethod.Body.Variables.Add(newVariableDefinition);
            }
            CopyInstructions(sourceMethod, newMethod, source, target);
            CopyExceptionHandlers(sourceMethod, newMethod);
        }

        if (!isExistingMethod)
        {
            foreach (var parameterDefinition in sourceMethod.Parameters)
            {
                var newParameterDefinition = new ParameterDefinition(Resolve(parameterDefinition.ParameterType));
                newParameterDefinition.Name = parameterDefinition.Name;
                newMethod.Parameters.Add(newParameterDefinition);
            }

            target.Methods.Add(newMethod);
        }

        return newMethod;
    }
Esempio n. 43
0
 public virtual Module GetModuleFor(string modName) {
   if (this.currentModule == null) return null;
   ModuleReferenceList rMods = this.currentModule.ModuleReferences;
   ModuleReference rMod = null;
   if (rMods == null)
     rMods = this.currentModule.ModuleReferences = new ModuleReferenceList();
   else {
     for (int i = 0, n = rMods.Count; i < n; i++) {
       rMod = rMods[i];
       if (rMod == null) continue;
       if (rMod.Name == modName) return rMod.Module;
     }
   }
   Module mod = new Module();
   mod.Name = modName;
   mod.Kind = ModuleKindFlags.UnmanagedDynamicallyLinkedLibrary;
   rMod = new ModuleReference(modName, mod);
   rMods.Add(rMod);
   return mod;
 }
Esempio n. 44
0
 public virtual ModuleReference VisitModuleReference(ModuleReference moduleReference){
   return moduleReference;
 }
Esempio n. 45
0
 public virtual void VisitModuleReference(ModuleReference moduleReference)
 {
 }
Esempio n. 46
0
        /// <summary>
        /// Determines whether two module references are considered equal according to their signature.
        /// </summary>
        /// <param name="reference1">The first module to compare.</param>
        /// <param name="reference2">The second module to compare.</param>
        /// <returns><c>True</c> if the module references are considered equal, <c>False</c> otherwise.</returns>
        public bool MatchModules(ModuleReference reference1, ModuleReference reference2)
        {
            if (reference1 == null && reference2 == null)
                return true;
            if (reference1 == null || reference2 == null)
                return false;

            return reference1.Name == reference2.Name;
        }
Esempio n. 47
0
 /// <summary>
 /// Populates the list of module references.
 /// </summary>
 void LoadModuleReferences()
   //^ ensures this.ModuleReferenceArray != null;
 {
   uint numberOfModuleReferences = this.PEFileReader.ModuleRefTable.NumberOfRows;
   ModuleReference[] moduleRefList = new ModuleReference[numberOfModuleReferences + 1];
   for (uint i = 1; i <= numberOfModuleReferences; ++i) {
     ModuleRefRow moduleRefRow = this.PEFileReader.ModuleRefTable[i];
     IName moduleRefName = this.GetNameFromOffset(moduleRefRow.Name);
     ModuleIdentity moduleIdentity;
     if (this.ContainingAssembly == null) {
       moduleIdentity = new ModuleIdentity(moduleRefName, string.Empty);
     } else {
       moduleIdentity = new ModuleIdentity(moduleRefName, string.Empty, this.ContainingAssembly.AssemblyIdentity);
     }
     ModuleIdentity probedModuleIdentity = this.ModuleReader.metadataReaderHost.ProbeModuleReference(this.Module, moduleIdentity);
     uint internedModuleId = (uint)this.ModuleReader.metadataReaderHost.InternFactory.GetModuleInternedKey(probedModuleIdentity);
     ModuleReference moduleReference = new ModuleReference(this, i, internedModuleId, probedModuleIdentity);
     moduleRefList[i] = moduleReference;
   }
   //^ NonNullType.AssertInitialized(moduleRefList);
   this.ModuleReferenceArray = moduleRefList;
 }
Esempio n. 48
0
    public virtual Differences VisitModuleReference(ModuleReference moduleReference1, ModuleReference moduleReference2){
      Differences differences = new Differences(moduleReference1, moduleReference2);
      if (moduleReference1 == null || moduleReference2 == null){
        if (moduleReference1 != moduleReference2) differences.NumberOfDifferences++; else differences.NumberOfSimilarities++;
        return differences;
      }
      ModuleReference changes = (ModuleReference)moduleReference2.Clone();
      ModuleReference deletions = (ModuleReference)moduleReference2.Clone();
      ModuleReference insertions = (ModuleReference)moduleReference2.Clone();

      if (moduleReference1.Name == moduleReference2.Name) differences.NumberOfSimilarities++; else differences.NumberOfDifferences++;

      if (differences.NumberOfDifferences == 0){
        differences.Changes = null;
        differences.Deletions = null;
        differences.Insertions = null;
      }else{
        differences.Changes = changes;
        differences.Deletions = deletions;
        differences.Insertions = insertions;
      }
      return differences;
    }
Esempio n. 49
0
 //  Caller should lock this.
 internal Module/*?*/ ResolveModuleRefReference(
   ModuleReference moduleReference
 ) {
   //  If this is an assembly try to find in referred modules
   if (this.PEFileReader.IsAssembly) {
     Assembly/*?*/ assem = this.Module as Assembly;
     //^ assert assem != null;
     int moduleKey = moduleReference.ModuleIdentity.Name.UniqueKeyIgnoringCase;
     Module[] containigModules = assem.MemberModules.RawArray;
     for (int i = 0; i < containigModules.Length; ++i) {
       Module mod = containigModules[i];
       if (mod.ModuleName.UniqueKeyIgnoringCase == moduleKey)
         return mod;
     }
   }
   //  If not found or its not an assembly look else where...
   Module/*?*/ module = this.ModuleReader.LookupModule(this.Module, moduleReference.ModuleIdentity);
   return module;
 }
Esempio n. 50
0
        public static ChelaModule LoadModule(ModuleReader reader, bool fullLoad)
        {
            // Try to guess the file type.
            uint moduleStart = reader.GetPosition();
            byte[] signature;
            reader.Read(out signature, 8);

            // Check for elf file type.
            bool isElf = true;
            for(int i = 0; i < 4; ++i)
            {
                if(signature[i] != ElfFormat.ElfMagic[i])
                {
                    isElf = false;
                    break;
                }
            }

            // Check for PE.
            bool isPE = signature[0] == 'M' && signature[1] == 'Z';

            // Find the module content.
            reader.SetPosition(moduleStart);
            if(isElf)
            {
                // Move to the embedded module.
                ElfFormat.GetEmbeddedModule(reader);
                reader.FixBase();
            }
            else if(isPE)
            {
                // Move to the embedded module.
                PEFormat.GetEmbeddedModule(reader);
                reader.FixBase();
            }

            // Read the module header.
            ModuleHeader header = new ModuleHeader();
            header.Read(reader);

            // Create the output module.
            ChelaModule result = new ChelaModule();

            // Read the string table.
            reader.SetPosition(header.stringTableOffset);
            for(uint i = 0; i < header.stringTableEntries; ++i)
            {
                uint id = i+1u;
                string s = reader.ReadString();
                result.stringTable.Add(s);
                result.registeredStrings.Add(s, id);
            }

            // Read myself data.
            ModuleReference modref = new ModuleReference();
            reader.SetPosition(header.moduleRefTableOffset);
            modref.Read(reader);
            result.SetName(result.GetString(modref.moduleName));

            // Read the module type.
            result.moduleType = (ModuleType)header.moduleType;

            // Read the referenced modules.
            for(uint i = 1; i < header.moduleRefTableEntries; ++i)
            {
                // Read the referenced module.
                modref.Read(reader);

                // Load it.
                ChelaModule referencedModule = LoadNamedModule(result.GetString(modref.moduleName));
                result.referencedModules.Add(referencedModule);
            }

            // Preload the members.
            reader.SetPosition(header.memberTableOffset);
            uint end = header.memberTableOffset + header.memberTableSize;
            MemberHeader mheader = new MemberHeader();
            while(reader.GetPosition() < end)
            {
                // Read the member header.
                mheader.Read(reader);

                // Skip the attributes.
                SkipAttributes(reader, mheader.memberAttributes);

                // Preload the member.
                MemberHeaderType mtype = (MemberHeaderType)mheader.memberType;
                switch(mtype)
                {
                case MemberHeaderType.Namespace:
                    Namespace.PreloadMember(result, reader, mheader);
                    break;
                case MemberHeaderType.Structure:
                    Structure.PreloadMember(result, reader, mheader);
                    break;
                case MemberHeaderType.Class:
                    Class.PreloadMember(result, reader, mheader);
                    break;
                case MemberHeaderType.Interface:
                    Interface.PreloadMember(result, reader, mheader);
                    break;
                case MemberHeaderType.Function:
                    Function.PreloadMember(result, reader, mheader);
                    break;
                case MemberHeaderType.Field:
                    FieldVariable.PreloadMember(result, reader, mheader);
                    break;
                case MemberHeaderType.FunctionGroup:
                    FunctionGroup.PreloadMember(result, reader, mheader);
                    break;
                case MemberHeaderType.TypeInstance:
                    StructureInstance.PreloadMember(result, reader, mheader);
                    break;
                case MemberHeaderType.Property:
                    PropertyVariable.PreloadMember(result, reader, mheader);
                    break;
                case MemberHeaderType.Event:
                    EventVariable.PreloadMember(result, reader, mheader);
                    break;
                case MemberHeaderType.TypeName:
                    TypeNameMember.PreloadMember(result, reader, mheader);
                    break;
                case MemberHeaderType.MemberInstance:
                case MemberHeaderType.FunctionInstance:
                    // Ignore the member instance.
                    result.memberTable.Add(null);
                    reader.Skip(mheader.memberSize);
                    break;
                case MemberHeaderType.TypeGroup:
                    TypeGroup.PreloadMember(result, reader, mheader);
                    break;
                case MemberHeaderType.Reference:
                    {
                        // Read the module id.
                        byte moduleId = reader.ReadByte();

                        // Get the referenced module.
                        ChelaModule refMod = result.GetReferenced(moduleId);

                        // Find the member there.
                        ScopeMember member = refMod.GetMember(result.GetString(mheader.memberName));
                        result.memberTable.Add(member);
                    }
                    break;
                default:
                    // Unknown member.
                    System.Console.WriteLine("add unknown member {0}", mtype);
                    result.memberTable.Add(null);
                    reader.Skip(mheader.memberSize);
                    break;
                }
            }

            // Read the type table.
            reader.SetPosition(header.typeTableOffset);
            for(uint i = 0; i < header.typeTableEntries; ++i)
            {
                // Read the type reference.
                TypeReference typeRef = new TypeReference();
                typeRef.Read(reader);

                // Try to load direct members.
                TypeKind kind = (ChelaModule.TypeKind)typeRef.typeKind;
                if(kind == TypeKind.Class || kind == TypeKind.Interface ||
                   kind == TypeKind.Structure || kind == TypeKind.Instance)
                {
                    // Store the actual type.
                    result.typeTable.Add(result.GetMember(typeRef.memberId));
                }
                else
                {
                    // Store the reference for delayed loading.
                    result.typeTable.Add(typeRef);
                }
            }

            // Read the anonymous types.
            reader.SetPosition(header.anonTypeTableOffset);
            end = header.anonTypeTableOffset + header.anonTypeTableSize;
            while(reader.GetPosition() < end)
            {
                // Read the anonymous type data.
                AnonTypeHeader anonType = new AnonTypeHeader();
                anonType.Read(reader);

                // Store it in the anonymous type table.
                result.anonymousTypes.Add(anonType);
            }

            // Now, read the actual members.
            reader.SetPosition(header.memberTableOffset);
            for(int i = 0; i < result.memberTable.Count; ++i)
            {
                // Get the preloaded member.
                ScopeMember member = result.memberTable[i];

                // Read his header.
                mheader.Read(reader);

                // Skip the attributes.
                SkipAttributes(reader, mheader.memberAttributes);

                // Read the member.
                if(member != null && mheader.memberType != (int)MemberHeaderType.Reference)
                    member.Read(reader, mheader);
                else
                    reader.Skip(mheader.memberSize); // Skip unknown members.
            }

            // The first member must be the global namespace.
            result.globalNamespace = (Namespace)result.GetMember(1);

            // Update the parent children relationship.
            result.globalNamespace.UpdateParent(null);

            // Now, perform second read pass, required by function groups.
            reader.SetPosition(header.memberTableOffset);
            for(int i = 0; i < result.memberTable.Count; ++i)
            {
                // Get the preloaded member.
                ScopeMember member = result.memberTable[i];

                // Read his header.
                mheader.Read(reader);

                // Skip the attributes.
                SkipAttributes(reader, mheader.memberAttributes);

                // Read the member.
                if(member != null && mheader.memberType != (int)MemberHeaderType.Reference)
                    member.Read2(reader, mheader);
                else
                    reader.Skip(mheader.memberSize); // Skip unknown members.
            }

            // Finish all of the loading.
            result.globalNamespace.FinishLoad();

            // Register the member names.
            for(int i = 0; i < result.memberTable.Count; ++i)
            {
                ScopeMember member = result.memberTable[i];
                if(member != null)
                    result.memberNameTable[member.GetFullName()] = member;
            }

            // Load the runtime classes.
            if(result.referencedModules.Count == 0)
                result.LoadRuntimeReferences(result);

            // Dump the readed module.
            //result.Dump();

            // Return the result module.
            return result;
        }
Esempio n. 51
0
 public ModuleReference ImportModule(ModuleReference reference)
 {
     var table = _tableStreamBuffer.GetTable<ModuleReference>();
     var newReference = table.FirstOrDefault(x => _signatureComparer.MatchModules(x, reference));
     if (newReference == null)
         table.Add(newReference = new ModuleReference(reference.Name));
     return newReference;
 }
Esempio n. 52
0
 public virtual ModuleReference VisitModuleReference(ModuleReference moduleReference1, ModuleReference moduleReference2)
 {
     return moduleReference1;
 }
Esempio n. 53
0
 public void AddModuleReference(ModuleReference moduleRef) {
     if (moduleRef == null) {
         Debug.Fail("moduleRef should never be null");
         throw new ArgumentNullException("moduleRef");
     }
     _referencedModules.Add(moduleRef);
     moduleRef.AddReference(this);
 }
Esempio n. 54
0
 public virtual ModuleReference VisitModuleReference(ModuleReference moduleReference, ModuleReference changes, ModuleReference deletions, ModuleReference insertions){
   this.UpdateSourceContext(moduleReference, changes);
   if (moduleReference == null) return changes;
   if (changes != null){
     if (deletions == null || insertions == null)
       Debug.Assert(false);
     else{
     }
   }else if (deletions != null)
     return null;
   return moduleReference;
 }
Esempio n. 55
0
 public override ModuleReference VisitModuleReference(ModuleReference moduleReference)
 {
     if (moduleReference == null) return null;
     return base.VisitModuleReference((ModuleReference)moduleReference.Clone());
 }