Search in sources :

Example 1 with Member

use of lucee.transformer.expression.var.Member in project Lucee by lucee.

the class Output method addEncodeToChildren.

private void addEncodeToChildren(Iterator it, Expression encodeForValue, FunctionLibFunction encodeForBIF) {
    Statement stat;
    while (it.hasNext()) {
        stat = (Statement) it.next();
        if (stat instanceof PrintOut) {
            PrintOut printOut = ((PrintOut) stat);
            Expression e = removeCastString(printOut.getExpr());
            if (!(e instanceof Literal)) {
                if (e instanceof Variable) {
                    Member member = ((Variable) e).getFirstMember();
                    if (member instanceof BIF) {
                        BIF bif = (BIF) member;
                        String cn = bif.getClassDefinition().getClassName();
                        if (cn.startsWith(ENCODE_FOR) || cn.equals(ESAPIEncode.class.getName())) {
                            continue;
                        }
                    }
                }
                printOut.setEncodeFor(encodeForValue);
            }
        } else if (stat instanceof Tag) {
            Body b = ((Tag) stat).getBody();
            if (b != null)
                addEncodeToChildren(b.getStatements().iterator(), encodeForValue, encodeForBIF);
        } else if (stat instanceof Body) {
            addEncodeToChildren(((Body) stat).getStatements().iterator(), encodeForValue, encodeForBIF);
        }
    }
}
Also used : Variable(lucee.transformer.expression.var.Variable) PrintOut(lucee.transformer.bytecode.statement.PrintOut) Expression(lucee.transformer.expression.Expression) Statement(lucee.transformer.bytecode.Statement) Literal(lucee.transformer.expression.literal.Literal) CastString(lucee.transformer.bytecode.cast.CastString) TagLibTag(lucee.transformer.library.tag.TagLibTag) Tag(lucee.transformer.bytecode.statement.tag.Tag) Member(lucee.transformer.expression.var.Member) Body(lucee.transformer.bytecode.Body) BIF(lucee.transformer.bytecode.expression.var.BIF)

Example 2 with Member

use of lucee.transformer.expression.var.Member in project Lucee by lucee.

the class AbstrCFMLExprTransformer method newOp.

private Expression newOp(ExprData data, Expression expr) throws TemplateException {
    if (!(expr instanceof Variable))
        return expr;
    Variable var = (Variable) expr;
    Member m = var.getFirstMember();
    if (!(m instanceof DataMember))
        return expr;
    ExprString n = ((DataMember) m).getName();
    if (!(n instanceof LitString))
        return expr;
    LitString ls = (LitString) n;
    if (!"new".equalsIgnoreCase(ls.getString()))
        return expr;
    int start = data.srcCode.getPos();
    ExprString exprName = readComponentPath(data);
    if (exprName == null) {
        data.srcCode.setPos(start);
        return expr;
    }
    comments(data);
    if (data.srcCode.isCurrent('(')) {
        FunctionMember func = getFunctionMember(data, Identifier.toIdentifier(data.factory, "_createComponent", Identifier.CASE_ORIGNAL, null, null), true);
        func.addArgument(new Argument(exprName, "string"));
        Variable v = expr.getFactory().createVariable(expr.getStart(), expr.getEnd());
        v.addMember(func);
        comments(data);
        return v;
    }
    data.srcCode.setPos(start);
    return expr;
}
Also used : LitString(lucee.transformer.expression.literal.LitString) OpVariable(lucee.transformer.bytecode.op.OpVariable) Variable(lucee.transformer.expression.var.Variable) NamedArgument(lucee.transformer.bytecode.expression.var.NamedArgument) Argument(lucee.transformer.bytecode.expression.var.Argument) ExprString(lucee.transformer.expression.ExprString) DataMember(lucee.transformer.expression.var.DataMember) FunctionMember(lucee.transformer.bytecode.expression.var.FunctionMember) DataMember(lucee.transformer.expression.var.DataMember) Member(lucee.transformer.expression.var.Member) FunctionMember(lucee.transformer.bytecode.expression.var.FunctionMember)

Example 3 with Member

use of lucee.transformer.expression.var.Member in project Lucee by lucee.

the class ASMUtil method cachedWithinValue.

