Skip to content

Commit

Permalink
Merge branch 'udem-dlteam:main' into misc-fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
VisenDev authored Jan 3, 2025
2 parents f9c5c86 + 11525dd commit bf39e03
Show file tree
Hide file tree
Showing 9 changed files with 120 additions and 11 deletions.
2 changes: 1 addition & 1 deletion bootstrap-pnut-exe.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ if [ ! -d "$TEMP_DIR" ]; then mkdir "$TEMP_DIR"; fi
printf_timing() {
msg=$1
cmd=$2
real_time=`/usr/bin/time -p sh -c "$cmd" 2>&1 | grep '^real ' | sed 's/.* //'`
real_time=`env time -p sh -c "$cmd" 2>&1 | grep '^real ' | sed 's/.* //'`
printf "%ss %s\n" $real_time "$msg"
}

Expand Down
2 changes: 1 addition & 1 deletion bootstrap-pnut-sh.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ bootstrap_with_shell() {

echo "Bootstrap with $1"

/usr/bin/time $1 "$TEMP_DIR/pnut-sh.sh" $PNUT_SH_OPTIONS "pnut.c" > "$TEMP_DIR/pnut-sh-twice-bootstrapped.sh"
env time $1 "$TEMP_DIR/pnut-sh.sh" $PNUT_SH_OPTIONS "pnut.c" > "$TEMP_DIR/pnut-sh-twice-bootstrapped.sh"

diff "$TEMP_DIR/pnut-sh.sh" "$TEMP_DIR/pnut-sh-twice-bootstrapped.sh"

Expand Down
54 changes: 48 additions & 6 deletions pnut.c
Original file line number Diff line number Diff line change
Expand Up @@ -869,6 +869,13 @@ int WRITE_ID;
int OPEN_ID;
int CLOSE_ID;

// Macros that are defined by the preprocessor
int FILE__ID;
int LINE__ID;
int DATE__ID;
int TIME__ID;
int TIMESTAMP__ID;

// When we parse a macro, we generally want the tokens as they are, without expanding them.
void get_tok_macro() {
bool prev_expand_macro = expand_macro;
Expand Down Expand Up @@ -1263,8 +1270,7 @@ void get_ident() {
tok = heap[val+2];
}

int init_ident(int tok, char *name) {

int intern_str(char* name) {
int i = 0;
int prev_ch = ch; // The character may be important to the calling function, saving it

Expand All @@ -1276,15 +1282,19 @@ int init_ident(int tok, char *name) {
i += 1;
}

i = end_ident();

heap[i+2] = tok;
i = end_string();

ch = prev_ch;

return i;
}

int init_ident(int tok, char *name) {
int i = intern_str(name);
heap[i+2] = tok;
return i;
}

void init_ident_table() {

int i = 0;
Expand Down Expand Up @@ -1367,8 +1377,28 @@ void init_ident_table() {
NOT_SUPPORTED_ID = init_ident(IDENTIFIER, "NOT_SUPPORTED");
}

void init_builtin_string_macro(int macro_id, char* value) {
// Macro object shape: ([(tok, val)], arity). -1 arity means it's an object-like macro
heap[macro_id + 3] = cons(cons(cons(STRING, intern_str(value)), 0), -1);
}

void init_builtin_int_macro(int macro_id, int value) {
heap[macro_id + 3] = cons(cons(cons(INTEGER, -value), 0), -1);
}

void init_pnut_macros() {
init_ident(MACRO, "PNUT_CC");
FILE__ID = init_ident(MACRO, "__FILE__");
LINE__ID = init_ident(MACRO, "__LINE__");
DATE__ID = init_ident(MACRO, "__DATE__");
TIME__ID = init_ident(MACRO, "__TIME__");
TIMESTAMP__ID = init_ident(MACRO, "__TIMESTAMP__");

init_builtin_string_macro(FILE__ID, "<unknown>");
init_builtin_int_macro (LINE__ID, 0);
init_builtin_string_macro(DATE__ID, "Jan 1 1970");
init_builtin_string_macro(TIME__ID, "00:00:00");
init_builtin_string_macro(TIMESTAMP__ID, "Jan 1 1970 00:00:00");
}

// A macro argument is represented using a list of tokens.
Expand Down Expand Up @@ -1490,7 +1520,19 @@ bool attempt_macro_expansion(int macro) {
int tokens = car(heap[macro + 3]);
macro = val;
if (cdr(heap[macro + 3]) == -1) { // Object-like macro
play_macro(tokens, 0);
// Note: Redefining __{FILE,LINE}__ macros, either with the #define or #line
// directives is not supported.
if (macro == FILE__ID) {
play_macro(cons(cons(STRING, intern_str(fp_filepath)), 0), 0);
}
#ifdef INCLUDE_LINE_NUMBER_ON_ERROR
else if (macro == LINE__ID) {
play_macro(cons(cons(INTEGER, -line_number), 0), 0);
}
#endif
else {
play_macro(tokens, 0);
}
return true;
} else {
new_macro_args = get_macro_args_toks(macro);
Expand Down
11 changes: 8 additions & 3 deletions run-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,14 @@ esac
compile_pnut() { # extra pnut compilation options: $1
pnut_source="pnut.c"
extra_opts="$1"
extra_opts_id=$(printf "%s" $extra_opts | base64)
pnut_exe="./tests/pnut-by-gcc-$extra_opts_id.exe"
pnut_exe_backend="./tests/pnut-$extra_opts_id.$ext"
if [ -z "$extra_opts" ]; then
extra_opts_id="base"
else
extra_opts_id=$(printf "%s" "$extra_opts" | md5sum | cut -c 1-16) # 16 characters should be enough
fi
extra_opts_suffix=${extra_opts_id:+"-"}$extra_opts_id # Add a dash if there are extra options
pnut_exe="./tests/pnut-by-gcc${extra_opts_suffix}.exe"
pnut_exe_backend="./tests/pnut-$extra_opts_suffix.$ext"

if [ ! -f "$pnut_exe" ]; then
gcc "$pnut_source" $PNUT_EXE_OPTIONS $extra_opts -o "$pnut_exe" 2> /dev/null || fail "Error: Failed to compile $pnut_source with $backend"
Expand Down
3 changes: 3 additions & 0 deletions sh.c
Original file line number Diff line number Diff line change
Expand Up @@ -909,6 +909,7 @@ ast handle_side_effects_go(ast node, bool executes_conditionally) {
ast previous_conditional_fun_calls;
ast left_conditional_fun_calls;
ast right_conditional_fun_calls;
int start_gensym_ix = gensym_ix;

if (nb_children == 0) {
if (op == IDENTIFIER || op == IDENTIFIER_INTERNAL || op == IDENTIFIER_STRING || op == IDENTIFIER_DOLLAR || op == INTEGER || op == CHARACTER) {
Expand Down Expand Up @@ -967,9 +968,11 @@ ast handle_side_effects_go(ast node, bool executes_conditionally) {
// The left side is always executed, unless the whole expression is executed conditionally.
// We could compile it as always executed, but it makes the Shell code less regular so we compile it conditionally.
sub1 = handle_side_effects_go(get_child(node, 0), true);
gensym_ix = start_gensym_ix; // Reset gensym counter because the 2 sides are independent
left_conditional_fun_calls = conditional_fun_calls;
conditional_fun_calls = 0;
sub2 = handle_side_effects_go(get_child(node, 1), true);
gensym_ix = start_gensym_ix; // Reset gensym counter because the 2 sides are independent
right_conditional_fun_calls = conditional_fun_calls;
conditional_fun_calls = previous_conditional_fun_calls;
return new_ast4(op, sub1, sub2, left_conditional_fun_calls, right_conditional_fun_calls);
Expand Down
46 changes: 46 additions & 0 deletions tests/_all/preprocessor/macro/builtin-stubbed.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// tests for __FILE__, __LINE__, __DATE__, __TIME__, __TIMESTAMP__ built-in macros
#include <stdio.h>

#ifndef __FILE__
#error "__FILE__ is not defined"
#endif
#ifndef __LINE__
#error "__LINE__ is not defined"
#endif
#ifndef __DATE__
#error "__DATE__ is not defined"
#endif
#ifndef __TIME__
#error "__TIME__ is not defined"
#endif
#ifndef __TIMESTAMP__
#error "__TIMESTAMP__ is not defined"
#endif

void putint(int n) {
if (n < 0) {
putchar('-');
putint(-n);
} else if (n > 9) {
putint(n / 10);
putchar('0' + n % 10);
} else {
putchar('0' + n);
}
}

void putstr(char *str) {
while (*str) {
putchar(*str);
str += 1;
}
}

int main() {
putstr(__FILE__); putchar('\n');
putint(__LINE__); putchar('\n');
putstr(__DATE__); putchar('\n');
putstr(__TIME__); putchar('\n');
putstr(__TIMESTAMP__); putchar('\n');
return 0;
}
5 changes: 5 additions & 0 deletions tests/_all/preprocessor/macro/builtin-stubbed.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
tests/_all/preprocessor/macro/builtin-stubbed.c
0
Jan 1 1970
00:00:00
Jan 1 1970 00:00:00
3 changes: 3 additions & 0 deletions tests/_all/preprocessor/macro/builtin.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// tests for __FILE__, __LINE__, __DATE__, __TIME__, __TIMESTAMP__ built-in macros
// comp_pnut_opt: -DINCLUDE_LINE_NUMBER_ON_ERROR
#include "builtin-stubbed.c"
5 changes: 5 additions & 0 deletions tests/_all/preprocessor/macro/builtin.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
tests/_all/preprocessor/macro/builtin-stubbed.c
41
Jan 1 1970
00:00:00
Jan 1 1970 00:00:00

0 comments on commit bf39e03

Please sign in to comment.