Example #1
0
    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);
    }
Example #2
0
    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");
        }
    }
Example #3
0
    // 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);
    }