Package org.openquark.cal.internal.javamodel

Examples of org.openquark.cal.internal.javamodel.JavaMethod


            }

            JavaTypeName returnType = JavaTypeNames.RTFUNCTION;

            // Add the method to the class.
            JavaMethod javaMethod;
            if (functions.getNCAFs() + functions.getNZeroArityFunctions() <= 1) {
                javaMethod = new JavaMethod(modifiers,
                        returnType,
                        new String[]{SCJavaDefn.EXECUTION_CONTEXT_NAME},
                        new JavaTypeName[]{JavaTypeNames.RTEXECUTION_CONTEXT},
                        null, "make");
            } else {
                javaMethod = new JavaMethod(modifiers,
                               returnType,
                               new String[]{"scIndex", SCJavaDefn.EXECUTION_CONTEXT_NAME},
                               new JavaTypeName[]{JavaTypeName.INT, JavaTypeNames.RTEXECUTION_CONTEXT},
                               null, "make");
            }
            javaClassRep.addMethod(javaMethod);

            // Add the body..

// Turn on this code to include a diagnostic print statement.
//            JavaExpression field = new JavaField.Static(JavaTypeName.make("java.lang.System"), "out", JavaTypeName.make("java.io.PrintStream"));
//            JavaExpression args[] = new JavaExpression[1];
//            String s = javaDefn.getFunctionName() + ".make()";
//            args[0] = LiteralWrapper.make(s);
//            JavaTypeName argTypes[] = new JavaTypeName[1];
//            argTypes[0] = JavaTypeName.STRING;
//            JavaExpression me = new MethodInvocation.Instance (field, "println", args, argTypes, JavaTypeName.VOID, MethodInvocation.InvocationType.VIRTUAL);
//            JavaStatement se = new JavaStatement.ExpressionStatement(me);
//            javaMethod.addStatement(se);


            // For a CAF we cache 'instances' associated with execution contexts.  In this case an
            // 'instance' is represented by an application of the supercombinator to zero arguments.
            // A zero arity function is different from a CAF in that we don't cache the 'instance'.
            // Regular functions we just return the singleton supercombinator instance.

            if (functions.getNCAFs() + functions.getNZeroArityFunctions() <= 1) {
                for (final MachineFunction mf : functions.getTopLevelCALFunctions()) {
                    JavaField instanceField = new JavaField.Static(className, CALToJavaNames.getInstanceFieldName(mf.getQualifiedName(), module), className);

                    if (mf.isCAF()) {
                        Block b = new Block();
                        // This is a CAF (constant applicative form) we want to use the cached instance associated
                        // with the execution context, if it exists.
                        // If it doesn't exist we will create an instance and add it to the cache.

                        String instanceMapFieldName = functions.getFNamePrefix(mf.getName()) + "$instancesMap";
                        JavaField instanceMapField =
                            new JavaField.Static(className, instanceMapFieldName, JavaTypeName.MAP);

                        // RTFunction newInstance = (RTFunction)$instancesMap.get($ec);
                        JavaExpression.LocalVariable newInstanceVar =
                            new JavaExpression.LocalVariable("newInstance", returnType);
                        JavaExpression initializer = new JavaExpression.CastExpression(
                                returnType,
                                new MethodInvocation.Instance(
                                        instanceMapField,
                                        "get",
                                        SCJavaDefn.EXECUTION_CONTEXT_VAR,
                                        JavaTypeName.OBJECT,
                                        JavaTypeName.OBJECT,
                                        MethodInvocation.InvocationType.INTERFACE));
                        JavaStatement decl = new JavaStatement.LocalVariableDeclaration(newInstanceVar, initializer);
                        b.addStatement(decl);

                        // If no instance exists for the execution context create one and cache it.

                        // newInstance == null
                        JavaExpression comparison = new JavaExpression.OperatorExpression.Binary(JavaOperator.EQUALS_OBJECT, newInstanceVar, JavaExpression.LiteralWrapper.NULL);

                        // newInstance = new RTFullApp.General_0($instance);
                        // $instancesMap.put($ec, newInstance);
                        JavaStatement.Block then = new JavaStatement.Block();
                        then.addStatement(new ExpressionStatement(new JavaExpression.Assignment(newInstanceVar, new JavaExpression.ClassInstanceCreationExpression(_0TypeName, instanceField, JavaTypeNames.RTSUPERCOMBINATOR))));
                        JavaExpression cacheValue = new MethodInvocation.Instance(
                                instanceMapField,
                                "put",
                                new JavaExpression[] {
                                        SCJavaDefn.EXECUTION_CONTEXT_VAR,
                                        newInstanceVar },
                                new JavaTypeName[] {
                                        JavaTypeName.OBJECT,
                                        JavaTypeName.OBJECT },
                                JavaTypeName.OBJECT,
                                MethodInvocation.InvocationType.INTERFACE);
                        then.addStatement(new ExpressionStatement(cacheValue));

                        // Put the whole if expression together.
                        JavaStatement ifthen = new JavaStatement.IfThenElseStatement(comparison, then);
                        b.addStatement(ifthen);
                        b.addStatement(new ReturnStatement(newInstanceVar));

                        javaMethod.addStatement(b);
                        break;
                    } else if (mf.getArity() == 0) {

                        Block b = new Block();

                        // This is an unsafe method.  i.e. a non-CAF function of arity zero.  Since the
                        // function can have side effects we need to create a new instance of the class
                        // each time so that a previously evaluated value doesn't get re-used in place
                        // of actually executing the function.
                        JavaExpression.LocalVariable newInstanceVar = new JavaExpression.LocalVariable("newInstance", returnType);
                        JavaExpression initializer = new ClassInstanceCreationExpression(_0TypeName, instanceField, JavaTypeNames.RTSUPERCOMBINATOR);
                        JavaStatement decl = new JavaStatement.LocalVariableDeclaration(newInstanceVar, initializer);
                        b.addStatement(decl);
                        b.addStatement(new ReturnStatement(newInstanceVar));

                        javaMethod.addStatement(b);
                        break;
                    }
                }

            } else {
                SwitchStatement switchStatement =
                    new SwitchStatement(new MethodVariable("scIndex"));

                for (final MachineFunction mf : functions.getTopLevelCALFunctions()) {
                    JavaField instanceField = new JavaField.Static(className, CALToJavaNames.getInstanceFieldName(mf.getQualifiedName(), module), className);
                    int functionIndex = functions.getFunctionIndex(mf.getName());
                    if (mf.isCAF()) {

                        Block b = new Block();
                        // This is a CAF (constant applicative form) we want to use the cached instance associated
                        // with the execution context, if it exists.
                        // If it doesn't exist we will create an instance and add it to the cache.

                        String instanceMapFieldName = functions.getFNamePrefix(mf.getName()) + "$instancesMap";
                        JavaField instanceMapField =
                            new JavaField.Static(className, instanceMapFieldName, JavaTypeName.MAP);


                        // RTFunction newInstance = (RTFunction)$instancesMap.get($ec);
                        JavaExpression.LocalVariable newInstanceVar = new JavaExpression.LocalVariable("newInstance", returnType);
                        JavaExpression initializer =
                                new JavaExpression.CastExpression(returnType, new MethodInvocation.Instance (instanceMapField,
                                                    "get",
                                                    SCJavaDefn.EXECUTION_CONTEXT_VAR,
                                                    JavaTypeName.OBJECT,
                                                    JavaTypeName.OBJECT,
                                                    MethodInvocation.InvocationType.INTERFACE));
                        JavaStatement decl = new JavaStatement.LocalVariableDeclaration(newInstanceVar, initializer);
                        b.addStatement(decl);

                        // If no instance exists for the execution context create one and cache it.

                        // newInstance == null
                        JavaExpression comparison = new JavaExpression.OperatorExpression.Binary(JavaOperator.EQUALS_OBJECT, newInstanceVar, JavaExpression.LiteralWrapper.NULL);

                        // newInstance = new RTFullApp.General_0($instance);
                        // $instancesMap.put($ec, newInstance);
                        JavaStatement.Block then = new JavaStatement.Block();
                        then.addStatement(new ExpressionStatement(new JavaExpression.Assignment(newInstanceVar, new JavaExpression.ClassInstanceCreationExpression(_0TypeName, instanceField, JavaTypeNames.RTSUPERCOMBINATOR))));
                        JavaExpression cacheValue =
                            new MethodInvocation.Instance(instanceMapField,
                                                 "put",
                                                 new JavaExpression[]{SCJavaDefn.EXECUTION_CONTEXT_VAR, newInstanceVar},
                                                 new JavaTypeName[]{JavaTypeName.OBJECT, JavaTypeName.OBJECT},
                                                 JavaTypeName.OBJECT,
                                                 MethodInvocation.InvocationType.INTERFACE);
                        then.addStatement(new ExpressionStatement(cacheValue));

                        // Put the whole if expression together.
                        JavaStatement ifthen = new JavaStatement.IfThenElseStatement(comparison, then);
                        b.addStatement(ifthen);
                        b.addStatement(new ReturnStatement(newInstanceVar));

                        switchStatement.addCase(
                                new SwitchStatement.IntCaseGroup(
                                        functionIndex,
                                        b));

                    }

                }

                MethodInvocation mi =
                    new MethodInvocation.Static (JavaTypeNames.RTVALUE,
                                                   "badValue",
                                                   new JavaExpression[]{LiteralWrapper.NULL, LiteralWrapper.make("Illegal fall through to default case in " + functions.getFunctionGroupQualifiedName() + ".make().")},
                                                   new JavaTypeName[]{JavaTypeName.ERRORINFO, JavaTypeName.STRING},
                                                   JavaTypeNames.RTVALUE);
                switchStatement.addCase(
                        new SwitchStatement.DefaultCase(new ReturnStatement(new CastExpression(JavaTypeNames.RTFUNCTION, mi))));



                javaMethod.addStatement(switchStatement);
            }
        }
