traceop.ps 2.51 KB
Newer Older
1
% Copyright (C) 2001-2019 Artifex Software, Inc.
2
% All Rights Reserved.
3
%
4 5
% This software is provided AS-IS with no warranty, either express or
% implied.
6
%
7 8 9
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
10
%
11
% Refer to licensing information at http://www.artifex.com or contact
12 13
% Artifex Software, Inc.,  1305 Grant Avenue - Suite 200, Novato,
% CA 94945, U.S.A., +1(415)492-9861, for further information.
14
%
15 16 17 18 19 20 21 22 23 24 25 26 27

% Trace individual operators or procedures.
% <opref> is <opname> or <opname> <dict>
%    (dict defaults to dict where op is currently defined, if writable;
%    otherwise uses userdict)
% <opref> traceop prints vmem usage before;
% <opref> <numargs|preproc> prints arguments or runs proc before;
% <opref> <numargs|preproc> <numresults|postproc>
%    also prints results or runs proc after.
% If traceflush is true, flush the output after each printout.
/traceflush true def

currentpacking true setpacking
28
currentglobal true setglobal
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

% Define the default "before" action
/tracebefore { vmstatus 3 traceprint pop pop pop } def

% Define the default "after" action
/traceafter { } def

/traceprint {
  dup type /integertype eq {
    1 sub -1 0 { ( ) print index ==only } for
  } {
    exec
  } ifelse
} bind def
/traceend {
  traceflush { flush } if
} bind def
/traceop {
  userdict begin
  dup type dup /nametype eq exch /dicttype eq or { { tracebefore } } if
  1 index type dup /nametype eq exch /dicttype eq or { { traceafter } } if
  /.tpost exch def /.tpre exch def
  dup type /dicttype ne {
    dup where not { userdict 1 index {} put userdict } if
  } if
  dup dup wcheck not {
    (Warning: substituting userdict for non-writable dictionary.) =
    pop userdict
  } if
  /.tddict exch def   /.tdict exch def   /.tname exch cvlit def
59
  currentglobal [
60 61 62 63 64
  .tname /=only cvx ( ) /print cvx
    /.tpre load /traceprint cvx /traceend cvx
    .tdict .tname get /.tdef 1 index cvlit def
    dup xcheck {
      dup type dup /arraytype eq exch /packedarraytype eq or {
65
        /exec cvx
66 67 68
      } if
    } if
    /.tpost load /traceprint cvx () /= cvx /traceend cvx
69
  .tdef gcheck /.tpre load gcheck and /.tpost load gcheck and setglobal
70 71 72 73
  ] cvx
  .tdef type /operatortype eq {
    .tname exch .makeoperator
  } if
74
  exch setglobal
75 76 77 78 79 80
  .tddict exch .tname exch put
  end		% userdict
} bind def
/tracebind /bind load def	% in case someone wants to put it back
/bind { } def		% disable

81
setglobal
82
setpacking