| Index: runtime/vm/code_generator.cc
|
| ===================================================================
|
| --- runtime/vm/code_generator.cc (revision 24832)
|
| +++ runtime/vm/code_generator.cc (working copy)
|
| @@ -218,6 +218,34 @@
|
| }
|
|
|
|
|
| +// Instantiate type.
|
| +// Arg0: uninstantiated type.
|
| +// Arg1: instantiator type arguments.
|
| +// Return value: instantiated type.
|
| +DEFINE_RUNTIME_ENTRY(InstantiateType, 2) {
|
| + ASSERT(arguments.ArgCount() == kInstantiateTypeRuntimeEntry.argument_count());
|
| + AbstractType& type = AbstractType::CheckedHandle(arguments.ArgAt(0));
|
| + const AbstractTypeArguments& instantiator =
|
| + AbstractTypeArguments::CheckedHandle(arguments.ArgAt(1));
|
| + ASSERT(!type.IsNull() && !type.IsInstantiated());
|
| + ASSERT(instantiator.IsNull() || instantiator.IsInstantiated());
|
| + Error& malformed_error = Error::Handle();
|
| + type = type.InstantiateFrom(instantiator, &malformed_error);
|
| + if (!malformed_error.IsNull()) {
|
| + // Throw a dynamic type error.
|
| + const intptr_t location = GetCallerLocation();
|
| + String& malformed_error_message = String::Handle(
|
| + String::New(malformed_error.ToErrorCString()));
|
| + Exceptions::CreateAndThrowTypeError(
|
| + location, Symbols::Empty(), Symbols::Empty(),
|
| + Symbols::Empty(), malformed_error_message);
|
| + UNREACHABLE();
|
| + }
|
| + ASSERT(!type.IsNull() && type.IsInstantiated());
|
| + arguments.SetReturn(type);
|
| +}
|
| +
|
| +
|
| // Instantiate type arguments.
|
| // Arg0: uninstantiated type arguments.
|
| // Arg1: instantiator type arguments.
|
|
|