OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <ctype.h> | 5 #include <ctype.h> |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/assembler.h" | 10 #include "src/assembler.h" |
11 #include "src/base/platform/platform.h" | 11 #include "src/base/platform/platform.h" |
12 #include "src/smart-pointers.h" | 12 #include "src/ostreams.h" |
13 #include "src/string-stream.h" | |
14 | 13 |
15 namespace v8 { | 14 namespace v8 { |
16 namespace internal { | 15 namespace internal { |
17 | 16 |
18 // Define all of our flags. | 17 // Define all of our flags. |
19 #define FLAG_MODE_DEFINE | 18 #define FLAG_MODE_DEFINE |
20 #include "src/flag-definitions.h" // NOLINT | 19 #include "src/flag-definitions.h" // NOLINT |
21 | 20 |
22 // Define all of our flags default values. | 21 // Define all of our flags default values. |
23 #define FLAG_MODE_DEFINE_DEFAULTS | 22 #define FLAG_MODE_DEFINE_DEFAULTS |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 case Flag::TYPE_INT: return "int"; | 174 case Flag::TYPE_INT: return "int"; |
176 case Flag::TYPE_FLOAT: return "float"; | 175 case Flag::TYPE_FLOAT: return "float"; |
177 case Flag::TYPE_STRING: return "string"; | 176 case Flag::TYPE_STRING: return "string"; |
178 case Flag::TYPE_ARGS: return "arguments"; | 177 case Flag::TYPE_ARGS: return "arguments"; |
179 } | 178 } |
180 UNREACHABLE(); | 179 UNREACHABLE(); |
181 return NULL; | 180 return NULL; |
182 } | 181 } |
183 | 182 |
184 | 183 |
185 static SmartArrayPointer<const char> ToString(Flag* flag) { | 184 OStream& operator<<(OStream& os, const Flag& flag) { // NOLINT |
186 HeapStringAllocator string_allocator; | 185 switch (flag.type()) { |
187 StringStream buffer(&string_allocator); | |
188 switch (flag->type()) { | |
189 case Flag::TYPE_BOOL: | 186 case Flag::TYPE_BOOL: |
190 buffer.Add("%s", (*flag->bool_variable() ? "true" : "false")); | 187 os << (*flag.bool_variable() ? "true" : "false"); |
191 break; | 188 break; |
192 case Flag::TYPE_MAYBE_BOOL: | 189 case Flag::TYPE_MAYBE_BOOL: |
193 buffer.Add("%s", flag->maybe_bool_variable()->has_value | 190 os << (flag.maybe_bool_variable()->has_value |
194 ? (flag->maybe_bool_variable()->value ? "true" : "false") | 191 ? (flag.maybe_bool_variable()->value ? "true" : "false") |
195 : "unset"); | 192 : "unset"); |
196 break; | 193 break; |
197 case Flag::TYPE_INT: | 194 case Flag::TYPE_INT: |
198 buffer.Add("%d", *flag->int_variable()); | 195 os << *flag.int_variable(); |
199 break; | 196 break; |
200 case Flag::TYPE_FLOAT: | 197 case Flag::TYPE_FLOAT: |
201 buffer.Add("%f", FmtElm(*flag->float_variable())); | 198 os << *flag.float_variable(); |
202 break; | 199 break; |
203 case Flag::TYPE_STRING: { | 200 case Flag::TYPE_STRING: { |
204 const char* str = flag->string_value(); | 201 const char* str = flag.string_value(); |
205 buffer.Add("%s", str ? str : "NULL"); | 202 os << (str ? str : "NULL"); |
206 break; | 203 break; |
207 } | 204 } |
208 case Flag::TYPE_ARGS: { | 205 case Flag::TYPE_ARGS: { |
209 JSArguments args = *flag->args_variable(); | 206 JSArguments args = *flag.args_variable(); |
210 if (args.argc > 0) { | 207 if (args.argc > 0) { |
211 buffer.Add("%s", args[0]); | 208 os << args[0]; |
212 for (int i = 1; i < args.argc; i++) { | 209 for (int i = 1; i < args.argc; i++) { |
213 buffer.Add(" %s", args[i]); | 210 os << args[i]; |
214 } | 211 } |
215 } | 212 } |
216 break; | 213 break; |
217 } | 214 } |
218 } | 215 } |
219 return buffer.ToCString(); | 216 return os; |
220 } | 217 } |
221 | 218 |
222 | 219 |
223 // static | 220 // static |
224 List<const char*>* FlagList::argv() { | 221 List<const char*>* FlagList::argv() { |
225 List<const char*>* args = new List<const char*>(8); | 222 List<const char*>* args = new List<const char*>(8); |
226 Flag* args_flag = NULL; | 223 Flag* args_flag = NULL; |
227 for (size_t i = 0; i < num_flags; ++i) { | 224 for (size_t i = 0; i < num_flags; ++i) { |
228 Flag* f = &flags[i]; | 225 Flag* f = &flags[i]; |
229 if (!f->IsDefault()) { | 226 if (!f->IsDefault()) { |
230 if (f->type() == Flag::TYPE_ARGS) { | 227 if (f->type() == Flag::TYPE_ARGS) { |
231 ASSERT(args_flag == NULL); | 228 ASSERT(args_flag == NULL); |
232 args_flag = f; // Must be last in arguments. | 229 args_flag = f; // Must be last in arguments. |
233 continue; | 230 continue; |
234 } | 231 } |
235 HeapStringAllocator string_allocator; | 232 { |
236 StringStream buffer(&string_allocator); | 233 bool disabled = f->type() == Flag::TYPE_BOOL && !*f->bool_variable(); |
237 if (f->type() != Flag::TYPE_BOOL || *(f->bool_variable())) { | 234 OStringStream os; |
238 buffer.Add("--%s", f->name()); | 235 os << (disabled ? "--no" : "--") << f->name(); |
239 } else { | 236 args->Add(StrDup(os.c_str())); |
240 buffer.Add("--no%s", f->name()); | |
241 } | 237 } |
242 args->Add(buffer.ToCString().Detach()); | |
243 if (f->type() != Flag::TYPE_BOOL) { | 238 if (f->type() != Flag::TYPE_BOOL) { |
244 args->Add(ToString(f).Detach()); | 239 OStringStream os; |
| 240 os << *f; |
| 241 args->Add(StrDup(os.c_str())); |
245 } | 242 } |
246 } | 243 } |
247 } | 244 } |
248 if (args_flag != NULL) { | 245 if (args_flag != NULL) { |
249 HeapStringAllocator string_allocator; | 246 OStringStream os; |
250 StringStream buffer(&string_allocator); | 247 os << "--" << args_flag->name(); |
251 buffer.Add("--%s", args_flag->name()); | 248 args->Add(StrDup(os.c_str())); |
252 args->Add(buffer.ToCString().Detach()); | |
253 JSArguments jsargs = *args_flag->args_variable(); | 249 JSArguments jsargs = *args_flag->args_variable(); |
254 for (int j = 0; j < jsargs.argc; j++) { | 250 for (int j = 0; j < jsargs.argc; j++) { |
255 args->Add(StrDup(jsargs[j])); | 251 args->Add(StrDup(jsargs[j])); |
256 } | 252 } |
257 } | 253 } |
258 return args; | 254 return args; |
259 } | 255 } |
260 | 256 |
261 | 257 |
262 inline char NormalizeChar(char ch) { | 258 inline char NormalizeChar(char ch) { |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 } | 510 } |
515 } | 511 } |
516 | 512 |
517 | 513 |
518 // static | 514 // static |
519 void FlagList::PrintHelp() { | 515 void FlagList::PrintHelp() { |
520 CpuFeatures::Probe(false); | 516 CpuFeatures::Probe(false); |
521 CpuFeatures::PrintTarget(); | 517 CpuFeatures::PrintTarget(); |
522 CpuFeatures::PrintFeatures(); | 518 CpuFeatures::PrintFeatures(); |
523 | 519 |
524 printf("Usage:\n"); | 520 OFStream os(stdout); |
525 printf(" shell [options] -e string\n"); | 521 os << "Usage:\n" |
526 printf(" execute string in V8\n"); | 522 << " shell [options] -e string\n" |
527 printf(" shell [options] file1 file2 ... filek\n"); | 523 << " execute string in V8\n" |
528 printf(" run JavaScript scripts in file1, file2, ..., filek\n"); | 524 << " shell [options] file1 file2 ... filek\n" |
529 printf(" shell [options]\n"); | 525 << " run JavaScript scripts in file1, file2, ..., filek\n" |
530 printf(" shell [options] --shell [file1 file2 ... filek]\n"); | 526 << " shell [options]\n" |
531 printf(" run an interactive JavaScript shell\n"); | 527 << " shell [options] --shell [file1 file2 ... filek]\n" |
532 printf(" d8 [options] file1 file2 ... filek\n"); | 528 << " run an interactive JavaScript shell\n" |
533 printf(" d8 [options]\n"); | 529 << " d8 [options] file1 file2 ... filek\n" |
534 printf(" d8 [options] --shell [file1 file2 ... filek]\n"); | 530 << " d8 [options]\n" |
535 printf(" run the new debugging shell\n\n"); | 531 << " d8 [options] --shell [file1 file2 ... filek]\n" |
536 printf("Options:\n"); | 532 << " run the new debugging shell\n\n" |
| 533 << "Options:\n"; |
537 for (size_t i = 0; i < num_flags; ++i) { | 534 for (size_t i = 0; i < num_flags; ++i) { |
538 Flag* f = &flags[i]; | 535 Flag* f = &flags[i]; |
539 SmartArrayPointer<const char> value = ToString(f); | 536 os << " --" << f->name() << " (" << f->comment() << ")\n" |
540 printf(" --%s (%s)\n type: %s default: %s\n", | 537 << " type: " << Type2String(f->type()) << " default: " << *f |
541 f->name(), f->comment(), Type2String(f->type()), value.get()); | 538 << "\n"; |
542 } | 539 } |
543 } | 540 } |
544 | 541 |
545 | 542 |
546 // static | 543 // static |
547 void FlagList::EnforceFlagImplications() { | 544 void FlagList::EnforceFlagImplications() { |
548 #define FLAG_MODE_DEFINE_IMPLICATIONS | 545 #define FLAG_MODE_DEFINE_IMPLICATIONS |
549 #include "src/flag-definitions.h" | 546 #include "src/flag-definitions.h" |
550 #undef FLAG_MODE_DEFINE_IMPLICATIONS | 547 #undef FLAG_MODE_DEFINE_IMPLICATIONS |
551 } | 548 } |
552 | 549 |
553 } } // namespace v8::internal | 550 } } // namespace v8::internal |
OLD | NEW |