.gitignore | 02 |
AMF.xs | 173214 |
Changes | 303321 |
MANIFEST | 01 |
META.json | 054 |
META.yml | 2424 |
Makefile.PL | 1313 |
TODO | 04 |
lib/Storable/AMF/Mapper.pm | 105 |
lib/Storable/AMF.pm | 175 |
lib/Storable/AMF0.pm | 247 |
lib/Storable/AMF3.pm | 183 |
t/00-compile.t | 22 |
t/40-negative-freeze.t | 210 |
t/64-prefer-number.t | 48 |
t/65-prefer-number3.t | 411 |
16 files changed (This is a version diff) | 594684 |
@@ -9,3 +9,5 @@ MYMETA.yml
_build
*.tar.gz
[a-z].pl
+AMF.o
+MYMETA.json
@@ -22,6 +22,9 @@
#ifndef inline /* don't like borgs definitions */ /* inline is keyword for STDC compiler */
# if defined(__GNUC__) || defined(__cplusplus__) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L))
+# if defined(__APPLE__)
+# define inline
+# endif
# else
# if defined(WIN32) && defined(_MSV) /* Microsoft Compiler */
# define inline _inline
@@ -30,6 +33,8 @@
# endif
# endif
#endif /* inline */
+/* Stupid FreeBSD compiler failed with plain inline */
+#define FREE_INLINE STATIC_INLINE
#define MARKER3_UNDEF '\x00'
#define MARKER3_NULL '\x01'
@@ -96,6 +101,7 @@
#define OPT_JSON_BOOLEAN 64
#define OPT_MAPPER 128
#define OPT_TARG 256
+#define OPT_SKIP_BAD 512
#define EXPERIMENT1
@@ -197,35 +203,35 @@ struct io_struct{
bool reuse;
};
-inline SV* get_tmp_storage( pTHX_ SV *option );
-inline void destroy_tmp_storage( pTHX_ SV *self);
+FREE_INLINE SV* get_tmp_storage( pTHX_ SV *option );
+FREE_INLINE void destroy_tmp_storage( pTHX_ SV *self);
STATIC_INLINE SV * amf0_parse_one(pTHX_ struct io_struct * io);
STATIC_INLINE SV * amf3_parse_one(pTHX_ struct io_struct * io);
-inline void io_in_destroy(pTHX_ struct io_struct * io, AV *);
-inline void io_out_cleanup(pTHX_ struct io_struct * io);
+FREE_INLINE void io_in_destroy(pTHX_ struct io_struct * io, AV *);
+FREE_INLINE void io_out_cleanup(pTHX_ struct io_struct * io);
-inline void io_test_eof(pTHX_ struct io_struct *io);
-inline void io_register_error(struct io_struct *io, int);
-inline void io_register_error_and_free(pTHX_ struct io_struct *io, int, void *);
-inline int
+FREE_INLINE void io_test_eof(pTHX_ struct io_struct *io);
+FREE_INLINE void io_register_error(struct io_struct *io, int);
+FREE_INLINE void io_register_error_and_free(pTHX_ struct io_struct *io, int, void *);
+FREE_INLINE int
io_position(struct io_struct *io){
return io->pos-io->ptr;
}
-inline void
+FREE_INLINE void
io_set_position(struct io_struct *io, int pos){
io->pos = io->ptr + pos;
}
-inline void
+FREE_INLINE void
io_savepoint(pTHX_ struct io_struct *io, struct amf3_restore_point *p){
p->offset_buffer = io_position(io);
p->offset_object = av_len(io->arr_object);
p->offset_trait = av_len(io->arr_trait);
p->offset_string = av_len(io->arr_string);
}
-inline void
+FREE_INLINE void
io_restorepoint(pTHX_ struct io_struct *io, struct amf3_restore_point *p){
io_set_position(io, p->offset_buffer);
while(av_len(io->arr_object) > p->offset_object){
@@ -241,24 +247,24 @@ io_restorepoint(pTHX_ struct io_struct *io, struct amf3_restore_point *p){
}
-inline void
+FREE_INLINE void
io_move_backward(struct io_struct *io, int step){
io->pos-= step;
}
-inline void
+FREE_INLINE void
io_move_forward(struct io_struct *io, int len){
io->pos+=len;
}
-inline void
+FREE_INLINE void
io_require(struct io_struct *io, int len){
if (io->end - io->pos < len){
io_register_error(io, ERR_EOF);
}
}
-inline void
+FREE_INLINE void
io_reserve(pTHX_ struct io_struct *io, int len){
if (io->end - io->pos< len){
unsigned int ipos = io->pos - io->ptr;
@@ -274,12 +280,12 @@ io_reserve(pTHX_ struct io_struct *io, int len){
io->end = io->ptr + SvLEN(io->sv_buffer);
}
}
-inline void io_register_error(struct io_struct *io, int errtype){
+FREE_INLINE void io_register_error(struct io_struct *io, int errtype){
io->error_code = errtype;
Siglongjmp(io->target_error, errtype);
}
-inline void io_test_eof(pTHX_ struct io_struct *io){
+FREE_INLINE void io_test_eof(pTHX_ struct io_struct *io){
if (io->pos!=io->end){
io_register_error( io, ERR_EOF );
}
@@ -318,22 +324,21 @@ void io_format_error(pTHX_ struct io_struct *io ){
}
}
-inline void io_register_error_and_free(pTHX_ struct io_struct *io, int errtype, void *pointer){
+FREE_INLINE void io_register_error_and_free(pTHX_ struct io_struct *io, int errtype, void *pointer){
if (pointer)
sv_2mortal((SV*) pointer);
Siglongjmp(io->target_error, errtype);
}
-inline SV* get_tmp_storage(pTHX_ SV* option){
+FREE_INLINE SV* get_tmp_storage(pTHX_ SV* option){
struct io_struct * io;
SV *sv ;
- AV *tmp;
Newxz( io, 1, struct io_struct );
sv = sv_newmortal();
sv_setref_iv( sv, "Storable::AMF0::TemporaryStorage", PTR2IV( io ) );
- tmp = io->arr_trait = newAV();
- tmp = io->arr_string = newAV();
- tmp = io->arr_object = newAV();
+ io->arr_trait = newAV();
+ io->arr_string = newAV();
+ io->arr_object = newAV();
io->hv_object = newHV();
HvSHAREKEYS_off( io->hv_object );
@@ -356,7 +361,7 @@ inline SV* get_tmp_storage(pTHX_ SV* option){
}
return sv;
}
-inline void destroy_tmp_storage( pTHX_ SV *self ){
+FREE_INLINE void destroy_tmp_storage( pTHX_ SV *self ){
if ( ! SvROK( self )) {
croak( "Bad Storable::AMF0::TemporaryStorage" );
}
@@ -369,26 +374,26 @@ inline void destroy_tmp_storage( pTHX_ SV *self ){
SvREFCNT_dec( (SV *) io->hv_object );
SvREFCNT_dec( (SV *) io->hv_string );
SvREFCNT_dec( (SV *) io->hv_trait );
- // SvREFCNT_dec( (SV *) io->sv_buffer );
+ /* SvREFCNT_dec( (SV *) io->sv_buffer ); */
Safefree( io );
/* fprintf( stderr, "Destroy\n"); */
}
}
-inline void io_in_cleanup(pTHX_ struct io_struct *io){
+FREE_INLINE void io_in_cleanup(pTHX_ struct io_struct *io){
av_clear( io->arr_object );
if ( AMF3_VERSION == io->final_version ){
av_clear( io->arr_string );
av_clear( io->arr_trait );
};
}
-inline void io_out_cleanup(pTHX_ struct io_struct *io){
+FREE_INLINE void io_out_cleanup(pTHX_ struct io_struct *io){
hv_clear( io->hv_object );
if ( AMF3_VERSION == io->version ){
hv_clear( io->hv_string );
hv_clear( io->hv_trait );
};
}
-inline void io_in_init(pTHX_ struct io_struct * io, SV* data, int amf_version, SV * sv_option){
+FREE_INLINE void io_in_init(pTHX_ struct io_struct * io, SV* data, int amf_version, SV * sv_option){
struct io_struct *reuse_storage_ptr;
bool reuse_storage;
/* PerlInterpreter *my_perl = io->interpreter; */
@@ -464,7 +469,7 @@ inline void io_in_init(pTHX_ struct io_struct * io, SV* data, int amf_version,
}
}
}
-inline void io_in_destroy(pTHX_ struct io_struct * io, AV *a){
+FREE_INLINE void io_in_destroy(pTHX_ struct io_struct * io, AV *a){
int i;
SV **ref_item;
int alen;
@@ -502,7 +507,7 @@ inline void io_in_destroy(pTHX_ struct io_struct * io, AV *a){
}
}
}
-inline void io_out_init(pTHX_ struct io_struct *io, SV*sv_option, int amf_version){
+STATIC_INLINE void io_out_init(pTHX_ struct io_struct *io, SV*sv_option, int amf_version){
SV *sbuffer;
unsigned int ibuf_size ;
unsigned int ibuf_step ;
@@ -612,17 +617,17 @@ inline void io_out_init(pTHX_ struct io_struct *io, SV*sv_option, int amf_versio
}
-inline SV * io_buffer(struct io_struct *io){
+FREE_INLINE SV * io_buffer(struct io_struct *io){
SvCUR_set(io->sv_buffer, io->pos - io->ptr);
return io->sv_buffer;
}
-inline double io_read_double(struct io_struct *io);
-inline unsigned char io_read_marker(struct io_struct * io);
-inline int io_read_u8(struct io_struct * io);
-inline int io_read_u16(struct io_struct * io);
-inline int io_read_u32(struct io_struct * io);
-inline int io_read_u24(struct io_struct * io);
+FREE_INLINE double io_read_double(struct io_struct *io);
+FREE_INLINE unsigned char io_read_marker(struct io_struct * io);
+FREE_INLINE int io_read_u8(struct io_struct * io);
+FREE_INLINE int io_read_u16(struct io_struct * io);
+FREE_INLINE int io_read_u32(struct io_struct * io);
+FREE_INLINE int io_read_u24(struct io_struct * io);
#define MOVERFLOW(VALUE, MAXVALUE, PROC)\
@@ -633,7 +638,7 @@ inline int io_read_u24(struct io_struct * io);
-inline void io_write_double(pTHX_ struct io_struct *io, double value){
+FREE_INLINE void io_write_double(pTHX_ struct io_struct *io, double value){
const int step = 8;
union {
signed int iv;
@@ -654,14 +659,14 @@ inline void io_write_double(pTHX_ struct io_struct *io, double value){
io->pos+= step ;
return;
}
-inline void io_write_marker(pTHX_ struct io_struct * io, char value) {
+FREE_INLINE void io_write_marker(pTHX_ struct io_struct * io, char value) {
const int step = 1;
io_reserve(aTHX_ io, 1);
io->pos[0]= value;
io->pos+=step;
return;
}
-inline void io_write_uchar (pTHX_ struct io_struct * io, unsigned char value) {
+FREE_INLINE void io_write_uchar (pTHX_ struct io_struct * io, unsigned char value) {
const int step = 1;
io_reserve(aTHX_ io, 1);
io->pos[0]= value;
@@ -669,7 +674,7 @@ inline void io_write_uchar (pTHX_ struct io_struct * io, unsigned char value) {
return;
}
-inline void io_write_u8(pTHX_ struct io_struct * io, unsigned int value){
+FREE_INLINE void io_write_u8(pTHX_ struct io_struct * io, unsigned int value){
const int step = 1;
union {
signed int iv;
@@ -686,7 +691,7 @@ inline void io_write_u8(pTHX_ struct io_struct * io, unsigned int value){
}
-inline void io_write_s16(pTHX_ struct io_struct * io, signed int value){
+FREE_INLINE void io_write_s16(pTHX_ struct io_struct * io, signed int value){
const int step = 2;
union {
signed int iv;
@@ -703,7 +708,7 @@ inline void io_write_s16(pTHX_ struct io_struct * io, signed int value){
return;
}
-inline void io_write_u16(pTHX_ struct io_struct * io, unsigned int value){
+FREE_INLINE void io_write_u16(pTHX_ struct io_struct * io, unsigned int value){
const int step = 2;
union {
signed int iv;
@@ -720,7 +725,7 @@ inline void io_write_u16(pTHX_ struct io_struct * io, unsigned int value){
return;
}
-inline void io_write_u32(pTHX_ struct io_struct * io, unsigned int value){
+FREE_INLINE void io_write_u32(pTHX_ struct io_struct * io, unsigned int value){
const int step = 4;
union {
signed int iv;
@@ -738,7 +743,7 @@ inline void io_write_u32(pTHX_ struct io_struct * io, unsigned int value){
return;
}
-inline void io_write_u24(pTHX_ struct io_struct * io, unsigned int value){
+FREE_INLINE void io_write_u24(pTHX_ struct io_struct * io, unsigned int value){
const int step = 3;
union {
signed int iv;
@@ -755,24 +760,24 @@ inline void io_write_u24(pTHX_ struct io_struct * io, unsigned int value){
io->pos+=step;
return;
}
-inline void io_write_bytes(pTHX_ struct io_struct* io, const char * const buffer, int len){
+FREE_INLINE void io_write_bytes(pTHX_ struct io_struct* io, const char * const buffer, int len){
io_reserve(aTHX_ io, len);
Copy(buffer, io->pos, len, char);
io->pos+=len;
}
/* Date checking */
-inline bool util_is_date(SV *one);
-inline double util_date_time(SV *one);
-
-inline void amf0_format_one(pTHX_ struct io_struct *io, SV * one);
-inline void amf0_format_number(pTHX_ struct io_struct *io, SV * one);
-inline void amf0_format_string(pTHX_ struct io_struct *io, SV * one);
-inline void amf0_format_strict_array(pTHX_ struct io_struct *io, AV * one);
-inline void amf0_format_object(pTHX_ struct io_struct *io, HV * one);
-inline void amf0_format_null(pTHX_ struct io_struct *io);
-inline void amf0_format_typed_object(pTHX_ struct io_struct *io, HV * one);
-
-inline bool util_is_date(SV *one){
+FREE_INLINE bool util_is_date(SV *one);
+FREE_INLINE double util_date_time(SV *one);
+
+STATIC_INLINE void amf0_format_one(pTHX_ struct io_struct *io, SV * one);
+STATIC_INLINE void amf0_format_number(pTHX_ struct io_struct *io, SV * one);
+STATIC_INLINE void amf0_format_string(pTHX_ struct io_struct *io, SV * one);
+STATIC_INLINE void amf0_format_strict_array(pTHX_ struct io_struct *io, AV * one);
+STATIC_INLINE void amf0_format_object(pTHX_ struct io_struct *io, HV * one);
+STATIC_INLINE void amf0_format_null(pTHX_ struct io_struct *io);
+STATIC_INLINE void amf0_format_typed_object(pTHX_ struct io_struct *io, HV * one);
+
+FREE_INLINE bool util_is_date(SV *one){
if (SvNOKp(one)){
HV* stash = SvSTASH(one);
char *class_name = HvNAME(stash);
@@ -787,14 +792,14 @@ inline bool util_is_date(SV *one){
return 0;
}
}
-inline double util_date_time(SV *one){
+FREE_INLINE double util_date_time(SV *one){
return (SvNVX(one)*1000);
}
-inline void amf0_format_reference(pTHX_ struct io_struct * io, SV *ref){
+FREE_INLINE void amf0_format_reference(pTHX_ struct io_struct * io, SV *ref){
io_write_marker(aTHX_ io, MARKER0_REFERENCE);
io_write_u16(aTHX_ io, SvIV(ref));
}
-inline void amf0_format_scalar_ref(pTHX_ struct io_struct * io, SV *ref){
+FREE_INLINE void amf0_format_scalar_ref(pTHX_ struct io_struct * io, SV *ref){
const char *const reftype = "REFVAL";
io_write_marker(aTHX_ io, MARKER0_TYPED_OBJECT);
@@ -811,16 +816,27 @@ inline void amf0_format_scalar_ref(pTHX_ struct io_struct * io, SV *ref){
io_write_marker(aTHX_ io, MARKER0_OBJECT_END);
}
-inline void amf0_format_one(pTHX_ struct io_struct *io, SV * one){
+FREE_INLINE void amf0_format_one(pTHX_ struct io_struct *io, SV * one){
+ SV *rv = 0;
+ bool is_perl_bool = 0;
if (SvROK(one)){
+ rv = (SV*) SvRV(one);
if ( sv_isobject( one )){
- bool is_perl_bool = 0;
- if ( sv_isa(one, "boolean" )){
- is_perl_bool = 1;
- }
- if ( sv_isa(one, "JSON::XS::Boolean")){
- is_perl_bool = 1;
- }
+ HV* stash = SvSTASH(rv);
+ char *class_name = HvNAME(stash);
+ if ( class_name[0] == 'J' ){
+ if ( sv_isa(one, "JSON::PP::Boolean")){
+ is_perl_bool = 1;
+ }
+ else if ( sv_isa(one, "JSON::XS::Boolean") ){
+ is_perl_bool = 1;
+ }
+ }
+ else if ( class_name[0] == 'b' ){
+ if ( sv_isa(one, "boolean" )){
+ is_perl_bool = 1;
+ }
+ }
if ( is_perl_bool ){
io_write_marker(aTHX_ io, MARKER0_BOOLEAN );
/* TODO SvTRUE can call die or something like */
@@ -830,8 +846,7 @@ inline void amf0_format_one(pTHX_ struct io_struct *io, SV * one){
}
}
- if (SvROK(one)){
- SV * rv = (SV*) SvRV(one);
+ if (rv){
/* test has stored */
SV **OK = hv_fetch(io->hv_object, (char *)(&rv), sizeof (rv), 1);
if (SvOK(*OK)) {
@@ -880,7 +895,11 @@ inline void amf0_format_one(pTHX_ struct io_struct *io, SV * one){
}
else {
/* may be i has to format as undef */
- io_register_error(io, ERR_BAD_OBJECT);
+ if ( io->options & OPT_SKIP_BAD ){
+ io_write_marker( aTHX_ io, MARKER0_UNDEFINED );
+ }
+ else
+ io_register_error(io, ERR_BAD_OBJECT);
}
}
else if (SvTYPE(rv) == SVt_PVAV)
@@ -893,7 +912,10 @@ inline void amf0_format_one(pTHX_ struct io_struct *io, SV * one){
amf0_format_scalar_ref(aTHX_ io, (SV*) rv);
}
else {
- io_register_error(io, ERR_BAD_OBJECT);
+ if ( io->options & OPT_SKIP_BAD )
+ io_write_marker( aTHX_ io, MARKER0_UNDEFINED );
+ else
+ io_register_error(io, ERR_BAD_OBJECT);
}
}
}
@@ -913,9 +935,16 @@ inline void amf0_format_one(pTHX_ struct io_struct *io, SV * one){
if (SvPOK(one)){
amf0_format_string(aTHX_ io, one);
}
- else {
+ else if ( SvNIOK(one) ){
amf0_format_number(aTHX_ io, one);
}
+ else {
+ if (io->options & OPT_SKIP_BAD ){
+ io_write_marker(aTHX_ io, MARKER0_UNDEFINED );
+ }
+ else
+ io_register_error(io, ERR_BAD_OBJECT);
+ }
}
else {
amf0_format_null(aTHX_ io);
@@ -923,12 +952,12 @@ inline void amf0_format_one(pTHX_ struct io_struct *io, SV * one){
}
}
-inline void amf0_format_number(pTHX_ struct io_struct *io, SV * one){
+FREE_INLINE void amf0_format_number(pTHX_ struct io_struct *io, SV * one){
io_write_marker(aTHX_ io, MARKER0_NUMBER);
io_write_double(aTHX_ io, SvNV(one));
}
-inline void amf0_format_string(pTHX_ struct io_struct *io, SV * one){
+FREE_INLINE void amf0_format_string(pTHX_ struct io_struct *io, SV * one){
/* TODO: process long string */
if (SvPOK(one)){
@@ -950,7 +979,7 @@ inline void amf0_format_string(pTHX_ struct io_struct *io, SV * one){
amf0_format_null(aTHX_ io);
}
}
-inline void amf0_format_strict_array(pTHX_ struct io_struct *io, AV * one){
+FREE_INLINE void amf0_format_strict_array(pTHX_ struct io_struct *io, AV * one){
int i, len;
AV * one_array;
one_array = one;
@@ -968,31 +997,24 @@ inline void amf0_format_strict_array(pTHX_ struct io_struct *io, AV * one){
}
}
}
-inline void amf0_format_object(pTHX_ struct io_struct *io, HV * one){
- STRLEN key_len;
- HV *hv;
- HE *he;
+FREE_INLINE void amf0_format_object(pTHX_ struct io_struct *io, HV * one){
+ I32 key_len;
SV * value;
- char * key_str;
- hv = one;
- if (1) {
- hv_iterinit(hv);
- while( (he = hv_iternext(hv))){
- key_str = HePV(he, key_len);
- value = HeVAL(he);
- io_write_u16(aTHX_ io, key_len);
- io_write_bytes(aTHX_ io, key_str, key_len);
- amf0_format_one(aTHX_ io, value);
- }
+ char *key_str;
+ hv_iterinit(one);
+ while(( value = hv_iternextsv(one, &key_str, &key_len))){
+ io_write_u16(aTHX_ io, key_len);
+ io_write_bytes(aTHX_ io, key_str, key_len);
+ amf0_format_one(aTHX_ io, value);
}
io_write_u16(aTHX_ io, 0);
io_write_marker(aTHX_ io, MARKER0_OBJECT_END);
}
-inline void amf0_format_null(pTHX_ struct io_struct *io){
+FREE_INLINE void amf0_format_null(pTHX_ struct io_struct *io){
io_write_marker(aTHX_ io, MARKER0_UNDEFINED);
}
-inline void amf0_format_typed_object(pTHX_ struct io_struct *io, HV * one){
+FREE_INLINE void amf0_format_typed_object(pTHX_ struct io_struct *io, HV * one){
HV* stash = SvSTASH(one);
char *class_name = HvNAME(stash);
io_write_marker(aTHX_ io, MARKER0_TYPED_OBJECT);
@@ -1018,16 +1040,18 @@ STATIC_INLINE SV* amf0_parse_recordset(pTHX_ struct io_struct *io);
STATIC_INLINE SV* amf0_parse_xml_document(pTHX_ struct io_struct *io);
STATIC_INLINE SV* amf0_parse_typed_object(pTHX_ struct io_struct *io);
-inline void io_write_double(pTHX_ struct io_struct *io, double value);
-inline void io_write_marker(pTHX_ struct io_struct * io, char value);
-inline void io_write_uchar (pTHX_ struct io_struct * io, unsigned char value);
-inline void io_write_u8(pTHX_ struct io_struct * io, unsigned int value);
-inline void io_write_s16(pTHX_ struct io_struct * io, signed int value);
-inline void io_write_u16(pTHX_ struct io_struct * io, unsigned int value);
-inline void io_write_u32(pTHX_ struct io_struct * io, unsigned int value);
-inline void io_write_u24(pTHX_ struct io_struct * io, unsigned int value);
-
-inline double io_read_double(struct io_struct *io){
+FREE_INLINE void io_write_double(pTHX_ struct io_struct *io, double value);
+FREE_INLINE void io_write_marker(pTHX_ struct io_struct * io, char value);
+FREE_INLINE void io_write_uchar (pTHX_ struct io_struct * io, unsigned char value);
+FREE_INLINE void io_write_u8(pTHX_ struct io_struct * io, unsigned int value);
+FREE_INLINE void io_write_s16(pTHX_ struct io_struct * io, signed int value);
+FREE_INLINE void io_write_u16(pTHX_ struct io_struct * io, unsigned int value);
+FREE_INLINE void io_write_u32(pTHX_ struct io_struct * io, unsigned int value);
+FREE_INLINE void io_write_u24(pTHX_ struct io_struct * io, unsigned int value);
+/*
+*/
+
+FREE_INLINE double io_read_double(struct io_struct *io){
const int step = sizeof(double);
double a;
unsigned char * ptr_in = io->pos;
@@ -1044,20 +1068,20 @@ inline double io_read_double(struct io_struct *io){
io->pos += step;
return a;
}
-inline char *io_read_bytes(struct io_struct *io, int len){
+FREE_INLINE char *io_read_bytes(struct io_struct *io, int len){
char * pos = ( char * )io->pos;
io_require(io, len);
io->pos+=len;
return pos;
}
-inline char *io_read_chars(struct io_struct *io, int len){
+FREE_INLINE char *io_read_chars(struct io_struct *io, int len){
char * pos = ( char * )io->pos;
io_require(io, len);
io->pos+=len;
return pos;
}
-inline unsigned char io_read_marker(struct io_struct * io){
+FREE_INLINE unsigned char io_read_marker(struct io_struct * io){
const int step = 1;
unsigned char marker;
io_require(io, step);
@@ -1065,7 +1089,7 @@ inline unsigned char io_read_marker(struct io_struct * io){
io->pos++;
return marker;
}
-inline int io_read_u8(struct io_struct * io){
+FREE_INLINE int io_read_u8(struct io_struct * io){
const int step = 1;
union{
unsigned int x;
@@ -1077,7 +1101,7 @@ inline int io_read_u8(struct io_struct * io){
io->pos+= step;
return (int) str.x;
}
-inline int io_read_s16(struct io_struct * io){
+FREE_INLINE int io_read_s16(struct io_struct * io){
const int step = 2;
union{
int x;
@@ -1090,7 +1114,7 @@ inline int io_read_s16(struct io_struct * io){
io->pos+= step;
return (int) str.x;
}
-inline int io_read_u16(struct io_struct * io){
+FREE_INLINE int io_read_u16(struct io_struct * io){
const int step = 2;
union{
unsigned int x;
@@ -1103,7 +1127,7 @@ inline int io_read_u16(struct io_struct * io){
io->pos+= step;
return (int) str.x;
}
-inline int io_read_u24(struct io_struct * io){
+FREE_INLINE int io_read_u24(struct io_struct * io){
const int step = 3;
union{
unsigned int x;
@@ -1117,7 +1141,7 @@ inline int io_read_u24(struct io_struct * io){
io->pos+= step;
return (int) str.x;
}
-inline int io_read_u32(struct io_struct * io){
+FREE_INLINE int io_read_u32(struct io_struct * io){
const int step = 4;
union{
unsigned int x;
@@ -1132,7 +1156,7 @@ inline int io_read_u32(struct io_struct * io){
io->pos+= step;
return (int) str.x;
}
-inline void amf3_write_integer(pTHX_ struct io_struct *io, IV ivalue){
+FREE_INLINE void amf3_write_integer(pTHX_ struct io_struct *io, IV ivalue){
UV value;
if (ivalue<0){
if ( ivalue < -( 1 << 28) ){
@@ -1178,7 +1202,7 @@ inline void amf3_write_integer(pTHX_ struct io_struct *io, IV ivalue){
return;
}
-inline int amf3_read_integer(struct io_struct *io){
+FREE_INLINE int amf3_read_integer(struct io_struct *io){
I32 value;
io_require(io, 1);
if ((U8) io->pos[0] > 0x7f) {
@@ -1231,19 +1255,17 @@ STATIC_INLINE SV * amf0_parse_object(pTHX_ struct io_struct * io){
int len_next;
char * key;
SV * value;
- int obj_pos;
SV *RETVALUE;
obj = newHV();
RETVALUE = newRV_noinc( (SV *) obj );
av_push(io->arr_object, RETVALUE);
- obj_pos = av_len(io->arr_object);
while(1){
len_next = io_read_u16(io);
if (len_next == 0) {
char object_end;
object_end= io_read_marker(io);
- if ((object_end == MARKER0_OBJECT_END))
+ if ( MARKER0_OBJECT_END == object_end )
{
if (io->options & OPT_STRICT){
if (SvREFCNT(RETVALUE) > 1)
@@ -1372,7 +1394,7 @@ STATIC_INLINE SV* amf0_parse_ecma_array(pTHX_ struct io_struct *io){
fprintf( stderr, "Start parse array %d\n", array_len);
fprintf( stderr, "position %d\n", io_position(io));
#endif
- if (0 <= array_len){
+ if (1){
bool ok;
UV index;
key_len = io_read_u16(io);
@@ -1469,9 +1491,8 @@ STATIC_INLINE SV* amf0_parse_ecma_array(pTHX_ struct io_struct *io){
STATIC_INLINE SV* amf0_parse_date(pTHX_ struct io_struct *io){
SV* RETVALUE;
double time;
- int tz;
time = io_read_double(io);
- tz = io_read_s16(io);
+ (void)io_read_s16(io);
if ( io->options & OPT_MILLSEC_DATE )
RETVALUE = newSVnv(time);
else
@@ -1507,7 +1528,7 @@ STATIC_INLINE SV* amf0_parse_xml_document(pTHX_ struct io_struct *io){
av_push(io->arr_object, RETVALUE);
return RETVALUE;
}
-inline SV *parse_scalar_ref(pTHX_ struct io_struct *io){
+FREE_INLINE SV *parse_scalar_ref(pTHX_ struct io_struct *io){
SV * obj;
int obj_pos;
int len_next;
@@ -1525,7 +1546,7 @@ inline SV *parse_scalar_ref(pTHX_ struct io_struct *io){
if (len_next == 0) {
char object_end;
object_end= io_read_marker(io);
- if ((object_end == MARKER0_OBJECT_END))
+ if (MARKER0_OBJECT_END == object_end)
{
SV* RETVALUE = *av_fetch(io->arr_object, obj_pos, 0);
if (!value)
@@ -1589,7 +1610,7 @@ STATIC_INLINE SV* amf0_parse_double(pTHX_ struct io_struct * io){
return newSVnv(io_read_double(io));
}
-inline SV* util_boolean(pTHX_ struct io_struct *io, bool value){
+FREE_INLINE SV* util_boolean(pTHX_ struct io_struct *io, bool value){
if ( ! (io->options & OPT_JSON_BOOLEAN) ){
SV *sv = boolSV( value );
/* SvREFCNT_inc_simple_void_NN( sv ); */
@@ -1646,7 +1667,7 @@ STATIC_INLINE SV* parse_boolean(pTHX_ struct io_struct * io){
return value;
}
*/
-inline SV * amf3_parse_one(pTHX_ struct io_struct *io);
+FREE_INLINE SV * amf3_parse_one(pTHX_ struct io_struct *io);
STATIC_INLINE SV * amf3_parse_undefined(pTHX_ struct io_struct *io){
SV * RETVALUE;
RETVALUE = newSV(0);
@@ -1678,7 +1699,7 @@ STATIC_INLINE SV * amf3_parse_double(pTHX_ struct io_struct *io){
RETVALUE = newSVnv(io_read_double(io));
return RETVALUE;
}
-inline char * amf3_read_string(pTHX_ struct io_struct *io, int ref_len, STRLEN *str_len){
+FREE_INLINE char * amf3_read_string(pTHX_ struct io_struct *io, int ref_len, STRLEN *str_len){
AV * arr_string = io->arr_string;
if (ref_len & 1) {
@@ -1726,7 +1747,7 @@ STATIC_INLINE SV * amf3_parse_xml_doc(pTHX_ struct io_struct *io){
RETVALUE = amf3_parse_xml(aTHX_ io);
return RETVALUE;
}
-inline SV * amf3_parse_date(pTHX_ struct io_struct *io){
+STATIC_INLINE SV * amf3_parse_date(pTHX_ struct io_struct *io){
SV * RETVALUE;
int i = amf3_read_integer(io);
if (i&1){
@@ -1756,14 +1777,14 @@ inline SV * amf3_parse_date(pTHX_ struct io_struct *io){
}
-inline void amf3_store_object(pTHX_ struct io_struct *io, SV * item){
+FREE_INLINE void amf3_store_object(pTHX_ struct io_struct *io, SV * item){
av_push(io->arr_object, newRV_noinc(item));
}
-inline void amf3_store_object_rv(pTHX_ struct io_struct *io, SV * item){
+FREE_INLINE void amf3_store_object_rv(pTHX_ struct io_struct *io, SV * item){
av_push(io->arr_object, item);
}
-inline SV * amf3_parse_array(pTHX_ struct io_struct *io){
+STATIC_INLINE SV * amf3_parse_array(pTHX_ struct io_struct *io){
SV * RETVALUE;
int ref_len = amf3_read_integer(io);
if (ref_len & 1){
@@ -1778,8 +1799,6 @@ inline SV * amf3_parse_array(pTHX_ struct io_struct *io){
int old_vlen;
SV * item_value;
UV item_index;
- int obj_pos;
-
AV * array;
str_len = amf3_read_integer(io);
@@ -1795,7 +1814,6 @@ inline SV * amf3_parse_array(pTHX_ struct io_struct *io){
RETVALUE = newRV_noinc(item);
amf3_store_object_rv(aTHX_ io, RETVALUE);
- obj_pos = av_len(io->arr_object);
recover = FALSE;
if (str_len !=1){
@@ -1896,7 +1914,7 @@ struct amf3_trait_struct{
SV* class_name;
HV* stash;
};
-inline SV * amf3_parse_object(pTHX_ struct io_struct *io){
+STATIC_INLINE SV * amf3_parse_object(pTHX_ struct io_struct *io){
SV * RETVALUE;
int obj_ref = amf3_read_integer(io);
#ifdef TRACE0
@@ -2047,13 +2065,13 @@ STATIC_INLINE SV * amf3_parse_bytearray(pTHX_ struct io_struct *io){
}
return RETVALUE;
}
-inline void amf3_format_date( pTHX_ struct io_struct *io, SV * one){
+FREE_INLINE void amf3_format_date( pTHX_ struct io_struct *io, SV * one){
io_write_marker( aTHX_ io, MARKER3_DATE );
amf3_write_integer( aTHX_ io, 1 );
io_write_double( aTHX_ io, util_date_time( one ));
}
-inline void amf3_format_one(pTHX_ struct io_struct *io, SV * one);
-inline void amf3_format_integer(pTHX_ struct io_struct *io, SV *one){
+FREE_INLINE void amf3_format_one(pTHX_ struct io_struct *io, SV * one);
+FREE_INLINE void amf3_format_integer(pTHX_ struct io_struct *io, SV *one){
IV i = SvIV(one);
if (i <= 0xfffffff && i>= -(0x10000000)){
@@ -2066,20 +2084,20 @@ inline void amf3_format_integer(pTHX_ struct io_struct *io, SV *one){
}
}
-inline void amf3_format_double(pTHX_ struct io_struct * io, SV *one){
+FREE_INLINE void amf3_format_double(pTHX_ struct io_struct * io, SV *one){
io_write_marker(aTHX_ io, MARKER3_DOUBLE);
io_write_double(aTHX_ io, SvNV(one));
}
-inline void amf3_format_undef(pTHX_ struct io_struct *io){
+FREE_INLINE void amf3_format_undef(pTHX_ struct io_struct *io){
io_write_marker(aTHX_ io, MARKER3_UNDEF);
}
-inline void amf3_format_null(pTHX_ struct io_struct *io){
+FREE_INLINE void amf3_format_null(pTHX_ struct io_struct *io){
io_write_marker(aTHX_ io, MARKER3_NULL);
}
-inline void amf3_write_string_pvn(pTHX_ struct io_struct *io, char *pstr, STRLEN plen){
+FREE_INLINE void amf3_write_string_pvn(pTHX_ struct io_struct *io, char *pstr, STRLEN plen){
HV* rhv;
SV ** hv_item;
@@ -2103,7 +2121,7 @@ inline void amf3_write_string_pvn(pTHX_ struct io_struct *io, char *pstr, STRLEN
}
}
-inline void amf3_format_string(pTHX_ struct io_struct *io, SV *one){
+FREE_INLINE void amf3_format_string(pTHX_ struct io_struct *io, SV *one){
char *pstr;
STRLEN plen;
pstr = SvPV(one, plen);
@@ -2111,11 +2129,11 @@ inline void amf3_format_string(pTHX_ struct io_struct *io, SV *one){
amf3_write_string_pvn(aTHX_ io, pstr, plen);
}
-inline void amf3_format_reference(pTHX_ struct io_struct *io, SV *num){
+FREE_INLINE void amf3_format_reference(pTHX_ struct io_struct *io, SV *num){
amf3_write_integer(aTHX_ io, SvIV(num)<<1);
}
-inline void amf3_format_array(pTHX_ struct io_struct *io, AV * one){
+FREE_INLINE void amf3_format_array(pTHX_ struct io_struct *io, AV * one){
int alen;
int i;
SV ** aitem;
@@ -2133,7 +2151,7 @@ inline void amf3_format_array(pTHX_ struct io_struct *io, AV * one){
}
}
}
-inline void amf3_format_object(pTHX_ struct io_struct *io, SV * rone){
+FREE_INLINE void amf3_format_object(pTHX_ struct io_struct *io, SV * rone){
AV * trait;
SV ** rv_trait;
char *class_name;
@@ -2203,16 +2221,27 @@ inline void amf3_format_object(pTHX_ struct io_struct *io, SV * rone){
io_write_marker(aTHX_ io, STR_EMPTY);
}
-inline void amf3_format_one(pTHX_ struct io_struct *io, SV * one){
+FREE_INLINE void amf3_format_one(pTHX_ struct io_struct *io, SV * one){
+ SV *rv=0;
+ bool is_perl_bool = 0;
if (SvROK(one)){
+ rv = (SV*) SvRV(one);
if ( sv_isobject( one )){
- bool is_perl_bool = 0;
- if ( sv_isa(one, "boolean" )){
- is_perl_bool = 1;
- }
- if ( sv_isa(one, "JSON::XS::Boolean")){
- is_perl_bool = 1;
- }
+ HV* stash = SvSTASH(rv);
+ char *class_name = HvNAME(stash);
+ if ( class_name[0] == 'J' ){
+ if ( sv_isa(one, "JSON::PP::Boolean")){
+ is_perl_bool = 1;
+ }
+ else if ( sv_isa(one, "JSON::XS::Boolean") ){
+ is_perl_bool = 1;
+ }
+ }
+ else if ( class_name[0] == 'b' ){
+ if ( sv_isa(one, "boolean" )){
+ is_perl_bool = 1;
+ }
+ }
if ( is_perl_bool ){
io_write_marker(aTHX_ io, (SvTRUE( SvRV( one )) ? MARKER3_TRUE : MARKER3_FALSE ) );
return ;
@@ -2220,8 +2249,7 @@ inline void amf3_format_one(pTHX_ struct io_struct *io, SV * one){
}
}
- if (SvROK(one)){
- SV * rv = (SV*) SvRV(one);
+ if (rv){
/* test has stored */
SV **OK = hv_fetch(io->hv_object, (char *)(&rv), sizeof (rv), 1);
if (SvOK(*OK)) {
@@ -2238,7 +2266,12 @@ inline void amf3_format_one(pTHX_ struct io_struct *io, SV * one){
amf3_format_reference(aTHX_ io, *OK);
}
else {
- io_register_error(io, ERR_BAD_OBJECT);
+ if ( io->options & OPT_SKIP_BAD ){
+ io_write_marker( aTHX_ io, MARKER3_UNDEF );
+ }
+ else {
+ io_register_error(io, ERR_BAD_OBJECT);
+ }
}
}
else {
@@ -2246,7 +2279,7 @@ inline void amf3_format_one(pTHX_ struct io_struct *io, SV * one){
(void) hv_store(io->hv_object, (char *) (&rv), sizeof (rv), newSViv(io->rc_object), 0);
++io->rc_object;
- if ( io->options && OPT_MAPPER ){
+ if ( io->options & OPT_MAPPER ){
if ( sv_isobject( one ) ){
GV *to_amf = gv_fetchmethod_autoload (SvSTASH (rv), "TO_AMF", 0);
@@ -2285,7 +2318,10 @@ inline void amf3_format_one(pTHX_ struct io_struct *io, SV * one){
amf3_format_date(aTHX_ io, rv );
}
else {
- io_register_error(io, ERR_BAD_OBJECT);
+ if ( io->options & OPT_SKIP_BAD )
+ io_write_marker( aTHX_ io, MARKER3_UNDEF );
+ else
+ io_register_error(io, ERR_BAD_OBJECT);
}
}
}
@@ -2317,7 +2353,10 @@ inline void amf3_format_one(pTHX_ struct io_struct *io, SV * one){
amf3_format_double(aTHX_ io, one);
}
else {
- io_register_error(io, ERR_BAD_OBJECT );
+ if ( io->options & OPT_SKIP_BAD )
+ io_write_marker( aTHX_ io, MARKER3_UNDEF );
+ else
+ io_register_error(io, ERR_BAD_OBJECT );
}
}
else {
@@ -2364,7 +2403,7 @@ parse_sub amf3_parse_subs[] = {
&amf3_parse_bytearray,
};
-inline SV * amf3_parse_one(pTHX_ struct io_struct * io){
+FREE_INLINE SV * amf3_parse_one(pTHX_ struct io_struct * io){
unsigned char marker;
marker = (unsigned char) io_read_marker(io);
@@ -2376,8 +2415,7 @@ inline SV * amf3_parse_one(pTHX_ struct io_struct * io){
return 0; /* Never reach this statement */
}
}
-inline SV* amf0_parse_one_tmp( pTHX_ struct io_struct *io, SV * reuse ){
- char marker;
+FREE_INLINE SV* amf0_parse_one_tmp( pTHX_ struct io_struct *io, SV * reuse ){
SV * RETVALUE;
HV * obj;
@@ -2387,7 +2425,6 @@ inline SV* amf0_parse_one_tmp( pTHX_ struct io_struct *io, SV * reuse ){
int obj_pos;
io_require( io, 1 );
- marker = *(io->pos);
RETVALUE = reuse;
if ( MARKER0_OBJECT != MARKER0_OBJECT || ! SvROK( reuse ) ){
@@ -2409,7 +2446,7 @@ inline SV* amf0_parse_one_tmp( pTHX_ struct io_struct *io, SV * reuse ){
if (len_next == 0) {
char object_end;
object_end= io_read_marker(io);
- if ((object_end == MARKER0_OBJECT_END))
+ if (MARKER0_OBJECT_END == object_end)
{
if (io->options & OPT_STRICT){
SV* RETVALUE = *av_fetch(io->arr_object, obj_pos, 0);
@@ -2449,8 +2486,8 @@ STATIC_INLINE SV * amf0_parse_one(pTHX_ struct io_struct * io){
return io_register_error(io, ERR_MARKER),(SV *)0;
}
}
-inline SV * deep_clone(pTHX_ SV * value);
-inline AV * deep_array(pTHX_ AV* value){
+FREE_INLINE SV * deep_clone(pTHX_ SV * value);
+FREE_INLINE AV * deep_array(pTHX_ AV* value){
AV* copy = (AV*) newAV();
int c_len;
int i;
@@ -2461,7 +2498,7 @@ inline AV * deep_array(pTHX_ AV* value){
return copy;
}
-inline HV * deep_hash(pTHX_ HV* value){
+FREE_INLINE HV * deep_hash(pTHX_ HV* value){
HV * copy = (HV*) newHV();
SV * key_value;
char * key_str;
@@ -2476,11 +2513,11 @@ inline HV * deep_hash(pTHX_ HV* value){
return copy;
}
-inline SV * deep_scalar(pTHX_ SV * value){
+FREE_INLINE SV * deep_scalar(pTHX_ SV * value){
return deep_clone(aTHX_ value);
}
-inline SV * deep_clone(pTHX_ SV * value){
+FREE_INLINE SV * deep_clone(pTHX_ SV * value){
if (SvROK(value)){
SV * rv = (SV*) SvRV(value);
SV * copy;
@@ -2514,7 +2551,7 @@ inline SV * deep_clone(pTHX_ SV * value){
return copy;
}
}
-inline void ref_clear(pTHX_ HV * go_once, SV *sv){
+FREE_INLINE void ref_clear(pTHX_ HV * go_once, SV *sv){
SV *ref_addr;
if (! SvROK(sv))
@@ -2626,7 +2663,7 @@ deparse_amf(SV *data, SV * sv_option = 0)
PROTOTYPE: $;$
ALIAS:
Storable::AMF::deparse_amf=1
- Storable::AMF::deparse_amf0=1
+ Storable::AMF::deparse_amf0=2
INIT:
SV* retvalue;
struct io_struct io[1];
@@ -2776,8 +2813,12 @@ _test_freeze_integer(SV*data)
void
endian()
+ PREINIT:
+ SV * retvalue;
PPCODE:
- PerlIO_printf(PerlIO_stderr(), "%s %x\n", GAX, BYTEORDER);
+ retvalue = newSVpvf("%s %x\n",GAX, BYTEORDER);
+ sv_2mortal(retvalue);
+ XPUSHs(retvalue);
void freeze(SV *data, SV *sv_option = 0 )
PROTOTYPE: $;$
@@ -2949,7 +2990,7 @@ parse_option(char * s, int options=0)
error = 1;
};
if (error)
- croak("Storable::AMF0::parse_option: unknown option '%.*s'", current - word, word);
+ croak("Storable::AMF0::parse_option: unknown option '%.*s'", (int)(current - word), word);
for(; *current && !isALPHA(*current) && *current!='+' && *current!='-'; ++current);
word = current;
@@ -2976,7 +3017,7 @@ total_sv()
SV * svi;
/* fprintf( stderr, "=%p %d\n", sva, SvREFCNT( sva ) ); */
for( svi = sva + 1; svi<svend; ++svi ){
- if ( SvTYPE(svi) != SVTYPEMASK && SvREFCNT(svi) ){
+ if ( (unsigned int)SvTYPE(svi) != SVTYPEMASK && SvREFCNT(svi) ){
/** skip pads, they have a PVAV as their first element inside a PVAV **/
if (SvTYPE(svi) == SVt_PVAV && av_len( (AV*) svi) != -1) {
SV** first = AvARRAY((AV*)svi);
@@ -1,392 +1,410 @@
Revision history for Perl extension Storable::AMF.
-0.01 Mon Aug 25 13:04:31 2008
- - original version; created by h2xs 1.23 with options
- -A -n Data::AMF::XS
+1.05 2015-02-14
+ - Fixed FreeBSD compiling issues
-0.0200 ( 404) 2008-09-01 13:25:47 +0400
- - blessed referenses added
+1.04 2015-02-11:
+ - Pod fixes thanks to github kdk (2015-02-11)
+ - Changes (2015-02-11)
+ - JSON::XS, Types::Serializer fixes (2015-01-14)
-0.0200 ( 405) 2008-09-01 15:21:37 +0400
- - added documentation
- - some error handling
+1.03 2014-12-25
+ - skip_bad_option (512) for (saving subs as undefs )(2014-12-25)
+ - Fix Ubuntu compiling (CCFLAG is problem)
+ - Apple compiling issue (Thanks to Alberto)
-0.0200 ( 452) 2008-09-04 12:18:11 +0400
- - add warnings && some code improvement && use setjmp
- - speed up dclone for 20% gain
- - add prototypes
+1.02 2014-06-24
+ - fixed test stability over perl above 5.19.1
+ - remove gcc warnings
-0.0200 ( 487) 2008-09-26 18:30:43 +0400
- - Minor error fixes
+1.01 2011-08-19
+ - remove development notice
+ - some fix in documentaion
-0.0200 ( 523) 2008-10-08 11:11:48 +0400
- - fixed error with null array element
- - added support for self referenses structures
+1.00 2011-06-10
+ - speed improvement
+ - major perl version fixes ( compile for 5.10-5.14 )
-0.0200 ( 528) 2008-10-09 13:15:56 +0400
- - fixed ecma_array
- - Create lots of real data tests 08(real-data)
- - Add unicode support
+0.99 2011-06-03
+ - thaw0_sv for utilizing hashref
+ - small speed improvement (ecma_array)
+ - small fix of logic
-0.0200 ( 533) 2008-10-10 13:34:13 +0400
- - begin work for AMF3
- - amf3 numbers worked
- - added strings for amf3
- - added tests for AMF3 and improve Storable::AMF3 (array && objects)
+0.98 2011-06-03
+ - added amf_tmp_storage for thaw()
+ - New function aliases: deparse_amf0, deparse_amf3
+ - make work amf_tmp_storage for freeze
-0.1200 ( 540) 2008-10-16 13:55:15 +0400
- - Tested for memory leak (mainly AMF0 and some AMF3)
- - Uploaded to cpan
- - find bug report
+0.97 2011-04-06
+ - changed memtest code from Devel::Gladiator
+ - put forgotted PUTBACK
-0.1400 ( 581) 2008-11-07 11:25:31 +0300
- - improved docs
- - deleted unused filex
- - improved doc and tests
- - remove UTF8 support
+0.96 20011-04-03
+ - better freeze integer ( added test for boundary conditions )
+ - added examples
+ - added use TARG ( about 25% speed improvement for freeze )
+ - added bench for TARG usage
-0.1500 ( 593) 2008-11-12 15:13:44 +0300
- - fixed typos (date->data)
- - add support of bigendian machines
+0.95 2011-04-09
+ - examples change
+ - fix possible memleak with (amf_plus_marker)
+ - fix possible memleak in thaw/deparse_amf AMF3
+ - more correct creation temp structures
+ - limit for array size when array extend
+ - fix amf3_read_integer for big integers ( crazy typo )
+ - fix amf3_write_integer for boundary conditions
+ - added more tests for amf3 integer convertion t/08-amf3_integer.t
+ - uncomment memleak for amf3
-0.1500 ( 599) 2008-11-13 13:28:37 +0300
- - implements parse bytearray, xml-doc, xml, date. Added more descriptive error codes
- - Added TODO section
+0.94 2011-02-28 --- 2011-04-08
+ - Extend boolean test
+ - fix routine io_write_u8
+ - fix amf0 boolean format
+ - added cope of amf-plus-marker
+ - Rewrite of error reporting
+ - ( Dev remove &io_record )
-0.1502 ( 603) 2008-11-14 13:28:37 +0300
- - Remove Strange bug for BigEndian machine
- - Fixed int (I32) declaration for hv_iternextsv
- - Upgrade ExtUtils::MakeMaker to 6.48
- - remove warnings: empty declaration
+0.93 2011-02-17
+ - New tests for roundtrip JSON::XS:Boolean and AMF::boolean
+ - Fixed convertion from AMF::boolean -> JSON::XS::boolean
+ - Test typo fix. Extend boolean tests
+ - Added prefix for all amf0 functions
+ - Added test for bigendian boolean ( darwin + IRIX )
-0.1503 ( 605) 2008-11-15 11:53:53 +0300
- - Fixed read/write integer for BIGENDIAN machine
+0.92 2011-01-24
+ - added experimental TO_AMF support for AMF3 freeze
-0.1600 ( 608) 2008-11-15 16:39:32 +0300
- - Improved MakeFile. Some compile error for Solaris eliminated.
+0.91 2011-01-24
+ - added more real tests for boolean support
+ - added experimental TO_AMF support for AMF0 freeze
-0.1700 ( 611) 2008-11-17 13:25:30 +0300
- - fixed read_u* and read_s16 for big_endian machines
+0.90 2011-01-24
+ - fixed typo in boolean
+ - added more test
+ - remove dependeces in JSON::XS
-0.1701 ( 613) 2008-11-17 14:31:00 +0300
- - Add Perl Licence. Add marker comments
+0.89 2011-01-20
+ - boolean support ( JSON::XS and boolean type )
+ - new option ( 'json_boolean' )
+ - thaw( AMF0_FALSE ) now is '' before it was 0
+ - thaw( AMF3_FALSE ) now is '' before it was 0
-0.1800 ( 615) 2008-11-18 10:39:57 +0300
- - Fixed stupid typo( NetBSD ).
+0.86 2010-10-26 23:45 +0400
+ - prefer number option added (experimental)
-0.1900 ( 627) 2008-11-21 14:04:41 +0300
- - Patch for Solaris 2.10 compile bug
- - Fixed implicit convertion strings to numbers in some cases
- - Improved Makefile.PL
+0.85 2010-10-25 23:40 +0400
+ - try please automated tests
-0.2000 ( 634) 2008-11-24 17:32:35 +0300
- - added lots tests for date. more date. more references.(AMF0).
- - Some algoritms fixed for date
+0.84 2010-10-24 23:50 +0400
+ - added parse_serializator_option
+ - added option "millisecond_date"
+ - revealed option "utf8_decode"
+ - revealed option "utf8_encode" (does nothing)
+ - revealed option "raise_error"
+ - revealed option "strict"
+ - added tests for 'parse_serializator_option'
+ - switched to perlish date
+ - test for "utf8_decode", "millisecond_date"
+ - remove all "skipped utf8 tests"
-0.2100 ( 644) 2008-11-25 17:22:07 +0300
- - Added XMLDocument type parse(amf0)
- - Added freeze long string. More tests
+0.83 2010-10-24 02:25 +0400
+ - Added tests -basic externalized
+ - Added basic externalized test
+ - rewrite test suit for (adding dumps)
+ - fix typo in memtest amf3
-0.2200 ( 694) 2008-12-05 12:45:20 +0300
- - blessed references mod to undef
- - added more error messages.
- - Added tests for AMF3.
- - Fixed thaw_amf3 for array.
- - Fixed test for AMF3 XML
+0.78 2010-10-15 11:31 +0400
+ - Strawberry Perl (PERL_IMPLICIT_SYS make not compile Sigsetjmp) # undefine
+0.79 2010-10-20 15:31 +0400
+ - Date support for AMF0, AMF3 dates
+ - through perl_date, new_date
+0.80 2010-10-20 15:31 +0400
+ - rename new_date to new_amfdate
+ - perl_date add type check
+ - some source refactor
+ - add smoke tests for dates
+ - Version check
+0.81 2010-10-22 11:25 +0400
+ - Fix Build.PL
+ - Some regret for CPAN index problems
+ - Change some constant for buffer allocation.
+ - Convience hacks.
+0.82 2010-10-23 02:25 +0400
+ - test added and a little rewrite
+ - fix with date sigfault in 0.80(found in test)
-0.2300 ( 704) 2008-12-08 11:54:41 +0300
- - Fixed bug behavior for freeze.
- - Added tests for blessed or not CODEREF, etc.
+0.77 2010-10-12 11:31 +0400
+ - Next try compile for Strawberry Perl (replace jmp_buf, setjmp, longjmp for Sigjmp_buf, Sigsetjmp, Siglongjmp)
-0.2400 ( 706) 2008-12-08 14:25:38 +0300
- - Add negative tests for trimed and extra bytes in stream (thaw). Bug with successfully parses was fixed.
+0.76 2010-10-07 11:00 +0400
+ - Fix for MS cl.exe && gcc distribution for WIN32 build
-0.2600 ( 718) 2008-12-09 17:57:51 +0300
- - added Carp for store, nstore, etc.
+0.75 2010-10-06 16:33 +0400
+ - Makefile rewrite add warnings -Wunused -Wuninitialized
-0.2700 ( 746) 2008-12-12 18:56:23 +0300
- - added aux function: ref_destroy ref_lost_memory for AMF0
+0.74 2010-10-06 16:33 +0400
+ - Typos in Some compilers fix ( STATIC_INLINE ) don't like inline
-0.2800 ( 749) 2008-12-13 18:10:47 +0300
- - Solaris: delete optimize for Solaris
+0.73 2010-10-06 16:33 +0400
+ - Some compilers fix ( STATIC_INLINE ) don't like inline
+ - Copyright fix
+ - Docs && Abstract fix
-0.2900 ( 788) 2008-12-18 12:44:07 +0300
- - fprintf moved to PerlIO abstraction layer
- - added documentation for ref_lost_memory ref_destroy.
- - some fixes to documentation
-0.3000 ( 797) 2008-12-18 15:09:08 +0300
- - remove magic marker numbers.
- - change error handle: set setting error number and description
- - checks for error reporting. test cleanup
+0.72 ( ) 2010-10-03 23:25:02 +0400
+ - Code cleanup( remove some warnings )
-0.3100 ( 843) 2008-12-26 12:11:33 +0300
- - Added dualvar behave. Document Regexp, io, error reporting
+0.71 ( ) 2010-09-07 14:02:02 +0400
+ - Basic external object parsing
-0.3200 ( 848) 2008-12-26 15:14:23 +0300
- - First port to MSWin32
+0.70 ( ) 2010-09-07 14:02:02 +0400
+ - improve retrive && store for speed ( for win32 specialy )
-0.3300 ( 857) 2008-12-27 17:10:34 +0300
- - add memory leak test for positive AMF0
- - add memory leak test for positive AMF3
- - REF and SCALAR option added to test
+0.6600 ( 1904) 2009-08-27 01:10:02 +0400
+ - Some fixes ???
-0.3400 ( 860) 2008-12-28 20:29:19 +0300
- - add io_destroy memleak test for AMF0, AMF3
- - add memory leak test for negative AMF0
+0.6400 ( 1904) 2009-08-27 01:10:02 +0400
+ - bug in thaw for empty string
-0.3500 ( 861) 2008-12-29 11:13:25 +0300
- - fixed memory leak positive AMF3
- - add memory leak test for negative AMF3
+0.6300 ( 1766) 2009-04-10 14:48:01 +0400
+ - change croaking for file operation
+ - perltidy
+ - function deparse_amf
+ - added deparse test for amf0
+ - deparse for AMF0 && AMF3
+ - added parse_amf
-0.3600 ( 863) 2008-12-29 14:18:27 +0300
- - fixed memory leak negative for AMF3
- - replace direct long_jmp with io_register_error
+0.6100 ( 1447) 2009-03-31 17:25:10 +0400
+ - add proto for store and etc .. add test for these functions
-0.3700 ( 865) 2008-12-29 14:48:04 +0300
- - improve memleak tests
+0.6000 ( 1445) 2009-03-31 16:31:28 +0400
+ - allowed freeze of ref ( REF and SCALAR )
-0.3800 ( 870) 2008-12-29 16:18:57 +0300
- - some fixes for port MSWin32
- - fix some warns. Increase compiler warn.
+0.6000 ( 1444) 2009-03-31 14:35:42 +0400
+ - tidy
-0.3900 ( 876) 2008-12-30 11:28:29 +0300
- - fix warnings
- - remove stupid say from test
- - comment out SVt_string for 5.11.0
+0.5800 ( 1418) 2009-03-24 16:17:19 +0300
+ - Fix BYTEORDER
-0.4000 ( 882) 2009-01-10 18:03:20 +0300
- - Now can handle magical strings in thawing
+0.5700 ( 1414) 2009-03-20 18:55:44 +0300
+ - Make work on windows
+ - fix for Win32 build for broken Module::Build
-0.4100 ( 884) 2009-01-10 18:03:20 +0300
- - fix IV to UV for some strict compilers
+0.5600 ( 1411) 2009-03-20 16:35:19 +0300
+ - Cleanup code
-0.4200 ( 999) 2009-01-22 14:45:31 +0300
- - fixed typos in IV to UV for Solaris (again)
- - dublicated test remove
- - fix test never worked
- - reorganize tests (move rename etc)
- - added all files (amf0 amf3 xml eval) in one pack
-0.4300 ( 999) 2009-01-22 14:45:31 +0300
- - fixed stupid typo
+0.5500 ( 1354) 2009-03-12 15:59:44 +0300
+ - Port to Straberry perl 5.10
-0.4400 ( 1033) 2009-01-26 18:53:38 +0300
- - amf3_format_integer: refactor
- - rename read_* , write_* to io_*
- - some fix in store
+0.5400 ( 1306) 2009-02-25 18:57:17 +0300
+ - added UTF8_DECODE, UTF8_ENCODE, STRICT, ERROR_RAISE
+ - added test pod
-0.4500 ( 1038) 2009-01-27 16:36:07 +0300
- - Added resolve bug for Flash 9.0
- - fix in documentation.
- - store and retrieve
+0.5300 ( 1243) 2009-02-15 13:41:29 +0300
+ - fixed build reqs for Build.PL
+ - fix some tests
+ - Fixed some memleak for strict mode. added test
+ - rename ref_destroy to ref_clean
+ - some fixes for opts
-0.4600 ( 1049) 2009-01-28 12:29:00 +0300
- - back_port to 5.8.8
- - Find stupid bug AMF3 add test
+0.5200 ( 1159) 2009-02-06 12:21:15 +0300
+ - croaking on thaw(bytearray_array) then bytearray is UTF8_on string
+ - added Build.PL
-0.4700 ( 1097) 2009-01-30 19:14:39 +0300
- - Added strict pragma. thaw bug fix
+0.5100 ( 1138) 2009-02-04 18:24:16 +0300
+ - add feature strict to amf3
+
+0.5000 ( 1134) 2009-02-04 16:54:15 +0300
+ - new tests for flash 9.0 bug. and fixes
+
+0.4900 ( 1103) 2009-02-02 13:18:42 +0300
+ - fix objects bugs in AMF3
0.4800 ( 1100) 2009-02-02 11:08:10 +0300
- fix file_read_bug. (Win32 test bug)
- added test for thaw(undef)
-0.4900 ( 1103) 2009-02-02 13:18:42 +0300
- - fix objects bugs in AMF3
+0.4700 ( 1097) 2009-01-30 19:14:39 +0300
+ - Added strict pragma. thaw bug fix
-0.5000 ( 1134) 2009-02-04 16:54:15 +0300
- - new tests for flash 9.0 bug. and fixes
+0.4600 ( 1049) 2009-01-28 12:29:00 +0300
+ - back_port to 5.8.8
+ - Find stupid bug AMF3 add test
-0.5100 ( 1138) 2009-02-04 18:24:16 +0300
- - add feature strict to amf3
+0.4500 ( 1038) 2009-01-27 16:36:07 +0300
+ - Added resolve bug for Flash 9.0
+ - fix in documentation.
+ - store and retrieve
-0.5200 ( 1159) 2009-02-06 12:21:15 +0300
- - croaking on thaw(bytearray_array) then bytearray is UTF8_on string
- - added Build.PL
+0.4400 ( 1033) 2009-01-26 18:53:38 +0300
+ - amf3_format_integer: refactor
+ - rename read_* , write_* to io_*
+ - some fix in store
-0.5300 ( 1243) 2009-02-15 13:41:29 +0300
- - fixed build reqs for Build.PL
- - fix some tests
- - Fixed some memleak for strict mode. added test
- - rename ref_destroy to ref_clean
- - some fixes for opts
+0.4200 ( 999) 2009-01-22 14:45:31 +0300
+ - fixed typos in IV to UV for Solaris (again)
+ - dublicated test remove
+ - fix test never worked
+ - reorganize tests (move rename etc)
+ - added all files (amf0 amf3 xml eval) in one pack
+0.4300 ( 999) 2009-01-22 14:45:31 +0300
+ - fixed stupid typo
-0.5400 ( 1306) 2009-02-25 18:57:17 +0300
- - added UTF8_DECODE, UTF8_ENCODE, STRICT, ERROR_RAISE
- - added test pod
+0.4100 ( 884) 2009-01-10 18:03:20 +0300
+ - fix IV to UV for some strict compilers
-0.5500 ( 1354) 2009-03-12 15:59:44 +0300
- - Port to Straberry perl 5.10
+0.4000 ( 882) 2009-01-10 18:03:20 +0300
+ - Now can handle magical strings in thawing
-0.5600 ( 1411) 2009-03-20 16:35:19 +0300
- - Cleanup code
+0.3900 ( 876) 2008-12-30 11:28:29 +0300
+ - fix warnings
+ - remove stupid say from test
+ - comment out SVt_string for 5.11.0
-0.5700 ( 1414) 2009-03-20 18:55:44 +0300
- - Make work on windows
- - fix for Win32 build for broken Module::Build
+0.3800 ( 870) 2008-12-29 16:18:57 +0300
+ - some fixes for port MSWin32
+ - fix some warns. Increase compiler warn.
-0.5800 ( 1418) 2009-03-24 16:17:19 +0300
- - Fix BYTEORDER
+0.3700 ( 865) 2008-12-29 14:48:04 +0300
+ - improve memleak tests
-0.6000 ( 1444) 2009-03-31 14:35:42 +0400
- - tidy
+0.3600 ( 863) 2008-12-29 14:18:27 +0300
+ - fixed memory leak negative for AMF3
+ - replace direct long_jmp with io_register_error
-0.6000 ( 1445) 2009-03-31 16:31:28 +0400
- - allowed freeze of ref ( REF and SCALAR )
+0.3500 ( 861) 2008-12-29 11:13:25 +0300
+ - fixed memory leak positive AMF3
+ - add memory leak test for negative AMF3
-0.6100 ( 1447) 2009-03-31 17:25:10 +0400
- - add proto for store and etc .. add test for these functions
+0.3400 ( 860) 2008-12-28 20:29:19 +0300
+ - add io_destroy memleak test for AMF0, AMF3
+ - add memory leak test for negative AMF0
-0.6300 ( 1766) 2009-04-10 14:48:01 +0400
- - change croaking for file operation
- - perltidy
- - function deparse_amf
- - added deparse test for amf0
- - deparse for AMF0 && AMF3
- - added parse_amf
+0.3300 ( 857) 2008-12-27 17:10:34 +0300
+ - add memory leak test for positive AMF0
+ - add memory leak test for positive AMF3
+ - REF and SCALAR option added to test
-0.6400 ( 1904) 2009-08-27 01:10:02 +0400
- - bug in thaw for empty string
-
-0.6600 ( 1904) 2009-08-27 01:10:02 +0400
- - Some fixes ???
+0.3200 ( 848) 2008-12-26 15:14:23 +0300
+ - First port to MSWin32
-0.70 ( ) 2010-09-07 14:02:02 +0400
- - improve retrive && store for speed ( for win32 specialy )
+0.3100 ( 843) 2008-12-26 12:11:33 +0300
+ - Added dualvar behave. Document Regexp, io, error reporting
-0.71 ( ) 2010-09-07 14:02:02 +0400
- - Basic external object parsing
+0.2900 ( 788) 2008-12-18 12:44:07 +0300
+ - fprintf moved to PerlIO abstraction layer
+ - added documentation for ref_lost_memory ref_destroy.
+ - some fixes to documentation
+0.3000 ( 797) 2008-12-18 15:09:08 +0300
+ - remove magic marker numbers.
+ - change error handle: set setting error number and description
+ - checks for error reporting. test cleanup
-0.72 ( ) 2010-10-03 23:25:02 +0400
- - Code cleanup( remove some warnings )
+0.2800 ( 749) 2008-12-13 18:10:47 +0300
+ - Solaris: delete optimize for Solaris
-0.73 2010-10-06 16:33 +0400
- - Some compilers fix ( STATIC_INLINE ) don't like inline
- - Copyright fix
- - Docs && Abstract fix
+0.2700 ( 746) 2008-12-12 18:56:23 +0300
+ - added aux function: ref_destroy ref_lost_memory for AMF0
-0.74 2010-10-06 16:33 +0400
- - Typos in Some compilers fix ( STATIC_INLINE ) don't like inline
+0.2600 ( 718) 2008-12-09 17:57:51 +0300
+ - added Carp for store, nstore, etc.
-0.75 2010-10-06 16:33 +0400
- - Makefile rewrite add warnings -Wunused -Wuninitialized
+0.2400 ( 706) 2008-12-08 14:25:38 +0300
+ - Add negative tests for trimed and extra bytes in stream (thaw). Bug with successfully parses was fixed.
-0.76 2010-10-07 11:00 +0400
- - Fix for MS cl.exe && gcc distribution for WIN32 build
+0.2300 ( 704) 2008-12-08 11:54:41 +0300
+ - Fixed bug behavior for freeze.
+ - Added tests for blessed or not CODEREF, etc.
-0.77 2010-10-12 11:31 +0400
- - Next try compile for Strawberry Perl (replace jmp_buf, setjmp, longjmp for Sigjmp_buf, Sigsetjmp, Siglongjmp)
+0.2200 ( 694) 2008-12-05 12:45:20 +0300
+ - blessed references mod to undef
+ - added more error messages.
+ - Added tests for AMF3.
+ - Fixed thaw_amf3 for array.
+ - Fixed test for AMF3 XML
-0.78 2010-10-15 11:31 +0400
- - Strawberry Perl (PERL_IMPLICIT_SYS make not compile Sigsetjmp) # undefine
-0.79 2010-10-20 15:31 +0400
- - Date support for AMF0, AMF3 dates
- - through perl_date, new_date
-0.80 2010-10-20 15:31 +0400
- - rename new_date to new_amfdate
- - perl_date add type check
- - some source refactor
- - add smoke tests for dates
- - Version check
-0.81 2010-10-22 11:25 +0400
- - Fix Build.PL
- - Some regret for CPAN index problems
- - Change some constant for buffer allocation.
- - Convience hacks.
-0.82 2010-10-23 02:25 +0400
- - test added and a little rewrite
- - fix with date sigfault in 0.80(found in test)
+0.2100 ( 644) 2008-11-25 17:22:07 +0300
+ - Added XMLDocument type parse(amf0)
+ - Added freeze long string. More tests
-0.83 2010-10-24 02:25 +0400
- - Added tests -basic externalized
- - Added basic externalized test
- - rewrite test suit for (adding dumps)
- - fix typo in memtest amf3
+0.2000 ( 634) 2008-11-24 17:32:35 +0300
+ - added lots tests for date. more date. more references.(AMF0).
+ - Some algoritms fixed for date
-0.84 2010-10-24 23:50 +0400
- - added parse_serializator_option
- - added option "millisecond_date"
- - revealed option "utf8_decode"
- - revealed option "utf8_encode" (does nothing)
- - revealed option "raise_error"
- - revealed option "strict"
- - added tests for 'parse_serializator_option'
- - switched to perlish date
- - test for "utf8_decode", "millisecond_date"
- - remove all "skipped utf8 tests"
+0.1900 ( 627) 2008-11-21 14:04:41 +0300
+ - Patch for Solaris 2.10 compile bug
+ - Fixed implicit convertion strings to numbers in some cases
+ - Improved Makefile.PL
-0.85 2010-10-25 23:40 +0400
- - try please automated tests
+0.1800 ( 615) 2008-11-18 10:39:57 +0300
+ - Fixed stupid typo( NetBSD ).
-0.86 2010-10-26 23:45 +0400
- - prefer number option added (experimental)
+0.1701 ( 613) 2008-11-17 14:31:00 +0300
+ - Add Perl Licence. Add marker comments
-0.89 2011-01-20
- - boolean support ( JSON::XS and boolean type )
- - new option ( 'json_boolean' )
- - thaw( AMF0_FALSE ) now is '' before it was 0
- - thaw( AMF3_FALSE ) now is '' before it was 0
+0.1700 ( 611) 2008-11-17 13:25:30 +0300
+ - fixed read_u* and read_s16 for big_endian machines
-0.90 2011-01-24
- - fixed typo in boolean
- - added more test
- - remove dependeces in JSON::XS
+0.1600 ( 608) 2008-11-15 16:39:32 +0300
+ - Improved MakeFile. Some compile error for Solaris eliminated.
-0.91 2011-01-24
- - added more real tests for boolean support
- - added experimental TO_AMF support for AMF0 freeze
+0.1503 ( 605) 2008-11-15 11:53:53 +0300
+ - Fixed read/write integer for BIGENDIAN machine
-0.92 2011-01-24
- - added experimental TO_AMF support for AMF3 freeze
+0.1502 ( 603) 2008-11-14 13:28:37 +0300
+ - Remove Strange bug for BigEndian machine
+ - Fixed int (I32) declaration for hv_iternextsv
+ - Upgrade ExtUtils::MakeMaker to 6.48
+ - remove warnings: empty declaration
-0.93 2011-02-17
- - New tests for roundtrip JSON::XS:Boolean and AMF::boolean
- - Fixed convertion from AMF::boolean -> JSON::XS::boolean
- - Test typo fix. Extend boolean tests
- - Added prefix for all amf0 functions
- - Added test for bigendian boolean ( darwin + IRIX )
-
-
-0.94 2011-02-28 --- 2011-04-08
- - Extend boolean test
- - fix routine io_write_u8
- - fix amf0 boolean format
- - added cope of amf-plus-marker
- - Rewrite of error reporting
- - ( Dev remove &io_record )
+0.1500 ( 599) 2008-11-13 13:28:37 +0300
+ - implements parse bytearray, xml-doc, xml, date. Added more descriptive error codes
+ - Added TODO section
-0.95 2011-04-09
- - examples change
- - fix possible memleak with (amf_plus_marker)
- - fix possible memleak in thaw/deparse_amf AMF3
- - more correct creation temp structures
- - limit for array size when array extend
- - fix amf3_read_integer for big integers ( crazy typo )
- - fix amf3_write_integer for boundary conditions
- - added more tests for amf3 integer convertion t/08-amf3_integer.t
- - uncomment memleak for amf3
+0.1500 ( 593) 2008-11-12 15:13:44 +0300
+ - fixed typos (date->data)
+ - add support of bigendian machines
-0.96 20011-04-03
- - better freeze integer ( added test for boundary conditions )
- - added examples
- - added use TARG ( about 25% speed improvement for freeze )
- - added bench for TARG usage
-
-0.97 2011-04-06
- - changed memtest code from Devel::Gladiator
- - put forgotted PUTBACK
+0.1400 ( 581) 2008-11-07 11:25:31 +0300
+ - improved docs
+ - deleted unused filex
+ - improved doc and tests
+ - remove UTF8 support
-0.98 2011-06-03
- - added amf_tmp_storage for thaw()
- - New function aliases: deparse_amf0, deparse_amf3
- - make work amf_tmp_storage for freeze
+0.1200 ( 540) 2008-10-16 13:55:15 +0400
+ - Tested for memory leak (mainly AMF0 and some AMF3)
+ - Uploaded to cpan
+ - find bug report
+0.0200 ( 533) 2008-10-10 13:34:13 +0400
+ - begin work for AMF3
+ - amf3 numbers worked
+ - added strings for amf3
+ - added tests for AMF3 and improve Storable::AMF3 (array && objects)
-0.99 2011-06-03
- - thaw0_sv for utilizing hashref
- - small speed improvement (ecma_array)
- - small fix of logic
+0.0200 ( 528) 2008-10-09 13:15:56 +0400
+ - fixed ecma_array
+ - Create lots of real data tests 08(real-data)
+ - Add unicode support
-1.00 2011-06-10
- - speed improvement
- - major perl version fixes ( compile for 5.10-5.14 )
+0.0200 ( 523) 2008-10-08 11:11:48 +0400
+ - fixed error with null array element
+ - added support for self referenses structures
+
+0.0200 ( 487) 2008-09-26 18:30:43 +0400
+ - Minor error fixes
+
+0.0200 ( 452) 2008-09-04 12:18:11 +0400
+ - add warnings && some code improvement && use setjmp
+ - speed up dclone for 20% gain
+ - add prototypes
+0.0200 ( 405) 2008-09-01 15:21:37 +0400
+ - added documentation
+ - some error handling
+
+0.0200 ( 404) 2008-09-01 13:25:47 +0400
+ - blessed referenses added
+
+0.01 Mon Aug 25 13:04:31 2008
+ - original version; created by h2xs 1.23 with options
+ -A -n Data::AMF::XS
@@ -164,3 +164,4 @@ examples/packets/amf_packet3
examples/packets/amf_packet4
examples/packets/failed_chunk
examples/packets/input
+META.json Module JSON meta-data (added by MakeMaker)
@@ -0,0 +1,54 @@
+{
+ "abstract" : "serializing/deserializing AMF0/AMF3 data",
+ "author" : [
+ "Grishaev Anatoliy <grian@cpan.org>"
+ ],
+ "dynamic_config" : 1,
+ "generated_by" : "ExtUtils::MakeMaker version 6.68, CPAN::Meta::Converter version 2.112621",
+ "license" : [
+ "perl_5"
+ ],
+ "meta-spec" : {
+ "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+ "version" : "2"
+ },
+ "name" : "Storable-AMF",
+ "no_index" : {
+ "directory" : [
+ "t",
+ "inc"
+ ]
+ },
+ "prereqs" : {
+ "build" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : 0
+ }
+ },
+ "configure" : {
+ "requires" : {
+ "ExtUtils::MakeMaker" : 0
+ }
+ },
+ "runtime" : {
+ "requires" : {
+ "XSLoader" : "0.06",
+ "perl" : "5.008001"
+ }
+ }
+ },
+ "release_status" : "stable",
+ "resources" : {
+ "bugtracker" : {
+ "web" : "http://rt.cpan.org/NoAuth/Bugs.html?Dist=Storable-AMF"
+ },
+ "homepage" : "http://search.cpan.org/dist/Storable-AMF",
+ "license" : [
+ "http://dev.perl.org/licenses/"
+ ],
+ "repository" : {
+ "url" : "git://github.com/Grian/Storable-AMF.git"
+ }
+ },
+ "version" : "1.05"
+}
@@ -1,28 +1,28 @@
---- #YAML:1.0
-name: Storable-AMF
-version: 1.00
-abstract: serializing/deserializing AMF0/AMF3 data
+---
+abstract: 'serializing/deserializing AMF0/AMF3 data'
author:
- - Grishaev Anatoliy <grian@cpan.org>
-license: perl
-distribution_type: module
-configure_requires:
- ExtUtils::MakeMaker: 0
+ - 'Grishaev Anatoliy <grian@cpan.org>'
build_requires:
- ExtUtils::MakeMaker: 0
+ ExtUtils::MakeMaker: 0
+configure_requires:
+ ExtUtils::MakeMaker: 0
+dynamic_config: 1
+generated_by: 'ExtUtils::MakeMaker version 6.68, CPAN::Meta::Converter version 2.112621'
+license: perl
+meta-spec:
+ url: http://module-build.sourceforge.net/META-spec-v1.4.html
+ version: 1.4
+name: Storable-AMF
+no_index:
+ directory:
+ - t
+ - inc
requires:
- perl: 5.008001
- XSLoader: 0.06
+ XSLoader: 0.06
+ perl: 5.008001
resources:
- bugtracker: http://rt.cpan.org/NoAuth/Bugs.html?Dist=Storable-AMF
- homepage: http://search.cpan.org/dist/Storable-AMF
- license: http://dev.perl.org/licenses/
- repository: git://github.com/Grian/Storable-AMF.git
-no_index:
- directory:
- - t
- - inc
-generated_by: ExtUtils::MakeMaker version 6.55_02
-meta-spec:
- url: http://module-build.sourceforge.net/META-spec-v1.4.html
- version: 1.4
+ bugtracker: http://rt.cpan.org/NoAuth/Bugs.html?Dist=Storable-AMF
+ homepage: http://search.cpan.org/dist/Storable-AMF
+ license: http://dev.perl.org/licenses/
+ repository: git://github.com/Grian/Storable-AMF.git
+version: 1.05
@@ -43,20 +43,20 @@ our %MyModule = (
OPTIMIZE => "-O3 -pipe -fomit-frame-pointer ",
);
-delete $MyModule{OPTIMIZE}
- if ( $Config{osname} =~ /solaris/
- or $Config{cc} eq 'cl' );
+if ( $Config{osname} =~ /solaris/ or $Config{cc} eq 'cl' ){
+ delete $MyModule{OPTIMIZE}
+};
if ( $Config{cc} eq 'gcc' || $Config{gccversion}) {
- if ($Config{osname}!~m/Win32/i ){
- for ( $MyModule{CCFLAGS} ){
- $_ .= ' -Wunused';
- $_ .= ' -Wuninitialized';
- $_ .= ' -Wall';
- #$_ .= ' -Wunreachable-code';
- #$_ .= ' -Wunsafe-loop-optimizations';
- };
- }
- #$MyModule{CCFLAGS} = '-Wunused-variable -Wunused-label -Wunused-function -Wuninitialized -Wunused-value'
+ if (0 && $Config{osname}!~m/Win32/i ){
+ for ($MyModule{CCFLAGS} ){
+ $_ .= ' -Wunused';
+ $_ .= ' -Wuninitialized';
+ $_ .= ' -Wall';
+ #$_ .= ' -Wunreachable-code';
+ #$_ .= ' -Wunsafe-loop-optimizations';
+ };
+ }
+ #$MyModule{CCFLAGS} = '-Wunused-variable -Wunused-label -Wunused-function -Wuninitialized -Wunused-value'
}
WriteMakefile(%MyModule);
@@ -3,3 +3,7 @@
- Improve testleak for strings
- add documentation for boolean, basic externalized objects, boolean_json
- memleak for amf_tmp_storage
+ - optimize amf?_format_one, more boolean
+ - remove C90 warnings
+ - reformat Changes
+
@@ -33,6 +33,10 @@ sub new{
}
return $option_int;
}
+
+1;
+__END__
+
=head1 SYNOPSYS
use Storable::AMF::Mapper;
@@ -50,15 +54,6 @@ sub new{
my $obj = thaw( $amf0 ); # $obj = { Zeta=> , some_key_to_be_added => "Key Value" }
-
-=cut
-
=head1 NOTICE
-
- This Mapper is experimental feature of Storable::AMF distro. So may change in future ...
-=cut
-
-
-
-1;
+ This Mapper is experimental feature of Storable::AMF distro. So may change in future ...
@@ -3,7 +3,7 @@ use strict;
use warnings;
BEGIN{
our $VERSION;
- $VERSION='1.00' unless $INC{'Storable/AMF0.pm'};
+ $VERSION='1.05' unless $INC{'Storable/AMF0.pm'};
}
use Storable::AMF0; # install and create all methods
use Exporter 'import';
@@ -109,7 +109,6 @@ Storable::AMF - serializing/deserializing AMF0/AMF3 data
$bytea = Storable::AMF3::freeze( ... );
...
-=cut
=head1 DESCRIPTION
@@ -117,22 +116,17 @@ This module is (de)serializer for Adobe's AMF0/AMF3 (Action Message Format ver 0
To deserialize AMF3 objects you can export function from Storable::AMF3 package
Almost all function implemented in XS/C for speed, except file operation.
-=cut
=head1 MOTIVATION
Speed, simplicity and agile.
-=cut
=head1 BENCHMARKS
About 50-60 times faster than Data::AMF pure perl module. (2009)
About 40% faster than Storable in big objects. (2009)
About 6 times faster than Storable for small object (2009)
-=cut
-
=head1 FUNCTIONS
-=cut
=over
@@ -155,7 +149,7 @@ Speed, simplicity and agile.
=item $perl_time = perl_date( $date_member )
Converts value from AMF date to perl timestampr, can croak.
-
+
=item store $obj, $file
--- Store serialized AMF0 data to file
@@ -184,27 +178,22 @@ Speed, simplicity and agile.
--- test if object contain lost memory fragments inside.
(Example do { my $a = []; @$a=$a; $a})
-=item parse_serializator_option
-=item parse_option
+=item parse_serializator_option / parse_option
generate option scalar for freeze/thaw/deparse_amf
See L<Storable::AMF0> for complete list of options
=back
=head1 EXPORT
-
- None by default.
-
-=cut
+ None by default.
=head1 LIMITATION
At current moment and with restriction of AMF0/AMF3 format referrences to scalar are not serialized,
and can't/ may not serialize tied variables.
And dualvars (See Scalar::Util) are serialized as string value.
-Freezing CODEREF, IO, Regexp, REF, GLOB, SCALAR referenses restricted.
-
+Freezing CODEREF, IO, Regexp, GLOB referenses are restricted.
=head1 SEE ALSO
@@ -226,4 +215,3 @@ Copyright (C) 2011 by A. G. Grishaev
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.8 or,
at your option, any later version of Perl 5 you may have available.
-=cut
@@ -2,7 +2,7 @@ package Storable::AMF0;
use strict;
use warnings;
use Fcntl qw(:flock);
-our $VERSION = '1.00';
+our $VERSION = '1.05';
use subs qw(freeze thaw);
use Scalar::Util qw(refaddr reftype); # for ref_circled
use Exporter 'import';
@@ -137,7 +137,6 @@ sub ref_lost_memory($) {
1;
__END__
-# Below is stub documentation for your module. You'd better edit it!
=head1 NAME
@@ -200,8 +199,6 @@ Storable::AMF0 - serializing/deserializing AMF0 data
$obj = thaw( $amf, $options );
$amf = freeze( $obj, $options );
-=cut
-
=head1 DESCRIPTION
This module is (de)serializer for Adobe's AMF0/AMF3 (Action Message Format ver 0-3).
@@ -209,16 +206,11 @@ This is only module and it recognize only AMF0 data.
Almost all function implemented in C for speed.
And some cases faster then Storable( for me always)
-=cut
-
=head1 EXPORT
-
- None by default.
-=cut
+ None by default.
=head1 FUNCTIONS
-=cut
=over
@@ -261,10 +253,9 @@ And some cases faster then Storable( for me always)
Return one object and number of bytes readed
if scalar context return object
-=item parse_option( $option_string )
-=item parse_serializator_option( $option_string )
+=item parse_serializator_option( $option_string ) / parse_option( $option_string )
--- generate option scalar from string usefull for some options of thaw/freeze/deparse_amf
-
+
=back
@@ -295,18 +286,11 @@ And some cases faster then Storable( for me always)
=back
-=cut
-
-=head1 NOTICE
-
- Storable::AMF0 is currently is at development stage.
-
-=cut
-
=head1 LIMITATION
-At current moment and with restriction of AMF0/AMF3 format referrences to scalar are not serialized,
-and can't/ may not serialize tied variables.
+At current moment and with restriction of AMF0/AMF3 format
+referrences to function, filehandles are not serialized,
+and can't/may not serialize tied variables.
=head1 FEATURES
@@ -334,4 +318,3 @@ Copyright (C) 2011 by A. G. Grishaev
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.8 or,
at your option, any later version of Perl 5 you may have available.
-=cut
@@ -7,7 +7,7 @@ use Exporter 'import';
use Carp qw(croak);
BEGIN{
our $VERSION;
- $VERSION='1.00' unless $INC{'Storable/AMF0.pm'};
+ $VERSION='1.05' unless $INC{'Storable/AMF0.pm'};
};
use Storable::AMF0 ();
@@ -73,7 +73,6 @@ sub lock_store($$) {
}};
1;
__END__
-# Below is stub documentation for your module. You'd better edit it!
=head1 NAME
@@ -110,8 +109,6 @@ Storable::AMF3 - serializing/deserializing AMF3 data
- or -
$obj = deparse_amf( freeze($a1) . freeze($a) ... );
-=cut
-
=head1 DESCRIPTION
This module is (de)serializer for Adobe's AMF3 (Action Message Format ver 3).
@@ -119,16 +116,11 @@ This is only module and it recognize only AMF3 data.
Almost all function implemented in C for speed.
And some cases faster then Storable( for me always)
-=cut
-
=head1 EXPORT
-
- None by default.
-=cut
+ None by default.
=head1 FUNCTIONS
-=cut
=over
@@ -171,19 +163,13 @@ And some cases faster then Storable( for me always)
Return one object and number of bytes readed
if scalar context return object
-=item parse_option
-=item parse_serializator_option
+=item parse_serializator_option / parse_option
generate option scalar for freeze/thaw/deparse_amf
See L<Storable::AMF0> for complete list of options
=back
-=head1 LIMITATION
-
-At current moment and with restriction of AMF0/AMF3 format referrences to scalar are not serialized,
-and can't/ may not serialize tied variables.
-
=head1 SEE ALSO
L<Data::AMF>, L<Storable>, L<Storable::AMF3>, L<Storable::AMF>
@@ -204,4 +190,3 @@ Copyright (C) 2011 by A. G. Grishaev
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.8 or,
at your option, any later version of Perl 5 you may have available.
-=cut
@@ -15,8 +15,8 @@ no warnings 'once';
use_ok('Storable::AMF0');
use_ok('Storable::AMF3');
use_ok('Storable::AMF::Mapper');
- print STDERR unpack( "H*", pack "d", 12345678), " ";
- Storable::AMF3::endian();
+ print STDERR unpack( "H*", pack "i", 0x12345678), " ";
+ print STDERR Storable::AMF3::endian();
# };
#########################
@@ -1,18 +1,24 @@
use ExtUtils::testlib;
use strict;
use warnings;
-use Test::More tests=>60; #'no_plan';
+use Test::More tests=>64; #'no_plan';
use Storable::AMF0 qw(freeze thaw );
use Data::Dumper;
+sub dehex{
+ unpack "H*", $_[0];
+}
sub my_test(){
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
$@ = undef;
- ok(! defined scalar Storable::AMF3::freeze($_), ref $_);
+ ok(! defined scalar Storable::AMF3::freeze($_), ref $_) ;
+# ! defined Storable::AMF3::freeze($_) or warn Dumper( dehex (Storable::AMF3::freeze($_)));
ok($@, "has error for3 ". ref $_);
ok(! defined scalar Storable::AMF0::freeze($_), ref $_);
ok($@, "has error for0 ". ref $_);
};
sub my_ok(){
+ local $Test::Builder::Level = $Test::Builder::Level + 1;
ok( defined scalar Storable::AMF0::freeze($_), $@);
is_deeply(Storable::AMF0::thaw(Storable::AMF0::freeze $_), $_, $@);
TODO: {
@@ -43,5 +49,7 @@ my_test for bless qr/\w+/, 'a';
my_test for *STDERR{IO};
my_test for bless *STDERR{IO}, 'a';
+my_test for \*STDERR;
+# my_test for *STDERR;
@@ -35,7 +35,7 @@ ok( is_amf_string ( $a ="4" , $nop ), 'str var not changed');
$a = 1;
$b = "$a";
$var = 'Int';
-ok( is_amf_string($a) , "$var converted is a string" );
+ok( is_amf_string($a) , "$var converted is a string" );
ok( ! is_amf_string(0+$a) , "$var 0+converted is double" );
ok( ! is_amf_string(0.0+$a,$nop), "$var 0.0+converted is double" );
ok( ! is_amf_string($a, $nop) , "$var converted again is double" );
@@ -45,7 +45,7 @@ ok( ! is_amf_string($a, $nop) , "$var converted again is double" );
$a = 1;
$b = "".$a;
$var = "Int++";
-ok( is_amf_string($a) , "$var converted is a string" );
+ok( is_amf_string($a) , "$var converted is a string" );
ok( ! is_amf_string(0+$a) , "$var 0+converted is double" );
ok( ! is_amf_string(0.0+$a,$nop), "$var 0.0+converted is double" );
ok( ! is_amf_string($a, $nop) , "$var converted again is double" );
@@ -55,7 +55,8 @@ $a = 1.0;
$b = "$a";
$var = "Double";
-ok( is_amf_string($a) , "$var converted is a string" );
+my %string_number=(0=>1,2=>1);
+ok( $string_number{ byte_amf_string($a)} , "$var converted is a string" );
ok( ! is_amf_string(0+$a) , "$var 0+converted is double" );
ok( ! is_amf_string(0.0+$a,$nop), "$var 0.0+converted is double" );
ok( ! is_amf_string($a, $nop) , "$var converted again is double" );
@@ -65,7 +66,7 @@ ok( ! is_amf_string($a, $nop) , "$var converted again is double" );
$a = 1.0;
$b = "".$a;
$var = "Double++";
-ok( is_amf_string($a) , "$var converted is a string" );
+ok( $string_number{ byte_amf_string($a)}, "$var converted is a string" );
ok( ! is_amf_string(0+$a) , "$var 0+converted is double" );
ok( ! is_amf_string(0.0+$a,$nop), "$var 0.0+converted is double" );
ok( ! is_amf_string($a, $nop) , "$var converted again is double" );
@@ -104,3 +105,6 @@ ok( is_amf_string(''.$a, ) , "$var ''.converted is str" );
sub is_amf_string{
ord( freeze( $_[0], $_[1]||0 )) == 2;
}
+sub byte_amf_string{
+ ord( freeze( $_[0], $_[1]||0 ));
+}
@@ -35,7 +35,7 @@ ok( is_amf_string ( $a ="4" , $nop ), 'str var not changed');
$a = 1;
$b = "$a";
$var = 'Int';
-ok( is_amf_string($a) , "$var converted is a string" );
+ok( is_amf_string($a) , "$var converted is a string" );
ok( ! is_amf_string(0+$a) , "$var 0+converted is double" );
ok( ! is_amf_string(0.0+$a,$nop), "$var 0.0+converted is double" );
ok( ! is_amf_string($a, $nop) , "$var converted again is double" );
@@ -45,7 +45,7 @@ ok( ! is_amf_string($a, $nop) , "$var converted again is double" );
$a = 1;
$b = "".$a;
$var = "Int++";
-ok( is_amf_string($a) , "$var converted is a string" );
+ok( is_amf_string($a) , "$var converted is a string" );
ok( ! is_amf_string(0+$a) , "$var 0+converted is double" );
ok( ! is_amf_string(0.0+$a,$nop), "$var 0.0+converted is double" );
ok( ! is_amf_string($a, $nop) , "$var converted again is double" );
@@ -55,7 +55,7 @@ $a = 1.0;
$b = "$a";
$var = "Double";
-ok( is_amf_string($a) , "$var converted is a string" );
+ok( is_double_string($a) , "$var converted is a string" );
ok( ! is_amf_string(0+$a) , "$var 0+converted is double" );
ok( ! is_amf_string(0.0+$a,$nop), "$var 0.0+converted is double" );
ok( ! is_amf_string($a, $nop) , "$var converted again is double" );
@@ -65,7 +65,7 @@ ok( ! is_amf_string($a, $nop) , "$var converted again is double" );
$a = 1.0;
$b = "".$a;
$var = "Double++";
-ok( is_amf_string($a) , "$var converted is a string" );
+ok( is_double_string($a) , "$var converted is a string" );
ok( ! is_amf_string(0+$a) , "$var 0+converted is double" );
ok( ! is_amf_string(0.0+$a,$nop), "$var 0.0+converted is double" );
ok( ! is_amf_string($a, $nop) , "$var converted again is double" );
@@ -100,7 +100,14 @@ ok( is_amf_string(''.$a, $nop), "$var ''.converted again is str" );
ok( is_amf_string(''.$a, ) , "$var ''.converted is str" );
+is_double_string( ('a'));
+is_double_string( (1234));
+is_double_string( (1234.0));
+sub is_double_string{
+ # print STDERR Dumper( ord( freeze( $_[0], $_[1]||0 )));
+ return scalar grep $_ == 6|| $_==5, ord( freeze( $_[0], $_[1]||0 ));
+}
sub is_amf_string{
ord( freeze( $_[0], $_[1]||0 )) == 6;
}