/// <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> ) } } }