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 // The infrastructure used for (localized) message reporting in V8. | 5 // The infrastructure used for (localized) message reporting in V8. |
6 // | 6 // |
7 // Note: there's a big unresolved issue about ownership of the data | 7 // Note: there's a big unresolved issue about ownership of the data |
8 // structures used by this framework. | 8 // structures used by this framework. |
9 | 9 |
10 #ifndef V8_MESSAGES_H_ | 10 #ifndef V8_MESSAGES_H_ |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 Handle<JSFunction> function() const { return function_; } | 55 Handle<JSFunction> function() const { return function_; } |
56 | 56 |
57 private: | 57 private: |
58 Handle<Script> script_; | 58 Handle<Script> script_; |
59 int start_pos_; | 59 int start_pos_; |
60 int end_pos_; | 60 int end_pos_; |
61 Handle<JSFunction> function_; | 61 Handle<JSFunction> function_; |
62 }; | 62 }; |
63 | 63 |
64 | 64 |
65 // A message handler is a convenience interface for accessing the list | |
66 // of message listeners registered in an environment | |
67 class MessageHandler { | |
68 public: | |
69 // Returns a message object for the API to use. | |
70 static Handle<JSMessageObject> MakeMessageObject( | |
71 Isolate* isolate, | |
72 const char* type, | |
73 MessageLocation* loc, | |
74 Vector< Handle<Object> > args, | |
75 Handle<JSArray> stack_frames); | |
76 | |
77 // Report a formatted message (needs JS allocation). | |
78 static void ReportMessage(Isolate* isolate, | |
79 MessageLocation* loc, | |
80 Handle<Object> message); | |
81 | |
82 static void DefaultMessageReport(Isolate* isolate, | |
83 const MessageLocation* loc, | |
84 Handle<Object> message_obj); | |
85 static Handle<String> GetMessage(Isolate* isolate, Handle<Object> data); | |
86 static SmartArrayPointer<char> GetLocalizedMessage(Isolate* isolate, | |
87 Handle<Object> data); | |
88 }; | |
89 | |
90 | |
91 class CallSite { | 65 class CallSite { |
92 public: | 66 public: |
93 CallSite(Handle<Object> receiver, Handle<JSFunction> fun, int pos) | 67 CallSite(Handle<Object> receiver, Handle<JSFunction> fun, int pos) |
94 : receiver_(receiver), fun_(fun), pos_(pos) {} | 68 : receiver_(receiver), fun_(fun), pos_(pos) {} |
95 | 69 |
96 Handle<Object> GetFileName(Isolate* isolate); | 70 Handle<Object> GetFileName(Isolate* isolate); |
97 Handle<Object> GetFunctionName(Isolate* isolate); | 71 Handle<Object> GetFunctionName(Isolate* isolate); |
98 Handle<Object> GetScriptNameOrSourceUrl(Isolate* isolate); | 72 Handle<Object> GetScriptNameOrSourceUrl(Isolate* isolate); |
99 Handle<Object> GetMethodName(Isolate* isolate); | 73 Handle<Object> GetMethodName(Isolate* isolate); |
100 // Return 1-based line number, including line offset. | 74 // Return 1-based line number, including line offset. |
101 int GetLineNumber(Isolate* isolate); | 75 int GetLineNumber(Isolate* isolate); |
102 // Return 1-based column number, including column offset if first line. | 76 // Return 1-based column number, including column offset if first line. |
103 int GetColumnNumber(Isolate* isolate); | 77 int GetColumnNumber(Isolate* isolate); |
104 bool IsNative(Isolate* isolate); | 78 bool IsNative(Isolate* isolate); |
105 bool IsToplevel(Isolate* isolate); | 79 bool IsToplevel(Isolate* isolate); |
106 bool IsEval(Isolate* isolate); | 80 bool IsEval(Isolate* isolate); |
107 bool IsConstructor(Isolate* isolate); | 81 bool IsConstructor(Isolate* isolate); |
108 | 82 |
109 private: | 83 private: |
110 Handle<Object> receiver_; | 84 Handle<Object> receiver_; |
111 Handle<JSFunction> fun_; | 85 Handle<JSFunction> fun_; |
112 int pos_; | 86 int pos_; |
113 }; | 87 }; |
114 | 88 |
115 | 89 |
116 #define MESSAGE_TEMPLATES(T) \ | 90 #define MESSAGE_TEMPLATES(T) \ |
117 /* Error */ \ | 91 /* Error */ \ |
| 92 T(None, "") \ |
118 T(CyclicProto, "Cyclic __proto__ value") \ | 93 T(CyclicProto, "Cyclic __proto__ value") \ |
| 94 T(DebuggerLoading, "Error loading debugger") \ |
119 T(DefaultOptionsMissing, "Internal % error. Default options are missing.") \ | 95 T(DefaultOptionsMissing, "Internal % error. Default options are missing.") \ |
| 96 T(UncaughtException, "Uncaught %") \ |
120 T(Unsupported, "Not supported") \ | 97 T(Unsupported, "Not supported") \ |
121 T(WrongServiceType, "Internal error, wrong service type: %") \ | 98 T(WrongServiceType, "Internal error, wrong service type: %") \ |
122 T(WrongValueType, "Internal error. Wrong value type.") \ | 99 T(WrongValueType, "Internal error. Wrong value type.") \ |
123 /* TypeError */ \ | 100 /* TypeError */ \ |
124 T(ApplyNonFunction, \ | 101 T(ApplyNonFunction, \ |
125 "Function.prototype.apply was called on %, which is a % and not a " \ | 102 "Function.prototype.apply was called on %, which is a % and not a " \ |
126 "function") \ | 103 "function") \ |
127 T(ArrayFunctionsOnFrozen, "Cannot modify frozen array elements") \ | 104 T(ArrayFunctionsOnFrozen, "Cannot modify frozen array elements") \ |
128 T(ArrayFunctionsOnSealed, "Cannot add/remove sealed array elements") \ | 105 T(ArrayFunctionsOnSealed, "Cannot add/remove sealed array elements") \ |
129 T(ArrayNotSubclassable, "Subclassing Arrays is not currently supported.") \ | 106 T(ArrayNotSubclassable, "Subclassing Arrays is not currently supported.") \ |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 T(UndefinedOrNullToObject, "Cannot convert undefined or null to object") \ | 234 T(UndefinedOrNullToObject, "Cannot convert undefined or null to object") \ |
258 T(ValueAndAccessor, \ | 235 T(ValueAndAccessor, \ |
259 "Invalid property. A property cannot both have accessors and be " \ | 236 "Invalid property. A property cannot both have accessors and be " \ |
260 "writable or have a value, %") \ | 237 "writable or have a value, %") \ |
261 T(VarRedeclaration, "Identifier '%' has already been declared") \ | 238 T(VarRedeclaration, "Identifier '%' has already been declared") \ |
262 T(WithExpression, "% has no properties") \ | 239 T(WithExpression, "% has no properties") \ |
263 T(WrongArgs, "%: Arguments list has wrong type") \ | 240 T(WrongArgs, "%: Arguments list has wrong type") \ |
264 /* ReferenceError */ \ | 241 /* ReferenceError */ \ |
265 T(NonMethod, "'super' is referenced from non-method") \ | 242 T(NonMethod, "'super' is referenced from non-method") \ |
266 T(NotDefined, "% is not defined") \ | 243 T(NotDefined, "% is not defined") \ |
| 244 T(StrongSuperCallMissing, \ |
| 245 "In strong mode, invoking the super constructor in a subclass is " \ |
| 246 "required") \ |
| 247 T(StrongUnboundGlobal, \ |
| 248 "In strong mode, using an undeclared global variable '%' is not allowed") \ |
267 T(UnsupportedSuper, "Unsupported reference to 'super'") \ | 249 T(UnsupportedSuper, "Unsupported reference to 'super'") \ |
268 /* RangeError */ \ | 250 /* RangeError */ \ |
269 T(ArrayLengthOutOfRange, "defineProperty() array length out of range") \ | 251 T(ArrayLengthOutOfRange, "defineProperty() array length out of range") \ |
270 T(DateRange, "Provided date is not in valid range.") \ | 252 T(DateRange, "Provided date is not in valid range.") \ |
271 T(ExpectedLocation, "Expected Area/Location for time zone, got %") \ | 253 T(ExpectedLocation, "Expected Area/Location for time zone, got %") \ |
272 T(InvalidArrayBufferLength, "Invalid array buffer length") \ | 254 T(InvalidArrayBufferLength, "Invalid array buffer length") \ |
273 T(InvalidArrayLength, "Invalid array length") \ | 255 T(InvalidArrayLength, "Invalid array length") \ |
274 T(InvalidCodePoint, "Invalid code point %") \ | 256 T(InvalidCodePoint, "Invalid code point %") \ |
275 T(InvalidCountValue, "Invalid count value") \ | 257 T(InvalidCountValue, "Invalid count value") \ |
276 T(InvalidCurrencyCode, "Invalid currency code: %") \ | 258 T(InvalidCurrencyCode, "Invalid currency code: %") \ |
(...skipping 14 matching lines...) Expand all Loading... |
291 T(NumberFormatRange, "% argument must be between 0 and 20") \ | 273 T(NumberFormatRange, "% argument must be between 0 and 20") \ |
292 T(PropertyValueOutOfRange, "% value is out of range.") \ | 274 T(PropertyValueOutOfRange, "% value is out of range.") \ |
293 T(StackOverflow, "Maximum call stack size exceeded") \ | 275 T(StackOverflow, "Maximum call stack size exceeded") \ |
294 T(ToPrecisionFormatRange, "toPrecision() argument must be between 1 and 21") \ | 276 T(ToPrecisionFormatRange, "toPrecision() argument must be between 1 and 21") \ |
295 T(ToRadixFormatRange, "toString() radix argument must be between 2 and 36") \ | 277 T(ToRadixFormatRange, "toString() radix argument must be between 2 and 36") \ |
296 T(TypedArraySetNegativeOffset, "Start offset is negative") \ | 278 T(TypedArraySetNegativeOffset, "Start offset is negative") \ |
297 T(TypedArraySetSourceTooLarge, "Source is too large") \ | 279 T(TypedArraySetSourceTooLarge, "Source is too large") \ |
298 T(UnsupportedTimeZone, "Unsupported time zone specified %") \ | 280 T(UnsupportedTimeZone, "Unsupported time zone specified %") \ |
299 T(ValueOutOfRange, "Value % out of range for % options property %") \ | 281 T(ValueOutOfRange, "Value % out of range for % options property %") \ |
300 /* SyntaxError */ \ | 282 /* SyntaxError */ \ |
| 283 T(BadGetterArity, "Getter must not have any formal parameters.") \ |
| 284 T(BadSetterArity, "Setter must have exactly one formal parameter.") \ |
| 285 T(ConstructorIsAccessor, "Class constructor may not be an accessor") \ |
| 286 T(ConstructorIsGenerator, "Class constructor may not be a generator") \ |
| 287 T(DerivedConstructorReturn, \ |
| 288 "Derived constructors may only return object or undefined") \ |
| 289 T(DuplicateArrawFunFormalParam, \ |
| 290 "Arrow function may not have duplicate parameter names") \ |
| 291 T(DuplicateConstructor, "A class may only have one constructor") \ |
| 292 T(DuplicateExport, "Duplicate export of '%'") \ |
| 293 T(DuplicateProto, \ |
| 294 "Duplicate __proto__ fields are not allowed in object literals") \ |
| 295 T(ForInLoopInitializer, \ |
| 296 "for-in loop variable declaration may not have an initializer.") \ |
| 297 T(ForInOfLoopMultiBindings, \ |
| 298 "Invalid left-hand side in % loop: Must have a single binding.") \ |
| 299 T(ForOfLoopInitializer, \ |
| 300 "for-of loop variable declaration may not have an initializer.") \ |
| 301 T(IllegalAccess, "Illegal access") \ |
| 302 T(IllegalBreak, "Illegal break statement") \ |
| 303 T(IllegalContinue, "Illegal continue statement") \ |
| 304 T(IllegalReturn, "Illegal return statement") \ |
| 305 T(InvalidLhsInAssignment, "Invalid left-hand side in assignment") \ |
| 306 T(InvalidLhsInFor, "Invalid left-hand side in for-loop") \ |
| 307 T(InvalidLhsInPostfixOp, \ |
| 308 "Invalid left-hand side expression in postfix operation") \ |
| 309 T(InvalidLhsInPrefixOp, \ |
| 310 "Invalid left-hand side expression in prefix operation") \ |
301 T(InvalidRegExpFlags, "Invalid flags supplied to RegExp constructor '%'") \ | 311 T(InvalidRegExpFlags, "Invalid flags supplied to RegExp constructor '%'") \ |
| 312 T(LabelRedeclaration, "Label '%' has already been declared") \ |
| 313 T(MalformedArrowFunParamList, "Malformed arrow function parameter list") \ |
302 T(MalformedRegExp, "Invalid regular expression: /%/: %") \ | 314 T(MalformedRegExp, "Invalid regular expression: /%/: %") \ |
| 315 T(MalformedRegExpFlags, "Invalid regular expression flags") \ |
| 316 T(ModuleExportUndefined, "Export '%' is not defined in module") \ |
| 317 T(MultipleDefaultsInSwitch, \ |
| 318 "More than one default clause in switch statement") \ |
| 319 T(NewlineAfterThrow, "Illegal newline after throw") \ |
| 320 T(NoCatchOrFinally, "Missing catch or finally after try") \ |
| 321 T(NotIsvar, "builtin %%IS_VAR: not a variable") \ |
| 322 T(ParamAfterRest, "Rest parameter must be last formal parameter") \ |
303 T(ParenthesisInArgString, "Function arg string contains parenthesis") \ | 323 T(ParenthesisInArgString, "Function arg string contains parenthesis") \ |
| 324 T(SingleFunctionLiteral, "Single function literal required") \ |
| 325 T(SloppyLexical, \ |
| 326 "Block-scoped declarations (let, const, function, class) not yet " \ |
| 327 "supported outside strict mode") \ |
| 328 T(StrictDelete, "Delete of an unqualified identifier in strict mode.") \ |
| 329 T(StrictEvalArguments, "Unexpected eval or arguments in strict mode") \ |
| 330 T(StrictFunction, \ |
| 331 "In strict mode code, functions can only be declared at top level or " \ |
| 332 "immediately within another function.") \ |
| 333 T(StrictOctalLiteral, "Octal literals are not allowed in strict mode.") \ |
| 334 T(StrictParamDupe, \ |
| 335 "Strict mode function may not have duplicate parameter names") \ |
| 336 T(StrictWith, "Strict mode code may not include a with statement") \ |
| 337 T(StrongArguments, \ |
| 338 "In strong mode, 'arguments' is deprecated, use '...args' instead") \ |
| 339 T(StrongConstructorReturnMisplaced, \ |
| 340 "In strong mode, returning from a constructor before its super " \ |
| 341 "constructor invocation or all assignments to 'this' is deprecated") \ |
| 342 T(StrongConstructorReturnValue, \ |
| 343 "In strong mode, returning a value from a constructor is deprecated") \ |
| 344 T(StrongConstructorSuper, \ |
| 345 "In strong mode, 'super' can only be used to invoke the super " \ |
| 346 "constructor, and cannot be nested inside another statement or " \ |
| 347 "expression") \ |
| 348 T(StrongConstructorThis, \ |
| 349 "In strong mode, 'this' can only be used to initialize properties, and " \ |
| 350 "cannot be nested inside another statement or expression") \ |
| 351 T(StrongDelete, \ |
| 352 "In strong mode, 'delete' is deprecated, use maps or sets instead") \ |
| 353 T(StrongDirectEval, "In strong mode, direct calls to eval are deprecated") \ |
| 354 T(StrongEllision, \ |
| 355 "In strong mode, arrays with holes are deprecated, use maps instead") \ |
| 356 T(StrongEmpty, \ |
| 357 "In strong mode, empty sub-statements are deprecated, make them explicit " \ |
| 358 "with '{}' instead") \ |
| 359 T(StrongEqual, \ |
| 360 "In strong mode, '==' and '!=' are deprecated, use '===' and '!==' " \ |
| 361 "instead") \ |
| 362 T(StrongForIn, \ |
| 363 "In strong mode, 'for'-'in' loops are deprecated, use 'for'-'of' instead") \ |
| 364 T(StrongSuperCallDuplicate, \ |
| 365 "In strong mode, invoking the super constructor multiple times is " \ |
| 366 "deprecated") \ |
| 367 T(StrongSuperCallMisplaced, \ |
| 368 "In strong mode, the super constructor must be invoked before any " \ |
| 369 "assignment to 'this'") \ |
| 370 T(StrongSwitchFallthrough, \ |
| 371 "In strong mode, switch fall-through is deprecated, terminate each case " \ |
| 372 "with 'break', 'continue', 'return' or 'throw'") \ |
| 373 T(StrongUndefined, \ |
| 374 "In strong mode, binding or assigning to 'undefined' is deprecated") \ |
| 375 T(StrongUseBeforeDeclaration, \ |
| 376 "In strong mode, declaring variable '%' before its use is required") \ |
| 377 T(StrongVar, \ |
| 378 "In strong mode, 'var' is deprecated, use 'let' or 'const' instead") \ |
| 379 T(TemplateOctalLiteral, \ |
| 380 "Octal literals are not allowed in template strings.") \ |
| 381 T(ThisFormalParameter, "'this' is not a valid formal parameter name") \ |
| 382 T(TooManyArguments, \ |
| 383 "Too many arguments in function call (only 65535 allowed)") \ |
| 384 T(TooManyParameters, \ |
| 385 "Too many parameters in function definition (only 65535 allowed)") \ |
| 386 T(TooManyVariables, "Too many variables declared (only 4194303 allowed)") \ |
304 T(UnexpectedEOS, "Unexpected end of input") \ | 387 T(UnexpectedEOS, "Unexpected end of input") \ |
| 388 T(UnexpectedReserved, "Unexpected reserved word") \ |
| 389 T(UnexpectedStrictReserved, "Unexpected strict mode reserved word") \ |
| 390 T(UnexpectedSuper, "'super' keyword unexpected here") \ |
| 391 T(UnexpectedTemplateString, "Unexpected template string") \ |
305 T(UnexpectedToken, "Unexpected token %") \ | 392 T(UnexpectedToken, "Unexpected token %") \ |
| 393 T(UnexpectedTokenIdentifier, "Unexpected identifier") \ |
306 T(UnexpectedTokenNumber, "Unexpected number") \ | 394 T(UnexpectedTokenNumber, "Unexpected number") \ |
307 T(UnexpectedTokenString, "Unexpected string") \ | 395 T(UnexpectedTokenString, "Unexpected string") \ |
| 396 T(UnknownLabel, "Undefined label '%'") \ |
| 397 T(UnterminatedArgList, "missing ) after argument list") \ |
| 398 T(UnterminatedRegExp, "Invalid regular expression: missing /") \ |
| 399 T(UnterminatedTemplate, "Unterminated template literal") \ |
| 400 T(UnterminatedTemplateExpr, "Missing } in template expression") \ |
308 /* EvalError */ \ | 401 /* EvalError */ \ |
309 T(CodeGenFromStrings, "%") \ | 402 T(CodeGenFromStrings, "%") \ |
310 /* URIError */ \ | 403 /* URIError */ \ |
311 T(URIMalformed, "URI malformed") | 404 T(URIMalformed, "URI malformed") |
312 | 405 |
313 class MessageTemplate { | 406 class MessageTemplate { |
314 public: | 407 public: |
315 enum Template { | 408 enum Template { |
316 #define TEMPLATE(NAME, STRING) k##NAME, | 409 #define TEMPLATE(NAME, STRING) k##NAME, |
317 MESSAGE_TEMPLATES(TEMPLATE) | 410 MESSAGE_TEMPLATES(TEMPLATE) |
318 #undef TEMPLATE | 411 #undef TEMPLATE |
319 kLastMessage | 412 kLastMessage |
320 }; | 413 }; |
321 | 414 |
322 static MaybeHandle<String> FormatMessage(int template_index, | 415 static MaybeHandle<String> FormatMessage(int template_index, |
323 Handle<String> arg0, | 416 Handle<String> arg0, |
324 Handle<String> arg1, | 417 Handle<String> arg1, |
325 Handle<String> arg2); | 418 Handle<String> arg2); |
| 419 |
| 420 static Handle<String> FormatMessage(Isolate* isolate, int template_index, |
| 421 Handle<Object> arg); |
| 422 }; |
| 423 |
| 424 |
| 425 // A message handler is a convenience interface for accessing the list |
| 426 // of message listeners registered in an environment |
| 427 class MessageHandler { |
| 428 public: |
| 429 // Returns a message object for the API to use. |
| 430 static Handle<JSMessageObject> MakeMessageObject( |
| 431 Isolate* isolate, MessageTemplate::Template type, MessageLocation* loc, |
| 432 Handle<Object> argument, Handle<JSArray> stack_frames); |
| 433 |
| 434 // Report a formatted message (needs JS allocation). |
| 435 static void ReportMessage(Isolate* isolate, MessageLocation* loc, |
| 436 Handle<Object> message); |
| 437 |
| 438 static void DefaultMessageReport(Isolate* isolate, const MessageLocation* loc, |
| 439 Handle<Object> message_obj); |
| 440 static Handle<String> GetMessage(Isolate* isolate, Handle<Object> data); |
| 441 static SmartArrayPointer<char> GetLocalizedMessage(Isolate* isolate, |
| 442 Handle<Object> data); |
326 }; | 443 }; |
327 } } // namespace v8::internal | 444 } } // namespace v8::internal |
328 | 445 |
329 #endif // V8_MESSAGES_H_ | 446 #endif // V8_MESSAGES_H_ |
OLD | NEW |