Skip to content

Commit 0d075ed

Browse files
committed
[js] Add support for using the setting in code that is webpacked and sent to the browser.
1 parent 56f5d83 commit 0d075ed

File tree

7 files changed

+22
-14
lines changed

7 files changed

+22
-14
lines changed

examples/webpacked/README

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
You need to install webpack.
2-
And then using npm install src/vm/js/nqp-loader and src/vm/js/nqp-runtime and install empty-module from npm.
2+
And then using npm install src/vm/js/nqp-loader and src/vm/js/nqp-runtime and install empty-module, browserify-bignum from npm.
33
For increased awesomeness we use webpack-dev-server and webpack-reload-plugin so you need to install those.
44

55

examples/webpacked/example.nqp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ sub setup() {
2626

2727
set-setup(&setup);
2828

29-
nqp::say("Hello Fancy Browser World");
29+
say("Hello Fancy Browser World");

examples/webpacked/webpack.config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ module.exports = {
77
alias: {
88
"ffi": "empty-module",
99
"fs-ext": "empty-module",
10-
"bignum": "empty-module",
1110
"ffi": "empty-module",
1211
"ref": "empty-module",
1312
"nqp-js-io": "empty-module",
14-
"sleep": "empty-module"
13+
"sleep": "empty-module",
14+
"bignum": "browserify-bignum"
1515
}
1616
},
1717
output: {

src/vm/js/Compiler.nqp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,6 +1097,11 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
10971097
}
10981098
}
10991099

1100+
my sub loadable($name) {
1101+
# workaround for webpack
1102+
quote_string($name) ~ ", function() \{return require({quote_string($name)})\}";
1103+
}
1104+
11001105
multi method as_js(QAST::CompUnit $node, :$want, :$cps) {
11011106
# Should have a single child which is the outer block.
11021107
if +@($node) != 1 || !nqp::istype($node[0], QAST::Block) {
@@ -1124,13 +1129,13 @@ class QAST::CompilerJS does DWIMYNameMangling does SerializeOnce {
11241129
if nqp::istype($op, QAST::Op) && $op.op eq 'forceouterctx' {
11251130
$*SETTING_NAME := $op[1][1].value;
11261131
$*SETTING_TARGET := $op[0].value;
1127-
$pre := $pre ~ "nqp.load_setting({quote_string($*SETTING_NAME)});\n";
1132+
$pre := $pre ~ "nqp.load_setting({loadable($*SETTING_NAME ~ '.setting')});\n";
11281133
# HACK to get nqp::sprintf to work
11291134
$pre := $pre ~ "require('sprintf');\n";
11301135
} elsif nqp::istype($op, QAST::Op)
11311136
&& $op.op eq 'callmethod'
11321137
&& $op.name eq 'load_module' {
1133-
$pre := $pre ~ "nqp.load_module({quote_string($op[1].value)});\n";
1138+
$pre := $pre ~ "nqp.load_module({loadable($op[1].value)});\n";
11341139
} else {
11351140
# self.log($op.dump);
11361141
}

src/vm/js/nqp-loader/main.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ module.exports = function(source) {
3131
var tmp = temp.openSync();
3232
fs.writeFileSync(tmp.path, source);
3333

34-
var command = "cd "+path+";.//nqp-js --setting=NULL --target=js --source-map '" + tmp.path + "'";
34+
var command = "cd "+path+";.//nqp-js --target=js --source-map '" + tmp.path + "'";
3535

3636

3737
var result = child_process.execSync(command, {encoding:"utf8"});

src/vm/js/nqp-runtime/deserialization.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,10 +595,11 @@ BinaryCursor.prototype.deserialize = function(sc) {
595595

596596
var declareCuids = 'var ' + cuids.join(',') + ';\n';
597597

598-
var prelude = "var nqp = require('nqp-runtime');\n";
598+
var prelude = ";\n";
599599
if (code) {
600600
/* TODO reduce accidental poisoning */
601601
/* TODO make cuids be in scope */
602+
var nqp = require('nqp-runtime');
602603
eval(prelude + declareCuids + code);
603604
}
604605

src/vm/js/nqp-runtime/runtime.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,19 @@ function saveCtx(where, block) {
6565
saveCtxAs = old;
6666
}
6767

68-
exports.load_setting = function(settingName) {
69-
exports.load_module(settingName + '.setting');
70-
};
71-
72-
exports.load_module = function(module) {
68+
exports.load_module = function(module, helper) {
7369
saveCtx(module, function() {
7470
module = module.replace(/::/g, '/');
75-
require(module);
71+
if (helper) {
72+
helper();
73+
} else {
74+
require(module);
75+
}
7676
});
7777
};
7878

79+
exports.load_setting = exports.load_module;
80+
7981
exports.setup_setting = function(settingName) {
8082
return savedCtxs[settingName + '.setting'];
8183
};

0 commit comments

Comments
 (0)