Files
sdk/runtime/lib/error.dart
T
hausner@google.com 35d7793891 Throw AbstractClassInstantiationError if an abstract class is instantiated
This is the second try to my previous attempt to implement the
new abstract class handling. Instead of a compile-time error,
the VM now throws an AbstractClassInstantiationError at runtime
if an abstract class is instantiated. Added the new error class
to the core library.

For now I'm still using the rule that a class is abstract if it is explicitly
marked as abstract, or if it defines a new abstract method.
Review URL: https://chromiumcodereview.appspot.com//10916039

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@11708 260f80e4-7a28-3924-810f-c04153c831b5
2012-08-31 18:06:42 +00:00

132 lines
4.1 KiB
Dart

// 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.
// Errors are created and thrown by DartVM only.
// Changes here should also be reflected in corelib/error.dart as well
class AssertionErrorImplementation implements AssertionError {
factory AssertionErrorImplementation._uninstantiable() {
throw const UnsupportedOperationException(
"AssertionError can only be allocated by the VM");
}
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;
}
class TypeErrorImplementation
extends AssertionErrorImplementation
implements TypeError {
factory TypeErrorImplementation._uninstantiable() {
throw const UnsupportedOperationException(
"TypeError can only be allocated by the VM");
}
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;
}
class CastExceptionImplementation
extends TypeErrorImplementation
implements CastException {
factory CastException._uninstantiable() {
throw const UnsupportedOperationException(
"CastException can only be allocated by the VM");
}
// A CastException is allocated by TypeError._throwNew() when dst_name equals
// Exceptions::kCastExceptionDstName.
String toString() {
String str = (malformedError != null) ? malformedError : "";
if ((dstName != null) && (dstName.length > 0)) {
str = "${str}type '$srcType' is not a subtype of "
"type '$dstType' in type cast.";
} else {
str = "${str}malformed type used in type cast.";
}
return str;
}
}
class FallThroughErrorImplementation implements FallThroughError {
factory FallThroughErrorImplementation._uninstantiable() {
throw const UnsupportedOperationException(
"FallThroughError can only be allocated by the VM");
}
static _throwNew(int case_clause_pos) native "FallThroughError_throwNew";
String toString() {
return "'$url': Switch case fall-through at line $line.";
}
final String url;
final int line;
}
class InternalError {
const InternalError(this._msg);
String toString() => "InternalError: '${_msg}'";
final String _msg;
}
class StaticResolutionException implements Exception {
factory StaticResolutionException._uninstantiable() {
throw const UnsupportedOperationException(
"StaticResolutionException can only be allocated by the VM");
}
String toString() => "Unresolved static method: url '$url' line $line "
"pos $column\n$failedResolutionLine\n";
static _throwNew(int token_pos) native "StaticResolutionException_throwNew";
final String failedResolutionLine;
final String url;
final int line;
final int column;
}
class AbstractClassInstantiationErrorImplementation
implements AbstractClassInstantiationError {
factory AbstractClassInstantiationErrorImplementation._uninstantiable() {
throw const UnsupportedOperationException(
"AbstractClassInstantiationError can only be allocated by the VM");
}
static _throwNew(int case_clause_pos, String className)
native "AbstractClassInstantiationError_throwNew";
String toString() {
return "Cannot instantiate abstract class $className: "
"url '$url' line $line";
}
final String className;
final String url;
final int line;
}