Package org.openquark.cal.internal.javamodel.JavaStatement

Examples of org.openquark.cal.internal.javamodel.JavaStatement.Block


                        LiteralWrapper.make(javaDefn.getQualifiedName().getQualifiedName()),
                        JavaTypeName.STRING,
                        JavaTypeName.BOOLEAN,
                        MethodInvocation.InvocationType.VIRTUAL);

            JavaStatement.Block debuggingNeededThenBlock = new Block();
            JavaStatement isDebuggingNeededIfStatement =
                new JavaStatement.IfThenElseStatement(isDebuggingNeededCheck, debuggingNeededThenBlock);

            final int arity = javaDefn.getArity();

            //new RTValue[]{CAL_Int.make(take$nElements$1), take$list$2}
            JavaExpression[] argValues = new JavaExpression[arity];
            for (int i = 0; i < arity; ++i) {

                String javaArgName = argNames[i];
                JavaTypeName javaArgType = argTypes[i];

                JavaExpression javaArgValue = new LocalName(javaArgName, javaArgType);
                if (!javaArgType.equals(JavaTypeNames.RTVALUE)) {
                    javaArgValue = SCJavaDefn.boxExpression(javaArgType, javaArgValue);
                }

                argValues[i] = javaArgValue;
            }

            JavaExpression argValueArrayCreation = new JavaExpression.ArrayCreationExpression(JavaTypeNames.RTVALUE, argValues);


            //$ec.debugProcessing("Prelude.take",
            //            new RTValue[]{CAL_Int.make(take$nElements$1), take$list$2}));
            JavaExpression suspend =
                new MethodInvocation.Instance(
                    SCJavaDefn.EXECUTION_CONTEXT_VAR, "debugProcessing",
                    new JavaExpression[] {
                            LiteralWrapper.make(javaDefn.getQualifiedName().getQualifiedName()),
                            argValueArrayCreation },
                    new JavaTypeName[] { JavaTypeName.STRING,
                            JavaTypeName.CAL_VALUE_ARRAY },
                    JavaTypeName.VOID,
                    MethodInvocation.InvocationType.VIRTUAL);
            debuggingNeededThenBlock.addStatement(new ExpressionStatement(suspend));

            return isDebuggingNeededIfStatement;
        }
View Full Code Here


            // 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));
View Full Code Here

            // 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

            //notice that for non-RTValue fields, we need to box

            //$ec.isBreakpointEnabled($functionNameField)
            JavaExpression isDebuggingNeededCheck = new MethodInvocation.Instance(SCJavaDefn.EXECUTION_CONTEXT_VAR, "isDebugProcessingNeeded", LiteralWrapper.make(dc.getName().getQualifiedName()), JavaTypeName.STRING, JavaTypeName.BOOLEAN, MethodInvocation.InvocationType.VIRTUAL);
            JavaStatement.Block debuggingNeededThenBlock = new Block();
            JavaStatement isDebuggingNeededIfStatement =
                new JavaStatement.IfThenElseStatement(isDebuggingNeededCheck, debuggingNeededThenBlock);

            final int arity = dc.getArity();

            //new RTValue[]{CAL_Int.make(take$nElements$1), take$list$2}
            JavaExpression[] argValues = new JavaExpression[arity];
            for (int i = 0; i < arity; ++i) {

                String javaArgName = argNames[i];
                JavaTypeName javaArgType = argTypes[i];

                JavaExpression javaArgValue = new LocalName(javaArgName, javaArgType);
                if (!javaArgType.equals(JavaTypeNames.RTVALUE)) {
                    javaArgValue = SCJavaDefn.boxExpression(javaArgType, javaArgValue);
                }

                argValues[i] = javaArgValue;
            }
            JavaExpression argValueArrayCreation = new JavaExpression.ArrayCreationExpression(JavaTypeNames.RTVALUE, argValues);

            //$ec.debugProcessing("Prelude.take",
            //            new RTValue[]{CAL_Int.make(take$nElements$1), take$list$2}));
            JavaExpression suspend =
                new MethodInvocation.Instance(
                    SCJavaDefn.EXECUTION_CONTEXT_VAR, "debugProcessing",
                    new JavaExpression[] {
                            LiteralWrapper.make(dc.getName().getQualifiedName()),
                            argValueArrayCreation },
                    new JavaTypeName[] { JavaTypeName.STRING,
                            JavaTypeName.CAL_VALUE_ARRAY },
                    JavaTypeName.VOID,
                    MethodInvocation.InvocationType.VIRTUAL);
            debuggingNeededThenBlock.addStatement(new ExpressionStatement(suspend));

            return isDebuggingNeededIfStatement;

        }