View Full Code Here


         */
        private void createMethod_getArity() {
            int modifiers = Modifier.PUBLIC | Modifier.FINAL;

            // Add the method to the class.
            JavaMethod javaMethod = new JavaMethod(modifiers, JavaTypeName.INT, "getArity");
            javaClassRep.addMethod(javaMethod);

            // Add the body
            if (functions.getNFunctions() > 1) {
                JavaField arityField = new JavaField.Instance(null, "arity", JavaTypeName.INT);
                javaMethod.addStatement(new ReturnStatement(arityField));
            } else {
                int arity = functions.getTopLevelCALFunctions().iterator().next().getArity();
                javaMethod.addStatement(new ReturnStatement(LiteralWrapper.make(Integer.valueOf(arity))));
            }
        }
View Full Code Here

        private void createMethod_fUnsaturated(final SCJavaDefn javaDefn,
                                               final boolean consolidateFunctions) throws CodeGenerationException {

            final int arity = javaDefn.getArity();

            final JavaMethod javaMethod;
            {
                final int modifiers = Modifier.PUBLIC | Modifier.FINAL;

                // Add the method to the class.
                final String[] argNames = new String []{ROOT_NODE, SCJavaDefn.EXECUTION_CONTEXT_NAME};
                final JavaTypeName[] argTypes = new JavaTypeName []{JavaTypeNames.RTRESULT_FUNCTION, JavaTypeNames.RTEXECUTION_CONTEXT};
                final boolean[] argFinal = new boolean[] {true, true};

                final String methodNamePrefix = functions.getFNamePrefix(javaDefn.getFunctionName());
                final String methodName = methodNamePrefix + "f";

                javaMethod = new JavaMethod(modifiers, JavaTypeNames.RTVALUE, argNames, argTypes, argFinal, methodName);

                // Add the throws declaration
                javaMethod.addThrows(JavaTypeName.CAL_EXECUTOR_EXCEPTION);

                final JavaDocComment comment = new JavaDocComment(methodName);
                comment.addLine("This method implements the function logic of the CAL function " + javaDefn.getModuleName() + "." + javaDefn.getFunctionName());
                javaMethod.setJavaDocComment(comment);
            }

            javaClassRep.addMethod(javaMethod);

            if (consolidateFunctions) {

                // Extract the arguments from the application chain.
                JavaStatement argumentExtraction = generateArgumentExtractors(javaDefn);
                javaMethod.addStatement(argumentExtraction);

                final JavaExpression[] args = new JavaExpression[arity + 1];
                final JavaTypeName[] argTypes = new JavaTypeName[arity + 1];
                Arrays.fill (argTypes, JavaTypeNames.RTVALUE);
                args[arity] = SCJavaDefn.EXECUTION_CONTEXT_VAR;
                argTypes[arity] = JavaTypeNames.RTEXECUTION_CONTEXT;

                // Call fnS with the extracted arguments.
                for (int i = 0; i < arity; ++i) {
                    String javaName = javaDefn.getJavaArgumentName(i);
                    if (javaDefn.isArgStrict(i) && javaDefn.isArgUnboxable(i)) {
                        // We append the names of the arguments with $L to allow the declared name to
                        // be used with the unboxed primitive value.
                        javaName += "$L";
                    }

                    JavaTypeName argType = JavaTypeNames.RTVALUE;
                    if (javaDefn.isArgStrict(i) && javaDefn.isArgUnboxable(i)) {
                        argType = javaDefn.getArgumentTypeName(i);
                    }
                    LocalVariable lv = new LocalVariable (javaName, JavaTypeNames.RTVALUE);
                    args[i] = lv;
                    if (javaDefn.isArgStrict(i)) {
                        args[i] = SCJavaDefn.createInvocation(args[i], SCJavaDefn.EVALUATE, SCJavaDefn.EXECUTION_CONTEXT_VAR);
                        args[i] =
                            callLastRef(args[i], lv);
                        if (javaDefn.isArgUnboxable(i)) {
                            args[i] = SCJavaDefn.unboxValue(javaDefn.getArgumentTypeName(i), args[i]);
                            argTypes[i] = argType;
                        }
                    } else {
                        args[i] =
                            callLastRef(args[i], lv);
                    }
                }

                String methodNamePrefix2 = functions.getFnNamePrefix(javaDefn.getFunctionName());
                JavaExpression mi =
                    new MethodInvocation.Instance (
                            null,
                            methodNamePrefix2 + "f" + arity + "S",
                            args,
                            argTypes,
                            JavaTypeNames.RTVALUE,
                            MethodInvocation.InvocationType.VIRTUAL);

                javaMethod.addStatement(new JavaStatement.ReturnStatement(mi));

            } else {
                // Add statistics generation.
                addStatsBlock (javaMethod, javaDefn);


                // Extract function arguments from the application chain.
                JavaStatement argumentExtraction = generateArgumentExtractors(javaDefn);
                javaMethod.addStatement(argumentExtraction);

                javaMethod.addStatement (generateStrictArgEvaluationBlock(javaDefn));


                String[] unboxedLocalVarNames = null;
                JavaTypeName[] unboxedLocalVarTypes = null;
                if (LECCMachineConfiguration.generateDebugCode() || LECCMachineConfiguration.generateDebugCode()) {
                    unboxedLocalVarNames = new String[arity];
                    unboxedLocalVarTypes = new JavaTypeName[arity];
                    for (int i = 0; i < arity; ++i) {
                        unboxedLocalVarNames[i] = javaDefn.getJavaArgumentName(i);
                        if (javaDefn.isArgStrict(i) && javaDefn.isArgUnboxable(i)) {
                            unboxedLocalVarTypes[i] = javaDefn.getArgumentTypeName(i);
                        } else {
                            unboxedLocalVarTypes[i] = JavaTypeNames.RTVALUE;
                        }
                    }
                }

                //Add the body
                Block bodyBlock = javaDefn.genS_SC_Boxed();

                if (javaDefn.isTailRecursive()) {

                    Block loopBodyBlock = new Block();

                    if (!LECCMachineConfiguration.nonInterruptibleRuntime()) {
                        // Add a check of the quit flag at the top of the loop body.
                        loopBodyBlock.addStatement(checkForQuit());
                    }

                    if (LECCMachineConfiguration.SANITY_CHECK_LET_VARS) {
                        loopBodyBlock.addStatement(resetLetVarFlags(javaDefn.getFunctionName()));

                    }

                    if (LECCMachineConfiguration.generateDebugCode()) {
                        loopBodyBlock.addStatement(generateDebugCode(javaDefn, unboxedLocalVarNames, unboxedLocalVarTypes));
                    }

                    loopBodyBlock.addStatement(bodyBlock);
                    UnconditionalLoop whileStatement = new UnconditionalLoop (SCJavaDefn.TAIL_RECURSION_LOOP_LABEL, loopBodyBlock);
                    javaMethod.addStatement (whileStatement);

                } else {
                    if (LECCMachineConfiguration.SANITY_CHECK_LET_VARS) {
                        javaMethod.addStatement(resetLetVarFlags(javaDefn.getFunctionName()));
                    }

                    if (LECCMachineConfiguration.generateDebugCode()) {
                        javaMethod.addStatement(generateDebugCode(javaDefn, unboxedLocalVarNames, unboxedLocalVarTypes));
                    }

                    javaMethod.addStatement(bodyBlock);
                }
            }
        }
