Skip to content

Commit 0513305

Browse files
committed
Perlito5 - js3: autovivify at runtime only
1 parent be26903 commit 0513305

File tree

3 files changed

+67
-120
lines changed

3 files changed

+67
-120
lines changed

perlito5.pl

Lines changed: 20 additions & 27 deletions
Large diffs are not rendered by default.

src5/lib/Perlito5/Javascript3/Emitter.pm

Lines changed: 26 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -409,19 +409,9 @@ package Perlito5::Javascript3;
409409
sub emit_javascript3_autovivify {
410410
my $obj = shift;
411411
my $level = shift;
412-
my $type = shift; # 'array'/'hash'
413412
my $wantarray = 'scalar';
414413

415-
return $obj->emit_javascript3($level, $wantarray, $type);
416-
417-
# '(' . $obj->emit_javascript3($level)
418-
# . ' || (' . $obj->emit_javascript3($level) . ' = '
419-
# . ( $type eq 'array' ? 'new p5ArrayRef(new p5Array([]))'
420-
# : $type eq 'hash' ? 'new p5HashRef(new p5Hash({}))'
421-
# : 'new p5ScalarRef(null)'
422-
# )
423-
# . ')'
424-
# . ')'
414+
return $obj->emit_javascript3($level, $wantarray);
425415
}
426416

427417
sub emit_function_javascript3 {
@@ -771,31 +761,26 @@ package Perlito5::AST::Index;
771761
my $self = shift;
772762
my $level = shift;
773763
my $wantarray = shift;
774-
my $type = shift; # autovivify to 'array'/'hash'
775-
776-
$type = $type ? '"' . $type . '"' : 'null';
777764

778765
if ( $self->{obj}->isa('Perlito5::AST::Var')
779766
&& $self->{obj}->sigil eq '$'
780767
)
781768
{
782769
my $v = Perlito5::AST::Var->new( sigil => '@', namespace => $self->{obj}->namespace, name => $self->{obj}->name );
783770
return $v->emit_javascript3($level)
784-
. '.aget(' . Perlito5::Javascript3::to_num($self->{index_exp}, $level) . ', ' . $type . ')';
771+
. '.aget(' . Perlito5::Javascript3::to_num($self->{index_exp}, $level) . ')';
785772
}
786773
if ( $self->{obj}->isa('Perlito5::AST::Apply')
787774
&& $self->{obj}->{code} eq 'prefix:<$>'
788775
)
789776
{
790777
# $$a[0] ==> $a->[0]
791-
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}{arguments}[0], $level, 'array' )
792-
. '.aget('
793-
. Perlito5::Javascript3::to_num($self->{index_exp}) . ', ' . $type
794-
. ')';
778+
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}{arguments}[0], $level )
779+
. '.aget(' . Perlito5::Javascript3::to_num($self->{index_exp}) . ')';
795780
}
796781

797-
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}, $level, 'array' )
798-
. '.aget(' . Perlito5::Javascript3::to_num($self->{index_exp}, $level) . ', ' . $type . ')';
782+
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}, $level )
783+
. '.aget(' . Perlito5::Javascript3::to_num($self->{index_exp}, $level) . ')';
799784
}
800785
sub emit_javascript3_set {
801786
my $self = shift;
@@ -818,14 +803,14 @@ package Perlito5::AST::Index;
818803
)
819804
{
820805
# $$a[0] ==> $a->[0]
821-
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}{arguments}[0], $level, 'array' )
806+
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}{arguments}[0], $level )
822807
. '.aset('
823808
. Perlito5::Javascript3::to_num($self->{index_exp}) . ', '
824809
. Perlito5::Javascript3::to_scalar([$arguments], $level+1)
825810
. ')';
826811
}
827812

828-
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}, $level, 'array' )
813+
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}, $level )
829814
. '.aset('
830815
. Perlito5::Javascript3::to_num($self->{index_exp}, $level+1) . ', '
831816
. Perlito5::Javascript3::to_scalar([$arguments], $level+1)
@@ -840,9 +825,6 @@ package Perlito5::AST::Lookup;
840825
my $self = shift;
841826
my $level = shift;
842827
my $wantarray = shift;
843-
my $type = shift; # autovivify to 'array'/'hash'
844-
845-
$type = $type ? '"' . $type . '"' : 'null';
846828

