public static Stella_Object accessInContext(Stella_Object value, Context homecontext, boolean dontinheritP) {
    if ((value == null) ||
        (!((value != null) &&
        (value.primaryType() == Stella.SGT_STELLA_CS_VALUE)))) {
      if (dontinheritP) {
        if (((Context)(Stella.$CONTEXT$.get())) == homecontext) {
          return (value);
        }
      }
      else {
        if ((homecontext == null) ||
            (((((Context)(Stella.$CONTEXT$.get())) == homecontext) ||
            ((Context)(Stella.$CONTEXT$.get())).allSuperContexts.membP(homecontext)) ||
             (Stella_Object.isaP(homecontext, Stella.SGT_STELLA_MODULE) &&
              Context.visibleFromP(homecontext, ((Module)(Stella.$MODULE$.get())))))) {
          return (value);
        }
      }
      return (null);
    }
    { KvCons kvcons = ((CsValue)(value)).theKvList;
      int contextnumber = Stella.NULL_INTEGER;

      { Context target = ((Context)(Stella.$CONTEXT$.get()));

        contextnumber = target.contextNumber;
        while ((kvcons != null) &&
            (contextnumber < ((Context)(kvcons.key)).contextNumber)) {
          if ((((((Context)(kvcons.key)).contextNumber) % 2) == 1) &&
              ((!Stella.$CONTEXT_BACKTRACKING_MODE$) &&
               Stella.$UNLINK_DISCARDED_CONTEXTS_ON_READp$)) {
            if (kvcons.rest != null) {
              { KvCons nextkvcons = kvcons.rest;

                kvcons.key = nextkvcons.key;
                kvcons.value = nextkvcons.value;
                kvcons.rest = nextkvcons.rest;
                nextkvcons.free();
              }
            }
            else {
              {
                ((CsValue)(value)).removeAt(((Context)(kvcons.key)));
                return (null);
              }
            }
          }
          else {
            kvcons = kvcons.rest;
          }
        }
        if (kvcons == null) {
          return (null);
        }
        if (target == kvcons.key) {
          return (kvcons.value);
        }
        if (dontinheritP) {
          return (null);
        }
      }
      { Context target = null;
        Cons iter000 = ((Context)(Stella.$CONTEXT$.get())).allSuperContexts;

        for (;!(iter000 == Stella.NIL); iter000 = iter000.rest) {
          target = ((Context)(iter000.value));
          contextnumber = target.contextNumber;
          while ((kvcons != null) &&
              (contextnumber < ((Context)(kvcons.key)).contextNumber)) {
            if ((((((Context)(kvcons.key)).contextNumber) % 2) == 1) &&
                ((!Stella.$CONTEXT_BACKTRACKING_MODE$) &&
                 Stella.$UNLINK_DISCARDED_CONTEXTS_ON_READp$)) {
              if (kvcons.rest != null) {
                { KvCons nextkvcons = kvcons.rest;

                  kvcons.key = nextkvcons.key;
                  kvcons.value = nextkvcons.value;
                  kvcons.rest = nextkvcons.rest;
                  nextkvcons.free();
                }
              }
              else {
                {
                  ((CsValue)(value)).removeAt(((Context)(kvcons.key)));
                  return (null);
                }
              }
            }
            else {
              kvcons = kvcons.rest;
            }
          }
          if (kvcons == null) {
            return (null);
          }
          if (target == kvcons.key) {
            return (kvcons.value);
          }
          if (dontinheritP) {
            return (null);
          }
        }
      }
      return (null);
    }
  }