View Full Code Here

                    argTypes[i] = javaDefn.getArgumentTypeName(i);
                }
            }

            // Add the method to the class.
            JavaMethod javaMethod = new JavaMethod(modifiers, JavaTypeNames.RTVALUE, argNames, argTypes, null, methodName);
            javaClassRep.addMethod(javaMethod);

            // Add the throws declaration
            javaMethod.addThrows(JavaTypeName.CAL_EXECUTOR_EXCEPTION);

            JavaDocComment comment = new JavaDocComment(methodName);
            comment.addLine("This method implements the function logic of the CAL function " + javaDefn.getModuleName() + "." + javaDefn.getFunctionName());
            javaMethod.setJavaDocComment(comment);

            // Add statistics generation.
            addStatsBlock (javaMethod, javaDefn);

            // Add the body
            if (javaDefn.isTailRecursive()) {

                Block loopBodyBlock = new Block();

                if (!LECCMachineConfiguration.nonInterruptibleRuntime()) {
                    // Add a check of the quit flag at the top of the loop body.
                    loopBodyBlock.addStatement(checkForQuit());
                }

                if (LECCMachineConfiguration.SANITY_CHECK_LET_VARS) {
                    loopBodyBlock.addStatement(resetLetVarFlags(javaDefn.getFunctionName()));
                }

                if (LECCMachineConfiguration.generateDebugCode()) {
                    loopBodyBlock.addStatement(generateDebugCode(javaDefn, argNames, argTypes));
                }

                loopBodyBlock.addStatement(bodyBlock);
                UnconditionalLoop whileStatement = new UnconditionalLoop (SCJavaDefn.TAIL_RECURSION_LOOP_LABEL, loopBodyBlock);
                javaMethod.addStatement (whileStatement);
            } else {

                if (LECCMachineConfiguration.SANITY_CHECK_LET_VARS) {
                    javaMethod.addStatement(resetLetVarFlags(javaDefn.getFunctionName()));
                }

                if (LECCMachineConfiguration.generateDebugCode()) {
                    javaMethod.addStatement(generateDebugCode(javaDefn, argNames, argTypes));
                }

                javaMethod.addStatement(bodyBlock);
            }
        }
