protected override void TraverseEval(Eval eval) { var m = eval.InvokedMethod(); var args = eval.InvocationArgsInfo(); if (m.DeclaringType == typeof(Ctm) && m.Name == "Malloc") { throw AssertionHelper.Fail(); } else if (m.DeclaringType.IsArray || m.DeclaringType == typeof(Array)) { var @this = args.First().Item1; if (m.Name == "GetLength") { var e_dim = args.Skip(1).AssertSingle().Item1; var dim = e_dim.AssertCast<Const>().Value.AssertCoerce<int>(); _ptx.ld(@this).arrdim(dim); } else if (m.IsArrayGetter()) { _ptx.ld(@this); args.Skip(1).ForEach(idx => _ptx.ld(idx.Item1)); _ptx.arrget(m); } else if (m.IsArraySetter()) { _ptx.ld(@this); args.Skip(1).ForEach(idx => _ptx.ld(idx.Item1)); _ptx.arrset(m); } else { throw AssertionHelper.Fail(); } } else { var a_ptx = m.AttrOrNull<PtxAttribute>(); if (a_ptx == null) { var p_m = m.EnclosingProperty(); if (p_m != null) a_ptx = p_m.AttrOrNull<PtxAttribute>(); } a_ptx.AssertNotNull(); (a_ptx.Version <= _cfg.Version).AssertTrue(); (a_ptx.Target <= _cfg.Target).AssertTrue(); var s_code = a_ptx.Code.Trim(); var is_literal = !s_code.Contains(" "); is_literal.AssertEquiv(args.IsEmpty()); if (is_literal) { _ptx.op(s_code); } else { var splits = s_code.Split(" ".MkArray(), StringSplitOptions.RemoveEmptyEntries); splits.AssertThat(seq => seq.Count() >= 3); var cop = splits.AssertFirst(); splits.AssertSecond().AssertThat(s => s == "%"); splits.Skip(2).ForEach(s_arg => { if (!s_arg.StartsWith("%")) { _ptx.ld(s_arg); } else { var p_name = s_arg.AssertExtract("$%(?<name>.*)^"); var p = m.GetParameters().AssertSingle(p1 => p1.Name == p_name); _ptx.ld(args[p]); } }); _ptx.op(cop); } } }
protected override void TraverseEval(Eval eval) { var m = eval.InvokedMethod(); var args = eval.InvocationArgsInfo(); if (m.DeclaringType == typeof(Ctm) && m.Name == "Malloc") { throw AssertionHelper.Fail(); } else if (m.DeclaringType.IsArray || m.DeclaringType == typeof(Array)) { var @this = args.First().Item1; if (m.Name == "GetLength") { var e_dim = args.Skip(1).AssertSingle().Item1; var dim = e_dim.AssertCast <Const>().Value.AssertCoerce <int>(); _ptx.ld(@this).arrdim(dim); } else if (m.IsArrayGetter()) { _ptx.ld(@this); args.Skip(1).ForEach(idx => _ptx.ld(idx.Item1)); _ptx.arrget(m); } else if (m.IsArraySetter()) { _ptx.ld(@this); args.Skip(1).ForEach(idx => _ptx.ld(idx.Item1)); _ptx.arrset(m); } else { throw AssertionHelper.Fail(); } } else { var a_ptx = m.AttrOrNull <PtxAttribute>(); if (a_ptx == null) { var p_m = m.EnclosingProperty(); if (p_m != null) { a_ptx = p_m.AttrOrNull <PtxAttribute>(); } } a_ptx.AssertNotNull(); (a_ptx.Version <= _cfg.Version).AssertTrue(); (a_ptx.Target <= _cfg.Target).AssertTrue(); var s_code = a_ptx.Code.Trim(); var is_literal = !s_code.Contains(" "); is_literal.AssertEquiv(args.IsEmpty()); if (is_literal) { _ptx.op(s_code); } else { var splits = s_code.Split(" ".MkArray(), StringSplitOptions.RemoveEmptyEntries); splits.AssertThat(seq => seq.Count() >= 3); var cop = splits.AssertFirst(); splits.AssertSecond().AssertThat(s => s == "%"); splits.Skip(2).ForEach(s_arg => { if (!s_arg.StartsWith("%")) { _ptx.ld(s_arg); } else { var p_name = s_arg.AssertExtract("$%(?<name>.*)^"); var p = m.GetParameters().AssertSingle(p1 => p1.Name == p_name); _ptx.ld(args[p]); } }); _ptx.op(cop); } } }