Skip to content

Commit a8106a1

Browse files
committed
Perlito5 - js - more support for typeglob assignment
1 parent 21af3dc commit a8106a1

File tree

7 files changed

+348
-306
lines changed

7 files changed

+348
-306
lines changed

html/perlito5.js

Lines changed: 304 additions & 285 deletions
Large diffs are not rendered by default.

perlito5.pl

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

src5/lib/Perlito5/Javascript2/Emitter.pm

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,7 +1187,11 @@ package Perlito5::AST::Var;
11871187
return '(' . $self->emit_javascript2() . ' = ' . Perlito5::Javascript2::to_list([$arguments], $level+1, 'hash') . ')'
11881188
}
11891189
if ( $self->sigil eq '*' ) {
1190-
return '(' . $self->emit_javascript2() . ' = ' . Perlito5::Javascript2::to_scalar([$arguments], $level+1) . ')'
1190+
return 'p5typeglob_set('
1191+
. '"' . ($self->{namespace} || $Perlito5::PKG_NAME) . '", '
1192+
. '"' . $self->{name} . '", '
1193+
. Perlito5::Javascript2::to_scalar([$arguments], $level+1)
1194+
. ')'
11911195
}
11921196

11931197
die "don't know how to assign to variable ", $self->sigil, $self->name;
@@ -2725,7 +2729,7 @@ package Perlito5::AST::Sub;
27252729
. Perlito5::Javascript2::tab($level) . '}';
27262730

27272731
if ( $self->{name} ) {
2728-
return 'p5make_sub("' . $self->{namespace} . '", "' . $self->{name} . '", ' . $s . ')'
2732+
return 'p5typeglob_set("' . $self->{namespace} . '", "' . $self->{name} . '", ' . $s . ')'
27292733
}
27302734
else {
27312735
return $s;

src5/lib/Perlito5/Javascript2/IO.pm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ if (isNode) {
2929
3030
var fs = require("fs");
3131
32-
p5make_sub("Perlito5::IO", "print", function (List__, p5want) {
32+
p5typeglob_set("Perlito5::IO", "print", function (List__, p5want) {
3333
var i;
3434
List__.shift(); // TODO - use IO::FILE
3535
for (i = 0; i < List__.length; i++) {
@@ -141,21 +141,21 @@ if (isNode) {
141141
}
142142
};
143143
144-
p5make_sub("Perlito5::IO", "slurp", function(List__) {
144+
p5typeglob_set("Perlito5::IO", "slurp", function(List__) {
145145
return fs.readFileSync(List__[0],"utf8");
146146
});
147147
148148
} else {
149149
// not running in node.js
150-
p5make_sub("Perlito5::IO", "print", function (List__, p5want) {
150+
p5typeglob_set("Perlito5::IO", "print", function (List__, p5want) {
151151
var i;
152152
List__.shift(); // TODO - use IO::FILE
153153
for (i = 0; i < List__.length; i++) {
154154
write(p5str(List__[i]));
155155
}
156156
return 1;
157157
});
158-
p5make_sub("Perlito5::IO", "slurp", function(List__) {
158+
p5typeglob_set("Perlito5::IO", "slurp", function(List__) {
159159
var filename = List__[0];
160160
if (typeof readFile == "function") {
161161
return readFile(filename);

src5/lib/Perlito5/Javascript2/Runtime.pm

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -313,13 +313,32 @@ p5make_package("Perlito5::IO");
313313
p5make_package("Perlito5::Runtime");
314314
p5make_package("Perlito5::Grammar");
315315
316-
function p5make_sub(pkg_name, sub_name, func) {
317-
p5make_package(pkg_name);
318-
p5pkg[pkg_name][sub_name] = func;
319-
}
320-
321316
var sigils = { '@' : 'List_', '%' : 'Hash_', '$' : 'v_' };
322317
318+
function p5typeglob_set(namespace, name, obj) {
319+
p5make_package(namespace);
320+
if ( obj.hasOwnProperty("_ref_") ) {
321+
if ( obj._ref_ == "HASH" ) {
322+
p5pkg[namespace][sigils['%'] + name] = obj._hash_;
323+
}
324+
else if ( obj._ref_ == "ARRAY" ) {
325+
p5pkg[namespace][sigils['@'] + name] = obj._array_;
326+
}
327+
else if ( obj._ref_ == "SCALAR" ) {
328+
p5pkg[namespace][sigils['$'] + name] = obj._scalar_;
329+
}
330+
else if ( obj._ref_ == "GLOB" ) {
331+
// TODO
332+
p5pkg[namespace][name] = obj;
333+
}
334+
}
335+
else {
336+
p5pkg[namespace][name] = obj; // CODE
337+
// TODO - non-reference
338+
}
339+
return p5pkg[namespace][name]; // TODO - return GLOB
340+
}
341+
323342
function p5set_local(namespace, name, sigil) {
324343
var vname = sigils[sigil] + name;
325344
p5LOCAL.push([namespace, vname, namespace[vname]]);

src5/lib/Perlito5/Javascript3/Emitter.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2251,7 +2251,7 @@ package Perlito5::AST::Sub;
22512251
. Perlito5::Javascript3::tab($level) . '}';
22522252

22532253
if ( $self->{name} ) {
2254-
return 'p5make_sub("' . $self->{namespace} . '", "' . $self->{name} . '", ' . $s . ')'
2254+
return 'p5typeglob_set("' . $self->{namespace} . '", "' . $self->{name} . '", ' . $s . ')'
22552255
}
22562256
else {
22572257
return $s;

src5/lib/Perlito5/Javascript3/Runtime.pm

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ p5make_package("Perlito5::IO");
271271
p5make_package("Perlito5::Runtime");
272272
p5make_package("Perlito5::Grammar");
273273
274-
function p5make_sub(pkg_name, sub_name, func) {
274+
function p5typeglob_set(pkg_name, sub_name, func) {
275275
p5make_package(pkg_name);
276276
p5pkg[pkg_name][sub_name] = func;
277277
}
@@ -811,12 +811,12 @@ p5a_to_h = function(a) {
811811
812812
if (isNode) {
813813
var fs = require("fs");
814-
p5make_sub("Perlito5::IO", "slurp", function(List__) {
814+
p5typeglob_set("Perlito5::IO", "slurp", function(List__) {
815815
var filename = p5str(List__[0]);
816816
return fs.readFileSync(filename, "utf8");
817817
});
818818
} else {
819-
p5make_sub("Perlito5::IO", "slurp", function(List__) {
819+
p5typeglob_set("Perlito5::IO", "slurp", function(List__) {
820820
var filename = p5str(List__[0]);
821821
if (typeof readFile == "function") {
822822
return readFile(filename);

0 commit comments

Comments
 (0)