View Full Code Here

                    argTypes[i] = javaDefn.getArgumentTypeName(i);
                }
            }

            // Add the method to the class.
            JavaMethod javaMethod = new JavaMethod(modifiers, returnType, argNames, argTypes, null, methodName);
            javaClassRep.addMethod(javaMethod);

            // Add a comment indicating which CAL function this
            // corresponds to.
            JavaDocComment comment = new JavaDocComment(methodName);
            comment.addLine("This method implements the logic of the CAL function " + javaDefn.getModuleName() + "." + javaDefn.getFunctionName());
            comment.addLine("This version of the logic returns an unboxed value.");
            javaMethod.setJavaDocComment(comment);

            // Add the throws declaration
            javaMethod.addThrows(JavaTypeName.CAL_EXECUTOR_EXCEPTION);

            // Add statistics generation.
            addStatsBlock (javaMethod, javaDefn);

            // Add the body
            if (javaDefn.isTailRecursive()) {

                Block loopBodyBlock = new Block();

                if (!LECCMachineConfiguration.nonInterruptibleRuntime()) {
                    // Add a check of the quit flag at the top of the loop body.
                    loopBodyBlock.addStatement(checkForQuit());
                }

                if (LECCMachineConfiguration.SANITY_CHECK_LET_VARS) {
                    loopBodyBlock.addStatement(resetLetVarFlags(javaDefn.getFunctionName()));
                }

                if (LECCMachineConfiguration.generateDebugCode()) {
                    loopBodyBlock.addStatement(generateDebugCode(javaDefn, argNames, argTypes));
                }

                loopBodyBlock.addStatement(bodyBlock);
                UnconditionalLoop whileStatement = new UnconditionalLoop (SCJavaDefn.TAIL_RECURSION_LOOP_LABEL, loopBodyBlock);
                javaMethod.addStatement (whileStatement);
            } else {

                if (LECCMachineConfiguration.SANITY_CHECK_LET_VARS) {
                    javaMethod.addStatement(resetLetVarFlags(javaDefn.getFunctionName()));
                }

                if (LECCMachineConfiguration.generateDebugCode()) {
                    javaMethod.addStatement(generateDebugCode(javaDefn, argNames, argTypes));
                }

                javaMethod.addStatement(bodyBlock);
            }
        }
