diff options
author | Thomas Hallgren | 2010-01-15 14:28:19 +0000 |
---|---|---|
committer | Thomas Hallgren | 2010-01-15 14:28:19 +0000 |
commit | 88f81e75d700362f6257485c3eeca768a31d83d3 (patch) | |
tree | 585e79af661fc744c76e0fe84dc92cca3b54daea | |
parent | c18927f9fdb096b7906d0ec989f2ca4dd88d0104 (diff) | |
download | rt.equinox.p2-88f81e75d700362f6257485c3eeca768a31d83d3.tar.gz rt.equinox.p2-88f81e75d700362f6257485c3eeca768a31d83d3.tar.xz rt.equinox.p2-88f81e75d700362f6257485c3eeca768a31d83d3.zip |
299580 : Memory burn in CompoundQueryable.query (expression eval optimization)v20101015
2 files changed, 45 insertions, 72 deletions
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/EvaluationContext.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/EvaluationContext.java index 8a7dbda45..6048a008a 100644 --- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/EvaluationContext.java +++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/EvaluationContext.java @@ -17,37 +17,16 @@ import org.eclipse.equinox.p2.metadata.expression.IExpression; * Highly specialized evaluation contexts optimized for misc purposes */ public class EvaluationContext implements IEvaluationContext { - public static class Parameters extends EvaluationContext { - private static final Object[] noParameters = new Object[0]; - - private final Object[] parameters; - - public Parameters(IEvaluationContext parentContext, Object[] parameters) { - super(parentContext); - this.parameters = parameters == null ? noParameters : parameters; - } - - public Object getParameter(int position) { - return parameters[position]; - } - } - - public static class SingleVariableContext implements IEvaluationContext { - private final IEvaluationContext parentContext; - + static class SingleVariableContext extends EvaluationContext { private Object value; private final IExpression variable; - public SingleVariableContext(IEvaluationContext parentContext, IExpression variable) { - this.parentContext = parentContext; + public SingleVariableContext(IEvaluationContext parentContext, IExpression variable, Object[] parameters) { + super(parentContext, parameters); this.variable = variable; } - public Object getParameter(int position) { - return parentContext.getParameter(position); - } - public Object getValue(IExpression var) { return variable == var ? value : parentContext.getValue(var); } @@ -60,22 +39,16 @@ public class EvaluationContext implements IEvaluationContext { } } - static class MultiVariableContext implements IEvaluationContext { - private final IEvaluationContext parentContext; - + static class MultiVariableContext extends EvaluationContext { private final Object[] values; - public MultiVariableContext(IEvaluationContext parentContext, IExpression[] variables) { - this.parentContext = parentContext; + public MultiVariableContext(IEvaluationContext parentContext, IExpression[] variables, Object[] parameters) { + super(parentContext, parameters); values = new Object[variables.length * 2]; for (int idx = 0, ndx = 0; ndx < variables.length; ++ndx, idx += 2) values[idx] = variables[ndx]; } - public Object getParameter(int position) { - return parentContext.getParameter(position); - } - public Object getValue(IExpression variable) { for (int idx = 0; idx < values.length; ++idx) if (values[idx++] == variable) @@ -93,58 +66,65 @@ public class EvaluationContext implements IEvaluationContext { } } - public static final EvaluationContext INSTANCE = new EvaluationContext(null); + private static final Object[] noParameters = new Object[0]; + + private static final EvaluationContext INSTANCE = new EvaluationContext(null, noParameters); public static IEvaluationContext create() { return INSTANCE; } public static IEvaluationContext create(IEvaluationContext parent, IExpression variable) { - return new SingleVariableContext(parent, variable); + return new SingleVariableContext(parent, variable, ((EvaluationContext) parent).parameters); } public static IEvaluationContext create(IEvaluationContext parent, IExpression[] variables) { - return variables.length == 1 ? new SingleVariableContext(parent, variables[0]) : new MultiVariableContext(parent, variables); + return create(parent, ((EvaluationContext) parent).parameters, variables); + } + + public static IEvaluationContext create(IEvaluationContext parent, Object[] parameters, IExpression[] variables) { + if (variables == null || variables.length == 0) + return create(parent, parameters); + if (parameters == null) + parameters = noParameters; + return variables.length == 1 ? new SingleVariableContext(parent, variables[0], parameters) : new MultiVariableContext(parent, variables, parameters); } public static IEvaluationContext create(IEvaluationContext parent, Object[] parameters) { - return new Parameters(parent, parameters); + if (parameters == null) + parameters = noParameters; + return new EvaluationContext(parent, parameters); } public static IEvaluationContext create(IExpression variable) { - return new SingleVariableContext(null, variable); + return new SingleVariableContext(INSTANCE, variable, noParameters); } public static IEvaluationContext create(IExpression[] variables) { - if (variables == null || variables.length == 0) - return INSTANCE; - return variables.length == 1 ? create(variables[0]) : new MultiVariableContext(INSTANCE, variables); + return create(INSTANCE, noParameters, variables); } public static IEvaluationContext create(Object[] parameters, IExpression variable) { - return parameters == null || parameters.length == 0 ? create(variable) : new SingleVariableContext(new Parameters(null, parameters), variable); + if (parameters == null) + parameters = noParameters; + return new SingleVariableContext(INSTANCE, variable, parameters); } public static IEvaluationContext create(Object[] parameters, IExpression[] variables) { - if (parameters == null || parameters.length == 0) - return create(variables); - - Parameters pctx = new Parameters(null, parameters); - if (variables == null || variables.length == 0) - return pctx; - return create(pctx, variables); + return create(INSTANCE, parameters, variables); } - protected EvaluationContext(IEvaluationContext parentContext) { + final IEvaluationContext parentContext; + + private final Object[] parameters; + + EvaluationContext(IEvaluationContext parentContext, Object[] parameters) { this.parentContext = parentContext; + this.parameters = parameters; } - private final IEvaluationContext parentContext; - - public Object getParameter(int position) { - if (parentContext == null) - throw new IllegalArgumentException("No such parameter: $" + position); //$NON-NLS-1$ - return parentContext.getParameter(position); + public final Object getParameter(int position) { + return parameters[position]; } public Object getValue(IExpression variable) { diff --git a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/CurryedLambdaExpression.java b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/CurryedLambdaExpression.java index dfdeb7b76..eae2c915d 100644 --- a/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/CurryedLambdaExpression.java +++ b/bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/CurryedLambdaExpression.java @@ -74,22 +74,15 @@ final class CurryedLambdaExpression extends LambdaExpression implements IQLConst } public IEvaluationContext prolog(IEvaluationContext context) { - IEvaluationContext lambdaContext = super.prolog(context); - int top = assignments.length; - if (top > 0) { - if (top == 1) { - Assignment v = assignments[0]; - lambdaContext = EvaluationContext.create(lambdaContext, v.lhs); - lambdaContext.setValue(v.lhs, v.rhs.evaluate(context)); - } else { - Variable[] vars = new Variable[top]; - for (int idx = 0; idx < top; ++idx) - vars[idx] = (Variable) assignments[idx].lhs; - lambdaContext = EvaluationContext.create(lambdaContext, vars); - for (int idx = 0; idx < top; ++idx) - lambdaContext.setValue(vars[idx], assignments[idx].rhs.evaluate(context)); - } - } + IEvaluationContext lambdaContext; + int top = assignments.length + 1; + Variable[] vars = new Variable[top]; + vars[0] = getItemVariable(); + for (int idx = 1; idx < top; ++idx) + vars[idx] = (Variable) assignments[idx - 1].lhs; + lambdaContext = EvaluationContext.create(context, vars); + for (int idx = 1; idx < top; ++idx) + lambdaContext.setValue(vars[idx], assignments[idx - 1].rhs.evaluate(context)); return lambdaContext; } } |