blob: f8412402dd159030f4547b2d21385c5526a9815c [file] [log] [blame]
// 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<String, dynamic> namedArguments = new Map<String, dynamic>();
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<String,dynamic> 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<String,dynamic> 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";
}