View Full Code Here

            argNames[arity] = SCJavaDefn.EXECUTION_CONTEXT_NAME;
            argTypes[arity] = JavaTypeNames.RTEXECUTION_CONTEXT;


            // Add the method to the class.
            JavaMethod javaMethod = new JavaMethod(modifiers, JavaTypeNames.RTVALUE, argNames, argTypes, null, methodName);
            javaClassRep.addMethod(javaMethod);

            // Add the throws declaration
            javaMethod.addThrows(JavaTypeName.CAL_EXECUTOR_EXCEPTION);

            JavaDocComment comment = new JavaDocComment(methodName);
            comment.addLine("This method implements the function logic of the CAL function " + javaDefn.getModuleName() + "." + javaDefn.getFunctionName());
            javaMethod.setJavaDocComment(comment);

            if (consolidateFunctions) {
                JavaExpression[] args = new JavaExpression[arity + 1];
                argTypes = new JavaTypeName[arity + 1];
                Arrays.fill (argTypes, JavaTypeNames.RTVALUE);

                for (int i = 0; i < arity; ++i) {
                    String varName = javaDefn.getJavaArgumentName(i);
                    if (javaDefn.isArgStrict(i) && javaDefn.isArgUnboxable(i)) {
                        varName += "$L";
                    }
                    MethodVariable mv = new MethodVariable(varName);
                    args[i] = mv;
                    if (javaDefn.hasStrictArguments() && javaDefn.isArgStrict(i)) {
                        args[i] = SCJavaDefn.createInvocation(args[i], SCJavaDefn.EVALUATE, SCJavaDefn.EXECUTION_CONTEXT_VAR);
                        args[i] =
                            callLastRef(args[i], mv);
                        if (javaDefn.isArgUnboxable(i)) {
                            args[i] = SCJavaDefn.unboxValue(javaDefn.getArgumentTypeName(i), args[i]);
                            argTypes[i] = javaDefn.getArgumentTypeName(i);
                        }
                    } else {
                        args[i] =
                            callLastRef(args[i], mv);
                    }
                }

                args[arity] = SCJavaDefn.EXECUTION_CONTEXT_VAR;
                argTypes[arity] = JavaTypeNames.RTEXECUTION_CONTEXT;

                JavaExpression mi =
                    new MethodInvocation.Instance (
                            null,
                            methodNamePrefix + "f" + arity + "S",
                            args,
                            argTypes,
                            JavaTypeNames.RTVALUE,
                            MethodInvocation.InvocationType.VIRTUAL);

                javaMethod.addStatement(new JavaStatement.ReturnStatement(mi));

            } else {

                Block bodyBlock = javaDefn.genS_SC_Boxed();

                // Add statistics generation.
                addStatsBlock (javaMethod, javaDefn);

                javaMethod.addStatement(generateStrictArgEvaluationBlock(javaDefn));

                String[] unboxedLocalVarNames = null;
                JavaTypeName[] unboxedLocalVarTypes = null;
                if (LECCMachineConfiguration.generateDebugCode() || LECCMachineConfiguration.generateDebugCode()) {
                    unboxedLocalVarNames = new String[arity];
                    unboxedLocalVarTypes = new JavaTypeName[arity];
                    for (int i = 0; i < arity; ++i) {
                        unboxedLocalVarNames[i] = javaDefn.getJavaArgumentName(i);
                        if (javaDefn.isArgStrict(i) && javaDefn.isArgUnboxable(i)) {
                            unboxedLocalVarTypes[i] = javaDefn.getArgumentTypeName(i);
                        } else {
                            unboxedLocalVarTypes[i] = JavaTypeNames.RTVALUE;
                        }
                    }
                }

                // Add the body
                if (javaDefn.isTailRecursive()) {
                    Block loopBodyBlock = new Block();

                    if (!LECCMachineConfiguration.nonInterruptibleRuntime()) {
                        // Add a check of the quit flag at the top of the loop body.
                        loopBodyBlock.addStatement(checkForQuit());
                    }

                    if (LECCMachineConfiguration.SANITY_CHECK_LET_VARS) {
                        loopBodyBlock.addStatement(resetLetVarFlags(javaDefn.getFunctionName()));
                    }

                    if (LECCMachineConfiguration.generateDebugCode()) {
                        loopBodyBlock.addStatement(generateDebugCode(javaDefn, unboxedLocalVarNames, unboxedLocalVarTypes));
                    }

                    loopBodyBlock.addStatement(bodyBlock);
                    UnconditionalLoop whileStatement = new UnconditionalLoop (SCJavaDefn.TAIL_RECURSION_LOOP_LABEL, loopBodyBlock);
                    javaMethod.addStatement (whileStatement);
                } else {

                    if (LECCMachineConfiguration.SANITY_CHECK_LET_VARS) {
                        javaMethod.addStatement(resetLetVarFlags(javaDefn.getFunctionName()));
                    }

                    if (LECCMachineConfiguration.generateDebugCode()) {
                        javaMethod.addStatement(generateDebugCode(javaDefn, unboxedLocalVarNames, unboxedLocalVarTypes));
                    }

                    javaMethod.addStatement(bodyBlock);
                }
            }
        }
