Affix
view release on metacpan or search on metacpan
infix/src/arch/x64/abi_win_x64.c view on Meta::CPAN
*out_layout = nullptr;
return INFIX_ERROR_LAYOUT_FAILED;
}
}
}
size_t total_stack_arg_size = current_stack_offset - SHADOW_SPACE;
// Total allocation must include shadow space and be 16-byte aligned.
layout->total_stack_alloc = (SHADOW_SPACE + total_stack_arg_size + 15) & ~15;
// Prevent integer overflow and excessive stack allocation.
if (layout->total_stack_alloc > INFIX_MAX_STACK_ALLOC) {
fprintf(stderr, "Error: Calculated stack allocation exceeds safe limit of %d bytes.\n", INFIX_MAX_STACK_ALLOC);
*out_layout = nullptr;
return INFIX_ERROR_LAYOUT_FAILED;
}
*out_layout = layout;
return INFIX_SUCCESS;
}
/**
* @internal
* @brief Stage 2 (Forward): Generates the function prologue for the Windows x64 trampoline.
* @details This function emits the standard machine code required at the beginning of a function.
infix/src/common/double_tap.h view on Meta::CPAN
#define subtest(name) \
for (bool _tap_subtest_once = tap_subtest_start(name); _tap_subtest_once; _tap_subtest_once = tap_subtest_end())
/** @brief Marks a specified number of subsequent tests as skipped with a given reason. */
#define skip(count, ...) tap_skip(count, __VA_ARGS__)
/** @brief Marks all subsequent tests in the current scope as skipped. */
#define skip_all(...) tap_skip_all(__VA_ARGS__)
/** @brief Defines a block of tests that are expected to fail. A failure in a TODO block does not fail the overall
* suite. */
#define TODO(reason) \
for (int _tap_todo_once = (tap_todo_start(reason), 1); _tap_todo_once; _tap_todo_once = (tap_todo_end(), 0))
/** @brief Prints a diagnostic message to stderr, prefixed with '#'. Standard TAP practice for auxiliary information. */
#define diag(...) diag(__VA_ARGS__)
/** @brief Prints a diagnostic message (a note) to stdout, prefixed with '#'. */
#ifndef note
#define note(...) tap_note(__VA_ARGS__)
#endif
/** @brief Defines the main test function body where all tests are written. */
#ifdef __cplusplus
#define TEST extern "C" void test_body(void)
#else
#define TEST void test_body(void)
#endif
#else // If DBLTAP_ENABLE is not defined, provide stub macros to allow code to compile without the harness.
#define plan(count) ((void)0)
#define done() (0)
#define bail_out(...) \
do { \
fprintf(stderr, "Bail out! "); \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, "\n"); \
exit(1); \
} while (0)
#define ok(cond, ...) (true)
#define pass(...) ((void)0)
#define fail(...) ((void)0)
#define subtest(name) if (0)
#define skip(count, ...) ((void)0)
#define skip_all(...) ((void)0)
#define TODO(reason, ...) if (0)
#define diag(...) ((void)0)
infix/src/common/double_tap.h view on Meta::CPAN
current_state->todo_reason[0] = '\0';
}
void diag(const char * fmt, ...) {
_tap_ensure_initialized();
char buffer[1024];
va_list args;
va_start(args, fmt);
vsnprintf(buffer, sizeof(buffer), fmt, args);
va_end(args);
print_indent(stderr);
fprintf(stderr, "# %s\n", buffer);
fflush(stderr);
}
void tap_note(const char * fmt, ...) {
_tap_ensure_initialized();
char buffer[1024];
va_list args;
va_start(args, fmt);
vsnprintf(buffer, sizeof(buffer), fmt, args);
va_end(args);
print_indent(stdout);
fprintf(stdout, "# %s\n", buffer);
fflush(stdout);
}
void tap_bail_out(const char * reason, ...) {
fprintf(stderr, "Bail out! ");
va_list args;
va_start(args, reason);
vfprintf(stderr, reason, args);
va_end(args);
fprintf(stderr, "\n");
fflush(stderr);
exit(1);
}
bool tap_subtest_start(const char * name) {
_tap_ensure_initialized();
print_indent(stdout);
fprintf(stdout, "# Subtest: %s\n", name);
fflush(stdout);
push_state();
snprintf(current_state->subtest_name, sizeof(current_state->subtest_name), "%s", name);
lib/Affix/Build.pm view on Meta::CPAN
# Fallback to C
return '_build_c';
}
method _run (@cmd) {
print STDERR "[Affix] Exec: @cmd\n" if $debug;
# use Data::Dump;
# ddx \@cmd;
my ( $stdout, $stderr, $exit ) = capture {
system @cmd;
};
if ( !!$exit ) {
warn $stdout if $stdout;
warn $stderr if $stderr;
my $rc = $exit >> 8;
croak "Command failed (Exit $rc): @cmd";
}
}
method _can_run (@cmd) {
for my $c (@cmd) {
return $c if MM->maybe_command($c);
for my $dir ( File::Spec->path ) {
my $abs = File::Spec->catfile( $dir, $c );
lib/Affix/Platform/Unix.pm view on Meta::CPAN
chomp($ret);
return undef unless -x $ret;
chomp($ret);
$ret;
}
->();
my $trace;
{
use File::Temp qw[tempfile];
my ( $fh, $temp_file ) = tempfile();
$trace = `$compiler -Wl,-t -o $temp_file -l$name 2>&1`; # Redirect stderr to stdout
};
grep {/^.*?\/lib$name\.[^\s]+$/} split /\n/, $trace;
}
sub find_library ( $name, $version //= '' ) { # TODO: actually feed version to diff methods
if ( -f $name ) {
$name = readlink $name if -l $name; # Handle symbolic links
return $name if is_elf($name);
}
CORE::state $cache;
lib/Affix/Wrap.pm view on Meta::CPAN
if ( $ep_dir eq $pd ) { $found = 1; last; }
}
push @$project_dirs, $ep_dir unless $found;
my @includes = map { "-I" . $self->_normalize($_) } @$include_dirs;
for my $d (@$project_dirs) { push @includes, "-I$d"; }
my @cmd = (
$clang, '-target', $self->_get_triple(), '-Xclang',
'-ast-dump=json', '-Xclang', '-detailed-preprocessing-record', '-fsyntax-only',
'-fparse-all-comments', '-Wno-everything', @includes, $ep_abs
);
my ( $stdout, $stderr, $exit ) = Capture::Tiny::capture { system(@cmd); };
if ( $exit != 0 ) { die "Clang Error:\n$stderr"; }
if ( $stdout =~ /^.*?(\{.*)/s ) { $stdout = $1; }
my $ast = JSON::PP::decode_json($stdout);
my @objects;
$self->_walk( $ast, \@objects, $ep_abs );
$self->_scan_macros_fallback( \@objects );
$self->_merge_typedefs( \@objects );
$self->_wrap_named_types( \@objects );
#~ @objects = sort { ( $a->file cmp $b->file ) || ( $a->start_offset <=> $b->start_offset ) } @objects;
@objects;
lib/Test2/Tools/Affix.pm view on Meta::CPAN
#~ Affix::set_destruct_level(3);
#~ die 'I should be running a test named ' . $test;
}
elsif ( defined $generate_suppressions ) {
no Test2::Plugin::ExitSummary;
pass 'exiting...';
done_testing;
exit;
}
else {
my ( $stdout, $stderr, $exit_code ) = Capture::Tiny::capture(
sub {
system('valgrind --version');
}
);
plan skip_all 'Valgrind is not installed' if $exit_code;
diag 'Valgrind v', ( $stdout =~ m/valgrind-(.+)$/ ), ' found';
diag 'Generating suppressions...';
my @cmd = (
qw[valgrind --leak-check=full --show-reachable=yes --error-limit=no
--gen-suppressions=all --log-fd=1], $^X, '-e',
t/019_fileio.t view on Meta::CPAN
#include <string.h>
// Define a struct that contains a file pointer
typedef struct {
FILE* log_file;
int counter;
} Logger;
// Initialize logger with a file
DLLEXPORT void init_logger(Logger* logger, FILE* fp) {
if (!fp) fprintf(stderr, "C-side Warning: fp is NULL\n");
logger->log_file = fp;
logger->counter = 0;
}
// Write to a file retrieved from the struct
DLLEXPORT void log_message(Logger* logger, const char* msg) {
if (logger->log_file) {
fprintf(logger->log_file, "[%d] %s\n", ++logger->counter, msg);
fflush(logger->log_file);
}
t/src/std.h view on Meta::CPAN
#include <stdbool.h>
#include <stddef.h> // offsetof
#include <stdio.h>
#include <stdlib.h> // malloc
#include <string.h>
#include <wchar.h>
// Some tests might actually include perl.h which has the real version of this
#if !defined(warn)
#define warn(FORMAT, ...) \
fprintf(stderr, FORMAT " at %s line %i\n", ##__VA_ARGS__, __FILE__, __LINE__); \
fflush(stderr);
#endif
#if defined _WIN32 || defined __CYGWIN__
#include <BaseTsd.h>
// typedef SSIZE_T ssize_t;
typedef signed __int64 int64_t;
#ifdef __GNUC__
#define DLLEXPORT __attribute__((dllexport))
#else
#define DLLEXPORT __declspec(dllexport)
t/src/std.h view on Meta::CPAN
void _DumpHex(const void * addr, size_t len, const char * file, int line) {
fflush(stdout);
int perLine = 16;
// Silently ignore silly per-line values.
if (perLine < 4 || perLine > 64)
perLine = 16;
size_t i;
unsigned char buff[perLine + 1];
const unsigned char * pc = (const unsigned char *)addr;
if (addr == NULL) {
fprintf(stderr, "# Dumping NULL pointer at %s line %d\n", file, line);
return;
}
fprintf(stderr, "# Dumping %" PRIuPTR " bytes from %p at %s line %d\n", len, addr, file, line);
// Length checks.
if (len == 0) {
warn("ZERO LENGTH");
return;
}
if (len < 0) {
warn("NEGATIVE LENGTH: %" PRIuPTR, len);
return;
}
for (i = 0; i < len; i++) {
if ((i % perLine) == 0) { // Only print previous-line ASCII buffer for
// lines beyond first.
if (i != 0)
fprintf(stderr, " | %s\n", buff);
fprintf(stderr, "# %03" PRIuPTR " ", i); // Output the offset of current line.
}
// Now the hex code for the specific character.
fprintf(stderr, " %02x", pc[i]);
// And buffer a printable ASCII character for later.
if ((pc[i] < 0x20) || (pc[i] > 0x7e)) // isprint() may be better.
buff[i % perLine] = '.';
else
buff[i % perLine] = pc[i];
buff[(i % perLine) + 1] = '\0';
}
// Pad out last line if not exactly perLine characters.
while ((i % perLine) != 0) {
fprintf(stderr, " ");
i++;
}
fprintf(stderr, " | %s\n", buff);
fflush(stderr);
}
( run in 0.846 second using v1.01-cache-2.11-cpan-bbdf54b448f )