/* Soot - a J*va Optimization Framework
* Copyright (C) 2002 Ondrej Lhotak
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package soot.jimple.spark.internal;
import soot.jimple.spark.pag.*;
import soot.jimple.toolkits.pointer.representations.*;
import soot.jimple.toolkits.pointer.util.*;
import soot.toolkits.scalar.Pair;
import soot.*;
public class SparkNativeHelper extends NativeHelper {
protected PAG pag;
public SparkNativeHelper( PAG pag ) {
this.pag = pag;
}
protected void assignImpl(ReferenceVariable lhs, ReferenceVariable rhs) {
pag.addEdge( (Node) rhs, (Node) lhs );
}
protected void assignObjectToImpl(ReferenceVariable lhs, AbstractObject obj) {
AllocNode objNode = pag.makeAllocNode(
new Pair( "AbstractObject", obj.getType() ),
obj.getType(), null );
VarNode var;
if( lhs instanceof FieldRefNode ) {
var = pag.makeGlobalVarNode( objNode, objNode.getType() );
pag.addEdge( (Node) lhs, var );
} else {
var = (VarNode) lhs;
}
pag.addEdge( objNode, var );
}
protected void throwExceptionImpl(AbstractObject obj) {
AllocNode objNode = pag.makeAllocNode(
new Pair( "AbstractObject", obj.getType() ),
obj.getType(), null );
pag.addEdge( objNode, pag.nodeFactory().caseThrow() );
}
protected ReferenceVariable arrayElementOfImpl(ReferenceVariable base) {
VarNode l;
if( base instanceof VarNode ) {
l = (VarNode) base;
} else {
FieldRefNode b = (FieldRefNode) base;
l = pag.makeGlobalVarNode( b, b.getType() );
pag.addEdge( b, l );
}
return pag.makeFieldRefNode( l, ArrayElement.v() );
}
protected ReferenceVariable cloneObjectImpl(ReferenceVariable source) {
return source;
}
protected ReferenceVariable newInstanceOfImpl(ReferenceVariable cls) {
return pag.nodeFactory().caseNewInstance( (VarNode) cls );
}
protected ReferenceVariable staticFieldImpl(String className, String fieldName ) {
SootClass c = RefType.v( className ).getSootClass();
SootField f = c.getFieldByName( fieldName );
return pag.makeGlobalVarNode( f, f.getType() );
}
protected ReferenceVariable tempFieldImpl(String fieldsig) {
return pag.makeGlobalVarNode( new Pair( "tempField", fieldsig ),
RefType.v( "java.lang.Object" ) );
}
protected ReferenceVariable tempVariableImpl() {
return pag.makeGlobalVarNode( new Pair( "TempVar", new Integer( ++G.v().SparkNativeHelper_tempVar ) ),
RefType.v( "java.lang.Object" ) );
}
protected ReferenceVariable tempLocalVariableImpl(SootMethod method) {
return pag.makeLocalVarNode( new Pair( "TempVar", new Integer( ++G.v().SparkNativeHelper_tempVar ) ),
RefType.v( "java.lang.Object" ) , method);
}
}