Skip to content

Commit 9fb1be5

Browse files
committed
get_utf8_string
1 parent 6f48342 commit 9fb1be5

File tree

3 files changed

+64
-2
lines changed

3 files changed

+64
-2
lines changed

lib/JavaScript/Duktape.pm

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use Carp;
55
use Data::Dumper;
66
use Scalar::Util 'looks_like_number';
77

8-
our $VERSION = '0.2.1';
8+
our $VERSION = '0.3.0';
99

1010
use base qw/Exporter/;
1111
our @EXPORT = qw (
@@ -295,7 +295,7 @@ sub to_perl {
295295
my $type = $self->get_type($index);
296296

297297
if ($type == JavaScript::Duktape::DUK_TYPE_STRING){
298-
$ret = $self->get_string($index);
298+
$ret = $self->get_utf8_string($index);
299299
}
300300

301301
elsif ($type == JavaScript::Duktape::DUK_TYPE_NUMBER){
@@ -458,6 +458,11 @@ sub safe_call {
458458
return 0;
459459
}
460460

461+
##############################################
462+
# custom functions
463+
##############################################
464+
*get_utf8_string = \&perl_duk_get_utf8_string;
465+
461466
##############################################
462467
# overridden functions
463468
##############################################

lib/JavaScript/Duktape/C/duktape_wrap.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,14 @@ SV *perl_duk_require_context(duk_context *ctx, duk_idx_t index) {
186186
return obj_ref;
187187
}
188188

189+
SV *perl_duk_get_utf8_string(duk_context *ctx, duk_idx_t index) {
190+
STRLEN slen;
191+
const char *str = duk_get_lstring(ctx, index, &slen);
192+
SV *src = newSVpv(str, slen);
193+
SvPV(src, slen);
194+
SvUTF8_on(src);
195+
return src;
196+
}
189197

190198
/**
191199
* open c shared library

t/utf8.t

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
use lib './lib';
2+
use strict;
3+
use warnings;
4+
use JavaScript::Duktape;
5+
use Data::Dumper;
6+
use Test::More;
7+
use Encode;
8+
use utf8;
9+
10+
my $js = JavaScript::Duktape->new();
11+
my $duk = $js->duk;
12+
13+
my $count = 0;
14+
15+
my $evalstr = <<'//JSEND';
16+
function test (s){
17+
is(s, "abc αβγ ß");
18+
is(s.toUpperCase().length, 10);
19+
}
20+
21+
function uc(s) { return s.toUpperCase(); }
22+
toPerl( uc("abc αβγ ß") ) // ascii: abc, greek:alpha beta gamma, german:sharp-s
23+
//JSEND
24+
25+
$js->set(is => sub {
26+
shift;
27+
is(shift, shift);
28+
});
29+
30+
$js->set(toPerl =>
31+
sub {
32+
my $duk = shift;
33+
my $string = shift;
34+
is length $string, 10;
35+
36+
use bytes;
37+
is length $string, 13;
38+
no bytes;
39+
40+
is $string, uc("abc αβγ ß");
41+
}
42+
);
43+
44+
$js->eval($evalstr);
45+
46+
my $jsTest = $js->get('test');
47+
$jsTest->("abc αβγ ß");
48+
49+
done_testing(5);

0 commit comments

Comments
 (0)