View Full Code Here

            // Add the reduce method.
            strictAppClassRep.addMethod(createStrictAppClass_method_reduce(mf, functionField, strictAppTypeName, functionArgumentMemberFields));

            // Add the clearMembers() method.
            JavaMethod clearMembers = new JavaMethod (Modifier.PUBLIC | Modifier.FINAL, JavaTypeName.VOID, "clearMembers");
            //the line "function = null;" should not be added to clearMembers. function is a reference to a singleton
            //so that clearing it doesn't actually free any memory. However, not clearing it means that the the method
            //debug_getNodeStartText works as desired even in the case when result == null and clearMembers() has been called.
            //clearMembers.addStatement(new ExpressionStatement(new Assignment(functionField, LiteralWrapper.NULL)));
            for (int i = 0; i < functionArgumentMemberFields.length; ++i) {
                if (!mf.getParameterStrictness()[i] || !SCJavaDefn.canTypeBeUnboxed(mf.getParameterTypes()[i])) {
                    Assignment a = new Assignment(functionArgumentMemberFields[i], LiteralWrapper.NULL);
                    clearMembers.addStatement(new ExpressionStatement(a));
                }
            }
            strictAppClassRep.addMethod (clearMembers);

            createAppClass_debugMethods(strictAppClassRep, functionArgumentMemberFields);
