import java.io.PrintWriter;
import java.io.StringWriter;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JavaImporterBug {
	public static void main(String[] args) throws ScriptException, NoSuchMethodException { 
		ScriptEngineManager manager = new ScriptEngineManager(); 
		ScriptEngine engine = manager.getEngineByName("javascript"); 

		String script = getScript(1366); 
		printScript(script); 

		engine.eval(script); 
		if (engine instanceof Invocable) { 
			((Invocable) engine).invokeFunction("func"); 
		} 
	} 

	private static String getScript(int functionStatementCount) { 
		StringWriter script = new StringWriter(); 
		PrintWriter writer = new PrintWriter(script); 
		writer.println("var imports = new JavaImporter(java.lang);"); 
		writer.println("with (imports) {"); 
		writer.println(" function func() {"); 
		writer.println(" System.out.println(\"Hello function\"); // first statement "); 
		for (int count = 2; count <= functionStatementCount; count++) { 
			writer.println(" System.out.println(\"Hello again\"); // function statement " + count); 
		} 
		writer.println(" }"); 
		writer.println("}"); 
		writer.println(); 
		return script.toString(); 
	} 

	private static void printScript(String script) { 
		int lineNo = 0; 
		for (String line : script.split("\\R")) { 
			System.out.println(++lineNo + "\t" + line); 
		} 
	} 
}
