Changeset 485
- Timestamp:
- 04/05/07 02:17:22 (2 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/client-xs-20070328/Cache-Memcached-GetParserXS/GetParserXS.xs
r481 r485 15 15 #define FLAGS 6 16 16 #define KEY 7 /* current key we're parsing (without the namespace prefix) */ 17 #define FINISHED 8 /* hashref of keys and flags to be finalized at any time */ 17 18 18 19 #define DEBUG 0 … … 43 44 } 44 45 46 inline SV *get_offset_sv (AV* self) { 47 SV** svp = av_fetch(self, OFFSET, 0); 48 if (svp) 49 return (SV*) *svp; 50 51 *svp = newSViv(0); 52 av_store(self, OFFSET, *svp); 53 return (SV*) *svp; 54 } 55 56 inline void clear_on_item (AV* self) { 57 SV** svp = av_store(self, ON_ITEM, newSV(0) ); 58 } 59 45 60 inline void set_flags (AV* self, int flags) { 46 61 av_store(self, FLAGS, newSViv(flags)); … … 57 72 inline HV* get_dest (AV* self) { 58 73 SV** svp = av_fetch(self, DEST, 0); 74 if (svp) 75 return (HV*) SvRV(*svp); 76 return 0; 77 } 78 79 inline HV* get_finished (AV* self) { 80 SV** svp = av_fetch(self, FINISHED, 0); 59 81 if (svp) 60 82 return (HV*) SvRV(*svp); … … 100 122 char *barekey; 101 123 124 HV* finished = get_finished(self); 125 102 126 if (DEBUG) 103 127 printf("get_buffer (nslen = %d)...\n", nslen); … … 190 214 191 215 if (copy == state) { 192 dSP ; 193 194 /* have it all? */ 195 ENTER ; 196 SAVETMPS ; 197 PUSHMARK(SP) ; 198 XPUSHs(sv_2mortal(newSVpv(barekey, barelen))); 199 XPUSHs(sv_2mortal(newSViv(flags))); 200 PUTBACK ; 201 call_sv(on_item, G_VOID | G_DISCARD); 202 FREETMPS ; 203 LEAVE ; 216 hv_store(finished, barekey, barelen, newSViv(flags), 0); 204 217 205 218 set_offset(self, 0); … … 208 221 } else { 209 222 /* don't have it all... but buffer is now empty */ 223 hv_store(finished, barekey, barelen, newSViv(flags), 0); 210 224 set_offset(self, copy); 211 225 set_flags(self, flags);
