// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. patch class Error { /* patch */ static String _objectToString(Object object) { return Object._toString(object); } /* patch */ StackTrace get stackTrace => _stackTrace; StackTrace _stackTrace; } patch class AssertionError extends Error { AssertionError._create( this._failedAssertion, this._url, this._line, this._column); static _throwNew(int assertionStart, int assertionEnd) native "AssertionError_throwNew"; String toString() { return "'$_url': Failed assertion: line $_line pos $_column: " "'$_failedAssertion' is not true."; } final String _failedAssertion; final String _url; final int _line; final int _column; } patch class TypeError extends AssertionError { TypeError._create(String url, int line, int column, this._srcType, this._dstType, this._dstName, this._malformedError) : super._create("is assignable", url, line, column); static _throwNew(int location, Object src_value, String dst_type_name, String dst_name, String malformed_error) native "TypeError_throwNew"; String toString() { String str = (_malformedError != null) ? _malformedError : ""; if ((_dstName != null) && (_dstName.length > 0)) { str = "${str}type '$_srcType' is not a subtype of " "type '$_dstType' of '$_dstName'."; } else { str = "${str}malformed type used."; } return str; } final String _srcType; final String _dstType; final String _dstName; final String _malformedError; } patch class CastError extends Error { CastError._create(this._url, this._line, this._column, this._srcType, this._dstType, this._dstName, this._malformedError); // A CastError is allocated by TypeError._throwNew() when dst_name equals // Exceptions::kCastErrorDstName. String toString() { String str = (_malformedError != null) ? _malformedError : ""; str = "${str}type '$_srcType' is not a subtype of " "type '$_dstType' in type cast."; return str; } // Fields _url, _line, and _column are only used for debugging purposes. final String _url; final int _line; final int _column; final String _srcType; final String _dstType; final String _dstName; final String _malformedError; } patch class FallThroughError { FallThroughError._create(this._url, this._line); static _throwNew(int case_clause_pos) native "FallThroughError_throwNew"; /* patch */ String toString() { return "'$_url': Switch case fall-through at line $_line."; } // These new fields cannot be declared final, because a constructor exists // in the original version of this patched class. String _url; int _line; } class _InternalError { const _InternalError(this._msg); String toString() => "InternalError: '${_msg}'"; final String _msg; } patch class AbstractClassInstantiationError { AbstractClassInstantiationError._create( this._className, this._url, this._line); static _throwNew(int case_clause_pos, String className) native "AbstractClassInstantiationError_throwNew"; /* patch */ String toString() { return "Cannot instantiate abstract class $_className: " "_url '$_url' line $_line"; } // These new fields cannot be declared final, because a constructor exists // in the original version of this patched class. String _url; int _line; } patch class NoSuchMethodError { // The compiler emits a call to _throwNew when it cannot resolve a static // method at compile time. The receiver is actually the literal class of the // unresolved method. static void _throwNew(Object receiver, String memberName, int invocation_type, List arguments, List argumentNames, List existingArgumentNames) { int numNamedArguments = argumentNames == null ? 0 : argumentNames.length; int numPositionalArguments = arguments == null ? 0 : arguments.length; numPositionalArguments -= numNamedArguments; List positionalArguments; if (numPositionalArguments == 0) { // Differ between no arguments specified and 0 arguments. // TODO(srdjan): This can currently occur for unresolvable static methods. // In that case, the arguments are evaluated but not passed to the // throwing stub (see EffectGraphVisitor::BuildThrowNoSuchMethodError and // Parser::ThrowNoSuchMethodError)). positionalArguments = argumentNames == null ? null : []; } else { positionalArguments = arguments.sublist(0, numPositionalArguments); } Map namedArguments = new Map(); for (int i = 0; i < numNamedArguments; i++) { var arg_value = arguments[numPositionalArguments + i]; namedArguments[argumentNames[i]] = arg_value; } throw new NoSuchMethodError._withType(receiver, memberName, invocation_type, positionalArguments, namedArguments, existingArgumentNames); } // Remember the type from the invocation mirror or static compilation // analysis when thrown directly with _throwNew. A negative value means // that no information is available. final int _invocation_type; NoSuchMethodError(Object this._receiver, String this._memberName, List this._arguments, Map this._namedArguments, [List existingArgumentNames = null]) : this._existingArgumentNames = existingArgumentNames, this._invocation_type = -1; NoSuchMethodError._withType(Object this._receiver, String this._memberName, this._invocation_type, List this._arguments, Map this._namedArguments, [List existingArgumentNames = null]) : this._existingArgumentNames = existingArgumentNames; String _developerMessage(args_mismatch) { if (_invocation_type < 0) { return ""; } var type = _invocation_type & _InvocationMirror._TYPE_MASK; var level = (_invocation_type >> _InvocationMirror._CALL_SHIFT) & _InvocationMirror._CALL_MASK; var type_str = (const ["method", "getter", "setter", "getter or setter"])[type]; var args_message = args_mismatch ? " with matching arguments" : ""; var msg; switch (level) { case _InvocationMirror._DYNAMIC: { if (_receiver == null) { msg = "The null object does not have a $type_str '$_memberName'" "$args_message."; } else { if (_receiver is Function) { msg = "Closure call with mismatched arguments: " "function '$_memberName'"; } else { msg = "Class '${_receiver.runtimeType}' has no instance $type_str " "'$_memberName'$args_message."; } } break; } case _InvocationMirror._STATIC: { msg = "No static $type_str '$_memberName' declared in class " "'$_receiver'."; break; } case _InvocationMirror._CONSTRUCTOR: { msg = "No constructor '$_memberName' declared in class '$_receiver'."; break; } case _InvocationMirror._TOP_LEVEL: { msg = "No top-level $type_str '$_memberName'$args_message declared."; break; } } return "$msg\n\n"; } /* patch */ String toString() { StringBuffer actual_buf = new StringBuffer(); int i = 0; if (_arguments == null) { // Actual arguments unknown. // TODO(srdjan): Remove once arguments are passed for unresolvable // static methods. actual_buf.write("..."); } else { for (; i < _arguments.length; i++) { if (i > 0) { actual_buf.write(", "); } actual_buf.write(Error.safeToString(_arguments[i])); } } if (_namedArguments != null) { _namedArguments.forEach((String key, var value) { if (i > 0) { actual_buf.write(", "); } actual_buf.write(key); actual_buf.write(": "); actual_buf.write(Error.safeToString(value)); i++; }); } var args_mismatch = _existingArgumentNames != null; StringBuffer msg_buf = new StringBuffer(_developerMessage(args_mismatch)); String receiver_str; var level = (_invocation_type >> _InvocationMirror._CALL_SHIFT) & _InvocationMirror._CALL_MASK; if ( level == _InvocationMirror._TOP_LEVEL) { receiver_str = "top-level"; } else { receiver_str = Error.safeToString(_receiver); } if (!args_mismatch) { msg_buf.write( "NoSuchMethodError : method not found: '$_memberName'\n" "Receiver: $receiver_str\n" "Arguments: [$actual_buf]"); } else { String actualParameters = actual_buf.toString(); StringBuffer formal_buf = new StringBuffer(); for (int i = 0; i < _existingArgumentNames.length; i++) { if (i > 0) { formal_buf.write(", "); } formal_buf.write(_existingArgumentNames[i]); } String formalParameters = formal_buf.toString(); msg_buf.write( "NoSuchMethodError: incorrect number of arguments passed to " "method named '$_memberName'\n" "Receiver: $receiver_str\n" "Tried calling: $_memberName($actualParameters)\n" "Found: $_memberName($formalParameters)"); } return msg_buf.toString(); } } class _JavascriptIntegerOverflowError extends Error { final Object _value; _JavascriptIntegerOverflowError(this._value); String toString() => "Javascript Integer Overflow: $_value"; }