01: /**
02: * MVEL (The MVFLEX Expression Language)
03: *
04: * Copyright (C) 2007 Christopher Brock, MVFLEX/Valhalla Project and the Codehaus
05: *
06: * Licensed under the Apache License, Version 2.0 (the "License");
07: * you may not use this file except in compliance with the License.
08: * You may obtain a copy of the License at
09: *
10: * http://www.apache.org/licenses/LICENSE-2.0
11: *
12: * Unless required by applicable law or agreed to in writing, software
13: * distributed under the License is distributed on an "AS IS" BASIS,
14: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15: * See the License for the specific language governing permissions and
16: * limitations under the License.
17: *
18: */package org.mvel.ast;
19:
20: import static org.mvel.MVEL.eval;
21: import org.mvel.compiler.ExecutableStatement;
22: import org.mvel.integration.VariableResolver;
23: import org.mvel.integration.VariableResolverFactory;
24: import org.mvel.util.ParseTools;
25: import static org.mvel.util.ParseTools.doOperations;
26: import static org.mvel.util.ParseTools.subCompileExpression;
27:
28: public class IndexedOperativeAssign extends ASTNode {
29: private final int register;
30: private ExecutableStatement statement;
31: private final int operation;
32:
33: public IndexedOperativeAssign(char[] expr, int operation,
34: int register, int fields) {
35: this .operation = operation;
36: this .name = expr;
37: this .register = register;
38:
39: if ((fields & COMPILE_IMMEDIATE) != 0) {
40: statement = (ExecutableStatement) subCompileExpression(expr);
41: }
42: }
43:
44: public Object getReducedValueAccelerated(Object ctx,
45: Object this Value, VariableResolverFactory factory) {
46: VariableResolver resolver = factory
47: .getIndexedVariableResolver(register);
48: resolver
49: .setValue(ctx = doOperations(resolver.getValue(),
50: operation, statement.getValue(ctx, this Value,
51: factory)));
52: return ctx;
53: }
54:
55: public Object getReducedValue(Object ctx, Object this Value,
56: VariableResolverFactory factory) {
57: VariableResolver resolver = factory
58: .getIndexedVariableResolver(register);
59: resolver.setValue(ctx = doOperations(resolver.getValue(),
60: operation, eval(name, ctx, factory)));
61: return ctx;
62: }
63: }
|