private void Evaluate(object obj) { var code = (IntermediateCode)obj; if (code is ICAssignment) { ICAssignment ica = (ICAssignment)code; // create OperationImpl instance ObjectHandle handle = Activator.CreateInstance("JOSPrototype", "JOSPrototype.Runtime.Operation." + ica.op + "OnKH", false, 0, null, new object[] { this, code, program }, null, null); Operation.Operation opImpl = (Operation.Operation)handle.Unwrap(); // execute the operation on KH opImpl.Run(); } else if (code is ICWhile) { ICWhile icw = (ICWhile)code; WhileOnKH op = new WhileOnKH(this, icw, program); op.Run(); } else { ICIfElse icie = (ICIfElse)code; IfElseOnKH op = new IfElseOnKH(this, icie, program); op.Run(); } }
protected void Evaluate(IntermediateCode code) { //System.Diagnostics.Debug.WriteLine("KH: " + code); if (code is ICAssignment) { ICAssignment ica = (ICAssignment)code; // create Operation instance ObjectHandle handle = Activator.CreateInstance("JOSPrototype", "JOSPrototype.Runtime.Operation." + ica.op + "OnKH", false, 0, null, new object[] { party, code, program, this }, null, null); Operation op = (Operation)handle.Unwrap(); // execute the operation on EVH op.Run(); } else if (code is ICWhile) { ICWhile icw = (ICWhile)code; WhileOnKH op = new WhileOnKH(party, icw, program, this); op.Run(); } else { ICIfElse icie = (ICIfElse)code; IfElseOnKH op = new IfElseOnKH(party, icie, program, this); op.Run(); } }
// nested if-else public IfElseOnEVH(Party party, ICIfElse code, Program program, Operation caller) : base(party, code, program, caller, OperationType.IfElse) { icie = code; }
// out most if-else public IfElseOnKH(Party party, ICIfElse code, Program program) : base(party, code, program, OperationType.IfElse) { icie = code; }
private bool IsDependent(IntermediateCode codei, IntermediateCode codej) { if (codei is ICAssignment && codej is ICAssignment) { ICAssignment assignmenti = (ICAssignment)codei, assignmentj = (ICAssignment)codej; if (ETerminal.IsEqual(assignmenti.result, assignmentj.result) || ETerminal.IsEqual(assignmentj.result, assignmenti.operand1) || ETerminal.IsEqual(assignmentj.result, assignmenti.operand2) || ETerminal.IsEqual(assignmenti.result, assignmentj.operand1) || ETerminal.IsEqual(assignmenti.result, assignmentj.operand2)) { return(true); } return(false); } else if (codei is ICAssignment && codej is ICWhile) { ICAssignment assignmenti = (ICAssignment)codei; ICWhile whilej = (ICWhile)codej; if (ETerminal.IsEqual(assignmenti.result, whilej.condition)) { return(true); } foreach (var entry in whilej.conditionCodes.GetCodes()) { if (IsDependent(assignmenti, entry)) { return(true); } } foreach (var entry in whilej.codes.GetCodes()) { if (IsDependent(assignmenti, entry)) { return(true); } } return(false); } else if (codei is ICWhile && codej is ICAssignment) { ICWhile whilei = (ICWhile)codei; ICAssignment assignmentj = (ICAssignment)codej; if (ETerminal.IsEqual(assignmentj.result, whilei.condition)) { return(true); } foreach (var entry in whilei.conditionCodes.GetCodes()) { if (IsDependent(entry, assignmentj)) { return(true); } } foreach (var entry in whilei.codes.GetCodes()) { if (IsDependent(entry, assignmentj)) { return(true); } } return(false); } else if (codei is ICWhile && codej is ICWhile) { ICWhile whilei = (ICWhile)codei, whilej = (ICWhile)codej; List <IntermediateCode> codesi = new List <IntermediateCode>(), codesj = new List <IntermediateCode>(); codesi.AddRange(whilei.conditionCodes.GetCodes()); codesi.AddRange(whilei.codes.GetCodes()); codesj.AddRange(whilej.conditionCodes.GetCodes()); codesj.AddRange(whilej.codes.GetCodes()); foreach (var entryi in codesi) { foreach (var entryj in codesj) { if (IsDependent(entryi, entryj)) { return(true); } } } return(false); } else if (codei is ICAssignment && codej is ICIfElse) { ICAssignment assignmenti = (ICAssignment)codei; ICIfElse ifelsej = (ICIfElse)codej; if (ETerminal.IsEqual(assignmenti.result, ifelsej.condition)) { return(true); } List <IntermediateCode> codesj = new List <IntermediateCode>(); codesj.AddRange(ifelsej.conditionCodes.GetCodes()); codesj.AddRange(ifelsej.codesIf.GetCodes()); codesj.AddRange(ifelsej.codesElse.GetCodes()); foreach (var entry in codesj) { if (IsDependent(assignmenti, entry)) { return(true); } } return(false); } else if (codei is ICIfElse && codej is ICAssignment) { ICIfElse ifelsei = (ICIfElse)codei; ICAssignment assignmentj = (ICAssignment)codej; if (ETerminal.IsEqual(assignmentj.result, ifelsei.condition)) { return(true); } List <IntermediateCode> codesi = new List <IntermediateCode>(); codesi.AddRange(ifelsei.conditionCodes.GetCodes()); codesi.AddRange(ifelsei.codesIf.GetCodes()); codesi.AddRange(ifelsei.codesElse.GetCodes()); foreach (var entry in codesi) { if (IsDependent(entry, assignmentj)) { return(true); } } return(false); } else if (codei is ICWhile && codej is ICIfElse) { ICWhile whilei = (ICWhile)codei; ICIfElse ifelsej = (ICIfElse)codej; List <IntermediateCode> codesi = new List <IntermediateCode>(), codesj = new List <IntermediateCode>(); codesi.AddRange(whilei.conditionCodes.GetCodes()); codesi.AddRange(whilei.codes.GetCodes()); codesj.AddRange(ifelsej.conditionCodes.GetCodes()); codesj.AddRange(ifelsej.codesIf.GetCodes()); codesj.AddRange(ifelsej.codesElse.GetCodes()); foreach (var entryi in codesi) { foreach (var entryj in codesj) { if (IsDependent(entryi, entryj)) { return(true); } } } return(false); } else if (codei is ICIfElse && codej is ICWhile) { ICIfElse ifelsei = (ICIfElse)codei; ICWhile whilej = (ICWhile)codej; List <IntermediateCode> codesi = new List <IntermediateCode>(), codesj = new List <IntermediateCode>(); codesi.AddRange(ifelsei.conditionCodes.GetCodes()); codesi.AddRange(ifelsei.codesIf.GetCodes()); codesi.AddRange(ifelsei.codesElse.GetCodes()); codesj.AddRange(whilej.conditionCodes.GetCodes()); codesj.AddRange(whilej.codes.GetCodes()); foreach (var entryi in codesi) { foreach (var entryj in codesj) { if (IsDependent(entryi, entryj)) { return(true); } } } return(false); } else { ICIfElse ifelsei = (ICIfElse)codei; ICIfElse ifelsej = (ICIfElse)codej; List <IntermediateCode> codesi = new List <IntermediateCode>(), codesj = new List <IntermediateCode>(); codesi.AddRange(ifelsei.conditionCodes.GetCodes()); codesi.AddRange(ifelsei.codesIf.GetCodes()); codesi.AddRange(ifelsei.codesElse.GetCodes()); codesj.AddRange(ifelsej.conditionCodes.GetCodes()); codesj.AddRange(ifelsej.codesIf.GetCodes()); codesj.AddRange(ifelsej.codesElse.GetCodes()); foreach (var entryi in codesi) { foreach (var entryj in codesj) { if (IsDependent(entryi, entryj)) { return(true); } } } return(false); } }