001 /** 002 * @author paulk, Jul 24, 2002 003 */ 004 package toolbus.atom; 005 006 import java.util.Stack; 007 008 import toolbus.Functions; 009 import toolbus.State; 010 import toolbus.TBTermFactory; 011 import toolbus.TBTermVar; 012 import toolbus.ToolBus; 013 import toolbus.exceptions.ToolBusException; 014 import toolbus.exceptions.ToolBusExecutionException; 015 import toolbus.parsercup.PositionInformation; 016 import toolbus.process.ProcessCall; 017 import toolbus.process.ProcessExpression; 018 import toolbus.process.ProcessInstance; 019 import aterm.ATerm; 020 import aterm.ATermAppl; 021 import aterm.ATermList; 022 023 public class Create extends Atom{ 024 private final Ref pcall; 025 private final Ref rvar; 026 027 public Create(ATerm c, ATerm v, TBTermFactory tbfactory, PositionInformation posInfo){ 028 super(tbfactory, posInfo); 029 pcall = new Ref(c); 030 rvar = new Ref(v); 031 setAtomArgs(new Ref[]{pcall, rvar}); 032 } 033 034 public ProcessExpression copy(){ 035 Atom a = new Create(pcall.value, rvar.value, tbfactory, getPosInfo()); 036 a.copyAtomAttributes(this); 037 return a; 038 } 039 040 public void compile(ProcessInstance P, Stack<String> calls, State follow) throws ToolBusException{ 041 super.compile(P, calls, follow); 042 043 if(pcall.value.getType() != ATerm.APPL) throw new ToolBusExecutionException("Malformed first argument in create.", getPosInfo()); 044 if(!tbfactory.isResultVar(rvar.value)) throw new ToolBusExecutionException("Second argument of create should be a result variable.", getPosInfo()); 045 } 046 047 public boolean execute() throws ToolBusException{ 048 if(!isEnabled()) return false; 049 050 String name = ((ATermAppl) pcall.value).getName(); 051 ATermList cargs = ((ATermAppl) pcall.value).getArguments(); 052 ATermList evargs = (ATermList) Functions.eval(cargs, getProcess(), getEnv()); 053 054 ToolBus TB = getToolBus(); 055 056 ProcessInstance P = TB.addProcess(new ProcessCall(name, evargs, false, TB.getTBTermFactory(), null)); 057 058 getEnv().assignVar((TBTermVar) rvar.value, tbfactory.makeInt(P.getProcessId())); 059 return true; 060 } 061 }