Skip to content

Instantly share code, notes, and snippets.

@jef-sure
Last active September 7, 2020 22:23
Show Gist options
  • Save jef-sure/d126e709313af04353de79df2a9839af to your computer and use it in GitHub Desktop.
Save jef-sure/d126e709313af04353de79df2a9839af to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
use v5.20;
use B; # qw(object_2svref);
use Inline C => <<'END_OF_C_CODE';
char* typeof_sv(SV* sv) {
SvGETMAGIC (sv);
if (SvPOKp (sv))
return "string";
else if (SvNOKp (sv) || SvIOKp (sv))
return "number";
else if (SvROK (sv))
return "reference";
else if (!SvOK (sv))
return "null";
else
return "unknown";
}
END_OF_C_CODE
sub typeof_pl {
my $o = B::svref_2object(\$_[0]);
#return ref($o);
if ($o->can('FLAGS')) {
my $flags = $o->FLAGS;
if ($flags & B::SVp_POK) {
return "string";
} elsif ($flags & B::SVp_NOK || $flags & B::SVp_IOK) {
return "number";
} else {
return "unknown";
}
} else {
return "null";
}
}
say typeof_sv($_) for (1, 2, 3.5, "0", "jaja", sub { }, undef, bless([], "T"), -3);
say "---";
say typeof_pl($_) for (1, 2, 3.5, "0", "jaja", sub { }, undef, bless([], "T"), -3, 235);
__END__
number
number
number
string
string
reference
null
reference
number
---
number
number
number
string
string
unknown
null
unknown
number
number
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment