… | |
… | |
97 | *stash_cf_living_wrap; |
97 | *stash_cf_living_wrap; |
98 | |
98 | |
99 | static inline SV * |
99 | static inline SV * |
100 | newSVpv_utf8 (const char *s) |
100 | newSVpv_utf8 (const char *s) |
101 | { |
101 | { |
|
|
102 | if (!s) |
|
|
103 | return newSV (0); |
|
|
104 | |
102 | SV *sv = newSVpv (s, 0); |
105 | SV *sv = newSVpv (s, 0); |
103 | SvUTF8_on (sv); |
106 | SvUTF8_on (sv); |
104 | return sv; |
107 | return sv; |
105 | } |
108 | } |
106 | |
109 | |
107 | static inline SV * |
110 | static inline SV * |
108 | newSVpvn_utf8 (const char *s, STRLEN l) |
111 | newSVpvn_utf8 (const char *s, STRLEN l) |
109 | { |
112 | { |
|
|
113 | if (!s) |
|
|
114 | return newSV (0); |
|
|
115 | |
110 | SV *sv = newSVpvn (s, l); |
116 | SV *sv = newSVpvn (s, l); |
111 | SvUTF8_on (sv); |
117 | SvUTF8_on (sv); |
112 | return sv; |
118 | return sv; |
113 | } |
119 | } |
114 | |
120 | |
… | |
… | |
321 | newSVptr (void *ptr, HV *stash, HV *hv = newHV ()) |
327 | newSVptr (void *ptr, HV *stash, HV *hv = newHV ()) |
322 | { |
328 | { |
323 | SV *sv; |
329 | SV *sv; |
324 | |
330 | |
325 | if (!ptr) |
331 | if (!ptr) |
326 | return &PL_sv_undef; |
332 | return newSV (0); |
327 | |
333 | |
328 | sv_magicext ((SV *)hv, 0, PERL_MAGIC_ext, 0, (char *)ptr, 0); |
334 | sv_magicext ((SV *)hv, 0, PERL_MAGIC_ext, 0, (char *)ptr, 0); |
329 | return sv_bless (newRV_noinc ((SV *)hv), stash); |
335 | return sv_bless (newRV_noinc ((SV *)hv), stash); |
330 | } |
336 | } |
331 | |
337 | |
… | |
… | |
350 | |
356 | |
351 | static SV * |
357 | static SV * |
352 | newSVattachable (attachable *obj, HV *stash) |
358 | newSVattachable (attachable *obj, HV *stash) |
353 | { |
359 | { |
354 | if (!obj) |
360 | if (!obj) |
355 | return &PL_sv_undef; |
361 | return newSV (0); |
356 | |
362 | |
357 | if (!obj->self) |
363 | if (!obj->self) |
358 | obj->self = newHV (); |
364 | obj->self = newHV (); |
359 | |
365 | |
360 | if (!SvOBJECT (obj->self)) |
366 | if (!SvOBJECT (obj->self)) |
… | |
… | |
407 | return SvPTR (sv, klass); |
413 | return SvPTR (sv, klass); |
408 | else |
414 | else |
409 | return 0; |
415 | return 0; |
410 | } |
416 | } |
411 | |
417 | |
412 | inline SV *to_sv (const shstr & v) { return v ? newSVpvn_utf8 ((const char *)v, v.length ()) : &PL_sv_undef; } |
418 | inline SV *to_sv (const shstr & v) { return newSVpvn_utf8 ((const char *)v, v.length ()); } |
413 | inline SV *to_sv (const char * v) { return v ? newSVpv (v, 0) : &PL_sv_undef; } |
419 | inline SV *to_sv (const char * v) { return v ? newSVpv (v, 0) : newSV (0); } |
414 | inline SV *to_sv (bool v) { return newSViv (v); } |
420 | inline SV *to_sv (bool v) { return newSViv (v); } |
415 | inline SV *to_sv ( signed char v) { return newSViv (v); } |
421 | inline SV *to_sv ( signed char v) { return newSViv (v); } |
416 | inline SV *to_sv (unsigned char v) { return newSViv (v); } |
422 | inline SV *to_sv (unsigned char v) { return newSViv (v); } |
417 | inline SV *to_sv ( signed short v) { return newSViv (v); } |
423 | inline SV *to_sv ( signed short v) { return newSViv (v); } |
418 | inline SV *to_sv (unsigned short v) { return newSVuv (v); } |
424 | inline SV *to_sv (unsigned short v) { return newSVuv (v); } |
… | |
… | |
524 | break; |
530 | break; |
525 | |
531 | |
526 | case DT_STRING: |
532 | case DT_STRING: |
527 | { |
533 | { |
528 | char *str = (char *)va_arg (ap, const char *); |
534 | char *str = (char *)va_arg (ap, const char *); |
529 | sv = str ? newSVpv (str, 0) : &PL_sv_undef; |
535 | sv = str ? newSVpv (str, 0) : newSV (0); |
530 | } |
536 | } |
531 | break; |
537 | break; |
532 | |
538 | |
533 | case DT_DATA: |
539 | case DT_DATA: |
534 | { |
540 | { |
535 | char *str = (char *)va_arg (ap, const void *); |
541 | char *str = (char *)va_arg (ap, const void *); |
536 | int len = va_arg (ap, int); |
542 | int len = va_arg (ap, int); |
537 | sv = str ? newSVpv (str, len) : &PL_sv_undef; |
543 | sv = str ? newSVpv (str, len) : newSV (0); |
538 | } |
544 | } |
539 | break; |
545 | break; |
540 | |
546 | |
541 | case DT_OBJECT: |
547 | case DT_OBJECT: |
542 | sv = to_sv (va_arg (ap, object *)); |
548 | sv = to_sv (va_arg (ap, object *)); |
… | |
… | |
2866 | CODE: |
2872 | CODE: |
2867 | object_thawer *self; |
2873 | object_thawer *self; |
2868 | sv_to (sv, self); |
2874 | sv_to (sv, self); |
2869 | delete self; |
2875 | delete self; |
2870 | |
2876 | |
|
|
2877 | void |
|
|
2878 | tags (object_thawer *self) |
|
|
2879 | CODE: |
|
|
2880 | while (self->kw != KW_EOF) |
|
|
2881 | { |
|
|
2882 | if (self->kw == KW_tag) |
|
|
2883 | XPUSHs (sv_2mortal (to_sv (self->get_str ()))); |
|
|
2884 | |
|
|
2885 | self->skip (); |
|
|
2886 | } |
|
|
2887 | |