Exemplo n.º 1
0
        private void DeclareProceduresParametersIntoLinkage(Compiler.Nodes.FunctionDeclaration node, Compiler.Nodes.LinkageSection linkage, ParametersProfileNode profile)
        {
            var data = linkage.Children();

            // TCRFUN_CODEGEN_PARAMETERS_ORDER
            var generated = new List <string>();

            foreach (var parameter in profile.InputParameters)
            {
                if (!generated.Contains(parameter.Name) && !Contains(data, parameter.Name))
                {
                    linkage.Add(CreateParameterEntry(parameter, node));
                    generated.Add(parameter.Name);
                }
            }
            foreach (var parameter in profile.InoutParameters)
            {
                if (!generated.Contains(parameter.Name) && !Contains(data, parameter.Name))
                {
                    linkage.Add(CreateParameterEntry(parameter, node));
                    generated.Add(parameter.Name);
                }
            }
            foreach (var parameter in profile.OutputParameters)
            {
                if (!generated.Contains(parameter.Name) && !Contains(data, parameter.Name))
                {
                    linkage.Add(CreateParameterEntry(parameter, node));
                    generated.Add(parameter.Name);
                }
            }
            if (profile.ReturningParameter != null)
            {
                if (!generated.Contains(profile.ReturningParameter.Name) &&
                    !Contains(data, profile.ReturningParameter.Name))
                {
                    linkage.Add(CreateParameterEntry(profile.ReturningParameter, node));
                    generated.Add(profile.ReturningParameter.Name);
                }
            }
        }
Exemplo n.º 2
0
        protected void GenerateCodeToCallPublicProc(FunctionDeclaration originalNode, ProcedureDivision procedureDivision, Compiler.Nodes.WorkingStorageSection workingStorageSection, Compiler.Nodes.LinkageSection linkageSection)
        {
            ProgramImports imports = ProgramImportsAttribute.GetProgramImports(originalNode);

            foreach (var pgm in imports.Programs.Values)
            {
                workingStorageSection.Add(
                    new GeneratedNode2("01 TC-" + pgm.Name + " pic X(08) value '" + pgm.Name + "'.\n", true));
            }


            linkageSection.Add(new GeneratedNode2("*Common to all librairies used by the program.", true));
            linkageSection.Add(new GeneratedNode2("01 TC-Library-PntTab.", false));
            linkageSection.Add(new GeneratedNode2("    05 TC-Library-PntNbr          PIC S9(04) COMP.", true));
            linkageSection.Add(new GeneratedNode2(
                                   "    05 TC-Library-Item OCCURS 1000\n                        DEPENDING ON TC-Library-PntNbr\n                        INDEXED   BY TC-Library-Idx.",
                                   false));
            linkageSection.Add(new GeneratedNode2("       10 TC-Library-Item-Idt      PIC X(08).", true));
            linkageSection.Add(new GeneratedNode2("       10 TC-Library-Item-Pnt      PROCEDURE-POINTER.", true));


            foreach (var pgm in imports.Programs.Values)
            {
                foreach (var proc in pgm.Procedures.Values)
                {
                    proc.IsNotByExternalPointer = true;
                    linkageSection.Add(new GeneratedNode2(" ", true));
                    linkageSection.Add(new GeneratedNode2("*" + pgm.Name + "::" + proc.Name, true));
                    linkageSection.Add(new GeneratedNode2("01 TC-" + pgm.Name + "-" + proc.Hash + "-Item.", false));
                    linkageSection.Add(new GeneratedNode2("   05 TC-" + pgm.Name + "-" + proc.Hash + "-Idt PIC X(08).", true));
                    linkageSection.Add(new GeneratedNode2("   05 TC-" + pgm.Name + "-" + proc.Hash + " PROCEDURE-POINTER.",
                                                          true));
                }
            }


            if (imports.HasPublicProcedures)
            {
                Node whereToGenerate;

                //Generate a PERFORM, this must be the first instruction unless we have a Paragraph or a section
                var firstChildOfPDiv = procedureDivision.Children.First();
                if (firstChildOfPDiv is Section)
                {
                    var temp = firstChildOfPDiv.Children.First();
                    if (temp is Paragraph)
                    {
                        whereToGenerate = temp;
                    }
                    else
                    {
                        whereToGenerate = firstChildOfPDiv;
                    }
                }
                else if (firstChildOfPDiv is Paragraph)
                {
                    whereToGenerate = firstChildOfPDiv;
                }
                else
                {
                    whereToGenerate = procedureDivision;
                }

                //After #655, TC-Initializations is not used
                whereToGenerate.Add(new GeneratedNode2("    PERFORM TC-INITIALIZATIONS", true), 0);


                //Generate "TC-Initializations" paragraph
                procedureDivision.Add(
                    new GeneratedNode2("*=================================================================", true));
                procedureDivision.Add(new ParagraphGen("TC-INITIALIZATIONS"));
                procedureDivision.Add(
                    new GeneratedNode2("*=================================================================", true));
                procedureDivision.Add(new GeneratedNode2("     IF TC-FirstCall", true));
                procedureDivision.Add(new GeneratedNode2("          SET TC-NthCall TO TRUE", true));
                foreach (var pgm in imports.Programs.Values)
                {
                    foreach (var proc in pgm.Procedures.Values)
                    {
                        procedureDivision.Add(
                            new GeneratedNode2(
                                "          SET ADDRESS OF TC-" + pgm.Name + "-" + proc.Hash + "-Item  TO NULL", true));
                    }
                }
                procedureDivision.Add(new GeneratedNode2("     END-IF", true));
                procedureDivision.Add(new GeneratedNode2("     .", true));
            }

            //Generate "TC-LOAD-POINTERS-" paragraph
            foreach (var pgm in imports.Programs.Values)
            {
                procedureDivision.Add(new GeneratedNode2("*=================================================================", true));
                procedureDivision.Add(new ParagraphGen("TC-LOAD-POINTERS-" + pgm.Name));
                procedureDivision.Add(new GeneratedNode2("*=================================================================", true));
                procedureDivision.Add(new GeneratedNode2("     CALL 'ZCALLPGM' USING TC-" + pgm.Name, true));

                procedureDivision.Add(new GeneratedNode2("     ADDRESS OF TC-Library-PntTab", true));
                procedureDivision.Add(new GeneratedNode2("     PERFORM VARYING TC-Library-Idx FROM 1 BY 1", true));
                procedureDivision.Add(new GeneratedNode2("     UNTIL TC-Library-Idx > TC-Library-PntNbr", true));
                procedureDivision.Add(new GeneratedNode2("         EVALUATE TC-Library-Item-Idt (TC-Library-Idx)", true));
                foreach (var proc in pgm.Procedures.Values)
                {
                    procedureDivision.Add(new GeneratedNode2("         WHEN '" + proc.Hash + "'", true));
                    procedureDivision.Add(new GeneratedNode2("              SET ADDRESS OF", true));
                    procedureDivision.Add(new GeneratedNode2("              TC-" + pgm.Name + "-" + proc.Hash + "-Item", true));
                    procedureDivision.Add(new GeneratedNode2("              TO ADDRESS OF", true));
                    procedureDivision.Add(new GeneratedNode2("              TC-Library-Item(TC-Library-Idx)", true));
                }
                procedureDivision.Add(new GeneratedNode2("         END-EVALUATE", true));
                procedureDivision.Add(new GeneratedNode2("     END-PERFORM", true));
                procedureDivision.Add(new GeneratedNode2("     .", true));
            }
        }