調査中なので推測や誤解があるものとして読んでください。
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
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); |
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(); |
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>'); |
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 props = [ | |
"constructor", | |
"toString", | |
"toSource", | |
"valueOf", | |
"charAt", | |
"charCodeAt", | |
"indexOf", | |
"lastIndexOf", | |
"split", |
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()); |