internal override void WriteTo(CCodeWriterBase c) { CCodeWriterBase.SetLocalObjectIDGenerator(); // get actual statements var statements = Statements; if (statements.Count == 1 && statements.First().Kind == Kinds.BlockStatement) { var blockStatement = statements.First() as BlockStatement; if (blockStatement != null) { var block = blockStatement.Statements as Block; if (block != null) { statements = block.Statements; } } } var extraLocalDecls = this.SanitizeCode(statements); var skip = 0; ////if (this.MethodSymbol.MethodKind == MethodKind.Constructor) ////{ //// skip = ConstructorInitializer(c, statements); ////} c.NewLine(); c.OpenBlock(); foreach (var localDecl in extraLocalDecls) { var loadState = localDecl.Suppressed; localDecl.Suppressed = false; localDecl.WriteTo(c); localDecl.Suppressed = loadState; } if (MethodSymbol.MethodKind == MethodKind.StaticConstructor) { c.TextSpanNewLine("_cctor_being_called = true;"); } foreach (var statement in statements.Skip(skip)) { if (MethodSymbol.MethodKind == MethodKind.StaticConstructor && statement.Kind == Kinds.ReturnStatement) { c.TextSpanNewLine("_cctor_called = true;"); c.TextSpanNewLine("_cctor_being_called = false;"); } statement.WriteTo(c); } c.EndBlock(); }
public override void WriteTo(CCodeWriterBase c) { CCodeWriterBase.SetLocalObjectIDGenerator(); c.Separate(); c.TextSpanNewLine(string.Format("// Method : {0}", this.Method.ToDisplayString())); c.WriteMethodDeclaration(this.Method, false); if (this.MethodBodyOpt != null) { this.MethodBodyOpt.WriteTo(c); } else { c.WriteMethodBody(this.BoundBody, this.Method); } }
internal override void WriteTo(CCodeWriterBase c) { CCodeWriterBase.SetLocalObjectIDGenerator(); // get actual statements var statements = Statements; if (statements.Count == 1 && statements.First().Kind == Kinds.BlockStatement) { var blockStatement = statements.First() as BlockStatement; if (blockStatement != null) { var block = blockStatement.Statements as Block; if (block != null) { statements = block.Statements; } } } this.SanitizeCaseLabelsAndSetReturnTypes(statements); var skip = 0; ////if (this.MethodSymbol.MethodKind == MethodKind.Constructor) ////{ //// skip = ConstructorInitializer(c, statements); ////} c.NewLine(); c.OpenBlock(); if (this.MethodSymbol.MethodKind == MethodKind.StaticConstructor) { c.TextSpanNewLine("_cctor_called = true;"); } foreach (var statement in statements.Skip(skip)) { statement.WriteTo(c); } c.EndBlock(); }
internal override void WriteTo(CCodeWriterBase c) { CCodeWriterBase.SetLocalObjectIDGenerator(); // get actual statements var statements = Statements; if (statements.Count == 1 && statements.First().Kind == Kinds.BlockStatement) { var blockStatement = statements.First() as BlockStatement; if (blockStatement != null) { var block = blockStatement.Statements as Block; if (block != null) { statements = block.Statements; } } } var extraLocalDecls = this.SanitizeCode(statements); var skip = 0; ////if (this.MethodSymbol.MethodKind == MethodKind.Constructor) ////{ //// skip = ConstructorInitializer(c, statements); ////} c.NewLine(); c.OpenBlock(); foreach (var localDecl in extraLocalDecls) { var loadState = localDecl.Suppressed; localDecl.Suppressed = false; localDecl.WriteTo(c); localDecl.Suppressed = loadState; } if (MethodSymbol.MethodKind == MethodKind.StaticConstructor) { c.TextSpanNewLine("_cctor_being_called = true;"); } #region Virtual Generic methods support if (MethodSymbol.MethodKind == MethodKind.Constructor) { foreach (var typeParameter in MethodSymbol.ContainingType.GetTemplateParameters().Where(t => t.HasConstructorConstraint)) { c.TextSpanNewLine(string.Format("this->construct_{0} = construct_{0};", typeParameter.Name)); } } #endregion foreach (var statement in statements.Skip(skip)) { if (MethodSymbol.MethodKind == MethodKind.StaticConstructor && statement.Kind == Kinds.ReturnStatement) { c.TextSpanNewLine("_cctor_called = true;"); c.TextSpanNewLine("_cctor_being_called = false;"); } statement.WriteTo(c); } c.EndBlock(); }