src/jdk/nashorn/internal/objects/NativeFunction.java

Print this page

        

*** 31,44 **** --- 31,48 ---- import java.util.List; import jdk.nashorn.internal.objects.annotations.Attribute; import jdk.nashorn.internal.objects.annotations.Constructor; import jdk.nashorn.internal.objects.annotations.Function; import jdk.nashorn.internal.objects.annotations.ScriptClass; + import jdk.nashorn.internal.parser.Parser; + import jdk.nashorn.internal.runtime.Context; import jdk.nashorn.internal.runtime.JSType; + import jdk.nashorn.internal.runtime.ParserException; import jdk.nashorn.internal.runtime.ScriptFunction; import jdk.nashorn.internal.runtime.ScriptObject; import jdk.nashorn.internal.runtime.ScriptRuntime; + import jdk.nashorn.internal.runtime.Source; /** * ECMA 15.3 Function Objects * * Note: instances of this class are never created. This class is not even a
*** 185,208 **** public static Object function(final boolean newObj, final Object self, final Object... args) { final StringBuilder sb = new StringBuilder(); sb.append("(function ("); if (args.length > 0) { for (int i = 0; i < args.length - 1; i++) { ! sb.append(JSType.toString(args[i])); if (i < args.length - 2) { ! sb.append(","); } } } sb.append(") {\n"); if (args.length > 0) { ! sb.append(JSType.toString(args[args.length - 1])); sb.append('\n'); } sb.append("})"); final Global global = Global.instance(); return Global.directEval(global, sb.toString(), global, "<function>", Global.isStrict()); } } --- 189,241 ---- public static Object function(final boolean newObj, final Object self, final Object... args) { final StringBuilder sb = new StringBuilder(); sb.append("(function ("); if (args.length > 0) { + final StringBuilder paramListBuf = new StringBuilder(); for (int i = 0; i < args.length - 1; i++) { ! paramListBuf.append(JSType.toString(args[i])); if (i < args.length - 2) { ! paramListBuf.append(","); } } + + final String paramList = paramListBuf.toString(); + if (! paramList.isEmpty()) { + checkFunctionParameters(paramList); + sb.append(paramList); + } } sb.append(") {\n"); if (args.length > 0) { ! final String funcBody = JSType.toString(args[args.length - 1]); ! checkFunctionBody(funcBody); ! sb.append(funcBody); sb.append('\n'); } sb.append("})"); final Global global = Global.instance(); return Global.directEval(global, sb.toString(), global, "<function>", Global.isStrict()); } + + private static void checkFunctionParameters(final String params) { + final Source src = new Source("<function>", params); + final Parser parser = new Parser(Global.getEnv(), src, new Context.ThrowErrorManager()); + try { + parser.parseFormalParameterList(); + } catch (final ParserException pe) { + pe.throwAsEcmaException(); + } + } + + private static void checkFunctionBody(final String funcBody) { + final Source src = new Source("<function>", funcBody); + final Parser parser = new Parser(Global.getEnv(), src, new Context.ThrowErrorManager()); + try { + parser.parseFunctionBody(); + } catch (final ParserException pe) { + pe.throwAsEcmaException(); + } + } }