public int BackrackImpl(PlTerm a0, int arity, IntPtr control) { FRG fc = (FRG)(libpl.PL_foreign_control(control)); ContextHandle handle; switch (fc) { case FRG.PL_FIRST_CALL: { handle = NondetContextHandle.ObtainHandle(control, Clone()); var av = new PlTermV(a0, arity); handle.ManagedObject = New(handle, av); return(Call0(handle, av)); } break; case FRG.PL_REDO: { handle = NondetContextHandle.FindHandle(control); return(Call0(handle, new PlTermV(a0, arity))); } break; case FRG.PL_CUTTED: { handle = NondetContextHandle.FindHandle(control); var av = new PlTermV(a0, arity); bool res = Close(handle, av); NondetContextHandle.ReleaseHandle(handle); return(res ? 1 : 0); } break; default: { throw new PlException("no frg"); return(libpl.PL_fail); } break; } }
static public ContextHandle ObtainHandle(IntPtr context, SCCH value) { lock (NonDetHandles) { ContextHandle hnd; if (NonDetHandles.Count == 0) { hnd = new NondetContextHandle(value); } else { hnd = NonDetHandles.First.Value; NonDetHandles.RemoveFirst(); } hnd.Context = context; hnd.ManagedObject = value; lock (NondetContextHandle.HandleToObject) { NondetContextHandle.ContextToObject[context] = hnd; } return(hnd); } }
public static ContextHandle ObtainHandle(IntPtr context, SCCH value) { lock (NonDetHandles) { ContextHandle hnd; if (NonDetHandles.Count == 0) { hnd = new NondetContextHandle(value); } else { hnd = NonDetHandles.First.Value; NonDetHandles.RemoveFirst(); } hnd.Context = context; hnd.ManagedObject = value; lock (NondetContextHandle.HandleToObject) { NondetContextHandle.ContextToObject[context] = hnd; } return hnd; } }
public static int cliAddEventHandler0(PlTerm clazzOrInstance, PlTerm memberSpec, PlTerm closureTerm, PlTerm blockOn, IntPtr control) { var handle = control; FRG fc = (FRG)(libpl.PL_foreign_control(control)); switch (fc) { case FRG.PL_FIRST_CALL: { object getInstance; Type c; if (!GetInstanceAndType(clazzOrInstance, out getInstance, out c)) { return(PlSucceedOrFail(false)); } Type[] paramz = null; if (!CheckBound(memberSpec, closureTerm)) { return(PlSucceedOrFail(false)); } EventInfo fi = findEventInfo(memberSpec, c, ref paramz, BindingFlagsALL); if (fi == null) { return(Error("Cant find event {0} on {1}", memberSpec, (object)c ?? clazzOrInstance) ? 3 : 0); } ClosureDelegate newClosureDelegate = new ClosureDelegate(fi, getInstance, closureTerm); var v = NondetContextHandle.ObtainHandle(control, newClosureDelegate); bool res = v.Setup(new PlTermV(closureTerm, blockOn)); blockOn.FromObject(newClosureDelegate); bool more = v.HasMore(); if (more) { libpl.PL_retry(v.Handle); return(res ? 3 : 0); } return(res ? 1 : 0); } break; case FRG.PL_REDO: { var v = NondetContextHandle.FindHandle(control); bool res = v.Call(new PlTermV(closureTerm, blockOn)); bool more = v.HasMore(); if (more) { libpl.PL_retry(v.Handle); return(res ? 3 : 0); } return(res ? 1 : 0); } break; case FRG.PL_CUTTED: { var v = NondetContextHandle.FindHandle(control); bool res = v.Close(new PlTermV(closureTerm, blockOn)); NondetContextHandle.ReleaseHandle(v); return(res ? 1 : 0); } break; default: { throw new PlException("no frg"); return(libpl.PL_fail); } break; } }