View Full Code Here

        private void createMethod_getFieldByIndex (JavaTypeName forType, String nameForType) throws CodeGenerationException {
            if (javaFieldNames.length == 0) {
                return;
            }

            Block methodBodyBlock = new Block();
            int nReturnedFields = 0;

            // Check that this is an instance of the expected data constructor.
            MethodInvocation checkDC =
                new MethodInvocation.Instance(
                        null,
                        "checkDCOrdinalForFieldSelection",
                        new JavaExpression[]{new MethodVariable("dcOrdinal"), new MethodVariable("errorInfo")},
                        new JavaTypeName[]{JavaTypeName.INT, JavaTypeName.ERRORINFO},
                        JavaTypeName.VOID,
                        MethodInvocation.InvocationType.VIRTUAL);
            methodBodyBlock.addStatement(new ExpressionStatement(checkDC));

            SwitchStatement sw = new SwitchStatement(METHODVAR_FIELDINDEX);
            for (int i = 0; i < javaFieldNames.length; ++i) {
                if (forType != null) {
                    // If field is not strict or not primitive can't return unboxed form.
                    if (!fieldStrictness[i] || !SCJavaDefn.canTypeBeUnboxed(fieldTypes[i])) {
                        continue;
                    }

                    JavaTypeName ftn = SCJavaDefn.typeExprToTypeName(fieldTypes[i]);

                    if (!forType.equals(ftn)) {
                        // Check to see if we're doing return type 'Object' on a foreign type.
                        if (!forType.equals(JavaTypeName.OBJECT) || ftn instanceof JavaTypeName.Primitive) {
                            continue;
                        }
                    }
                }

                JavaExpression jf;
                if (fieldStrictness[i] && SCJavaDefn.canTypeBeUnboxed(fieldTypes[i])) {
                    jf = new JavaField.Instance (null, javaFieldNames[i], SCJavaDefn.typeExprToTypeName(fieldTypes[i]));
                    if (forType == null) {
                        jf = SCJavaDefn.boxExpression(fieldTypes[i], jf);
                    }
                } else {
                    // We have a non-strict field of type RTValue.  In order to reduce space usage
                    // we want to update the field value to be the result of the original suspension.
                    // We do this by using the field accessor function get_fieldName().
                    jf = new MethodInvocation.Instance(null, "get" + javaFieldNames[i], JavaTypeNames.RTVALUE, MethodInvocation.InvocationType.VIRTUAL);
                    if (forType != null) {
                        jf = SCJavaDefn.unboxValue(forType, jf);
                    }
                }

                SwitchStatement.IntCaseGroup iCase = new SwitchStatement.IntCaseGroup(i, new ReturnStatement (jf));
                sw.addCase(iCase);
                nReturnedFields++;

            }

            methodBodyBlock.addStatement (sw);

            MethodInvocation error =
                new MethodInvocation.Instance(
                        null,
                        "badFieldIndexInGetFieldByIndex",
                        METHODVAR_FIELDINDEX,
                        JavaTypeName.INT,
                        JavaTypeName.VOID,
                        MethodInvocation.InvocationType.VIRTUAL);

            methodBodyBlock.addStatement(new ExpressionStatement(error));
            methodBodyBlock.addStatement (makeDefaultValReturnStatement(forType));

            if (nReturnedFields > 0) {
                int modifiers = Modifier.PUBLIC | Modifier.FINAL;

                String methodName = "getFieldByIndex";
View Full Code Here

                unboxedBodyCode = (JavaStatement.Block)bodyCode.accept(copier, null);
            } catch (UnboxingTransformationError e) {
                // Unable to transform function body to directly return an unboxed value.
                // Fall back on calling fNS.

                Block body = new Block();

                JavaExpression argValues[] = new JavaExpression[getArity() + 1];
                JavaTypeName argTypes[] = new JavaTypeName[argValues.length];

                argValues[argValues.length-1] = SCJavaDefn.EXECUTION_CONTEXT_VAR;

                Arrays.fill(argTypes, JavaTypeNames.RTVALUE);
                argTypes[argTypes.length-1] = JavaTypeNames.RTEXECUTION_CONTEXT;

                for (int i = 0, n = getArity(); i < n; ++i) {
                    argValues[i] = new JavaExpression.MethodVariable(getJavaArgumentName(i));
                    if (isArgStrict(i) && SCJavaDefn.canTypeBeUnboxed(getArgumentType(i))) {
                        argTypes[i] = typeExprToTypeName(getArgumentType(i));
                    }
                }

                LECCModule.FunctionGroupInfo fgi = module.getFunctionGroupInfo(getQualifiedName());
                String functionName = fgi.getFnNamePrefix(getFunctionName()) + "f";
                if (getArity() > 0) {
                    functionName = functionName + getArity() + "S";
                }

                MethodInvocation fNS =
                    new MethodInvocation.Instance(
                            null,
                            functionName,
                            argValues,
                            argTypes,
                            JavaTypeNames.RTVALUE,
                            MethodInvocation.InvocationType.VIRTUAL);

                LocalVariable result = new LocalVariable("$result", JavaTypeNames.RTVALUE);
                LocalVariableDeclaration resultDecl = new LocalVariableDeclaration(result, fNS);

                body.addStatement(resultDecl);

                for (int i = 0, n = getArity(); i < n; ++i) {
                    if (!isArgStrict(i) || !SCJavaDefn.canTypeBeUnboxed(getArgumentType(i))) {
                        // Null out the argument value.
                        Assignment nullOut =
                            new Assignment((JavaExpression.Nameable)argValues[i], LiteralWrapper.NULL);
                        body.addStatement(new ExpressionStatement(nullOut));
                    }
                }

                MethodInvocation eval = createInvocation(result, SCJavaDefn.EVALUATE, SCJavaDefn.EXECUTION_CONTEXT_VAR);
                JavaExpression unbox = SCJavaDefn.unboxValue(SCJavaDefn.typeExprToTypeName(resultType), eval);

                body.addStatement(new ReturnStatement(unbox));

                unboxedBodyCode = body;
            }

        }
