From d5e485a3cca23c9ba370ca49f1d456d3be93c939 Mon Sep 17 00:00:00 2001 From: "mvstanton@chromium.org" Date: Fri, 26 Apr 2013 14:26:54 +0000 Subject: [PATCH] Change 'Parse error' to three more informative messages. Replace the 'unable_to_parse' key used in three places with three difference keys. Provide three more informative and less ambiguous error messages in place of 'Parse error'. Add three test/message cases to cover the new messages. BUG=2636 Review URL: https://codereview.chromium.org/14161007 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14462 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/messages.js | 4 ++- src/parser.cc | 4 +-- src/v8natives.js | 2 +- test/message/isvar.js | 31 +++++++++++++++++++++++ test/message/isvar.out | 4 +++ test/message/paren_in_arg_string.js | 29 +++++++++++++++++++++ test/message/paren_in_arg_string.out | 6 +++++ test/message/single-function-literal.js | 32 ++++++++++++++++++++++++ test/message/single-function-literal.out | 5 ++++ 9 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 test/message/isvar.js create mode 100644 test/message/isvar.out create mode 100644 test/message/paren_in_arg_string.js create mode 100644 test/message/paren_in_arg_string.out create mode 100644 test/message/single-function-literal.js create mode 100644 test/message/single-function-literal.out diff --git a/src/messages.js b/src/messages.js index 15a39b7b85..c4de8498f8 100644 --- a/src/messages.js +++ b/src/messages.js @@ -110,7 +110,9 @@ var kMessages = { stack_overflow: ["Maximum call stack size exceeded"], invalid_time_value: ["Invalid time value"], // SyntaxError - unable_to_parse: ["Parse error"], + paren_in_arg_string: ["Function arg string contains parenthesis"], + not_isvar: ["builtin %IS_VAR: not a variable"], + single_function_literal: ["Single function literal required"], invalid_regexp_flags: ["Invalid flags supplied to RegExp constructor '", "%0", "'"], invalid_regexp: ["Invalid RegExp pattern /", "%0", "/"], illegal_break: ["Illegal break statement"], diff --git a/src/parser.cc b/src/parser.cc index 267b8722c5..33b5fab3fc 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -662,7 +662,7 @@ FunctionLiteral* Parser::DoParseProgram(CompilationInfo* info, !body->at(0)->IsExpressionStatement() || !body->at(0)->AsExpressionStatement()-> expression()->IsFunctionLiteral()) { - ReportMessage("unable_to_parse", Vector::empty()); + ReportMessage("single_function_literal", Vector::empty()); ok = false; } } @@ -4752,7 +4752,7 @@ Expression* Parser::ParseV8Intrinsic(bool* ok) { if (args->length() == 1 && args->at(0)->AsVariableProxy() != NULL) { return args->at(0); } else { - ReportMessage("unable_to_parse", Vector::empty()); + ReportMessage("not_isvar", Vector::empty()); *ok = false; return NULL; } diff --git a/src/v8natives.js b/src/v8natives.js index 83b561859a..425863e501 100644 --- a/src/v8natives.js +++ b/src/v8natives.js @@ -1766,7 +1766,7 @@ function NewFunction(arg1) { // length == 1 // If the formal parameters string include ) - an illegal // character - it may make the combined function expression // compile. We avoid this problem by checking for this early on. - if (p.indexOf(')') != -1) throw MakeSyntaxError('unable_to_parse',[]); + if (p.indexOf(')') != -1) throw MakeSyntaxError('paren_in_arg_string',[]); // If the formal parameters include an unbalanced block comment, the // function must be rejected. Since JavaScript does not allow nested // comments we can include a trailing block comment to catch this. diff --git a/test/message/isvar.js b/test/message/isvar.js new file mode 100644 index 0000000000..67793a00b9 --- /dev/null +++ b/test/message/isvar.js @@ -0,0 +1,31 @@ +// Copyright 2008 the V8 project authors. 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 Google Inc. 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. + +// Flags: --allow-natives-syntax +var x; +%IS_VAR(x); +%IS_VAR(x+x); \ No newline at end of file diff --git a/test/message/isvar.out b/test/message/isvar.out new file mode 100644 index 0000000000..6d5cca3345 --- /dev/null +++ b/test/message/isvar.out @@ -0,0 +1,4 @@ +*%(basename)s:31: SyntaxError: builtin %%IS_VAR: not a variable +%%IS_VAR(x+x); + ^ +SyntaxError: builtin %%IS_VAR: not a variable diff --git a/test/message/paren_in_arg_string.js b/test/message/paren_in_arg_string.js new file mode 100644 index 0000000000..bab762a6a4 --- /dev/null +++ b/test/message/paren_in_arg_string.js @@ -0,0 +1,29 @@ +// Copyright 2008 the V8 project authors. 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 Google Inc. 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. + +var paren_in_arg_string_good = new Function('x', 'return;'); +var paren_in_arg_string_bad = new Function(')', 'return;'); \ No newline at end of file diff --git a/test/message/paren_in_arg_string.out b/test/message/paren_in_arg_string.out new file mode 100644 index 0000000000..3bc978b965 --- /dev/null +++ b/test/message/paren_in_arg_string.out @@ -0,0 +1,6 @@ +*%(basename)s:29: SyntaxError: Function arg string contains parenthesis +var paren_in_arg_string_bad = new Function(')', 'return;'); + ^ +SyntaxError: Function arg string contains parenthesis + at Function () + at *%(basename)s:29:31 \ No newline at end of file diff --git a/test/message/single-function-literal.js b/test/message/single-function-literal.js new file mode 100644 index 0000000000..372063737f --- /dev/null +++ b/test/message/single-function-literal.js @@ -0,0 +1,32 @@ +// Copyright 2008 the V8 project authors. 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 Google Inc. 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. + +// Flags: --allow-natives-syntax +var single_function_good = "(function() { return 5; })"; +%CompileString(single_function_good, true); +var single_function_bad = "(function() { return 5; })();"; +%CompileString(single_function_bad, true); \ No newline at end of file diff --git a/test/message/single-function-literal.out b/test/message/single-function-literal.out new file mode 100644 index 0000000000..a6a54b61a5 --- /dev/null +++ b/test/message/single-function-literal.out @@ -0,0 +1,5 @@ +undefined:1: SyntaxError: Single function literal required +(function() { return 5; })(); + ^ +SyntaxError: Single function literal required + at *%(basename)s:32:16 \ No newline at end of file