Code Search for Developers
 
 
  

CompiledModule.cs from p4shelf at Krugle


Show CompiledModule.cs syntax highlighted

/* **********************************************************************************
 *
 * Copyright (c) Microsoft Corporation. All rights reserved.
 *
 * This source code is subject to terms and conditions of the Shared Source License
 * for IronPython. A copy of the license can be found in the License.html file
 * at the root of this distribution. If you can not locate the Shared Source License
 * for IronPython, please send an email to ironpy@microsoft.com.
 * By using this source code in any fashion, you are agreeing to be bound by
 * the terms of the Shared Source License for IronPython.
 *
 * You must not remove this notice, or any other, from this software.
 *
 * **********************************************************************************/

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;

using IronPython.Runtime;
using IronPython.Hosting;
using IronPython.Runtime.Calls;
using IronPython.Runtime.Operations;
using IronPython.Runtime.Types;

namespace IronPython.Compiler {
    /// <summary>
    /// A Python module gets compiled into a CLI assembly which contains a type that inherits from CompiledModule. 
    /// CompiledModule is comparable with CompiledCode since it contains the code for a PythonModule, but not the state 
    /// associated with the module.
    /// Note that a CompiledModule does not directly relate to pre-compiled script code, though it is used
    /// in that context too.
    /// </summary>
    [PythonType(typeof(Dict))]
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
    public abstract class CompiledModule : CustomSymbolDict {

        internal static PythonModule Load(string moduleName, Type compiledModuleType, SystemState state) {
            CompiledModule compiledModule = (CompiledModule)compiledModuleType.GetConstructor(Type.EmptyTypes).Invoke(Ops.EMPTY);
            return compiledModule.Load(moduleName, new InitializeModule(compiledModule.Initialize), state);
        }

        internal PythonModule Load(string moduleName, InitializeModule init, SystemState state) {
            InitializeBuiltins();

            PythonModule pmod = new PythonModule(moduleName, this, state, init);
            this.Module = pmod;
            return pmod;
        }

        // The generated type has a static field to access the PythonModule. This allows quick access from
        // the generated IL.
        internal const string ModuleFieldName = "myModule__py";

        private PythonModule Module {
            get {
                FieldInfo ti = this.GetType().GetField(ModuleFieldName);
                return (PythonModule)ti.GetValue(this);
            }

            set {
                FieldInfo ti = this.GetType().GetField(ModuleFieldName);
                // Multiple PythonEngines do not reuse CompiledModules.
                Debug.Assert(ti.GetValue(this) == null);
                if (ti != null) ti.SetValue(this, value);
            }
        }

        /// <summary>
        /// This is the entry-point which corresponds to the global code of the module.
        /// </summary>
        public abstract void Initialize();

        /// <summary>
        /// This initializes generated static fields representing builtins. Use of static fields enables optimized
        /// access to builtins. 
        /// Also, see StaticFieldBuiltinSlot for how we deal with name clashes between builtins and globals.
        /// </summary>
        internal void InitializeBuiltins() {

            foreach (FieldInfo fi in this.GetType().GetFields()) {
                if (fi.FieldType != typeof(object) && fi.FieldType != typeof(BuiltinWrapper)) continue;
                if (!fi.IsStatic) continue;

                if (fi.Name == "__debug__") {
                    fi.SetValue(null, new BuiltinWrapper(Options.DebugMode, "__debug__"));
                    continue;
                }

                object bi;
                if (TypeCache.Builtin.TryGetSlot(DefaultContext.Default, SymbolTable.StringToId(fi.Name), out bi)) {
                    Debug.Assert(fi.FieldType == typeof(BuiltinWrapper));

                    fi.SetValue(null, new BuiltinWrapper(Ops.GetDescriptor(bi, null, TypeCache.Builtin), fi.Name));
                    continue;
                }

                if (fi.GetValue(null) == null) {
                    Debug.Assert(fi.FieldType == typeof(object));

                    fi.SetValue(null, Uninitialized.instance);
                }
            }
        }

        [PythonClassMethod("fromkeys")]
        public static object fromkeys(DynamicType cls, object seq) {
            return Dict.FromKeys(cls, seq, null);
        }

        [PythonClassMethod("fromkeys")]
        public static object fromkeys(DynamicType cls, object seq, object value) {
            return Dict.FromKeys(cls, seq, value);
        }

    }
}




See more files for this project here

p4shelf

A feature in Visual Studio Team Studio that was immediately appealing to me was shelving. The goal of this tool is replicate that general functionality in Perforce.

Project homepage: http://code.google.com/p/p4shelf/
Programming language(s): C#,C++,Python
License: gpl2

  AST/
    Binder.cs
    ClassDef.cs
    Expressions.cs
    FlowChecker.cs
    FuncDef.Generated.cs
    FuncDef.cs
    Node.cs
    Operator.Generated.cs
    Operator.cs
    ScopeStatement.Generated.cs
    ScopeStatement.cs
    Statements.cs
    Walker.Generated.cs
  Generation/
    AssemblyGen.cs
    CodeGen.cs
    EnvironmentFactory.cs
    EnvironmentNamespace.cs
    EnvironmentReference.cs
    Namespace.cs
    NewSubtypeMaker.cs
    NewTypeMaker.cs
    OutputGenerator.cs
    Slot.cs
    SlotFactory.cs
    TypeGen.cs
    UserTypeGenerator.cs
  CompiledModule.cs
  CompilerContext.cs
  CompilerHelpers.cs
  MethodBinder.cs
  MethodTracker.cs
  NameConverter.cs
  NameEnv.cs
  NewTypeInfo.cs
  Options.cs
  Parser.cs
  ParserSink.cs
  Token.cs
  TokenKind.Generated.cs
  Tokenizer.Generated.cs
  Tokenizer.cs