protected MethodGenerator(NativeCompiler compiler, SmalltalkClass cls, MethodDictionary methods)
     : base(compiler)
 {
     if (cls == null)
     {
         throw new ArgumentNullException("cls");
     }
     if (methods == null)
     {
         throw new ArgumentNullException("methods");
     }
     this.Class   = cls;
     this.Methods = methods;
     this.LiteralEncodingStrategy         = new NativeLiteralEncodingStrategy(this);
     this.DynamicCallStrategy             = new NativeDynamicCallStrategy(this);
     this.DiscreteBindingEncodingStrategy = new NativeDiscreteBindingEncodingStrategy(this);
 }
Example #2
0
        /// <summary>
        /// Generate a class named ".Initializers.ScopeName_Initializers" and in it,
        /// generate a method representing each initializer expression for the
        /// initializers (class, global (variable/constant), pool item (variable/constant) and program).
        /// </summary>
        private void GenerateInitializers()
        {
            // Type named ".Initializers.ScopeName_Initializers" to contain the initializers.
            this.InitializersTypeBuilder = this.Compiler.NativeGenerator.DefineType(
                this.Compiler.GetTypeName("Initializers", String.Format("{0}_Initializers", this.ScopeName)),
                typeof(Object),
                TypeAttributes.Class | TypeAttributes.NotPublic | TypeAttributes.Sealed | TypeAttributes.Abstract);

            NativeStrategyClient                  nativeStrategyClient            = new NativeStrategyClient(this.Compiler, this.InitializersTypeBuilder);
            NativeLiteralEncodingStrategy         literalEncodingStrategy         = new NativeLiteralEncodingStrategy(nativeStrategyClient);
            NativeDynamicCallStrategy             dynamicCallStrategy             = new NativeDynamicCallStrategy(nativeStrategyClient);
            NativeDiscreteBindingEncodingStrategy discreteBindingEncodingStrategy = new NativeDiscreteBindingEncodingStrategy(nativeStrategyClient);

            HashSet <string> names = new HashSet <string>();

            foreach (InitializerGenerator generator in this.Initializers)
            {
                generator.GenerateInitializerMethod(this.InitializersTypeBuilder, literalEncodingStrategy, dynamicCallStrategy, discreteBindingEncodingStrategy, names);
            }

            literalEncodingStrategy.GenerateTypes();
            dynamicCallStrategy.GenerateTypes();
            discreteBindingEncodingStrategy.GenerateTypes();
        }
Example #3
0
        protected override InitializerCompiler GetInitializerCompiler(NativeLiteralEncodingStrategy literalEncodingStrategy, NativeDynamicCallStrategy dynamicCallStrategy, NativeDiscreteBindingEncodingStrategy discreteBindingEncodingStrategy)
        {
            BindingScope globalScope   = BindingScope.ForClassInitializer((SmalltalkClass)this.Initializer.Binding.Value, this.Compiler.Parameters.Runtime.GlobalScope);
            BindingScope reservedScope = ReservedScope.ForClassInitializer();

            return(this.GetInitializerCompiler(globalScope, reservedScope, literalEncodingStrategy, dynamicCallStrategy, discreteBindingEncodingStrategy));
        }
 protected abstract Expression <Func <object, ExecutionContext, object> > GenerateInitializerLambda(NativeLiteralEncodingStrategy literalEncodingStrategy, NativeDynamicCallStrategy dynamicCallStrategy, NativeDiscreteBindingEncodingStrategy discreteBindingEncodingStrategy, string name);
        /// <summary>
        /// Generate initializer methods with the logic of each initializer.
        /// Those are contained in a class named ".Initializers.ScopeName_Initializers".
        /// </summary>
        internal void GenerateInitializerMethod(TypeBuilder type, NativeLiteralEncodingStrategy literalEncodingStrategy, NativeDynamicCallStrategy dynamicCallStrategy, NativeDiscreteBindingEncodingStrategy discreteBindingEncodingStrategy, ISet <string> names)
        {
            string name = this.GetInitializerName(names);

            this.MethodName = name;
            MethodBuilder method = type.DefineMethod(name, MethodAttributes.Public | MethodAttributes.Static);
            var           lambda = this.GenerateInitializerLambda(literalEncodingStrategy, dynamicCallStrategy, discreteBindingEncodingStrategy, name);

            if (this.Compiler.NativeGenerator.DebugInfoGenerator == null)
            {
                lambda.CompileToMethod(method);
            }
            else
            {
                lambda.CompileToMethod(method, this.Compiler.NativeGenerator.DebugInfoGenerator);
            }
        }
Example #6
0
        protected override InitializerCompiler GetInitializerCompiler(NativeLiteralEncodingStrategy literalEncodingStrategy, NativeDynamicCallStrategy dynamicCallStrategy, NativeDiscreteBindingEncodingStrategy discreteBindingEncodingStrategy)
        {
            PoolBinding poolBinding = this.Compiler.Parameters.Runtime.GlobalScope.GetPoolBinding(this.Initializer.PoolName);

            if ((poolBinding == null) || (poolBinding.Value == null))
            {
                throw new Exception(String.Format("Cannot find pool named {0}", this.Initializer.PoolName)); // May be better exception type
            }
            BindingScope globalScope   = BindingScope.ForPoolInitializer(poolBinding.Value, this.Compiler.Parameters.Runtime.GlobalScope);
            BindingScope reservedScope = ReservedScope.ForPoolInitializer();

            return(this.GetInitializerCompiler(globalScope, reservedScope, literalEncodingStrategy, dynamicCallStrategy, discreteBindingEncodingStrategy));
        }