847829
# my $var = $self->{obj}->emit_javascript3;
848830
# return $var . '[' . $self->{index_exp}->emit_javascript3() . ']'
@@ -852,20 +834,20 @@ package Perlito5::AST::Lookup;
852834
)
853835
{
854836
my $v = Perlito5::AST::Var->new( sigil => '%', namespace => $self->{obj}->namespace, name => $self->{obj}->name );
855-
return Perlito5::Javascript3::emit_javascript3_autovivify( $v, $level, 'hash' )
856-
. '.hget(' . Perlito5::Javascript3::autoquote($self->{index_exp}, $level) . ', ' . $type . ')';
837+
return Perlito5::Javascript3::emit_javascript3_autovivify( $v, $level )
838+
. '.hget(' . Perlito5::Javascript3::autoquote($self->{index_exp}, $level) . ')';
857839
}
858840
if ( $self->{obj}->isa('Perlito5::AST::Apply')
859841
&& $self->{obj}->{code} eq 'prefix:<$>'
860842
)
861843
{
862844
# $$a{0} ==> $a->{0}
863-
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}{arguments}[0], $level, 'hash' )
864-
. '.hget(' . Perlito5::Javascript3::autoquote($self->{index_exp}, $level, 'list') . ', ' . $type . ')';
845+
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}{arguments}[0], $level )
846+
. '.hget(' . Perlito5::Javascript3::autoquote($self->{index_exp}, $level, 'list') . ')';
865847
}
866848

867-
Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}, $level, 'hash' )
868-
. '.hget(' . Perlito5::Javascript3::autoquote($self->{index_exp}, $level) . ', ' . $type . ')';
849+
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}, $level )
850+
. '.hget(' . Perlito5::Javascript3::autoquote($self->{index_exp}, $level) . ')';
869851
}
870852
sub emit_javascript3_set {
871853
my $self = shift;
@@ -889,13 +871,13 @@ package Perlito5::AST::Lookup;
889871
)
890872
{
891873
# $$a{0} ==> $a->{0}
892-
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}{arguments}[0], $level, 'hash' )
874+
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}{arguments}[0], $level )
893875
. '.hset(' . Perlito5::Javascript3::autoquote($self->{index_exp}, $level, 'list') . ', '
894876
. Perlito5::Javascript3::to_scalar([$arguments], $level+1)
895877
. ')';
896878
}
897879

898-
Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}, $level, 'hash' )
880+
Perlito5::Javascript3::emit_javascript3_autovivify( $self->{obj}, $level )
899881
. '.hset(' . Perlito5::Javascript3::autoquote($self->{index_exp}, $level) . ', '
900882
. Perlito5::Javascript3::to_scalar([$arguments], $level+1)
901883
. ')';
@@ -1154,19 +1136,16 @@ package Perlito5::AST::Call;
11541136
my $self = shift;
11551137
my $level = shift;
11561138
my $wantarray = shift;
1157-
my $type = shift; # autovivify to 'array'/'hash'
1158-
1159-
$type = $type ? '"' . $type . '"' : 'null';
11601139

11611140
my $meth = $self->{method};
11621141

11631142
if ( $meth eq 'postcircumfix:<[ ]>' ) {
1164-
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{invocant}, $level, 'array' )
1165-
. '.aget(' . Perlito5::Javascript3::to_num($self->{arguments}) . ', ' . $type . ')';
1143+
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{invocant}, $level )
1144+
. '.aget(' . Perlito5::Javascript3::to_num($self->{arguments}) . ')';
11661145
}
11671146
if ( $meth eq 'postcircumfix:<{ }>' ) {
1168-
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{invocant}, $level, 'hash' )
1169-
. '.hget(' . Perlito5::Javascript3::autoquote($self->{arguments}, $level, 'list') . ', ' . $type . ')';
1147+
return Perlito5::Javascript3::emit_javascript3_autovivify( $self->{invocant}, $level )
1148+
. '.hget(' . Perlito5::Javascript3::autoquote($self->{arguments}, $level, 'list') . ')';
11701149
}
11711150

