Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Perl 5 code refs are invokable.
examples/term-ansicolor.pl now makes use of that.
  • Loading branch information
pmurias committed Oct 2, 2011
1 parent e1988ad commit 935bc30
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 14 deletions.
12 changes: 5 additions & 7 deletions examples/term-ansicolor.pl
@@ -1,10 +1,8 @@
eval("use Term::ANSIColor;",:lang<perl5>);
my &color := eval('\&color',:lang<perl5>);
say
eval('color "bold blue"',:lang<perl5>),
"Hello ",
eval('color "green"',:lang<perl5>),
"Colorful ",
eval('color "cyan"',:lang<perl5>),
"World",
eval('color "reset"',:lang<perl5>);
color("bold blue"), "Hello ",
color("green"), "Colorful ",
color("cyan"),"World",
color("reset");

30 changes: 25 additions & 5 deletions lib/Perl5Interpreter.cs
Expand Up @@ -33,6 +33,12 @@ public class Perl5Interpreter : IForeignInterpreter {
[DllImport("obj/p5embed.so", EntryPoint="p5embed_newSVpvn")]
public static extern IntPtr newSVpvn(string s,int length);

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

public static Variable SVToVariable(IntPtr sv) {
if (SvIOKp(sv) != 0) {
return Builtins.MakeInt(SvIV(sv));
Expand Down Expand Up @@ -92,15 +98,29 @@ int argument_n
}
}

public IntPtr sv;
public override Frame InvokeMethod(Frame caller, string name,
Variable[] pos, VarHash named) {
static IntPtr[] MarshalPositionals(Variable[] pos) {
IntPtr[] args = new IntPtr[pos.Length];
for (int i=0;i<pos.Length;i++) {
args[i] = VariableToSV(pos[i]);
}
IntPtr ret = MethodCall(name,args,args.Length);
caller.resultSlot = Perl5Interpreter.SVToVariable(ret);
return args;
}

public IntPtr sv;
public override Frame InvokeMethod(Frame caller, string name,
Variable[] pos, VarHash named) {

if (name == "postcircumfix:<( )>") {
IntPtr[] args = MarshalPositionals(pos);
IntPtr ret = Perl5Interpreter.SubCall(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;
}

Expand Down
29 changes: 27 additions & 2 deletions lib/p5embed.c
Expand Up @@ -66,8 +66,33 @@ SV* p5method_call(char* name,SV** args,int args_count) {

return ret;

/*FREETMPS;
LEAVE;*/
}

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


PUSHMARK(SP);
int i;
for (i=1;i<args_count;i++) {
XPUSHs(args[i]);
}
PUTBACK;


int count = call_sv(args[0],G_SCALAR);
SPAGAIN;
if (count != 1) croak("Big trouble\n");

SV* ret = POPs;

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

PUTBACK;

return ret;

}

int p5embed_SvIOKp(SV* sv) {
Expand Down

0 comments on commit 935bc30

Please sign in to comment.