View Full Code Here

            if (codeGenerationStats != null) {
                codeGenerationStats.incrementSCArity(nArguments);
            }

            bodyCode = new Block(exceptionInfo);

            // Generate the root (SC) variable scope
            VariableContext variableContext = new VariableContext();

            // Add the arguments to the variable scope and deal with strictness, boxing, etc.
View Full Code Here

                if (scheme == Scheme.C_SCHEME) {
                    scheme = Scheme.E_SCHEME;
                }
            }

            bodyCode = new Block(exceptionInfo);

            // Generate the root (SC) variable scope
            VariableContext variableContext = new VariableContext();

            // Add the arguments to the variable scope and deal with strictness, boxing, etc.
View Full Code Here

                ecp[i] = genS_C(chain[i], variableContext);
            }
        }

        // Consolidate the context of the arguments.
        Block newContext = ecp[0].getContextBlock();
        for (int i = 1; i < chain.length; ++i) {
            newContext.addStatement(ecp[i].getContextBlock());
        }

        // Get the supercombinator we're calling.
        JavaExpression root = ecp[0].getJavaExpression();
View Full Code Here

                // This is a general application
                ExpressionContextPair target = genS_C(appl.getE1(), variableContext);
                ExpressionContextPair arg = genS_C(appl.getE2(), variableContext);

                // Add the contexts for the target and the arg.
                Block newContextBlock = target.getContextBlock();
                newContextBlock.addStatement(arg.getContextBlock());

                ecp = new ExpressionContextPair(createInvocation(target.getJavaExpression(), APPLY, arg.getJavaExpression()), newContextBlock);
            }

            return ecp;
View Full Code Here

TOP

Related Classes of org.openquark.cal.internal.javamodel.JavaStatement.Block

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.