- if (IsNullable) {
- unwrap.EmitCheck (ec);
- ec.Emit (OpCodes.Brfalse, null_target);
- value.EmitAssign (ec, new_expr, false, false);
- } else if (new_expr != value && !is_constant) {
- value.EmitAssign (ec, new_expr, false, false);
+ if (equal_method != null) {
+ value.Emit (ec);
+ constant.Emit (ec);
+
+ var call = new CallEmitter ();
+ call.EmitPredefined (ec, equal_method, new Arguments (0));
+ ec.Emit (OpCodes.Brtrue, label.GetILLabel (ec));
+ continue;
+ }
+
+ if (constant.IsZeroInteger && constant.Type.BuiltinType != BuiltinTypeSpec.Type.Long && constant.Type.BuiltinType != BuiltinTypeSpec.Type.ULong) {
+ value.EmitBranchable (ec, label.GetILLabel (ec), false);
+ continue;
+ }
+
+ value.Emit (ec);
+ constant.Emit (ec);
+ ec.Emit (OpCodes.Beq, label.GetILLabel (ec));
+ }
+
+ ec.Emit (OpCodes.Br, defaultLabel);
+ }
+
+ void EmitDispatch (EmitContext ec)
+ {
+ if (value == null) {
+ //
+ // Constant switch, we already done the work
+ //
+ return;
+ }
+
+ if (string_dictionary != null) {
+ DoEmitStringSwitch (ec);
+ } else if (case_labels.Count < 4 || string_labels != null) {
+ EmitShortSwitch (ec);
+ } else {
+ EmitTableSwitch (ec, value);