| Index: runtime/vm/constant_propagator.cc
|
| diff --git a/runtime/vm/constant_propagator.cc b/runtime/vm/constant_propagator.cc
|
| index 7662e8bb2320844825e375a3c7f3bc09fba4747f..8cbb12d2480cbd59db596ff84f3764831d91aa71 100644
|
| --- a/runtime/vm/constant_propagator.cc
|
| +++ b/runtime/vm/constant_propagator.cc
|
| @@ -740,7 +740,23 @@ void ConstantPropagator::VisitInstanceOf(InstanceOfInstr* instr) {
|
| SetValue(instr, non_constant_);
|
| }
|
| } else if (IsConstant(value)) {
|
| - // TODO(kmillikin): Handle instanceof on constants.
|
| + if (value.IsInstance()) {
|
| + const Instance& instance = Instance::Cast(value);
|
| + const AbstractType& checked_type = instr->type();
|
| + if (instr->instantiator()->BindsToConstantNull() &&
|
| + instr->instantiator_type_arguments()->BindsToConstantNull()) {
|
| + const TypeArguments& checked_type_arguments = TypeArguments::Handle();
|
| + Error& bound_error = Error::Handle();
|
| + bool is_instance = instance.IsInstanceOf(checked_type,
|
| + checked_type_arguments,
|
| + &bound_error);
|
| + // Can only have bound error with generics.
|
| + ASSERT(bound_error.IsNull());
|
| + SetValue(instr, Bool::Get(instr->negate_result()
|
| + ? !is_instance : is_instance));
|
| + return;
|
| + }
|
| + }
|
| SetValue(instr, non_constant_);
|
| }
|
| }
|
|
|