調査中なので推測や誤解があるものとして読んでください。
Rhinoで 1=1
を評価すると ParserException
が発生する
$ java -jar buildGradle/libs/rhino-1.7.14-SNAPSHOT.jar -version 200
Rhino 1.7.14-SNAPSHOT 2021 04 04
js> 1 = 1
diff --git a/src/org/mozilla/javascript/optimizer/Codegen.java b/src/org/mozilla/javascript/optimizer/Codegen.java | |
index 7e518cc3..99901b1f 100644 | |
--- a/src/org/mozilla/javascript/optimizer/Codegen.java | |
+++ b/src/org/mozilla/javascript/optimizer/Codegen.java | |
@@ -301,6 +301,11 @@ public class Codegen implements Evaluator { | |
emitTemplateLiteralInit(cfw); | |
emitConstantDudeInitializers(cfw); | |
+ try { | |
+ java.nio.file.Files.write(java.nio.file.Paths.get("try.class"), cfw.toByteArray()); |
var props = [ | |
"constructor", | |
"toString", | |
"toSource", | |
"valueOf", | |
"charAt", | |
"charCodeAt", | |
"indexOf", | |
"lastIndexOf", | |
"split", |
macro asmfn { | |
case $name:ident ($params ...) { $body ... } => { | |
function $name(asmfn_params($params ...)) { | |
'use asm'; | |
asmfn_convparams($params ...) | |
$body ... | |
} | |
} | |
// case $name:ident ($params ...): $ret_type { $body ... } => { | |
// macro ret { |
var express = require('express'); | |
var app = express(); | |
app.get('/', function(req, res) { | |
res.type('text/html'); | |
res.send('<script>' + | |
'new EventSource(\'/event/a\').addEventListener(\'message\',function(event) {' + | |
'document.body.appendChild(document.createElement(\'div\')).textContent = event.data;' + | |
'});' + | |
'</script>'); |
function parse(str) { | |
var ir = Packages.jdk.nashorn.internal.ir; | |
var runtime = Packages.jdk.nashorn.internal.runtime; | |
var parser = Packages.jdk.nashorn.internal.parser; | |
var context = runtime.Context.getContext(); | |
var source = new runtime.Source('test', str); | |
var node = new parser.Parser(context.getEnv(), source, new runtime.Context.ThrowErrorManager(), true).parse(); | |
var lexContext = new ir.LexicalContext(); |
function traverseFn(node, fn) { | |
var parents = []; | |
(function f(node) { | |
fn(node, parents); | |
parents.push(node); | |
for (var c in Iterator(node)) { | |
f(c); | |
} | |
parents.pop(); | |
})(node); |
macro bf { | |
case : { $body ... } => { | |
(function() { | |
var env = { | |
p: 0, | |
b: [], | |
buf: new Buffer(1) | |
}; | |
bf_tokenizer[env]($body ...); | |
})(); |
macro bf { | |
case ($body ...) => { | |
eval('var p = 0, b = [], buf = new Buffer(1);'); | |
_bf($body ...); | |
} | |
} | |
macro _bf { | |
case (>) => { | |
eval('p++;'); | |
} |
class MyClass { | |
constructor(a, b, c) { | |
this.sum_ = a + b + c; | |
} | |
sum() { | |
return this.sum_; | |
} | |
} | |
console.log(new MyClass(2, 3, 4).sum()); |