View Full Code Here

        private JavaMethod createStrictAppClass_method_reduce (MachineFunction mf,
                                                               JavaField functionField,
                                                               JavaTypeName strictAppTypeName,
                                                               JavaField[] functionArgumentMemberFields) throws CodeGenerationException {
            // Add the reduce method.
            JavaMethod reduce = new JavaMethod (Modifier.PROTECTED | Modifier.FINAL,
                                                JavaTypeNames.RTVALUE,
                                                SCJavaDefn.EXECUTION_CONTEXT_NAME,
                                                JavaTypeNames.RTEXECUTION_CONTEXT,
                                                false, "reduce");
            // Add the throws declaration
            reduce.addThrows(JavaTypeName.CAL_EXECUTOR_EXCEPTION);

            // Add the body.
            // if (result == null) {
            //     setResult (
            //         function.f4S(
            //             RTValue.lastRef(arg1, arg1 = null), ...));
            // }
            // return result;

            final JavaField resultField = new JavaField.Instance(null, "result", JavaTypeNames.RTVALUE);

            OperatorExpression condition = new OperatorExpression.Binary (JavaOperator.EQUALS_OBJECT, resultField, LiteralWrapper.NULL);
            Block then = new Block();

            JavaExpression args[] = new JavaExpression[mf.getArity() + 1];
            JavaTypeName[] argTypes = new JavaTypeName[mf.getArity()+1];
            for (int i = 0; i < mf.getArity(); ++i) {
                args[i] = functionArgumentMemberFields[i];
                argTypes[i] = JavaTypeNames.RTVALUE;
                if (mf.getParameterStrictness()[i] && SCJavaDefn.canTypeBeUnboxed(mf.getParameterTypes()[i])) {
                    argTypes[i] = SCJavaDefn.typeExprToTypeName(mf.getParameterTypes()[i]);
                }
                if (argTypes[i].equals(JavaTypeNames.RTVALUE)) {
                    args[i] =
                        callLastRef(args[i], (JavaField)args[i]);
                }
            }
            args[args.length-1] = SCJavaDefn.EXECUTION_CONTEXT_VAR;
            argTypes[argTypes.length-1] = JavaTypeNames.RTEXECUTION_CONTEXT;

            String fMethodName = functions.getFnNamePrefix(mf.getName()) + "f" + mf.getArity() + "S";
            MethodInvocation fn = new MethodInvocation.Instance (functionField, fMethodName, args, argTypes, JavaTypeNames.RTVALUE, MethodInvocation.InvocationType.VIRTUAL);
            MethodInvocation setResult = new MethodInvocation.Instance (null, "setResult", fn, JavaTypeNames.RTVALUE, JavaTypeName.VOID,  MethodInvocation.InvocationType.VIRTUAL);
            then.addStatement(new ExpressionStatement(setResult));

            //call clearMembers(). We don't need to do this for tail recursive functions since clearMembers() will be called as
            //a result of setting the root node above.
            if (!mf.isTailRecursive()) {
                then.addStatement(new ExpressionStatement(new MethodInvocation.Instance(null, "clearMembers", JavaTypeName.VOID, MethodInvocation.InvocationType.VIRTUAL)));
            }

            reduce.addStatement(new IfThenElseStatement(condition, then));
            reduce.addStatement(new ReturnStatement(resultField));

            return reduce;
        }