public static Literal cachedWithinValue(Expression val) throws EvaluatorException {
    if (val instanceof Literal) {
        Literal l = (Literal) val;
        // double == days
        Double d = l.getDouble(null);
        if (d != null) {
            return val.getFactory().createLitLong(TimeSpanImpl.fromDays(d.doubleValue()).getMillis(), null, null);
        }
        return l;
    } else // createTimespan
    if (val instanceof Variable) {
        Variable var = (Variable) val;
        if (var.getMembers().size() == 1) {
            Member first = var.getFirstMember();
            if (first instanceof BIF) {
                BIF bif = (BIF) first;
                if ("createTimeSpan".equalsIgnoreCase(bif.getFlf().getName())) {
                    Argument[] args = bif.getArguments();
                    int len = ArrayUtil.size(args);
                    if (len >= 4 && len <= 5) {
                        double days = toDouble(args[0].getValue());
                        double hours = toDouble(args[1].getValue());
                        double minutes = toDouble(args[2].getValue());
                        double seconds = toDouble(args[3].getValue());
                        double millis = len == 5 ? toDouble(args[4].getValue()) : 0;
                        return val.getFactory().createLitLong(new TimeSpanImpl((int) days, (int) hours, (int) minutes, (int) seconds, (int) millis).getMillis(), null, null);
                    }
                }
            }
        }
    }
    throw cacheWithinException();
}
Also used : Variable(lucee.transformer.expression.var.Variable) Literal(lucee.transformer.expression.literal.Literal) TimeSpanImpl(lucee.runtime.type.dt.TimeSpanImpl) LitDouble(lucee.transformer.expression.literal.LitDouble) ExprDouble(lucee.transformer.expression.ExprDouble) DataMember(lucee.transformer.expression.var.DataMember) Member(lucee.transformer.expression.var.Member) BIF(lucee.transformer.bytecode.expression.var.BIF)

Example 4 with Member

use of lucee.transformer.expression.var.Member in project Lucee by lucee.

the class Assign method _writeOut.

@Override
public Type _writeOut(BytecodeContext bc, int mode) throws TransformerException {
    GeneratorAdapter adapter = bc.getAdapter();
    int count = variable.getCount();
    // count 0
    if (count == 0) {
        if (variable.ignoredFirstMember() && variable.getScope() == Scope.SCOPE_VAR) {
            // print.dumpStack();
            return Types.VOID;
        }
        return _writeOutEmpty(bc);
    }
    boolean doOnlyScope = variable.getScope() == Scope.SCOPE_LOCAL;
    Type rtn = Types.OBJECT;
    // boolean last;
    for (int i = doOnlyScope ? 0 : 1; i < count; i++) {
        adapter.loadArg(0);
    }
    rtn = _writeOutFirst(bc, (variable.getMembers().get(0)), mode, count == 1, doOnlyScope);
    // pc.get(
    for (int i = doOnlyScope ? 0 : 1; i < count; i++) {
        Member member = (variable.getMembers().get(i));
        boolean last = (i + 1) == count;
        // Data Member
        if (member instanceof DataMember) {
            // ((DataMember)member).getName().writeOut(bc, MODE_REF);
            getFactory().registerKey(bc, ((DataMember) member).getName(), false);
            if (last)
                writeValue(bc);
            adapter.invokeVirtual(Types.PAGE_CONTEXT, last ? SET_KEY : TOUCH_KEY);
            rtn = Types.OBJECT;
        } else // UDF
        if (member instanceof UDF) {
            if (last)
                throw new TransformerException("can't assign value to a user defined function", getStart());
            UDF udf = (UDF) member;
            getFactory().registerKey(bc, udf.getName(), false);
            ExpressionUtil.writeOutExpressionArray(bc, Types.OBJECT, udf.getArguments());
            adapter.invokeVirtual(Types.PAGE_CONTEXT, udf.hasNamedArgs() ? GET_FUNCTION_WITH_NAMED_ARGS_KEY : GET_FUNCTION_KEY);
            rtn = Types.OBJECT;
        }
    }
    return rtn;
}
Also used : Type(org.objectweb.asm.Type) DataMember(lucee.transformer.expression.var.DataMember) GeneratorAdapter(org.objectweb.asm.commons.GeneratorAdapter) DataMember(lucee.transformer.expression.var.DataMember) Member(lucee.transformer.expression.var.Member) TransformerException(lucee.transformer.TransformerException)

Example 5 with Member

use of lucee.transformer.expression.var.Member in project Lucee by lucee.

the class VT method _writeOut.

