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

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


        List<JavaExceptionHandler> oldExceptionHandlers = block.getExceptionHandlers();
        for (int i = 0, n = oldExceptionHandlers.size(); i < n; ++i) {
            newExceptionHandlers.add((JavaExceptionHandler)(oldExceptionHandlers.get(i)).accept(this, arg));
        }
       
        Block newBlock = new Block(newExceptionHandlers);
       
        for (int i = 0, n = block.getNBlockStatements(); i < n; ++i) {
            newBlock.addStatement(
                    (JavaStatement)block.getNthBlockStatement(i).accept(this, arg));
        }
       
        return newBlock;
    }
View Full Code Here


            }

            emitLine(sb, indent, "}");

        } else if (statement instanceof Block) {
            Block block = (Block)statement;

            int blockIndent = indent;
            List<JavaExceptionHandler> exceptionHandlers = block.getExceptionHandlers();
            if (!exceptionHandlers.isEmpty()) {
                emitLine(sb, indent, "try {");
                blockIndent++;
            }

            boolean doingLocalVarDeclarations = false;
            boolean wasLineComment = false;
            int nStatements = block.getNBlockStatements();
            for (int i = 0; i < nStatements; i++) {
                JavaStatement blockStatement = block.getNthBlockStatement(i);

                // Try to separate local var declarations from other types of block statements.
                boolean isLocalVarDeclaration = blockStatement instanceof LocalVariableDeclaration;
                if (!wasLineComment && isLocalVarDeclaration != doingLocalVarDeclarations && i > 0) {
                    sb.append(EOL);
View Full Code Here

                    TypeConstructorInfo typeConstructorInfo,
                    JavaTypeName className) {
               
                String[] argNames = new String [typeConstructorInfo.commonFieldNames.size()];
                JavaTypeName[] argTypes = new JavaTypeName [argNames.length];
                Block constructorBody = new Block();
               
                int i = 0;
                for (FieldName fn : typeConstructorInfo.commonFieldNames) {
                    Set<JavaTypeName> javaTypeNames = typeConstructorInfo.allFieldTypeNames.get(fn);
                    assert(javaTypeNames.size() == 1);
                   
                    Iterator<JavaTypeName> types = javaTypeNames.iterator();
                    JavaTypeName type = types.next();
       
                    String fieldName = (String)typeConstructorInfo.fieldJavaNames.get(fn);
                    String argName = fieldName+"$";
       
                    argNames[i] = argName;
                    argTypes[i] = type;
                   
                    JavaExpression.JavaField.Instance field =
                        new JavaExpression.JavaField.Instance(null, fieldName, type);
                    JavaExpression assign = new Assignment (field, new MethodVariable(argName));
                    constructorBody.addStatement(new ExpressionStatement(assign));
                    i++;
                }
               
                String constructorName = className.getUnqualifiedJavaSourceName();
                int index = constructorName.lastIndexOf('.');
View Full Code Here

               
                DataConstructorInfo dci = (DataConstructorInfo)typeConstructorInfo.dataConstructorInfo.get(dc);
               
                String[] argNames = new String [dc.getArity()];
                JavaTypeName[] argTypes = new JavaTypeName [argNames.length];
                Block constructorBody = new Block();
               
                for (int i = 0, n = dc.getArity(); i < n; ++i) {
                    FieldName fn = (FieldName)dc.getNthFieldName(i);
                   
                    JavaTypeName type = (JavaTypeName)dci.fieldTypeNames.get(fn);
                    String fieldName = (String)typeConstructorInfo.fieldJavaNames.get(fn);
                    String argName = fieldName+"$";
       
                    argNames[i] = argName;
                    argTypes[i] = type;

                    if (!typeConstructorInfo.commonFieldNames.contains(fn)) {
                        JavaExpression.JavaField.Instance field =
                            new JavaExpression.JavaField.Instance(null, fieldName, type);
                        JavaExpression assign = new Assignment (field, new MethodVariable(argName));
                        constructorBody.addStatement(new ExpressionStatement(assign));
                    }
                }
               
                String constructorName = dcClassTypeName.getUnqualifiedJavaSourceName();
                int index = constructorName.lastIndexOf('.');
View Full Code Here

            }
        }

        // Now we want to continue with almost the same process as when dealing with a regular switch.

        Block switchBlock = new Block();

        Object altTag = alt.getFirstAltTag();

        // Preserve the behaviour of a switch, i.e. the switch expression will be
        // strictly evaluated before falling through to the single default alternate.
        // This is really only needed if the switch expression can have a side effect.
        boolean isSwitchingOnDC = !alt.isDefaultAlt() && (altTag instanceof DataConstructor);
        boolean switchExprEvaluated = false;
        Expression.Var switchVar = eSwitch.getSwitchExpr().asVar();
        if (switchVar != null) {
            switchExprEvaluated = variableContext.isVarPreEvaluated(switchVar.getName());
        }

        // Only do a local variable if the switch expression is not evaluated or we will
        // be extracting member fields from the data constructor resulting from evaluating the switch expression.
        LocalVariable caseVar = null;
        JavaTypeName caseVarType = (isSwitchingOnDC && alt.hasVars()) ? JavaTypeNames.RTCONS : JavaTypeNames.RTVALUE;
        if (!switchExprEvaluated || alt.hasVars()) {
            caseVar = new LocalVariable("$case" + nestedCaseLevel, caseVarType);

            ExpressionContextPair pair = genS_E(eSwitch.getSwitchExpr(), variableContext);
            switchBlock.addStatement(pair.getContextBlock());
            JavaExpression caseExpression = pair.getJavaExpression();

            if (caseVarType.equals(JavaTypeNames.RTCONS)) {
                caseExpression = new CastExpression(JavaTypeNames.RTCONS, caseExpression);
            }

            LocalVariableDeclaration caseVarDeclaration =
                new LocalVariableDeclaration(caseVar, caseExpression);
            switchBlock.addStatement(caseVarDeclaration);
        }

        // Populate the switch statement with case statement groups.

        // Create a new let variable scope to handle the alternate and any let variables it contains.
        variableContext.pushJavaScope();

        Block caseBlock = new Block();

        if (isSwitchingOnDC) {
            caseBlock.addStatement(new LineComment(((DataConstructor)altTag).getName().getQualifiedName()));
        }

        // Get this alternative's variables.  These have to be added to the active list of scope variables
        if (alt.hasVars()) {
            caseBlock.addStatement(new LineComment("Decompose data type to access members."));

            if (caseVar == null) {
                throw new CodeGenerationException ("Null case variable encountered in single alternate switch.");
            }

            // Must be a data constructor tag, since there are field names (see Expression.Switch.SwitchAlt).
            DataConstructor tagDC = (DataConstructor)altTag;

            TypeExpr fieldTypes[] = SCJavaDefn.getFieldTypesForDC(tagDC);

            // Cast the case var to the appropriate type to call getField0, getField1, etc.
            JavaTypeName dcTypeName = CALToJavaNames.createTypeNameFromDC(tagDC, module);
            JavaExpression castExpression = new CastExpression(dcTypeName, caseVar);

            // There is at least one field to be extracted.
            // Declare a local variable that is the casted case var so that we only do the cast once.
            JavaExpression castCaseVar = new LocalVariable("$dcCaseVar" + nestedCaseLevel, dcTypeName);
            LocalVariableDeclaration localVarStmnt = new LocalVariableDeclaration((LocalVariable)castCaseVar, castExpression);
            caseBlock.addStatement (localVarStmnt);

            for (final AltVarIndexPair altVarIndexPair : getAltVarIndexList(alt, tagDC)) {

                String altVar = altVarIndexPair.getAltVar();
                int fieldIndex = altVarIndexPair.getIndex();

                String fieldGetterName = "get" + SCJavaDefn.getJavaFieldNameFromDC(tagDC, fieldIndex);

                // Build in place representation of this variable mapped to its name
                QualifiedName qn = QualifiedName.make(currentModuleName, altVar);
                VarInfo.DCMember vi = variableContext.addDCField(qn, fieldTypes[fieldIndex]);

                boolean fieldIsStrict =
                    !LECCMachineConfiguration.IGNORE_STRICTNESS_ANNOTATIONS && tagDC.isArgStrict(fieldIndex);

                if (fieldIsStrict) {
                    vi.setEvaluated(true);
                }

                if (fieldIsStrict) {
                    if (SCJavaDefn.canTypeBeUnboxed(fieldTypes[fieldIndex])) {
                        JavaTypeName strictType = SCJavaDefn.typeExprToTypeName(fieldTypes[fieldIndex]);
                        JavaExpression unboxedInitializer =
                            new JavaExpression.MethodInvocation.Instance(castCaseVar,
                                                                         fieldGetterName + "_As_" + SCJavaDefn.getNameForPrimitive(strictType),
                                                                         strictType,
                                                                         JavaExpression.MethodInvocation.InvocationType.VIRTUAL);

                        vi.updateUnboxedVarDef(unboxedInitializer);
                        JavaExpression localVar = new LocalVariable(vi.getJavaName()+"$U", vi.getUnboxedType());
                        vi.updateUnboxedReference(localVar);
                        JavaExpression boxedDef = SCJavaDefn.boxExpression(vi.getUnboxedType(), localVar);
                        vi.updateStrictReference(boxedDef);
                        vi.updateLazyReference(boxedDef);
                    } else {
                        JavaExpression initializer = new JavaExpression.MethodInvocation.Instance(castCaseVar, fieldGetterName, JavaTypeNames.RTVALUE, JavaExpression.MethodInvocation.InvocationType.VIRTUAL);
                        vi.updateStrictVarDef (initializer);
                        JavaExpression localVar = new LocalVariable(vi.getJavaName(), JavaTypeNames.RTVALUE);
                        vi.updateStrictReference(localVar);
                        vi.updateLazyReference(localVar);
                    }
                } else {
                    JavaExpression initializer = new JavaExpression.MethodInvocation.Instance(castCaseVar, fieldGetterName, JavaTypeNames.RTVALUE, JavaExpression.MethodInvocation.InvocationType.VIRTUAL);
                    vi.updateLazyVarDef (initializer);
                    JavaExpression localVar = new LocalVariable(vi.getJavaName(), JavaTypeNames.RTVALUE);
                    vi.updateLazyReference(localVar);

                    JavaExpression evaluatedVar = SCJavaDefn.createInvocation(localVar, SCJavaDefn.EVALUATE, SCJavaDefn.EXECUTION_CONTEXT_VAR);
                    vi.updateStrictReference(evaluatedVar);
                    if (SCJavaDefn.canTypeBeUnboxed(fieldTypes[fieldIndex])) {
                        vi.updateUnboxedReference(SCJavaDefn.unboxValue(vi.getUnboxedType(), evaluatedVar));
                    }
                }
            }
        }

        JavaStatement altStatement = genS_R(alt.getAltExpr(), variableContext);
        caseBlock.addStatement(variableContext.popJavaScope());
        caseBlock.addStatement(altStatement);
        switchBlock.addStatement(caseBlock);

        return switchBlock;
    }
