Beispiel #1
0
        /// <summary>
        /// Emit instantiation and initialization of NamingContext. Leaves reference to new NamingContext on the top of evaluation stack.
        /// </summary>
        /// <param name="il"></param>
        /// <param name="currentNamespace">Namespace to be passed as current namespace to the new instance of <see cref="NamingContext"/>.</param>
        /// <param name="aliases">Aliases to be passed to the new instance of <see cref="NamingContext"/>.</param>
        internal static void EmitNewNamingContext(Emit.ILEmitter/*!*/il, QualifiedName? currentNamespace, Dictionary<string, QualifiedName> aliases)
        {
            if (!NeedsNamingContext(currentNamespace, aliases))
            {
                il.Emit(OpCodes.Ldnull);
                return;
            }

            //
            // new NamingContext( currentNamespace.NamespacePhpName, aliases.Count )

            if (currentNamespace.HasValue && currentNamespace.Value.Namespaces.Length > 0)
                il.Emit(OpCodes.Ldstr, currentNamespace.Value.NamespacePhpName);
            else
                il.Emit(OpCodes.Ldnull);

            il.LdcI4((aliases != null) ? aliases.Count : 0);

            il.Emit(OpCodes.Newobj, Constructors.NamingContext);

            // tmp.AddAlias( aliases[i].Key, aliases[i].Value.NamespacePhpName
            if (aliases != null)
            {
                foreach (var alias in aliases)
                {
                    il.Emit(OpCodes.Dup);                                   // the NamingContext instance
                    il.Emit(OpCodes.Ldstr, alias.Key);                      // alias
                    il.Emit(OpCodes.Ldstr, alias.Value.ToString());         // qualifiedName
                    il.Emit(OpCodes.Call, Methods.NamingContext.AddAlias);  // AddAlias( <alias>, <qualifiedName> )
                }
            }

        }