public override Frame InvokeMethod(Frame caller, string name, Variable[] pos, VarHash named) { if (name == "postcircumfix:<( )>") { int context = 1; if (named["context"] != null) { context = Context(named["context"]); } IntPtr[] args = MarshalPositionals(pos); IntPtr ret = Perl5Interpreter.SubCall(context, args, args.Length); caller.resultSlot = Perl5Interpreter.SVToVariable(ret); return(caller); } else { IntPtr[] args = MarshalPositionals(pos); IntPtr ret = MethodCall(name, args, args.Length); caller.resultSlot = Perl5Interpreter.SVToVariable(ret); } return(caller); }
public static IntPtr VariableToSV(Variable var) { P6any obj = var.Fetch(); if (obj is SVany) { return(((SVany)obj).sv); } else if (obj.Does(Kernel.StrMO)) { string s = Kernel.UnboxAny <string>(obj); return(Perl5Interpreter.newSVpvn(s, s.Length)); } else { throw new NieczaException("can't convert argument to p5 type"); } }
// We can't use the standard char* conversion because some strings can contain nulls public static IntPtr MarshalString(string s) { byte[] array = System.Text.Encoding.UTF8.GetBytes(s); int size = Marshal.SizeOf(typeof(byte)) * (array.Length + 1); IntPtr ptr = Marshal.AllocHGlobal(size); /* This is a hack not to crash on mono!!! */ //allocated.Add(ptr, null); Marshal.Copy(array, 0, ptr, array.Length); Marshal.WriteByte(ptr, array.Length, 0); IntPtr sv = Perl5Interpreter.newSVpvn(ptr, array.Length); Perl5Interpreter.SvUTF8_on(sv); Marshal.FreeHGlobal(ptr); return(sv); }