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