Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(334)

Unified Diff: runtime/vm/code_generator.cc

Issue 1778133002: Enumerate URIs of all types in type errors in order to help the user diagnose (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: address comments Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/aot_optimizer.cc ('k') | runtime/vm/exceptions.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/code_generator.cc
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 652cdc25a7e6126c09cc072d077260351e0000fa..bd7d12395461951ccea081569074429eccb76322 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -190,21 +190,21 @@ DEFINE_RUNTIME_ENTRY(AllocateObject, 2) {
// Arg1: instantiator type arguments.
// Return value: instantiated type.
DEFINE_RUNTIME_ENTRY(InstantiateType, 2) {
- AbstractType& type = AbstractType::CheckedHandle(arguments.ArgAt(0));
+ AbstractType& type = AbstractType::CheckedHandle(zone, arguments.ArgAt(0));
const TypeArguments& instantiator =
- TypeArguments::CheckedHandle(arguments.ArgAt(1));
+ TypeArguments::CheckedHandle(zone, arguments.ArgAt(1));
ASSERT(!type.IsNull() && !type.IsInstantiated());
ASSERT(instantiator.IsNull() || instantiator.IsInstantiated());
- Error& bound_error = Error::Handle();
+ Error& bound_error = Error::Handle(zone);
type =
type.InstantiateFrom(instantiator, &bound_error, NULL, NULL, Heap::kOld);
if (!bound_error.IsNull()) {
// Throw a dynamic type error.
const TokenPosition location = GetCallerLocation();
String& bound_error_message = String::Handle(
- String::New(bound_error.ToErrorCString()));
+ zone, String::New(bound_error.ToErrorCString()));
Exceptions::CreateAndThrowTypeError(
- location, Symbols::Empty(), Symbols::Empty(),
+ location, AbstractType::Handle(zone), AbstractType::Handle(zone),
Symbols::Empty(), bound_error_message);
UNREACHABLE();
}
@@ -224,16 +224,16 @@ DEFINE_RUNTIME_ENTRY(InstantiateType, 2) {
// Return value: instantiated type arguments.
DEFINE_RUNTIME_ENTRY(InstantiateTypeArguments, 2) {
TypeArguments& type_arguments =
- TypeArguments::CheckedHandle(arguments.ArgAt(0));
+ TypeArguments::CheckedHandle(zone, arguments.ArgAt(0));
const TypeArguments& instantiator =
- TypeArguments::CheckedHandle(arguments.ArgAt(1));
+ TypeArguments::CheckedHandle(zone, arguments.ArgAt(1));
ASSERT(!type_arguments.IsNull() && !type_arguments.IsInstantiated());
ASSERT(instantiator.IsNull() || instantiator.IsInstantiated());
// Code inlined in the caller should have optimized the case where the
// instantiator can be reused as type argument vector.
ASSERT(instantiator.IsNull() || !type_arguments.IsUninstantiatedIdentity());
if (isolate->type_checks()) {
- Error& bound_error = Error::Handle();
+ Error& bound_error = Error::Handle(zone);
type_arguments =
type_arguments.InstantiateAndCanonicalizeFrom(instantiator,
&bound_error);
@@ -241,9 +241,9 @@ DEFINE_RUNTIME_ENTRY(InstantiateTypeArguments, 2) {
// Throw a dynamic type error.
const TokenPosition location = GetCallerLocation();
String& bound_error_message = String::Handle(
- String::New(bound_error.ToErrorCString()));
+ zone, String::New(bound_error.ToErrorCString()));
Exceptions::CreateAndThrowTypeError(
- location, Symbols::Empty(), Symbols::Empty(),
+ location, AbstractType::Handle(zone), AbstractType::Handle(zone),
Symbols::Empty(), bound_error_message);
UNREACHABLE();
}
@@ -260,7 +260,7 @@ DEFINE_RUNTIME_ENTRY(InstantiateTypeArguments, 2) {
// Arg0: number of variables.
// Return value: newly allocated context.
DEFINE_RUNTIME_ENTRY(AllocateContext, 1) {
- const Smi& num_variables = Smi::CheckedHandle(arguments.ArgAt(0));
+ const Smi& num_variables = Smi::CheckedHandle(zone, arguments.ArgAt(0));
arguments.SetReturn(Context::Handle(Context::New(num_variables.Value())));
}
@@ -270,8 +270,9 @@ DEFINE_RUNTIME_ENTRY(AllocateContext, 1) {
// Arg0: the context to be cloned.
// Return value: newly allocated context.
DEFINE_RUNTIME_ENTRY(CloneContext, 1) {
- const Context& ctx = Context::CheckedHandle(arguments.ArgAt(0));
- Context& cloned_ctx = Context::Handle(Context::New(ctx.num_variables()));
+ const Context& ctx = Context::CheckedHandle(zone, arguments.ArgAt(0));
+ Context& cloned_ctx =
+ Context::Handle(zone, Context::New(ctx.num_variables()));
cloned_ctx.set_parent(Context::Handle(ctx.parent()));
Object& inst = Object::Handle(zone);
for (int i = 0; i < ctx.num_variables(); i++) {
@@ -449,17 +450,18 @@ static void UpdateTypeTestCache(
// Arg3: SubtypeTestCache.
// Return value: true or false, or may throw a type error in checked mode.
DEFINE_RUNTIME_ENTRY(Instanceof, 4) {
- const Instance& instance = Instance::CheckedHandle(arguments.ArgAt(0));
- const AbstractType& type = AbstractType::CheckedHandle(arguments.ArgAt(1));
+ const Instance& instance = Instance::CheckedHandle(zone, arguments.ArgAt(0));
+ const AbstractType& type =
+ AbstractType::CheckedHandle(zone, arguments.ArgAt(1));
const TypeArguments& instantiator_type_arguments =
- TypeArguments::CheckedHandle(arguments.ArgAt(2));
+ TypeArguments::CheckedHandle(zone, arguments.ArgAt(2));
const SubtypeTestCache& cache =
- SubtypeTestCache::CheckedHandle(arguments.ArgAt(3));
+ SubtypeTestCache::CheckedHandle(zone, arguments.ArgAt(3));
ASSERT(type.IsFinalized());
ASSERT(!type.IsDynamicType()); // No need to check assignment.
ASSERT(!type.IsMalformed()); // Already checked in code generator.
ASSERT(!type.IsMalbounded()); // Already checked in code generator.
- Error& bound_error = Error::Handle();
+ Error& bound_error = Error::Handle(zone);
const Bool& result =
Bool::Get(instance.IsInstanceOf(type,
instantiator_type_arguments,
@@ -472,9 +474,9 @@ DEFINE_RUNTIME_ENTRY(Instanceof, 4) {
// Throw a dynamic type error only if the instanceof test fails.
const TokenPosition location = GetCallerLocation();
String& bound_error_message = String::Handle(
- String::New(bound_error.ToErrorCString()));
+ zone, String::New(bound_error.ToErrorCString()));
Exceptions::CreateAndThrowTypeError(
- location, Symbols::Empty(), Symbols::Empty(),
+ location, AbstractType::Handle(zone), AbstractType::Handle(zone),
Symbols::Empty(), bound_error_message);
UNREACHABLE();
}
@@ -493,19 +495,21 @@ DEFINE_RUNTIME_ENTRY(Instanceof, 4) {
// Arg4: SubtypeTestCache.
// Return value: instance if a subtype, otherwise throw a TypeError.
DEFINE_RUNTIME_ENTRY(TypeCheck, 5) {
- const Instance& src_instance = Instance::CheckedHandle(arguments.ArgAt(0));
- AbstractType& dst_type = AbstractType::CheckedHandle(arguments.ArgAt(1));
+ const Instance& src_instance =
+ Instance::CheckedHandle(zone, arguments.ArgAt(0));
+ AbstractType& dst_type =
+ AbstractType::CheckedHandle(zone, arguments.ArgAt(1));
const TypeArguments& instantiator_type_arguments =
- TypeArguments::CheckedHandle(arguments.ArgAt(2));
- const String& dst_name = String::CheckedHandle(arguments.ArgAt(3));
+ TypeArguments::CheckedHandle(zone, arguments.ArgAt(2));
+ const String& dst_name = String::CheckedHandle(zone, arguments.ArgAt(3));
const SubtypeTestCache& cache =
- SubtypeTestCache::CheckedHandle(arguments.ArgAt(4));
+ SubtypeTestCache::CheckedHandle(zone, arguments.ArgAt(4));
ASSERT(!dst_type.IsDynamicType()); // No need to check assignment.
ASSERT(!dst_type.IsMalformed()); // Already checked in code generator.
ASSERT(!dst_type.IsMalbounded()); // Already checked in code generator.
ASSERT(!src_instance.IsNull()); // Already checked in inlined code.
- Error& bound_error = Error::Handle();
+ Error& bound_error = Error::Handle(zone);
const bool is_instance_of = src_instance.IsInstanceOf(
dst_type, instantiator_type_arguments, &bound_error);
@@ -517,25 +521,20 @@ DEFINE_RUNTIME_ENTRY(TypeCheck, 5) {
if (!is_instance_of) {
// Throw a dynamic type error.
const TokenPosition location = GetCallerLocation();
- const AbstractType& src_type = AbstractType::Handle(src_instance.GetType());
- String& src_type_name = String::Handle(src_type.UserVisibleName());
+ const AbstractType& src_type =
+ AbstractType::Handle(zone, src_instance.GetType());
if (!dst_type.IsInstantiated()) {
// Instantiate dst_type before reporting the error.
dst_type = dst_type.InstantiateFrom(instantiator_type_arguments, NULL,
NULL, NULL, Heap::kNew);
// Note that instantiated dst_type may be malbounded.
}
- String& dst_type_name = String::Handle(dst_type.UserVisibleName());
- String& bound_error_message = String::Handle();
+ String& bound_error_message = String::Handle(zone);
if (!bound_error.IsNull()) {
ASSERT(isolate->type_checks());
bound_error_message = String::New(bound_error.ToErrorCString());
}
- if (src_type_name.Equals(dst_type_name)) {
- src_type_name = src_type.UserVisibleNameWithURI();
- dst_type_name = dst_type.UserVisibleNameWithURI();
- }
- Exceptions::CreateAndThrowTypeError(location, src_type_name, dst_type_name,
+ Exceptions::CreateAndThrowTypeError(location, src_type, dst_type,
dst_name, bound_error_message);
UNREACHABLE();
}
@@ -552,17 +551,18 @@ DEFINE_RUNTIME_ENTRY(TypeCheck, 5) {
// Return value: none, throws TypeError or AssertionError.
DEFINE_RUNTIME_ENTRY(NonBoolTypeError, 1) {
const TokenPosition location = GetCallerLocation();
- const Instance& src_instance = Instance::CheckedHandle(arguments.ArgAt(0));
+ const Instance& src_instance =
+ Instance::CheckedHandle(zone, arguments.ArgAt(0));
if (src_instance.IsNull()) {
- const Array& args = Array::Handle(Array::New(4));
- args.SetAt(0, String::Handle(
+ const Array& args = Array::Handle(zone, Array::New(4));
+ args.SetAt(0, String::Handle(zone,
String::New("Failed assertion: boolean expression must not be null")));
// No source code for this assertion, set url to null.
- args.SetAt(1, String::Handle(String::null()));
- args.SetAt(2, Smi::Handle(Smi::New(0)));
- args.SetAt(3, Smi::Handle(Smi::New(0)));
+ args.SetAt(1, String::Handle(zone, String::null()));
+ args.SetAt(2, Smi::Handle(zone, Smi::New(0)));
+ args.SetAt(3, Smi::Handle(zone, Smi::New(0)));
Exceptions::ThrowByType(Exceptions::kAssertion, args);
UNREACHABLE();
@@ -570,12 +570,10 @@ DEFINE_RUNTIME_ENTRY(NonBoolTypeError, 1) {
ASSERT(!src_instance.IsBool());
const Type& bool_interface = Type::Handle(Type::BoolType());
- const AbstractType& src_type = AbstractType::Handle(src_instance.GetType());
- const String& src_type_name = String::Handle(src_type.UserVisibleName());
- const String& bool_type_name =
- String::Handle(bool_interface.UserVisibleName());
- const String& no_bound_error = String::Handle();
- Exceptions::CreateAndThrowTypeError(location, src_type_name, bool_type_name,
+ const AbstractType& src_type =
+ AbstractType::Handle(zone, src_instance.GetType());
+ const String& no_bound_error = String::Handle(zone);
+ Exceptions::CreateAndThrowTypeError(location, src_type, bool_interface,
Symbols::BooleanExpression(),
no_bound_error);
UNREACHABLE();
@@ -589,26 +587,14 @@ DEFINE_RUNTIME_ENTRY(NonBoolTypeError, 1) {
// Return value: none, throws an exception.
DEFINE_RUNTIME_ENTRY(BadTypeError, 3) {
const TokenPosition location = GetCallerLocation();
- const Instance& src_value = Instance::CheckedHandle(arguments.ArgAt(0));
- const String& dst_name = String::CheckedHandle(arguments.ArgAt(1));
+ const Instance& src_value = Instance::CheckedHandle(zone, arguments.ArgAt(0));
+ const String& dst_name = String::CheckedHandle(zone, arguments.ArgAt(1));
const AbstractType& dst_type =
- AbstractType::CheckedHandle(arguments.ArgAt(2));
- const AbstractType& src_type = AbstractType::Handle(src_value.GetType());
- const String& src_type_name = String::Handle(src_type.UserVisibleName());
-
- String& dst_type_name = String::Handle();
- LanguageError& error = LanguageError::Handle(dst_type.error());
- ASSERT(!error.IsNull());
- if (error.kind() == Report::kMalformedType) {
- dst_type_name = Symbols::Malformed().raw();
- } else {
- ASSERT(error.kind() == Report::kMalboundedType);
- dst_type_name = Symbols::Malbounded().raw();
- }
- const String& error_message = String::ZoneHandle(
- Symbols::New(error.ToErrorCString()));
+ AbstractType::CheckedHandle(zone, arguments.ArgAt(2));
+ const AbstractType& src_type =
+ AbstractType::Handle(zone, src_value.GetType());
Exceptions::CreateAndThrowTypeError(
- location, src_type_name, dst_type_name, dst_name, error_message);
+ location, src_type, dst_type, dst_name, String::Handle(zone));
UNREACHABLE();
}
@@ -635,19 +621,19 @@ DEFINE_RUNTIME_ENTRY(PatchStaticCall, 0) {
DartFrameIterator iterator;
StackFrame* caller_frame = iterator.NextFrame();
ASSERT(caller_frame != NULL);
- const Code& caller_code = Code::Handle(caller_frame->LookupDartCode());
+ const Code& caller_code = Code::Handle(zone, caller_frame->LookupDartCode());
ASSERT(!caller_code.IsNull());
ASSERT(caller_code.is_optimized());
const Function& target_function = Function::Handle(
- caller_code.GetStaticCallTargetFunctionAt(caller_frame->pc()));
+ zone, caller_code.GetStaticCallTargetFunctionAt(caller_frame->pc()));
if (!target_function.HasCode()) {
const Error& error =
- Error::Handle(Compiler::CompileFunction(thread, target_function));
+ Error::Handle(zone, Compiler::CompileFunction(thread, target_function));
if (!error.IsNull()) {
Exceptions::PropagateError(error);
}
}
- const Code& target_code = Code::Handle(target_function.CurrentCode());
+ const Code& target_code = Code::Handle(zone, target_function.CurrentCode());
// Before patching verify that we are not repeatedly patching to the same
// target.
ASSERT(target_code.raw() !=
@@ -688,8 +674,9 @@ DEFINE_RUNTIME_ENTRY(BreakpointRuntimeHandler, 0) {
StackFrame* caller_frame = iterator.NextFrame();
ASSERT(caller_frame != NULL);
const Code& orig_stub = Code::Handle(
- isolate->debugger()->GetPatchedStubAddress(caller_frame->pc()));
- const Error& error = Error::Handle(isolate->debugger()->SignalBpReached());
+ zone, isolate->debugger()->GetPatchedStubAddress(caller_frame->pc()));
+ const Error& error =
+ Error::Handle(zone, isolate->debugger()->SignalBpReached());
if (!error.IsNull()) {
Exceptions::PropagateError(error);
UNREACHABLE();
@@ -704,7 +691,7 @@ DEFINE_RUNTIME_ENTRY(SingleStepHandler, 0) {
return;
}
const Error& error =
- Error::Handle(isolate->debugger()->DebuggerStepCallback());
+ Error::Handle(zone, isolate->debugger()->DebuggerStepCallback());
if (!error.IsNull()) {
Exceptions::PropagateError(error);
UNREACHABLE();
« no previous file with comments | « runtime/vm/aot_optimizer.cc ('k') | runtime/vm/exceptions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698