View Full Code Here

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

        Block newContext = ecp[0].getContextBlock();
        for (int i = 1; i < chain.length; ++i) {
            newContext.addStatement(ecp[i].getContextBlock());
        }

        JavaExpression root = ecp[0].getJavaExpression();

        if (codeGenerationStats != null) {
View Full Code Here

        for (int i = 1; i < length; ++i) {
                ecp[i] = genS_C(chain[i], variableContext);
        }

        // Build up the context from the compiled arguments.
        Block newContext = ecp[1].getContextBlock();
        for (int i = 2; i < length; ++i) {
            newContext.addStatement(ecp[i].getContextBlock());
        }

        // Build the statement to create a new partial application node.
        JavaExpression args[] = new JavaExpression[length];
        JavaTypeName argTypes[] = new JavaTypeName[length];
View Full Code Here

        if (codeGenerationStats != null) {
            codeGenerationStats.incrementTailRecursiveFunctions(getArity());
        }

        Block newContext = new Block ();

        Expression[] args = rc.getArguments();

        // We want to use the SC specific application node.
        // First generate the java expressions for the CAL expressions.
        ExpressionContextPair[] ecps = new ExpressionContextPair[args.length];
        for (int i = 0; i < args.length; ++i) {
            if (argumentStrictness[i]) {
                if (SCJavaDefn.canTypeBeUnboxed(argumentTypes[i])) {
                    ecps[i] = generateUnboxedArgument(typeExprToTypeName(argumentTypes[i]), args[i], variableContext);
                } else {
                    ecps[i] = genS_E(args[i], variableContext);
                }
            } else {
                ecps[i] = genS_C(args[i], variableContext);
            }
        }

        for (int i = 0; i < args.length; ++i) {
            newContext.addStatement(ecps[i].getContextBlock());
        }

        Block tempAssignment = new Block ();
        Block reAssignment = new Block ();

        // Do function argument re-assignment using temporaries.
        // We use temporaries to avoid problems with function interdependencies.
        // i.e. simply transforming: new RTAppS ($instance, n - 1, acc + n);  to:
        // n = n - 1; acc = acc + n; continue;  will give incorrect results because
        // the value of n has been re-assigned before calculating acc + n.

        // Try to avoid the temporary local variable where possible.
        int[] needTemp = new int[getArity()]// 0 -> temp, 1 -> assign, 2 -> skip
        Arrays.fill (needTemp, 0);

        // If we are assigning an atomic entity i.e. literal or var we don't need the temporary.
        for (int i = 0; i < getArity(); ++i) {
            if (args[i].asLiteral() != null) {
                needTemp[i] = 1;
            } else
            if (args[i].asVar() != null) {
                QualifiedName newVarName = args[i].asVar().getName();
                // If the argument is being passed unchanged to the tail recursive call we can skip the assignment.
                if (newVarName.equals(QualifiedName.make(currentModuleName, argumentNames[i])) &&
                        variableContext.isFunctionArgument(newVarName)) {
                        // The argument passed to the function is being passed unchanged in the tail recursive call.
                        needTemp[i] = 2;
                } else
                // If the var is a local or an sc do a simple assignment
                if (!variableContext.isLocalVariable(newVarName) ||
                    variableContext.isDCField(newVarName) ||
                    variableContext.isRecordField(newVarName)) {
                    needTemp[i] = 1;
                } else
                // If the assignment is to a following argument it is safe to do a simple assignment.
                if (variableContext.isFunctionArgument(newVarName)) {
                    for (int j = i + 1; j < getArity(); ++j) {
                        if (argumentNames[j].equals(newVarName.getUnqualifiedName())) {
                            needTemp[i] = 1;
                        }
                    }
                }

            } else {
                boolean dependent = false;
                for (int j = 0; j < i; j++) {
                    QualifiedName argName = QualifiedName.make(currentModuleName, argumentNames[j]);
                    if (needTemp[j] != 2 && args[i].isDependentOn(argName)) {
                        dependent = true;
                        break;
                    }
                }
                if (!dependent) {
                    needTemp[i] = 1;
                }
            }
        }

        for (int i = 0; i < getArity(); ++i) {
            JavaTypeName argType = JavaTypeNames.RTVALUE;
            if (isArgUnboxable(i) && isArgStrict (i)) {
                argType = typeExprToTypeName(argumentTypes[i]);
            }

            if (needTemp[i] == 0) {
                // Assign the new argument value to a local variable.
                // RTValue arg1$ = ...;
                JavaStatement.LocalVariableDeclaration decl = new LocalVariableDeclaration (new LocalVariable (getJavaArgumentName(i)+"$", argType),
                                                                             ecps[i].getJavaExpression());
                tempAssignment.addStatement (decl);

                // Assign back to the argument.
                // arg1 = arg1$;
                Assignment a = new Assignment(new JavaExpression.LocalName(getJavaArgumentName(i), argType),
                                              new JavaExpression.LocalName(getJavaArgumentName(i) + "$", argType));
                reAssignment.addStatement(new ExpressionStatement(a));
            } else
            if (needTemp[i] == 1){
                // Simply assign the new definition to the argument.
                // arg1 = ...;
                Assignment a = new Assignment(new JavaExpression.LocalName(getJavaArgumentName(i), argType),
                                                                           ecps[i].getJavaExpression());
                reAssignment.addStatement(new ExpressionStatement(a));
            }
        }

        newContext.addStatement (tempAssignment);
        newContext.addStatement (reAssignment);
View Full Code Here

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

        Block newContext = ecp[0].getContextBlock();
        for (int i = 1; i < chain.length; ++i) {
            newContext.addStatement(ecp[i].getContextBlock());
        }

        JavaExpression root = ecp[0].getJavaExpression();

        if (codeGenerationStats != null) {
View Full Code Here

        ExpressionContextPair[] ecp = new ExpressionContextPair[chain.length];
        for (int i = 0; i < chain.length; ++i) {
            ecp[i] = genS_C(chain[i], variableContext);
        }

        Block newContext = ecp[0].getContextBlock();
        for (int i = 1; i < chain.length; ++i) {
            newContext.addStatement(ecp[i].getContextBlock());
        }

        if (codeGenerationStats != null) {
            if (var.getForeignFunctionInfo() != null) {
                codeGenerationStats.incrementLazyForeignNodeCount();
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.