11721151
my $invocant = $self->{invocant}->emit_javascript3;
@@ -1355,25 +1334,25 @@ package Perlito5::AST::Apply;
13551334
'prefix:<$>' => sub {
13561335
my $self = $_[0];
13571336
my $arg = $self->{arguments}->[0];
1358-
Perlito5::Javascript3::emit_javascript3_autovivify( $arg, $level, 'scalar' ) . '.sderef()';
1337+
Perlito5::Javascript3::emit_javascript3_autovivify( $arg, $level ) . '.sderef()';
13591338
},
13601339
'prefix:<@>' => sub {
13611340
my $self = $_[0];
13621341
my $level = $_[1];
13631342
my $arg = $self->{arguments}->[0];
1364-
Perlito5::Javascript3::emit_javascript3_autovivify( $arg, $level, 'array' ) . '.aderef()';
1343+
Perlito5::Javascript3::emit_javascript3_autovivify( $arg, $level ) . '.aderef()';
13651344
},
13661345
'prefix:<$#>' => sub {
13671346
my $self = $_[0];
13681347
my $level = $_[1];
13691348
my $arg = $self->{arguments}->[0];
1370-
'(' . Perlito5::Javascript3::emit_javascript3_autovivify( $arg, $level, 'array' ) . '.aderef()._array_.length - 1)';
1349+
'(' . Perlito5::Javascript3::emit_javascript3_autovivify( $arg, $level ) . '.aderef()._array_.length - 1)';
13711350
},
13721351
'prefix:<%>' => sub {
13731352
my $self = $_[0];
13741353
my $level = $_[1];
13751354
my $arg = $self->{arguments}->[0];
1376-
Perlito5::Javascript3::emit_javascript3_autovivify( $arg, $level, 'hash' ) . '.hderef()';
1355+
Perlito5::Javascript3::emit_javascript3_autovivify( $arg, $level ) . '.hderef()';
13771356
},
13781357
'prefix:<&>' => sub {
13791358
my $self = $_[0];
@@ -1561,14 +1540,14 @@ package Perlito5::AST::Apply;
15611540
}
15621541