private Type _writeOut(BytecodeContext bc, int mode, Boolean asCollection) throws TransformerException {
    final GeneratorAdapter adapter = bc.getAdapter();
    final int count = countFM + countDM;
    // count 0
    if (count == 0)
        return _writeOutEmpty(bc);
    boolean doOnlyScope = scope == Scope.SCOPE_LOCAL;
    // boolean last;
    int c = 0;
    for (int i = doOnlyScope ? 0 : 1; i < count; i++) {
        Member member = (members.get((count - 1) - c));
        c++;
        adapter.loadArg(0);
        if (member.getSafeNavigated() && member instanceof UDF)
            adapter.checkCast(Types.PAGE_CONTEXT_IMPL);
    }
    Type rtn = _writeOutFirst(bc, (members.get(0)), mode, count == 1, doOnlyScope, null, null);
    // pc.get(
    for (int i = doOnlyScope ? 0 : 1; i < count; i++) {
        Member member = (members.get(i));
        boolean last = (i + 1) == count;
        // Data Member
        if (member instanceof DataMember) {
            ExprString name = ((DataMember) member).getName();
            if (last && ASMUtil.isDotKey(name)) {
                LitString ls = (LitString) name;
                if (ls.getString().equalsIgnoreCase("RECORDCOUNT")) {
                    adapter.invokeStatic(Types.VARIABLE_UTIL_IMPL, RECORDCOUNT);
                } else if (ls.getString().equalsIgnoreCase("CURRENTROW")) {
                    adapter.invokeStatic(Types.VARIABLE_UTIL_IMPL, CURRENTROW);
                } else if (ls.getString().equalsIgnoreCase("COLUMNLIST")) {
                    adapter.invokeStatic(Types.VARIABLE_UTIL_IMPL, COLUMNLIST);
                } else {
                    getFactory().registerKey(bc, name, false);
                    // safe nav
                    int type;
                    if (member.getSafeNavigated()) {
                        Expression val = member.getSafeNavigatedValue();
                        if (val == null)
                            ASMConstants.NULL(adapter);
                        else
                            val.writeOut(bc, Expression.MODE_REF);
                        type = THREE;
                    } else
                        type = TWO;
                    adapter.invokeVirtual(Types.PAGE_CONTEXT, asCollection(asCollection, last) ? GET_COLLECTION[type] : GET[type]);
                }
            } else {
                getFactory().registerKey(bc, name, false);
                // safe nav
                int type;
                if (member.getSafeNavigated()) {
                    Expression val = member.getSafeNavigatedValue();
                    if (val == null)
                        ASMConstants.NULL(adapter);
                    else
                        val.writeOut(bc, Expression.MODE_REF);
                    type = THREE;
                } else
                    type = TWO;
                adapter.invokeVirtual(Types.PAGE_CONTEXT, asCollection(asCollection, last) ? GET_COLLECTION[type] : GET[type]);
            }
            rtn = Types.OBJECT;
        } else // UDF
        if (member instanceof UDF) {
            rtn = _writeOutUDF(bc, (UDF) member);
        }
    }
    return rtn;
}
Also used : LitString(lucee.transformer.expression.literal.LitString) Type(org.objectweb.asm.Type) ExprString(lucee.transformer.expression.ExprString) Expression(lucee.transformer.expression.Expression) DataMember(lucee.transformer.expression.var.DataMember) GeneratorAdapter(org.objectweb.asm.commons.GeneratorAdapter) DataMember(lucee.transformer.expression.var.DataMember) Member(lucee.transformer.expression.var.Member)

Aggregations

Member (lucee.transformer.expression.var.Member)13 DataMember (lucee.transformer.expression.var.DataMember)11 GeneratorAdapter (org.objectweb.asm.commons.GeneratorAdapter)6 Expression (lucee.transformer.expression.Expression)5 Literal (lucee.transformer.expression.literal.Literal)5 ExprString (lucee.transformer.expression.ExprString)4 Variable (lucee.transformer.expression.var.Variable)4 ArrayList (java.util.ArrayList)3 TransformerException (lucee.transformer.TransformerException)3 BIF (lucee.transformer.bytecode.expression.var.BIF)3 ArrayVisitor (lucee.transformer.bytecode.visitor.ArrayVisitor)3 LitString (lucee.transformer.expression.literal.LitString)3 Type (org.objectweb.asm.Type)3 Body (lucee.transformer.bytecode.Body)2 Statement (lucee.transformer.bytecode.Statement)2 CastString (lucee.transformer.bytecode.cast.CastString)2 Argument (lucee.transformer.bytecode.expression.var.Argument)2 FunctionMember (lucee.transformer.bytecode.expression.var.FunctionMember)2 UDF (lucee.transformer.bytecode.expression.var.UDF)2 PrintOut (lucee.transformer.bytecode.statement.PrintOut)2