Package org.openquark.cal.internal.javamodel.JavaExpression

Examples of org.openquark.cal.internal.javamodel.JavaExpression.LocalVariable


        isABlock.addStatement(pair.getContextBlock());

        JavaExpression isAExpr = null;
        JavaExpression tagValue = SCJavaDefn.createInvocation (pair.getJavaExpression(), SCJavaDefn.GETORDINALVALUE);
        if ((lookingForTrue && trueCount > 1) || (!lookingForTrue && falseCount > 1)) {
            LocalVariable intVal = new LocalVariable ("$intVal", JavaTypeName.INT);
            LocalVariableDeclaration intValDeclaration = new LocalVariableDeclaration(intVal, tagValue);
            isABlock.addStatement (intValDeclaration);
            tagValue = intVal;
        }
View Full Code Here


            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])) {
View Full Code Here

            }

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

        // throw new RTForeignFunctionException(RTValue.generateForeignFunctionErrorMessage(exception, generatedClassName, supercombinatorName), null, exception);

        JavaTypeName exceptionType = JavaTypeName.make(exceptionClass);
        JavaExpression args[] = new JavaExpression [4];
        JavaTypeName argTypes[] = new JavaTypeName [4];
        args[0] = new LocalVariable("caught_exception" , exceptionType);
        argTypes[0] = JavaTypeName.THROWABLE;
        args[1] = LiteralWrapper.make(CALToJavaNames.createFullClassNameFromSC(getQualifiedName(), module));
        argTypes[1] = JavaTypeName.STRING;
        args[2] = LiteralWrapper.make(currentModuleName.toSourceText());
        argTypes[2] = JavaTypeName.STRING;
        args[3] = LiteralWrapper.make(getFunctionName());
        argTypes[3] = JavaTypeName.STRING;
        MethodInvocation genMessage = new MethodInvocation.Static (JavaTypeNames.RTVALUE,
                                                            "generateForeignFunctionErrorMessage",
                                                            args,
                                                            argTypes,
                                                            argTypes[1]);

        JavaExpression constructorArgs[] = new JavaExpression [2];
        JavaTypeName constructorArgTypes[] = new JavaTypeName [2];
        constructorArgs[0] = genMessage;
        constructorArgTypes[0] = JavaTypeName.STRING;
        constructorArgs[1] = new LocalVariable("caught_exception", exceptionType);
        constructorArgTypes[1] = JavaTypeName.THROWABLE;
        ClassInstanceCreationExpression nc =
            new ClassInstanceCreationExpression (JavaTypeNames.RTFOREIGN_FUNCTION_EXCEPTION, constructorArgs, constructorArgTypes);

        ThrowStatement throwSt = new ThrowStatement (nc);
View Full Code Here

                    JavaExpression boxedVarDef = ((VarInfo.LetRec)info).getLazyVarDef();
                    if (boxedVarDef == null) {
                        throw new CodeGenerationException ("Missing boxed definition for let variable: " + info.getCALName());
                    }

                    LocalVariable letNameVariable = new LocalVariable(javaName, JavaTypeNames.RTINDIRECTION);

                    // RTValue javaName = new RTIndirection();
                    JavaExpression newIndirection = new ClassInstanceCreationExpression(JavaTypeNames.RTINDIRECTION);
                    LocalVariableDeclaration letDecl = new LocalVariableDeclaration(letNameVariable, newIndirection);
                    declarationBlock.addStatement(letDecl);

                    // Emit let variable definition.
                    // letName.setResult(letDef);
                    MethodInvocation letInvocation = createInvocation(letNameVariable, SETRESULT, boxedVarDef);
                    definitionBlock.addStatement(new ExpressionStatement(letInvocation));
                } else
                if (info instanceof VarInfo.LetNonRec) {
                    // This variable is referenced multiple times.
                    // We need to declare/initialize a local java variable.

                    // If the variable is already evaluated we behave differently.
                    if (info.isEvaluated()) {
                        if (info.getUnboxedType() != null) {
                            // The definition function will return an unboxed value.
                            // Declare an unboxed local variable.
                            LocalVariable unboxedLocal = new LocalVariable(info.getJavaName()+"$U", info.getUnboxedType());
                            LocalVariableDeclaration unboxedVarDecl = new LocalVariableDeclaration(unboxedLocal, ((VarInfo.LetNonRec)info).getUnboxedVarDef());
                            declarationBlock.addStatement(unboxedVarDecl);

                        } else {
                            // All references will be boxed.
                            // Declare a boxed local variable an update the strict/lazy refs.
                            // We use the strict variable def since we know this variable is already evaluated.
                            LocalVariable boxedLocal = new LocalVariable(info.getJavaName(), JavaTypeNames.RTVALUE);
                            LocalVariableDeclaration boxedVarDecl = new LocalVariableDeclaration(boxedLocal, ((VarInfo.LetNonRec)info).getStrictVarDef());
                            declarationBlock.addStatement(boxedVarDecl);
                        }
                    } else {
                        // The variable is not pre-evaluated.
                        // The variable is referenced more than once.
                        // We want to use the lazy initializer.
                        LocalVariable boxedLocal = new LocalVariable(info.getJavaName(), JavaTypeNames.RTVALUE);
                        LocalVariableDeclaration boxedVarDecl = new LocalVariableDeclaration(boxedLocal, ((VarInfo.LetNonRec)info).getLazyVarDef());
                        declarationBlock.addStatement(boxedVarDecl);
                    }

                } else
                if (info instanceof VarInfo.DCMember){
                    // The DCMember instance of VarInfo will only have one
                    // varDef defined.  i.e. unboxed or strict or lazy.
                    JavaExpression unboxedVarDef = ((VarInfo.DCMember)info).getUnboxedVarDef();
                    JavaExpression lazyVarDef = ((VarInfo.DCMember)info).getLazyVarDef();
                    JavaExpression strictVarDef = ((VarInfo.DCMember)info).getStrictVarDef();

                    if (unboxedVarDef != null) {
                        // Base declarations on unboxed definition.
                        // Declare a local unboxed variable and update the unboxed reference.
                        LocalVariable unboxedLocal = new LocalVariable(javaName+"$U", info.getUnboxedType());
                        LocalVariableDeclaration letDecl = new LocalVariableDeclaration(unboxedLocal, unboxedVarDef);
                        declarationBlock.addStatement(letDecl);
                    } else
                    if (strictVarDef != null) {
                        // If there is a strict variable definition we should never have unboxed use.
                        // Since a strict variable of an unboxable type would have an unboxed variable definition.
                        // Declare a boxed local and update the strict and lazy references.
                        LocalVariable boxedLocal = new LocalVariable (javaName, JavaTypeNames.RTVALUE);
                        LocalVariableDeclaration boxedDecl = new LocalVariableDeclaration (boxedLocal, strictVarDef);
                        declarationBlock.addStatement(boxedDecl);
                        info.updateStrictReference(boxedLocal);
                        info.updateLazyReference(boxedLocal);
                    } else {
                        // Lazy variable.
                        // Declare a lazy local variable.
                        LocalVariable lazyLocal = new LocalVariable(info.getJavaName(), JavaTypeNames.RTVALUE);
                        LocalVariableDeclaration lazyDecl = new LocalVariableDeclaration(lazyLocal, lazyVarDef);
                        declarationBlock.addStatement(lazyDecl);
                    }
                }
            }
View Full Code Here

TOP

Related Classes of org.openquark.cal.internal.javamodel.JavaExpression.LocalVariable

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.