Skip to content

Instantly share code, notes, and snippets.

@FROGGS

FROGGS/mangle.p6 Secret

Created March 6, 2015 18:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FROGGS/7a43b46dd5a20325d819 to your computer and use it in GitHub Desktop.
Save FROGGS/7a43b46dd5a20325d819 to your computer and use it in GitHub Desktop.
sub mangle_cpp_symbol(Routine $r, $symbol) {
$r.signature.set_returns($r.package)
if $r.name eq 'new' && !$r.signature.has_returns && $r.package !~~ GLOBAL;
my $mangled = '_Z'
~ ($r.package.REPR eq 'CPPStruct' ?? 'N' !! '')
~ $symbol.split('::').map({$_ eq 'new' ?? 'C1' !! $_.chars ~ $_}).join('');
~ ($r.package.REPR eq 'CPPStruct' ?? 'E' !! '');
my @params = $r.signature.params;
if $r ~~ Method {
@params.shift;
@params.pop if @params[*-1].name eq '%_';
}
my $params = join '', @params.map: {
my $R = ''; # reference
my $P = .rw ?? 'P' !! ''; # pointer
my $K = $P && $_ ~~ CPPConst ?? 'K' !! ''; # const
cpp_param_letter(.type, :$R, :$P, :$K)
};
$mangled ~= $params || 'v';
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment