/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
* Free SoftwareFoundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.es.parser;
import com.caucho.es.ESException;
import java.io.IOException;
/**
* Expr is an intermediate form representing an expression.
*/
class AssignExpr extends Expr {
private Expr lhs;
private IdExpr var;
private Expr field;
private Expr rhs;
AssignExpr(Block block, IdExpr var, Expr rhs)
{
super(block);
this.var = var;
this.rhs = rhs;
rhs.getType();
if (! (rhs instanceof LiteralExpr || rhs instanceof IdExpr))
var.setUsed();
}
AssignExpr(Block block, Expr lhs, Expr field, Expr rhs)
{
super(block);
this.lhs = lhs;
this.field = field;
this.rhs = rhs;
rhs.getType();
lhs.setUsed();
}
void exprStatement(Function fun) throws ESException
{
isTop = true;
noValue = true;
fun.addExpr(this);
}
/**
* The assignment operator
*/
void printImpl()
throws IOException
{
cl.setLine(getFilename(), getLine());
if (var != null && (var.isJavaLocal() || var.isJavaGlobal())) {
if (! isTop && ! noValue) {
switch (var.getType()) {
case TYPE_NUMBER:
case TYPE_INTEGER:
cl.print("ESNumber.create(");
break;
case TYPE_BOOLEAN:
cl.print("ESBoolean.create(");
break;
default:
cl.print("(");
break;
}
}
else if (noValue && ! var.isUsed() &&
(rhs instanceof LiteralExpr || rhs instanceof IdExpr))
return;
else if (! noValue)
cl.print("(");
cl.print(var.getId());
cl.print(" = ");
switch (var.getType()) {
case TYPE_NUMBER:
rhs.printNum();
break;
case TYPE_INTEGER:
rhs.printInt32();
break;
case TYPE_BOOLEAN:
rhs.printBoolean();
break;
case TYPE_JAVA:
if (var.getType() == TYPE_JAVA &&
! var.getJavaClass().isAssignableFrom(rhs.getJavaClass()))
cl.print("(" + var.getJavaClass().getName() + ") ");
rhs.printJava();
break;
default:
rhs.print();
break;
}
if (! noValue)
cl.print(")");
}
else if (noValue && var != null) {
if (var.isGlobalScope())
cl.print("_env.global.setProperty(");
// XXX: should expand to anything without a side-effect
else if (! var.isUsed() && var.isLocal() &&
(rhs instanceof LiteralExpr || rhs instanceof IdExpr))
return;
else if (var.getVar().hasInit())
cl.print("_arg.setProperty(");
else
cl.print("_env.setScopeProperty(");
printLiteral(var.getId());
cl.print(", ");
rhs.print();
cl.print(")");
}
else if (var != null) {
if (var.isGlobalScope())
cl.print("_env.setGlobalProperty(");
else if (! var.isUsed() && var.isLocal() &&
(rhs instanceof LiteralExpr || rhs instanceof IdExpr))
return;
else if (var.getVar().hasInit())
cl.print("_arg.setProperty(");
else
cl.print("_env.setScopeProperty(");
printLiteral(var.getId());
cl.print(", ");
rhs.print();
cl.print(")");
}
else if (noValue) {
lhs.print();
cl.print(".setProperty(");
if (field.getType() == TYPE_INTEGER)
field.printInt32();
else
field.printStr();
cl.print(", ");
rhs.print();
cl.print(")");
}
else {
cl.print("_env.setProperty(");
lhs.print();
cl.print(", ");
field.printStr();
cl.print(", ");
rhs.print();
cl.print(")");
}
}
}