View Full Code Here

            // Add the reduce method.
            lazyAppClassRep.addMethod(createLazyAppClass_method_reduce(mf, functionField, lazyAppTypeName, functionArgumentMemberFields));

            // Add the clearMembers() method.
            JavaMethod clearMembers = new JavaMethod (Modifier.PUBLIC | Modifier.FINAL, JavaTypeName.VOID, "clearMembers");
            //the line "function = null;" should not be added to clearMembers. function is a reference to a singleton
            //so that clearing it doesn't actually free any memory. However, not clearing it means that the the method
            //debug_getNodeStartText works as desired even in the case when result == null and clearMembers() has been called.
            //clearMembers.addStatement(new ExpressionStatement(new Assignment(functionField, LiteralWrapper.NULL)));
            for (int i = 0; i < functionArgumentMemberFields.length; ++i) {
                Assignment a = new Assignment(functionArgumentMemberFields[i], LiteralWrapper.NULL);
                clearMembers.addStatement(new ExpressionStatement(a));
            }
            lazyAppClassRep.addMethod (clearMembers);

            createAppClass_debugMethods(lazyAppClassRep, functionArgumentMemberFields);
View Full Code Here

        private JavaMethod createLazyAppClass_method_reduce(MachineFunction mf,
                                                            JavaField functionField,
                                                            JavaTypeName lazyAppTypeName,
                                                            JavaField[] functionArgumentMemberFields) {
            // Add the reduce method.
            JavaMethod reduce = new JavaMethod (Modifier.PROTECTED | Modifier.FINAL,
                                                JavaTypeNames.RTVALUE,
                                                SCJavaDefn.EXECUTION_CONTEXT_NAME,
                                                JavaTypeNames.RTEXECUTION_CONTEXT,
                                                false, "reduce");
            // Add the throws declaration
            reduce.addThrows(JavaTypeName.CAL_EXECUTOR_EXCEPTION);

           // Add the body.
            // if (result == null) {
            //     setResult (
            //         function.f4L(RTValue.lastRef(arg1, arg1 = null), ...));
            // }
            // return result;

            final JavaField resultField = new JavaField.Instance(null, "result", JavaTypeNames.RTVALUE);

            OperatorExpression condition = new OperatorExpression.Binary (JavaOperator.EQUALS_OBJECT, resultField, LiteralWrapper.NULL);
            Block then = new Block();

            JavaExpression args[] = new JavaExpression[mf.getArity() + 1];
            JavaTypeName[] argTypes = new JavaTypeName[mf.getArity()+1];
            for (int i = 0; i < mf.getArity(); ++i) {
                args[i] =
                    callLastRef(functionArgumentMemberFields[i], (JavaField)functionArgumentMemberFields[i]);
                argTypes[i] = JavaTypeNames.RTVALUE;
            }
            args[args.length-1] = SCJavaDefn.EXECUTION_CONTEXT_VAR;
            argTypes[argTypes.length-1] = JavaTypeNames.RTEXECUTION_CONTEXT;

            String fMethodName = functions.getFnNamePrefix(mf.getName()) + "f" + mf.getArity() + "L";
            MethodInvocation fn = new MethodInvocation.Instance (functionField, fMethodName, args, argTypes, JavaTypeNames.RTVALUE, MethodInvocation.InvocationType.VIRTUAL);
            MethodInvocation setResult = new MethodInvocation.Instance (null, "setResult", fn, JavaTypeNames.RTVALUE, JavaTypeName.VOID,  MethodInvocation.InvocationType.VIRTUAL);
            then.addStatement(new ExpressionStatement(setResult));

            reduce.addStatement(new IfThenElseStatement(condition, then));
            reduce.addStatement(new ReturnStatement(resultField));

            return reduce;
        }
View Full Code Here

TOP

Related Classes of org.openquark.cal.internal.javamodel.JavaMethod

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.