15631542
if ( $parameters->isa( 'Perlito5::AST::Call' ) && $parameters->{method} eq 'postcircumfix:<[ ]>' ) {
1564-
return Perlito5::Javascript3::emit_javascript3_autovivify( $parameters->{invocant}, $level, 'array' )
1543+
return Perlito5::Javascript3::emit_javascript3_autovivify( $parameters->{invocant}, $level )
15651544
. '.aset('
15661545
. Perlito5::Javascript3::to_num($parameters->{arguments}) . ', '
15671546
. Perlito5::Javascript3::to_scalar([$arguments], $level+1)
15681547
. ')';
15691548
}
15701549
elsif ( $parameters->isa( 'Perlito5::AST::Call' ) && $parameters->{method} eq 'postcircumfix:<{ }>' ) {
1571-
return Perlito5::Javascript3::emit_javascript3_autovivify( $parameters->{invocant}, $level, 'hash' )
1550+
return Perlito5::Javascript3::emit_javascript3_autovivify( $parameters->{invocant}, $level )
15721551
. '.hset('
15731552
. Perlito5::Javascript3::autoquote($parameters->{arguments}, $level) . ', '
15741553
. Perlito5::Javascript3::to_scalar([$arguments], $level+1)

src5/lib/Perlito5/Javascript3/Runtime.pm

Lines changed: 21 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,8 @@ function p5HashRef(o) {
285285
this._href_._hash_[i] = v;
286286
return v;
287287
};
288-
this.hget = function(i, autoviv) {
289-
return this._href_.hget(i, autoviv);
288+
this.hget = function(i) {
289+
return this._href_.hget(i);
290290
}
291291
}
292292
@@ -304,8 +304,8 @@ function p5ArrayRef(o) {
304304
this._aref_._array_[i >= 0 ? i : this._aref_._array_.length + i] = v;
305305
return v;
306306
}
307-
this.aget = function(i, autoviv) {
308-
return this._aref_.aget(i, autoviv);
307+
this.aget = function(i) {
308+
return this._aref_.aget(i);
309309
}
310310
}
311311
@@ -350,32 +350,20 @@ function p5Array(o) {
350350
if (this._array_[i] instanceof p5Scalar) {
351351
this._array_[i].assign(v);
352352
}
353+
else if (v instanceof p5Scalar) {
354+
this._array_[i] = new p5Scalar(v._v_);
355+
}
353356
else {
354-
if (v instanceof p5Scalar) {
355-
this._array_[i] = new p5Scalar(v._v_);
356-
}
357-
else {
358-
this._array_[i] = new p5Scalar(v);
359-
}
357+
this._array_[i] = new p5Scalar(v);
360358
}
361359
return this._array_[i];
362360
};
363-
this.aget = function(i, autoviv) {
361+
this.aget = function(i) {
364362
if (i < 0) {
365363
i = this._array_.length + i;
366364
}
367-
var v = this._array_[i];
368-
if (v != null) {
369-
return v;
370-
}
371-
if (autoviv == 'array') {
372-
this._array_[i] = new p5ArrayRef(new p5Array([]));
373-
}
374-
else if (autoviv == 'hash') {
375-
this._array_[i] = new p5HashRef(new p5Hash({}));
376-
}
377-
else {
378-
this._array_[i] = new p5Scalar(null);
365+
if (!(this._array_[i] instanceof p5Scalar)) {
366+
this._array_[i] = new p5Scalar(this._array_[i]);
379367
}
380368
return this._array_[i];
381369
};
@@ -442,31 +430,18 @@ function p5Hash(o) {
442430
if (this._hash_[i] instanceof p5Scalar) {
443431
this._hash_[i].assign(v);
444432
}
433+
else if (v instanceof p5Scalar) {
434+
this._hash_[i] = new p5Scalar(v._v_);
435+
}
445436
else {
446-
if (v instanceof p5Scalar) {
447-
this._hash_[i] = new p5Scalar(v._v_);
448-
}
449-
else {
450-
this._hash_[i] = new p5Scalar(v);
451-
}
437+
this._hash_[i] = new p5Scalar(v);
452438
}
453439
return this._hash_[i];
454440
};
455-
this.hget = function(i, autoviv) {
456-
if (this._hash_[i] instanceof p5Scalar) {
457-
}
458-
else if (this._hash_[i] != null) {
441+
this.hget = function(i) {
442+
if (!(this._hash_[i] instanceof p5Scalar)) {
459443
this._hash_[i] = new p5Scalar(this._hash_[i]);
460444
}
461-
else if (autoviv == 'array') {
462-
this._hash_[i] = new p5ArrayRef(new p5Array([]));
463-
}
464-
else if (autoviv == 'hash') {
465-
this._hash_[i] = new p5HashRef(new p5Hash({}));
466-
}
467-
else {
468-
this._hash_[i] = new p5Scalar(null);
469-
}
470445
return this._hash_[i];
471446
};
472447
this.assign = function(h) {
@@ -532,12 +507,12 @@ function p5Scalar(o) {
532507
// TODO - autovivify array (with proxy object?)
533508
return this._v_.aderef();
534509
};
535-
this.aget = function(i, autoviv) {
510+
this.aget = function(i) {
536511
// TODO - autovivify array (with proxy object?)
537512
if (this._v_ == null) {
538513
this._v_ = new p5ArrayRef(new p5Array([]));
539514
}
540-
return this._v_.aget(i, autoviv);
515+
return this._v_.aget(i);
541516
};
542517
this.aset = function(i, v) {
543518
if (this._v_ == null) {
@@ -554,12 +529,12 @@ function p5Scalar(o) {
554529
}
555530
return this._v_.hderef();
556531
};
557-
this.hget = function(i, autoviv) {
532+
this.hget = function(i) {
558533
// TODO - autovivify hash (with proxy object?)
559534
if (this._v_ == null) {
560535
this._v_ = new p5HashRef(new p5Hash([]));
561536
}
562-
return this._v_.hget(i, autoviv);
537+
return this._v_.hget(i);
563538
}
564539
this.hset = function(i, v) {
565540
if (this._v_ == null) {

0 commit comments

Comments
 (0)