Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
implement S01-perl-5-integration/context.t
  • Loading branch information
pmurias committed Oct 16, 2011
1 parent d468f8f commit bf0cd86
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 11 deletions.
27 changes: 26 additions & 1 deletion lib/Perl5Interpreter.cs
Expand Up @@ -35,11 +35,16 @@ public class Perl5Interpreter : IForeignInterpreter {

[DllImport("obj/p5embed.so", EntryPoint="p5embed_subcall")]
public static extern IntPtr SubCall(
int context,
IntPtr[] arguments,
int argument_n
);

public static Variable SVToVariable(IntPtr sv) {
if (sv == IntPtr.Zero) {
//TODO: check - cargo culted
return Kernel.NilP.mo.typeVar;
}
if (SvIOKp(sv) != 0) {
return Builtins.MakeInt(SvIV(sv));
} else if (SvNOKp(sv) != 0) {
Expand Down Expand Up @@ -99,6 +104,20 @@ int argument_n
}
}

static int Context(Variable var) {
P6any obj = var.Fetch();
string s = Kernel.UnboxAny<string>(obj);
if (s == "list") {
return 0;
} else if (s == "scalar") {
return 1;
} else if (s == "void") {
return 2;
} else {
throw new NieczaException("unknown p5 context type: "+s);
}
}

static IntPtr[] MarshalPositionals(Variable[] pos) {
IntPtr[] args = new IntPtr[pos.Length];
for (int i=0;i<pos.Length;i++) {
Expand All @@ -112,8 +131,14 @@ int argument_n
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(args,args.Length);
IntPtr ret = Perl5Interpreter.SubCall(context,args,args.Length);


caller.resultSlot = Perl5Interpreter.SVToVariable(ret);
return caller;
} else {
Expand Down
24 changes: 14 additions & 10 deletions lib/p5embed.c
Expand Up @@ -72,7 +72,7 @@ SV* p5method_call(char* name,SV** args,int args_count) {

}

SV* p5embed_subcall(SV** args,int args_count) {
SV* p5embed_subcall(int context,SV** args,int args_count) {
dSP;


Expand All @@ -84,18 +84,22 @@ SV* p5embed_subcall(SV** args,int args_count) {
PUTBACK;


int count = call_sv(args[0],G_SCALAR);
SPAGAIN;
if (count != 1) croak("Big trouble\n");
/* HACK - list context is NYI */
if (context == 1 || context == 0) {
int count = call_sv(args[0],G_SCALAR);
SPAGAIN;
if (count != 1) croak("Big trouble\n");

SV* ret = POPs;
SV* ret = POPs;

/* TODO should i do that? */
SvREFCNT_inc(ret);
/* TODO should i do that? */
SvREFCNT_inc(ret);

PUTBACK;

return ret;
PUTBACK;
return ret;
} else if (context == 2) {
call_sv(args[0],G_VOID);
}

}

Expand Down

0 comments on commit bf0cd86

Please sign in to comment.