[gs-code-review] CET 20-02-02, don't restore the argument of operator begin

Leonardo leonardo at artifex.com
Thu Apr 5 22:28:10 PDT 2007


Alex,

I think you should go ahead with committing it.
It looks satisfying old Peter's remark.
A better review may appear later.
Please insert space lines in 2 places after variable definition
as C-style.htm requires.

Igor.


----- Original Message ----- 
From: "Alex Cherepanov" <alexcher at quadnet.net>
To: "gs-code-review" <gs-code-review at ghostscript.com>
Sent: Friday, April 06, 2007 3:36 AM
Subject: [gs-code-review] CET 20-02-02,don't restore the argument of
operator begin


> Following Adobe implementation don't restore the operand of --begin--
> when it overflows the dictionary stack. Fix CET 20-02-02.
>
> DETAILS:
> Implement the approach suggested by L. Peter Deutsch.
>
> - Change the check_dstack macro in dstack.h so it works the same as
>   check_estack in estack.h -- i.e., if the current dstack block is full,
>   call ref_stack_extend and then only return an error if
>   ref_stack_extend fails.
> - Change the handling of e_dictstackoverflow in interp.c so it works
>   the same as e_execstackoverflow -- i.e., it doesn't try to extend the
>   stack.
> - Change the implementation of zbegin in zdict.c to work like
>   check_dstack. I.e., if the current dstack block is full, call
>   ref_stack_extend; if ref_stack_extend returns e_dictstackoverflow, pop
>   the operand from the ostack before returning the error code.
>
> With this approach, the interpreter does not have to know anything about
> special handling of dictstackoverflow, and the right thing happens in
> the special case of the 'begin' operator.
>
> DIFFERENCES:
> No other CET or Comparefiles differences.
>
>


--------------------------------------------------------------------------------


> Index: gs/src/dstack.h
> ===================================================================
> --- gs/src/dstack.h (revision 7816)
> +++ gs/src/dstack.h (working copy)
> @@ -46,7 +46,9 @@
> /* Macro to ensure enough room on the dictionary stack */
> #define check_dstack(n)\
>   if ( dstop - dsp < (n) )\
> -    { d_stack.requested = (n); return_error(e_dictstackoverflow); }
> +    { int ds_code_ = ref_stack_extend(&d_stack, n);\
> +      if ( ds_code_ < 0 ) return ds_code_;\
> +    }
>
> /*
>  * The dictionary stack is implemented as a linked list of blocks;
> Index: gs/src/interp.c
> ===================================================================
> --- gs/src/interp.c (revision 7816)
> +++ gs/src/interp.c (working copy)
> @@ -539,12 +539,10 @@
>     /* we might be able to recover by adding or removing a block. */
>     switch (code) {
>  case e_dictstackoverflow:
> -     if (ref_stack_extend(&d_stack, d_stack.requested) >= 0) {
> - dict_set_top();
> - doref = *perror_object;
> - epref = &doref;
> - goto again;
> -     }
> +     /* We don't have to handle this specially: */
> +     /* The only places that could generate it */
> +     /* use check_dstack, which does a ref_stack_extend, */
> +     /* so if` we get this error, it's a real one. */
>      if (osp >= ostop) {
>  if ((ccode = ref_stack_extend(&o_stack, 1)) < 0)
>      return ccode;
> Index: gs/src/zdict.c
> ===================================================================
> --- gs/src/zdict.c (revision 7816)
> +++ gs/src/zdict.c (working copy)
> @@ -59,8 +59,17 @@
>
>     check_type(*op, t_dictionary);
>     check_dict_read(*op);
> -    if (dsp == dstop)
> - return_error(e_dictstackoverflow);
> +    if ( dsp == dstop ) {
> +        int code = ref_stack_extend(&d_stack, 1);
> +        if ( code < 0 ) {
> +            if (code == e_dictstackoverflow) {
> +                /* Adobe doesn't restore the operand that caused stack */
> +                /* overflow. We do the same to match CET 20-02-02      */
> +                pop(1);
> +            }
> +            return code;
> +        }
> +    }
>     ++dsp;
>     ref_assign(dsp, op);
>     dict_set_top();
>


--------------------------------------------------------------------------------


> _______________________________________________
> gs-code-review mailing list
> gs-code-review at ghostscript.com
> http://www.ghostscript.com/mailman/listinfo/gs-code-review
>



More information about the gs-code-review mailing list