public Value evaluate()

in modules/asc/src/java/macromedia/asc/semantics/ConfigurationEvaluator.java [439:655]


	public Value evaluate(Context cx, BinaryExpressionNode node) {
		Value val = null;
		if( fold_expressions )
		{
			Value lhs_val = node.lhs.evaluate(cx, this);
			Value rhs_val = node.rhs.evaluate(cx, this);
			
			Node new_lhs = foldRefValue(cx, lhs_val);
			Node new_rhs = foldRefValue(cx, rhs_val);
			if( new_lhs != null )
			{
				node.lhs = new_lhs;
				lhs_val = node.lhs.evaluate(cx, this);
			}
			if( new_rhs != null )
			{
				node.rhs = new_rhs;
				rhs_val = node.rhs.evaluate(cx, this);
			}
			
			if( lhs_val != null && rhs_val != null && lhs_val.hasValue() && rhs_val.hasValue() )
			{
				ObjectValue lhs_ov = (ObjectValue)lhs_val;
				ObjectValue rhs_ov = (ObjectValue)rhs_val;
				
				TypeValue lt = lhs_ov.getType(cx).getTypeValue();
				TypeValue rt = rhs_ov.getType(cx).getTypeValue();
				
				switch(node.op)
				{
				case PLUS_TOKEN:
					if( isNumericType(cx, lt) && isNumericType(cx, rt) )
					{
	                    TypeValue[] type = new TypeValue[1];
	                    double ld = cx.getEmitter().getValueOfNumberLiteral( lhs_ov.getValue(), type, node.numberUsage).doubleValue();
	                    double rd = cx.getEmitter().getValueOfNumberLiteral( rhs_ov.getValue(), type, node.numberUsage).doubleValue();
	                    double d = 0.0/0;
	                    d = ld + rd;
	                    val = new ObjectValue(Double.toString(d), cx.numberType());
					}
					else if( lt == cx.stringType() || rt == cx.stringType() )
					{
	                    String ls = toString(cx, lhs_ov);
	                    String rs = toString(cx, rhs_ov);
	                    val = new ObjectValue(ls+rs,cx.stringType());
					}
					break;
	            case MINUS_TOKEN:
	            case MULT_TOKEN:
	            case DIV_TOKEN:
	            case MODULUS_TOKEN:
	            	if( isNumericType(cx, lt) && isNumericType(cx, rt) )
	            	{
	                    TypeValue[] type = new TypeValue[1];
	                    double ld = cx.getEmitter().getValueOfNumberLiteral( lhs_ov.getValue(), type, node.numberUsage).doubleValue();
	                    double rd = cx.getEmitter().getValueOfNumberLiteral( rhs_ov.getValue(), type, node.numberUsage).doubleValue();
	                    double d = 0.0/0;
	                    switch( node.op )
	                    {
	                    case MINUS_TOKEN:
	                        d = ld-rd;
	                        break;
	                    case MULT_TOKEN:
	                        d = ld*rd;
	                        break;
	                    case DIV_TOKEN:
	                        d = ld/rd;
	                        break;
	                    case MODULUS_TOKEN:
	                        d = ld%rd;
	                        break;
	                    }
	                    val = new ObjectValue(Double.toString(d), cx.numberType());
	                    break;
	            	}
				case LOGICALOR_TOKEN:
				{
					Boolean b = toBoolean(cx, lhs_ov);
					Boolean b2 = toBoolean(cx, rhs_ov);
					if( b != null && b2 != null )
					{
						val = getBooleanObjectValue(cx, b.booleanValue() || b2.booleanValue());
					}
					break;
				}
				case LOGICALAND_TOKEN:
				{
					Boolean b = toBoolean(cx, lhs_ov);
					Boolean b2 = toBoolean(cx, rhs_ov);
					if( b != null && b2 != null )
					{
						val = getBooleanObjectValue(cx, b.booleanValue() && b2.booleanValue());
					}
					break;
				}
				case EQUALS_TOKEN:
				case NOTEQUALS_TOKEN:
				{
					Boolean b = compare(cx, lhs_ov, rhs_ov);
					if( b != null )
						if( node.op == NOTEQUALS_TOKEN)
							val = getBooleanObjectValue(cx, !b.booleanValue());
						else
							val = getBooleanObjectValue(cx, b.booleanValue());
					break;
				}
				
				case LESSTHAN_TOKEN:
				case GREATERTHANOREQUALS_TOKEN:
				{
					String less_result = lessthan(cx, lhs_ov, rhs_ov);
					Boolean b = null;
					if( node.op == LESSTHAN_TOKEN )
					{
						if( less_result == UNDEFINED || less_result == FALSE )
							b = Boolean.FALSE;
						else
							b = Boolean.TRUE ;
					}
					else
					{
						if( less_result == UNDEFINED || less_result == TRUE )
							b = Boolean.FALSE;
						else
							b = Boolean.TRUE;
					}
					if( b != null )
						val = getBooleanObjectValue(cx, b.booleanValue());
					break;
				}
				
				case LESSTHANOREQUALS_TOKEN:
				case GREATERTHAN_TOKEN:
				{
					String less_result = lessthan(cx, rhs_ov, lhs_ov);
					Boolean b = null;
					if( node.op == LESSTHANOREQUALS_TOKEN )
					{
						if( less_result == UNDEFINED || less_result == TRUE )
							b = Boolean.FALSE;
						else
							b = Boolean.TRUE ;
					}
					else
					{
						if( less_result == UNDEFINED || less_result == FALSE )
							b = Boolean.FALSE;
						else
							b = Boolean.TRUE;
					}
					if( b != null )
						val = getBooleanObjectValue(cx, b.booleanValue());
					break;
				}
				
				case LEFTSHIFT_TOKEN:
				case RIGHTSHIFT_TOKEN:
				{
					Integer li  = toInt(cx, lhs_ov);
					Integer ri = toInt(cx, rhs_ov) ;
					if( li != null && ri != null )
					{
						ri = ri & 0x1F;
						if( node.op == LEFTSHIFT_TOKEN )
							val = new ObjectValue(String.valueOf(li << ri), cx.intType());
						else
							val = new ObjectValue(String.valueOf(li >> ri), cx.intType());
					}
					break;
				}
				case UNSIGNEDRIGHTSHIFT_TOKEN:
				{
					Long ll  = toUInt(cx, lhs_ov);
					Long rl = toUInt(cx, rhs_ov);
					if( ll != null && rl != null )
					{
						rl = rl & 0x1F;
						val = new ObjectValue(String.valueOf(ll >>> rl), cx.intType());
					}
					break;
				}
				
				case BITWISEAND_TOKEN:
				case BITWISEXOR_TOKEN:
				case BITWISEOR_TOKEN:
				{
					Integer li = toInt(cx, lhs_ov);
					Integer ri = toInt(cx, rhs_ov);
					if( li != null && ri != null )
					{
						int result = 0;
						switch(node.op)
						{
						case BITWISEAND_TOKEN:
							result = li & ri;
							break;
						case BITWISEOR_TOKEN:
							result = li | ri;
							break;
						case BITWISEXOR_TOKEN:
							result = li ^ ri;
							break;
						}
						val = new ObjectValue(String.valueOf(result), cx.intType());
					}
				}
				}

			}
		}
		else
		{
			node.lhs = evalAndFold(cx, node.lhs);
			node.rhs = evalAndFold(cx, node.rhs);
		}
		return val;
	}