org.mozilla.javascript.optimizer.OptFunctionNode Maven / Gradle / Ivy
The newest version!
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.javascript.optimizer;
import org.mozilla.javascript.*;
import org.mozilla.javascript.ast.FunctionNode;
import org.mozilla.javascript.ast.ScriptNode;
public final class OptFunctionNode
{
OptFunctionNode(FunctionNode fnode)
{
this.fnode = fnode;
fnode.setCompilerData(this);
}
public static OptFunctionNode get(ScriptNode scriptOrFn, int i)
{
FunctionNode fnode = scriptOrFn.getFunctionNode(i);
return (OptFunctionNode)fnode.getCompilerData();
}
public static OptFunctionNode get(ScriptNode scriptOrFn)
{
return (OptFunctionNode)scriptOrFn.getCompilerData();
}
public boolean isTargetOfDirectCall()
{
return directTargetIndex >= 0;
}
public int getDirectTargetIndex()
{
return directTargetIndex;
}
void setDirectTargetIndex(int directTargetIndex)
{
// One time action
if (directTargetIndex < 0 || this.directTargetIndex >= 0)
Kit.codeBug();
this.directTargetIndex = directTargetIndex;
}
void setParameterNumberContext(boolean b)
{
itsParameterNumberContext = b;
}
public boolean getParameterNumberContext()
{
return itsParameterNumberContext;
}
public int getVarCount()
{
return fnode.getParamAndVarCount();
}
public boolean isParameter(int varIndex)
{
return varIndex < fnode.getParamCount();
}
public boolean isNumberVar(int varIndex)
{
varIndex -= fnode.getParamCount();
if (varIndex >= 0 && numberVarFlags != null) {
return numberVarFlags[varIndex];
}
return false;
}
void setIsNumberVar(int varIndex)
{
varIndex -= fnode.getParamCount();
// Can only be used with non-parameters
if (varIndex < 0) Kit.codeBug();
if (numberVarFlags == null) {
int size = fnode.getParamAndVarCount() - fnode.getParamCount();
numberVarFlags = new boolean[size];
}
numberVarFlags[varIndex] = true;
}
public int getVarIndex(Node n)
{
int index = n.getIntProp(Node.VARIABLE_PROP, -1);
if (index == -1) {
Node node;
int type = n.getType();
if (type == Token.GETVAR) {
node = n;
} else if (type == Token.SETVAR ||
type == Token.SETCONSTVAR) {
node = n.getFirstChild();
} else {
throw Kit.codeBug();
}
index = fnode.getIndexForNameNode(node);
if (index < 0) throw Kit.codeBug();
n.putIntProp(Node.VARIABLE_PROP, index);
}
return index;
}
public final FunctionNode fnode;
private boolean[] numberVarFlags;
private int directTargetIndex = -1;
private boolean itsParameterNumberContext;
boolean itsContainsCalls0;
boolean itsContainsCalls1;
}