Porting patch from revision 7821 to trunk.
Review URL: http://codereview.chromium.org/6964009
git-svn-id: http://v8.googlecode.com/svn/trunk@7822 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
diff --git a/preparser/preparser-process.cc b/preparser/preparser-process.cc
index 4860946..2dc98c0 100644
--- a/preparser/preparser-process.cc
+++ b/preparser/preparser-process.cc
@@ -1,4 +1,4 @@
-// Copyright 2010 the V8 project authors. All rights reserved.
+// Copyright 2011 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:
@@ -203,74 +203,114 @@
};
+bool IsFlag(const char* arg) {
+ // Anything starting with '-' is considered a flag.
+ // It's summarily ignored for now.
+ return arg[0] == '-';
+}
+
+
+struct ExceptionExpectation {
+ ExceptionExpectation()
+ : throws(false), type(NULL), beg_pos(-1), end_pos(-1) { }
+ bool throws;
+ const char* type;
+ int beg_pos;
+ int end_pos;
+};
+
+
void CheckException(v8::PreParserData* data,
- bool throws,
- const char* message,
- int beg_pos,
- int end_pos) {
+ ExceptionExpectation* expects) {
PreparseDataInterpreter reader(data->data(), data->size());
- if (throws) {
+ if (expects->throws) {
if (!reader.throws()) {
- if (message == NULL) {
+ if (expects->type == NULL) {
fail(data, "Didn't throw as expected\n");
} else {
- fail(data, "Didn't throw \"%s\" as expected\n", message);
+ fail(data, "Didn't throw \"%s\" as expected\n", expects->type);
}
}
- if (message != NULL) {
+ if (expects->type != NULL) {
const char* actual_message = reader.message();
- if (strcmp(message, actual_message)) {
+ if (strcmp(expects->type, actual_message)) {
fail(data, "Wrong error message. Expected <%s>, found <%s>\n",
- message, actual_message);
+ expects->type, actual_message);
}
}
- if (beg_pos >= 0) {
- if (beg_pos != reader.beg_pos()) {
+ if (expects->beg_pos >= 0) {
+ if (expects->beg_pos != reader.beg_pos()) {
fail(data, "Wrong error start position: Expected %i, found %i\n",
- beg_pos, reader.beg_pos());
+ expects->beg_pos, reader.beg_pos());
}
}
- if (end_pos >= 0) {
- if (end_pos != reader.end_pos()) {
+ if (expects->end_pos >= 0) {
+ if (expects->end_pos != reader.end_pos()) {
fail(data, "Wrong error end position: Expected %i, found %i\n",
- end_pos, reader.end_pos());
+ expects->end_pos, reader.end_pos());
}
}
} else if (reader.throws()) {
const char* message = reader.message();
- fail(data, "Throws unexpectedly with message: %s\n",
- message);
+ fail(data, "Throws unexpectedly with message: %s\n", message);
}
}
-int main(int argc, char* argv[]) {
- // Check for filename argument.
- if (argc < 2) {
- fail(NULL, "ERROR: No filename on command line.\n");
- }
- const char* filename = argv[1];
- // Parse expectations.
- bool throws = false;
- const char* throws_message = NULL;
- int throws_beg_pos = -1;
- int throws_end_pos = -1;
- // Check for throws argument.
- if (argc > 2) {
- if (strncmp("throws", argv[2], 6)) {
+ExceptionExpectation ParseExpectation(int argc, const char* argv[]) {
+ ExceptionExpectation expects;
+
+ // Parse exception expectations from (the remainder of) the command line.
+ int arg_index = 0;
+ // Skip any flags.
+ while (argc > arg_index && IsFlag(argv[arg_index])) arg_index++;
+ if (argc > arg_index) {
+ if (strncmp("throws", argv[arg_index], 7)) {
+ // First argument after filename, if present, must be the verbatim
+ // "throws", marking that the preparsing should fail with an exception.
fail(NULL, "ERROR: Extra arguments not prefixed by \"throws\".\n");
}
- throws = true;
- if (argc > 3) {
- throws_message = argv[3];
- }
- if (argc > 4) {
- throws_beg_pos = atoi(argv[4]);
- }
- if (argc > 5) {
- throws_end_pos = atoi(argv[5]);
+ expects.throws = true;
+ do {
+ arg_index++;
+ } while (argc > arg_index && IsFlag(argv[arg_index]));
+ if (argc > arg_index) {
+ // Next argument is the exception type identifier.
+ expects.type = argv[arg_index];
+ do {
+ arg_index++;
+ } while (argc > arg_index && IsFlag(argv[arg_index]));
+ if (argc > arg_index) {
+ expects.beg_pos = atoi(argv[arg_index]);
+ do {
+ arg_index++;
+ } while (argc > arg_index && IsFlag(argv[arg_index]));
+ if (argc > arg_index) {
+ expects.end_pos = atoi(argv[arg_index]);
+ }
+ }
}
}
+ return expects;
+}
+
+
+int main(int argc, const char* argv[]) {
+ // Parse command line.
+ // Format: preparser <scriptfile> ["throws" [<exn-type> [<start> [<end>]]]]
+ // Any flags on the line are ignored.
+
+ // Check for mandatory filename argument.
+ int arg_index = 1;
+ while (argc > arg_index && IsFlag(argv[arg_index])) arg_index++;
+ if (argc <= arg_index) {
+ fail(NULL, "ERROR: No filename on command line.\n");
+ }
+ const char* filename = argv[arg_index];
+ // Check remainder of command line for exception expectations.
+ arg_index++;
+ ExceptionExpectation expects =
+ ParseExpectation(argc - arg_index, argv + arg_index);
// Open JS file.
FILE* input = fopen(filename, "rb");
@@ -310,8 +350,7 @@
// Check that the expected exception is thrown, if an exception is
// expected.
- CheckException(&data, throws, throws_message,
- throws_beg_pos, throws_end_pos);
+ CheckException(&data, &expects);
return EXIT_SUCCESS;
}
diff --git a/src/version.cc b/src/version.cc
index dd89f61..ca870e5 100644
--- a/src/version.cc
+++ b/src/version.cc
@@ -35,7 +35,7 @@
#define MAJOR_VERSION 3
#define MINOR_VERSION 3
#define BUILD_NUMBER 5
-#define PATCH_LEVEL 1
+#define PATCH_LEVEL 2
// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
#define IS_CANDIDATE_VERSION 0