Beispiel #1
0
 public override void AccumEffects(EffectsContext fxCtxt, CallContext callCtxt, EvalTimes evalTimes)
 {
     fxCtxt.IncludeEffects(JST.Effects.Read(StateId));
     fxCtxt.IncludeEffects(JST.Effects.ReadHeap);
 }
Beispiel #2
0
 public abstract void AccumEffects(EffectsContext fxCtxt, CallContext callCtxt, EvalTimes evalTimes);
Beispiel #3
0
 public override void AccumEffects(EffectsContext fxCtxt, CallContext callCtxt, EvalTimes evalTimes)
 {
     if (Object != null)
     {
         Object.AccumEffects(fxCtxt, callCtxt, evalTimes);
     }
     fxCtxt.IncludeEffects(JST.Effects.ReadHeap);
 }
Beispiel #4
0
 public override void AccumEffects(EffectsContext fxCtxt, CallContext callCtxt, EvalTimes evalTimes)
 {
     Box.AccumEffects(fxCtxt, callCtxt, evalTimes);
     fxCtxt.IncludeEffects(JST.Effects.ReadHeap);
 }
Beispiel #5
0
        public override void AccumEffects(EffectsContext fxCtxt, CallContext callCtxt, EvalTimes evalTimes)
        {
            if (callCtxt != null && callCtxt.IsOk)
            {
                var idx = default(int);
                if (callCtxt.Parameters.TryGetValue(Id, out idx))
                {
                    if (callCtxt.SeenParameters[idx].HasValue)
                    {
                        if (callCtxt.SeenParameters[idx].Value)
                        {
                            // More than once syntactic occurence of this parameter
                            callCtxt.Fail();
                        }

                        // Remember we've seen a syntactic occurence of this parameter
                        callCtxt.SeenParameters[idx] = true;

                        if (!callCtxt.AllReadOnly)
                        {
                            for (var i = 0; i < idx; i++)
                            {
                                if (callCtxt.SeenParameters[i].HasValue && !callCtxt.SeenParameters[i].Value)
                                {
                                    // Evaluating this parameter before earlier parameters
                                    callCtxt.Fail();
                                }
                            }
                        }

                        switch (evalTimes.Value)
                        {
                        case EvalTimesEnum.Once:
                            break;

                        case EvalTimesEnum.Opt:
                            if (!callCtxt.AllReadOnly)
                            {
                                // May not always evaluate argument
                                callCtxt.Fail();
                            }
                            break;

                        case EvalTimesEnum.AtLeastOnce:
                        case EvalTimesEnum.Any:
                            // May evaluate argument more than once
                            callCtxt.Fail();
                            break;

                        default:
                            throw new ArgumentOutOfRangeException("evalTimes");
                        }

                        if (!fxCtxt.AccumEffects.CommutableWith(callCtxt.ArgumentEffects[idx]))
                        {
                            // Cannot defer evaluation of argument to occurance of parameter
                            callCtxt.Fail();
                        }
                    }
                    // else: argument is a value, so no constraints on occurences of parameter
                }
            }

            if (!fxCtxt.IsHidden(Id))
            {
                fxCtxt.IncludeEffects(JST.Effects.Read(Id));
            }
        }