summaryrefslogtreecommitdiff
path: root/builtin.c
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <leonerd@leonerd.org.uk>2021-12-03 13:35:53 +0000
committerPaul Evans <leonerd@leonerd.org.uk>2021-12-04 11:39:22 +0000
commit6ac93b496cce8882a9d5494bfedb84f4da7e0aee (patch)
tree39715c51bfcaf9a851f141a929fb07ae4fc39773 /builtin.c
parent6ae4a6b7932dd745639ff335e83dbc87c63031a1 (diff)
downloadperl-6ac93b496cce8882a9d5494bfedb84f4da7e0aee.tar.gz
Add builtin:: funcs for handling weakrefs
Also, ensure that B::Deparse understands the OA_TARGMY optimisation of OP_ISBOOL
Diffstat (limited to 'builtin.c')
-rw-r--r--builtin.c53
1 files changed, 38 insertions, 15 deletions
diff --git a/builtin.c b/builtin.c
index 8919628e05..5a62a12bb9 100644
--- a/builtin.c
+++ b/builtin.c
@@ -71,12 +71,8 @@ static OP *ck_builtin_const(pTHX_ OP *entersubop, GV *namegv, SV *ckobj)
return newSVOP(OP_CONST, 0, constval);
}
-enum {
- BUILTIN_FUNC1_ISBOOL = 1,
-};
-
-XS(XS_builtin_func1);
-XS(XS_builtin_func1)
+XS(XS_builtin_func1_scalar);
+XS(XS_builtin_func1_scalar)
{
dXSARGS;
dXSI32;
@@ -85,17 +81,46 @@ XS(XS_builtin_func1)
croak_xs_usage(cv, "arg");
switch(ix) {
- case BUILTIN_FUNC1_ISBOOL:
+ case OP_ISBOOL:
Perl_pp_isbool(aTHX);
break;
+ case OP_ISWEAK:
+ Perl_pp_isweak(aTHX);
+ break;
+
default:
- Perl_die(aTHX_ "panic: unhandled ix value %d for xs_builtin_func1()", ix);
+ Perl_die(aTHX_ "panic: unhandled opcode %d for xs_builtin_func1_scalar()", ix);
}
XSRETURN(1);
}
+XS(XS_builtin_func1_void);
+XS(XS_builtin_func1_void)
+{
+ dXSARGS;
+ dXSI32;
+
+ if(items != 1)
+ croak_xs_usage(cv, "arg");
+
+ switch(ix) {
+ case OP_WEAKEN:
+ Perl_pp_weaken(aTHX);
+ break;
+
+ case OP_UNWEAKEN:
+ Perl_pp_unweaken(aTHX);
+ break;
+
+ default:
+ Perl_die(aTHX_ "panic: unhandled opcode %d for xs_builtin_func1_void()", ix);
+ }
+
+ XSRETURN(0);
+}
+
static OP *ck_builtin_func1(pTHX_ OP *entersubop, GV *namegv, SV *ckobj)
{
const struct BuiltinFuncDescriptor *builtin = NUM2PTR(const struct BuiltinFuncDescriptor *, SvUV(ckobj));
@@ -125,12 +150,7 @@ static OP *ck_builtin_func1(pTHX_ OP *entersubop, GV *namegv, SV *ckobj)
op_free(entersubop);
- OPCODE opcode;
- switch(builtin->ckval) {
- case BUILTIN_FUNC1_ISBOOL: opcode = OP_ISBOOL; break;
- default:
- DIE(aTHX_ "panic: unhandled ckval value %" IVdf " for ck_builtin_func1()", builtin->ckval);
- }
+ OPCODE opcode = builtin->ckval;
return newUNOP(opcode, wantflags, argop);
}
@@ -143,7 +163,10 @@ static const struct BuiltinFuncDescriptor builtins[] = {
{ "builtin::false", &XS_builtin_false, &ck_builtin_const, BUILTIN_CONST_FALSE },
/* unary functions */
- { "builtin::isbool", &XS_builtin_func1, &ck_builtin_func1, BUILTIN_FUNC1_ISBOOL },
+ { "builtin::isbool", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_ISBOOL },
+ { "builtin::weaken", &XS_builtin_func1_void, &ck_builtin_func1, OP_WEAKEN },
+ { "builtin::unweaken", &XS_builtin_func1_void, &ck_builtin_func1, OP_UNWEAKEN },
+ { "builtin::isweak", &XS_builtin_func1_scalar, &ck_builtin_func1, OP_ISWEAK },
{ 0 }
};