File Coverage

MemoryBuffer.xs
Criterion Covered Total %
statement 23 25 92.0
branch 7 12 58.3
condition n/a
subroutine n/a
pod n/a
total 30 37 81.0


line stmt bran cond sub pod time code
1             MODULE = Thrift::XS PACKAGE = Thrift::XS::MemoryBuffer
2              
3             SV *
4             new(char *klass, ...)
5             CODE:
6             {
7             int bufsize = 8192;
8             TMemoryBuffer *mbuf;
9 3           New(0, mbuf, sizeof(TMemoryBuffer), TMemoryBuffer);
10 3           New(0, mbuf->buffer, sizeof(Buffer), Buffer);
11            
12             MEM_TRACE("new()\n");
13             MEM_TRACE(" New mbuf @ %p\n", mbuf);
14             MEM_TRACE(" New buffer @ %p\n", mbuf->buffer);
15            
16 3 50         if (items > 1 && SvIOK_UV(ST(1)))
    0          
17 0           bufsize = SvIV(ST(1));
18            
19 3           buffer_init(mbuf->buffer, bufsize);
20            
21 3           RETVAL = xs_object_magic_create(
22             aTHX_
23             (void *)mbuf,
24             gv_stashpv(klass, 0)
25             );
26             }
27             OUTPUT:
28             RETVAL
29              
30             int
31             isOpen(SV *)
32             CODE:
33             {
34             RETVAL = 1;
35             }
36             OUTPUT:
37             RETVAL
38              
39             void
40             open(SV *)
41             CODE:
42             { }
43              
44             void
45             close(SV *)
46             CODE:
47             { }
48              
49             void
50             flush(SV *)
51             CODE:
52             { }
53              
54             int
55             available(TMemoryBuffer *mbuf)
56             CODE:
57             {
58 1 50         RETVAL = buffer_len(mbuf->buffer);
59             }
60             OUTPUT:
61             RETVAL
62              
63             SV *
64             read(TMemoryBuffer *mbuf, int len)
65             CODE:
66             {
67 56           int avail = buffer_len(mbuf->buffer);
68            
69 56 100         if (avail == 0) {
70 8           RETVAL = newSVpvn("", 0);
71             }
72             else {
73 48           if (avail < len)
74             len = avail;
75            
76             DEBUG_TRACE("read(%d)\n", len);
77 48           RETVAL = newSVpvn( buffer_ptr(mbuf->buffer), len );
78 48           buffer_consume(mbuf->buffer, len);
79             }
80             }
81             OUTPUT:
82             RETVAL
83              
84             SV *
85             readAll(TMemoryBuffer *mbuf, int len)
86             CODE:
87             {
88 2           int avail = buffer_len(mbuf->buffer);
89            
90 2 100         if (avail < len) {
91 1           THROW_SV("Thrift::TTransportException", newSVpvf("Attempt to readAll(%d) found only %d available", len, avail));
92             }
93            
94             DEBUG_TRACE("readAll(%d)\n", len);
95             #ifdef XS_DEBUG
96             //buffer_dump(mbuf->buffer, len);
97             #endif
98            
99 1           RETVAL = newSVpvn( buffer_ptr(mbuf->buffer), len );
100 1           buffer_consume(mbuf->buffer, len);
101             }
102             OUTPUT:
103             RETVAL
104              
105             void
106             write(TMemoryBuffer *mbuf, SV *buf, ...)
107             CODE:
108             {
109             int len;
110            
111 3 50         if (items > 2)
112 0           len = SvIV(ST(2));
113             else
114 3           len = sv_len(buf);
115            
116 3           buffer_append(mbuf->buffer, (void *)SvPVX(buf), len);
117            
118             DEBUG_TRACE("write(%d)\n", len);
119             #ifdef XS_DEBUG
120             //buffer_dump(mbuf->buffer, 0);
121             #endif
122             }
123            
124             void
125             DESTROY(TMemoryBuffer *mbuf)
126             CODE:
127             {
128             MEM_TRACE("DESTROY()\n");
129             MEM_TRACE(" free buffer @ %p\n", mbuf->buffer);
130             MEM_TRACE(" free mbuf @ %p\n", mbuf);
131            
132 3           buffer_free(mbuf->buffer);
133 3           Safefree(mbuf->buffer);
134 3           Safefree(mbuf);
135             }