1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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
|
/* Copyright (C) 1998, 1999 Aladdin Enterprises. All rights reserved.
This software is licensed to a single customer by Artifex Software Inc.
under the terms of a specific OEM agreement.
*/
/*$RCSfile$ $Revision$ */
/* Generic dictionary stack API */
#ifndef idstack_INCLUDED
# define idstack_INCLUDED
#include "iddstack.h"
#include "idsdata.h"
#include "istack.h"
/* Define the type of pointers into the dictionary stack. */
typedef s_ptr ds_ptr;
typedef const_s_ptr const_ds_ptr;
/* Clean up a dictionary stack after a garbage collection. */
void dstack_gc_cleanup(P1(dict_stack_t *));
/*
* Define a special fast entry for name lookup on a dictionary stack.
* The key is known to be a name; search the entire dict stack.
* Return the pointer to the value slot.
* If the name isn't found, just return 0.
*/
ref *dstack_find_name_by_index(P2(dict_stack_t *, uint));
/*
* Define an extra-fast macro for name lookup, optimized for
* a single-probe lookup in the top dictionary on the stack.
* Amazingly enough, this seems to hit over 90% of the time
* (aside from operators, of course, which are handled either with
* the special cache pointer or with 'bind').
*/
#define dstack_find_name_by_index_inline(pds,nidx,htemp)\
((pds)->top_keys[htemp = dict_hash_mod_inline(dict_name_index_hash(nidx),\
(pds)->top_npairs) + 1] == pt_tag(pt_literal_name) + (nidx) ?\
(pds)->top_values + htemp : dstack_find_name_by_index(pds, nidx))
/*
* Define a similar macro that only checks the top dictionary on the stack.
*/
#define if_dstack_find_name_by_index_top(pds,nidx,htemp,pvslot)\
if ( (((pds)->top_keys[htemp = dict_hash_mod_inline(dict_name_index_hash(nidx),\
(pds)->top_npairs) + 1] == pt_tag(pt_literal_name) + (nidx)) ?\
((pvslot) = (pds)->top_values + (htemp), 1) :\
0)\
)
#endif /* idstack_INCLUDED */
|