1275
1277
return $crc ^ 0xFFFFFFFF;
1280
my $got_json = eval { require JSON };
1282
return JSON::encode_json(@_) if $got_json;
1284
return (object_to_json($data) || '');
1288
sub object_to_json {
1290
my $type = ref($obj);
1292
if($type eq 'HASH'){
1293
return hash_to_json($obj);
1295
elsif($type eq 'ARRAY'){
1296
return array_to_json($obj);
1299
return value_to_json($obj);
1306
for my $k ( sort { $a cmp $b } keys %$obj ) {
1307
push @res, string_to_json( $k )
1309
. ( object_to_json( $obj->{$k} ) || value_to_json( $obj->{$k} ) );
1311
return '{' . ( @res ? join( ",", @res ) : '' ) . '}';
1319
push @res, object_to_json($v) || value_to_json($v);
1322
return '[' . ( @res ? join( ",", @res ) : '' ) . ']';
1328
return 'null' if(!defined $value);
1330
my $b_obj = B::svref_2object(\$value); # for round trip problem
1331
my $flags = $b_obj->FLAGS;
1332
return $value # as is
1333
if $flags & ( B::SVp_IOK | B::SVp_NOK ) and !( $flags & B::SVp_POK ); # SvTYPE is IV or NV?
1335
my $type = ref($value);
1338
return string_to_json($value);
1357
sub string_to_json {
1360
$arg =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/g;
1361
$arg =~ s/\//\\\//g;
1362
$arg =~ s/([\x00-\x08\x0b\x0e-\x1f])/'\\u00' . unpack('H2', $1)/eg;
1364
utf8::upgrade($arg);
1367
return '"' . $arg . '"';
1279
1371
my ($package, undef, $line) = caller 0;
1280
1372
@_ = map { (my $temp = $_) =~ s/\n/\n# /g; $temp; }
1361
1453
my ( $self, $start ) = @_;
1362
1454
$self->{start} = $self->{last_reported} = $start || time();
1455
$self->{first_report} = 0;
1366
my ( $self, $callback, $now ) = @_;
1459
my ( $self, $callback, %args ) = @_;
1367
1460
my $jobsize = $self->{jobsize};
1461
my $now ||= $args{now} || time;
1369
1463
$self->{iterations}++; # How many updates have happened;
1465
if ( !$self->{first_report} && $args{first_report} ) {
1466
$args{first_report}->();
1467
$self->{first_report} = 1;
1371
1470
if ( $self->{report} eq 'time'
1372
1471
&& $self->{interval} > $now - $self->{last_reported}