8055395: Nashorn should use source, target to be 1.8 and use ASM5 version for generated code
Reviewed-by: attila, lagergren, jlaskey
This commit is contained in:
parent
47a0c94d3f
commit
fa78f33af1
nashorn
buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen
Main.javaMethodGenerator.javaNullVisitor.javaScriptClassInfoCollector.javaScriptClassInstrumentor.java
make
samples
@ -32,6 +32,7 @@ import java.io.IOException;
|
|||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import jdk.internal.org.objectweb.asm.ClassReader;
|
import jdk.internal.org.objectweb.asm.ClassReader;
|
||||||
import jdk.internal.org.objectweb.asm.ClassWriter;
|
import jdk.internal.org.objectweb.asm.ClassWriter;
|
||||||
|
import jdk.internal.org.objectweb.asm.Opcodes;
|
||||||
import jdk.internal.org.objectweb.asm.util.CheckClassAdapter;
|
import jdk.internal.org.objectweb.asm.util.CheckClassAdapter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -39,6 +40,11 @@ import jdk.internal.org.objectweb.asm.util.CheckClassAdapter;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class Main {
|
public class Main {
|
||||||
|
/**
|
||||||
|
* ASM version to be used by nasgen tool.
|
||||||
|
*/
|
||||||
|
public static final int ASM_VERSION = Opcodes.ASM5;
|
||||||
|
|
||||||
private static final boolean DEBUG = Boolean.getBoolean("nasgen.debug");
|
private static final boolean DEBUG = Boolean.getBoolean("nasgen.debug");
|
||||||
|
|
||||||
private interface ErrorReporter {
|
private interface ErrorReporter {
|
||||||
|
@ -32,7 +32,6 @@ import static jdk.internal.org.objectweb.asm.Opcodes.ACONST_NULL;
|
|||||||
import static jdk.internal.org.objectweb.asm.Opcodes.ALOAD;
|
import static jdk.internal.org.objectweb.asm.Opcodes.ALOAD;
|
||||||
import static jdk.internal.org.objectweb.asm.Opcodes.ANEWARRAY;
|
import static jdk.internal.org.objectweb.asm.Opcodes.ANEWARRAY;
|
||||||
import static jdk.internal.org.objectweb.asm.Opcodes.ARETURN;
|
import static jdk.internal.org.objectweb.asm.Opcodes.ARETURN;
|
||||||
import static jdk.internal.org.objectweb.asm.Opcodes.ASM4;
|
|
||||||
import static jdk.internal.org.objectweb.asm.Opcodes.ASTORE;
|
import static jdk.internal.org.objectweb.asm.Opcodes.ASTORE;
|
||||||
import static jdk.internal.org.objectweb.asm.Opcodes.BALOAD;
|
import static jdk.internal.org.objectweb.asm.Opcodes.BALOAD;
|
||||||
import static jdk.internal.org.objectweb.asm.Opcodes.BASTORE;
|
import static jdk.internal.org.objectweb.asm.Opcodes.BASTORE;
|
||||||
@ -96,7 +95,7 @@ public class MethodGenerator extends MethodVisitor {
|
|||||||
private final Type[] argumentTypes;
|
private final Type[] argumentTypes;
|
||||||
|
|
||||||
MethodGenerator(final MethodVisitor mv, final int access, final String name, final String descriptor) {
|
MethodGenerator(final MethodVisitor mv, final int access, final String name, final String descriptor) {
|
||||||
super(ASM4, mv);
|
super(Main.ASM_VERSION, mv);
|
||||||
this.access = access;
|
this.access = access;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.descriptor = descriptor;
|
this.descriptor = descriptor;
|
||||||
|
@ -29,7 +29,6 @@ import jdk.internal.org.objectweb.asm.AnnotationVisitor;
|
|||||||
import jdk.internal.org.objectweb.asm.ClassVisitor;
|
import jdk.internal.org.objectweb.asm.ClassVisitor;
|
||||||
import jdk.internal.org.objectweb.asm.FieldVisitor;
|
import jdk.internal.org.objectweb.asm.FieldVisitor;
|
||||||
import jdk.internal.org.objectweb.asm.MethodVisitor;
|
import jdk.internal.org.objectweb.asm.MethodVisitor;
|
||||||
import jdk.internal.org.objectweb.asm.Opcodes;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A visitor that does nothing on visitXXX calls.
|
* A visitor that does nothing on visitXXX calls.
|
||||||
@ -37,7 +36,7 @@ import jdk.internal.org.objectweb.asm.Opcodes;
|
|||||||
*/
|
*/
|
||||||
public class NullVisitor extends ClassVisitor {
|
public class NullVisitor extends ClassVisitor {
|
||||||
NullVisitor() {
|
NullVisitor() {
|
||||||
super(Opcodes.ASM4);
|
super(Main.ASM_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -47,7 +46,7 @@ public class NullVisitor extends ClassVisitor {
|
|||||||
final String desc,
|
final String desc,
|
||||||
final String signature,
|
final String signature,
|
||||||
final String[] exceptions) {
|
final String[] exceptions) {
|
||||||
return new MethodVisitor(Opcodes.ASM4) {
|
return new MethodVisitor(Main.ASM_VERSION) {
|
||||||
@Override
|
@Override
|
||||||
public AnnotationVisitor visitAnnotationDefault() {
|
public AnnotationVisitor visitAnnotationDefault() {
|
||||||
return new NullAnnotationVisitor();
|
return new NullAnnotationVisitor();
|
||||||
@ -67,7 +66,7 @@ public class NullVisitor extends ClassVisitor {
|
|||||||
final String desc,
|
final String desc,
|
||||||
final String signature,
|
final String signature,
|
||||||
final Object value) {
|
final Object value) {
|
||||||
return new FieldVisitor(Opcodes.ASM4) {
|
return new FieldVisitor(Main.ASM_VERSION) {
|
||||||
@Override
|
@Override
|
||||||
public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) {
|
public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) {
|
||||||
return new NullAnnotationVisitor();
|
return new NullAnnotationVisitor();
|
||||||
@ -82,7 +81,7 @@ public class NullVisitor extends ClassVisitor {
|
|||||||
|
|
||||||
private static class NullAnnotationVisitor extends AnnotationVisitor {
|
private static class NullAnnotationVisitor extends AnnotationVisitor {
|
||||||
NullAnnotationVisitor() {
|
NullAnnotationVisitor() {
|
||||||
super(Opcodes.ASM4);
|
super(Main.ASM_VERSION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,7 @@ public class ScriptClassInfoCollector extends ClassVisitor {
|
|||||||
private String javaClassName;
|
private String javaClassName;
|
||||||
|
|
||||||
ScriptClassInfoCollector(final ClassVisitor visitor) {
|
ScriptClassInfoCollector(final ClassVisitor visitor) {
|
||||||
super(Opcodes.ASM4, visitor);
|
super(Main.ASM_VERSION, visitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
ScriptClassInfoCollector() {
|
ScriptClassInfoCollector() {
|
||||||
@ -80,7 +80,7 @@ public class ScriptClassInfoCollector extends ClassVisitor {
|
|||||||
public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
|
public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
|
||||||
final AnnotationVisitor delegateAV = super.visitAnnotation(desc, visible);
|
final AnnotationVisitor delegateAV = super.visitAnnotation(desc, visible);
|
||||||
if (SCRIPT_CLASS_ANNO_DESC.equals(desc)) {
|
if (SCRIPT_CLASS_ANNO_DESC.equals(desc)) {
|
||||||
return new AnnotationVisitor(Opcodes.ASM4, delegateAV) {
|
return new AnnotationVisitor(Main.ASM_VERSION, delegateAV) {
|
||||||
@Override
|
@Override
|
||||||
public void visit(final String name, final Object value) {
|
public void visit(final String name, final Object value) {
|
||||||
if ("value".equals(name)) {
|
if ("value".equals(name)) {
|
||||||
@ -98,7 +98,7 @@ public class ScriptClassInfoCollector extends ClassVisitor {
|
|||||||
public FieldVisitor visitField(final int fieldAccess, final String fieldName, final String fieldDesc, final String signature, final Object value) {
|
public FieldVisitor visitField(final int fieldAccess, final String fieldName, final String fieldDesc, final String signature, final Object value) {
|
||||||
final FieldVisitor delegateFV = super.visitField(fieldAccess, fieldName, fieldDesc, signature, value);
|
final FieldVisitor delegateFV = super.visitField(fieldAccess, fieldName, fieldDesc, signature, value);
|
||||||
|
|
||||||
return new FieldVisitor(Opcodes.ASM4, delegateFV) {
|
return new FieldVisitor(Main.ASM_VERSION, delegateFV) {
|
||||||
@Override
|
@Override
|
||||||
public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) {
|
public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) {
|
||||||
final AnnotationVisitor delegateAV = super.visitAnnotation(descriptor, visible);
|
final AnnotationVisitor delegateAV = super.visitAnnotation(descriptor, visible);
|
||||||
@ -117,7 +117,7 @@ public class ScriptClassInfoCollector extends ClassVisitor {
|
|||||||
|
|
||||||
addScriptMember(memInfo);
|
addScriptMember(memInfo);
|
||||||
|
|
||||||
return new AnnotationVisitor(Opcodes.ASM4, delegateAV) {
|
return new AnnotationVisitor(Main.ASM_VERSION, delegateAV) {
|
||||||
// These could be "null" if values are not suppiled,
|
// These could be "null" if values are not suppiled,
|
||||||
// in which case we have to use the default values.
|
// in which case we have to use the default values.
|
||||||
private String name;
|
private String name;
|
||||||
@ -180,7 +180,7 @@ public class ScriptClassInfoCollector extends ClassVisitor {
|
|||||||
final MethodVisitor delegateMV = super.visitMethod(methodAccess, methodName, methodDesc,
|
final MethodVisitor delegateMV = super.visitMethod(methodAccess, methodName, methodDesc,
|
||||||
signature, exceptions);
|
signature, exceptions);
|
||||||
|
|
||||||
return new MethodVisitor(Opcodes.ASM4, delegateMV) {
|
return new MethodVisitor(Main.ASM_VERSION, delegateMV) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) {
|
public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) {
|
||||||
@ -201,7 +201,7 @@ public class ScriptClassInfoCollector extends ClassVisitor {
|
|||||||
|
|
||||||
addScriptMember(memInfo);
|
addScriptMember(memInfo);
|
||||||
|
|
||||||
return new AnnotationVisitor(Opcodes.ASM4, delegateAV) {
|
return new AnnotationVisitor(Main.ASM_VERSION, delegateAV) {
|
||||||
// These could be "null" if values are not suppiled,
|
// These could be "null" if values are not suppiled,
|
||||||
// in which case we have to use the default values.
|
// in which case we have to use the default values.
|
||||||
private String name;
|
private String name;
|
||||||
|
@ -73,7 +73,7 @@ public class ScriptClassInstrumentor extends ClassVisitor {
|
|||||||
private boolean staticInitFound;
|
private boolean staticInitFound;
|
||||||
|
|
||||||
ScriptClassInstrumentor(final ClassVisitor visitor, final ScriptClassInfo sci) {
|
ScriptClassInstrumentor(final ClassVisitor visitor, final ScriptClassInfo sci) {
|
||||||
super(Opcodes.ASM4, visitor);
|
super(Main.ASM_VERSION, visitor);
|
||||||
if (sci == null) {
|
if (sci == null) {
|
||||||
throw new IllegalArgumentException("Null ScriptClassInfo, is the class annotated?");
|
throw new IllegalArgumentException("Null ScriptClassInfo, is the class annotated?");
|
||||||
}
|
}
|
||||||
@ -103,7 +103,7 @@ public class ScriptClassInstrumentor extends ClassVisitor {
|
|||||||
|
|
||||||
final FieldVisitor delegateFV = super.visitField(fieldAccess, fieldName, fieldDesc,
|
final FieldVisitor delegateFV = super.visitField(fieldAccess, fieldName, fieldDesc,
|
||||||
signature, value);
|
signature, value);
|
||||||
return new FieldVisitor(Opcodes.ASM4, delegateFV) {
|
return new FieldVisitor(Main.ASM_VERSION, delegateFV) {
|
||||||
@Override
|
@Override
|
||||||
public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
|
public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
|
||||||
if (ScriptClassInfo.annotations.containsKey(desc)) {
|
if (ScriptClassInfo.annotations.containsKey(desc)) {
|
||||||
@ -140,7 +140,7 @@ public class ScriptClassInstrumentor extends ClassVisitor {
|
|||||||
final MethodGenerator delegateMV = new MethodGenerator(super.visitMethod(methodAccess, methodName, methodDesc,
|
final MethodGenerator delegateMV = new MethodGenerator(super.visitMethod(methodAccess, methodName, methodDesc,
|
||||||
signature, exceptions), methodAccess, methodName, methodDesc);
|
signature, exceptions), methodAccess, methodName, methodDesc);
|
||||||
|
|
||||||
return new MethodVisitor(Opcodes.ASM4, delegateMV) {
|
return new MethodVisitor(Main.ASM_VERSION, delegateMV) {
|
||||||
@Override
|
@Override
|
||||||
public void visitInsn(final int opcode) {
|
public void visitInsn(final int opcode) {
|
||||||
// call $clinit$ just before return from <clinit>
|
// call $clinit$ just before return from <clinit>
|
||||||
|
@ -128,6 +128,7 @@
|
|||||||
<compilerarg value="-Xlint:all"/>
|
<compilerarg value="-Xlint:all"/>
|
||||||
<compilerarg value="-XDignore.symbol.file"/>
|
<compilerarg value="-XDignore.symbol.file"/>
|
||||||
<compilerarg value="-Xdiags:verbose"/>
|
<compilerarg value="-Xdiags:verbose"/>
|
||||||
|
<compilerarg value="-parameters"/>
|
||||||
</javac>
|
</javac>
|
||||||
<copy todir="${build.classes.dir}/META-INF/services">
|
<copy todir="${build.classes.dir}/META-INF/services">
|
||||||
<fileset dir="${meta.inf.dir}/services/"/>
|
<fileset dir="${meta.inf.dir}/services/"/>
|
||||||
|
@ -28,8 +28,8 @@ jdk.asm.src.dir=../jdk/src/share/classes/jdk/internal/org/objectweb/asm
|
|||||||
|
|
||||||
# source and target levels
|
# source and target levels
|
||||||
build.compiler=modern
|
build.compiler=modern
|
||||||
javac.source=1.7
|
javac.source=1.8
|
||||||
javac.target=1.7
|
javac.target=1.8
|
||||||
|
|
||||||
# nashorn version information
|
# nashorn version information
|
||||||
nashorn.version=0.1
|
nashorn.version=0.1
|
||||||
|
87
nashorn/samples/find_nonfinals.js
Normal file
87
nashorn/samples/find_nonfinals.js
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of Oracle nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Nashorn project uses "final" modifier for method parameters
|
||||||
|
* (like 'val' of Scala). This tool finds method parameters that
|
||||||
|
* miss final modifier.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Usage: jjs -J-Djava.ext.dirs=<your_nashorn_jar_dir> find_nonfinals.js
|
||||||
|
|
||||||
|
var Class = Java.type("java.lang.Class");
|
||||||
|
var System = Java.type("java.lang.System");
|
||||||
|
var File = Java.type("java.io.File");
|
||||||
|
var JarFile = Java.type("java.util.jar.JarFile");
|
||||||
|
var Modifier = Java.type("java.lang.reflect.Modifier");
|
||||||
|
|
||||||
|
// locate nashorn.jar from java.ext.dirs
|
||||||
|
function findNashorn() {
|
||||||
|
var paths = System.getProperty("java.ext.dirs").split(':');
|
||||||
|
for each (var p in paths) {
|
||||||
|
var nashorn = p + File.separator + "nashorn.jar";
|
||||||
|
if (new File(nashorn).exists()) {
|
||||||
|
return nashorn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// analyze a single Class and print info on non-final parameters
|
||||||
|
function analyzeClass(cls) {
|
||||||
|
var methods = cls.getDeclaredMethods();
|
||||||
|
for each (var method in methods) {
|
||||||
|
// this requires -parameters option when compiling java sources
|
||||||
|
var params = method.parameters;
|
||||||
|
for each (var p in params) {
|
||||||
|
var modifiers = p.modifiers;
|
||||||
|
if (!Modifier.isFinal(modifiers)) {
|
||||||
|
if (! method.name.startsWith("access$")) {
|
||||||
|
print(method);
|
||||||
|
print(" ->", p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var jarFile = findNashorn();
|
||||||
|
// load each class and use reflection to analyze each Class
|
||||||
|
new JarFile(jarFile).stream().forEach(
|
||||||
|
function(entry) {
|
||||||
|
var name = entry.name;
|
||||||
|
if (name.endsWith(".class")) {
|
||||||
|
var clsName = name.substring(0, name.lastIndexOf('.class'));
|
||||||
|
clsName = clsName.replace(/\//g, '.');
|
||||||
|
var cls = Class.forName(clsName);
|
||||||
|
analyzeClass(cls);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
65
nashorn/samples/try_with_resource.js
Normal file
65
nashorn/samples/try_with_resource.js
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of Oracle nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
||||||
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This sample implements Java-like try..with..resource construct for nashorn */
|
||||||
|
|
||||||
|
if (arguments.length == 0) {
|
||||||
|
print("Usage: jjs try_with_resource.js -- <file name>");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Object.create accepts prototype and properties object
|
||||||
|
function With(res) {
|
||||||
|
return Object.create(With.prototype,
|
||||||
|
{ res: { value: res } });
|
||||||
|
}
|
||||||
|
|
||||||
|
// reserved words can be used as property names - for example "try"
|
||||||
|
With.prototype.try = function(callback) {
|
||||||
|
try {
|
||||||
|
callback();
|
||||||
|
} finally {
|
||||||
|
this.res.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var BufferedReader = Java.type("java.io.BufferedReader");
|
||||||
|
var FileReader = Java.type("java.io.FileReader");
|
||||||
|
|
||||||
|
var r = new BufferedReader(new FileReader(arguments[0]));
|
||||||
|
|
||||||
|
// Java-like try..with..resource
|
||||||
|
With(r).try(function() {
|
||||||
|
var s;
|
||||||
|
while ((s = r.readLine()) != null) {
|
||||||
|
print(s);
|
||||||
|
}
|
||||||
|
})
|
Loading…
x
Reference in New Issue
Block a user