Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hallgren2010-01-15 14:28:19 +0000
committerThomas Hallgren2010-01-15 14:28:19 +0000
commit88f81e75d700362f6257485c3eeca768a31d83d3 (patch)
tree585e79af661fc744c76e0fe84dc92cca3b54daea
parentc18927f9fdb096b7906d0ec989f2ca4dd88d0104 (diff)
downloadrt.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
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/EvaluationContext.java92
-rw-r--r--bundles/org.eclipse.equinox.p2.ql/src/org/eclipse/equinox/internal/p2/ql/expression/CurryedLambdaExpression.java25
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;
}
}

Back to the top