summaryrefslogtreecommitdiffstats
path: root/match.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-08-23 19:23:07 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-08-23 19:23:07 -0700
commita6fa35d2877745ba0b285093c40c1a3aad82a0e8 (patch)
treec198bb2deaa979417dbabc184dadf2061da86731 /match.c
parent6d0af6ae2af0003716581ed23b486f26ac809e0c (diff)
downloadtxr-a6fa35d2877745ba0b285093c40c1a3aad82a0e8.tar.gz
txr-a6fa35d2877745ba0b285093c40c1a3aad82a0e8.tar.bz2
txr-a6fa35d2877745ba0b285093c40c1a3aad82a0e8.zip
Use of new args for function calls in interpreter.
* args.c (args_copy_to_list): New function. * args.h (ARGS_MIN): New preprocessor symbol. (args_add_list): New inline function. (args_copy_to_list): Declared. * debug.c (debug): Args in debug frame are now struct args *. Pull them out nondestructively for printing using args_copy_to_list. * eval.c (do_eval_args): Fill struct args argument list rather than returning evaluated list. Dot position evaluation is handled by installing the dot position value as args->list. (do_eval): Allocate args of at least ARGS_MAX for the call to do_eval_args. Then use generic_funcall to invoke the function rather than apply. (eval_args_lisp1): Modified similarly to do_eval_args. (eval_lisp1): New static function. (expand_macro): Construct struct args argument list for the sake of debug_frame. (op_dwim): Allocate args which are filled by eval_args_lisp1, and applied to the function/object with generic_funcall. The object expression is separately evaluated with eval_lisp1. * match.c (h_fun, v_fun): Construct struct args arglist for the sake of debug_frame call. * unwind.c (uw_push_debug): args argument becomes struct args *. * unwind.h (struct uw_debug): args member becomes struct args *. (uw_push_debug): Declaration updated. * txr.1: Update documentation about dot position argument in function calls. (list . a) now works, which previously didn't.
Diffstat (limited to 'match.c')
-rw-r--r--match.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/match.c b/match.c
index b6775232..4c08fbc6 100644
--- a/match.c
+++ b/match.c
@@ -24,6 +24,7 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -34,8 +35,10 @@
#include <wchar.h>
#include <signal.h>
#include "config.h"
+#include ALLOCA_H
#include "lib.h"
#include "gc.h"
+#include "args.h"
#include "signal.h"
#include "unwind.h"
#include "regex.h"
@@ -1098,9 +1101,11 @@ static val h_fun(match_line_ctx *c)
}
{
+ struct args *args = args_alloc(ARGS_MIN);
+ args_init_list(args, ARGS_MIN, bindings_cp);
uw_block_begin(nil, result);
uw_env_begin;
- debug_frame(sym, bindings_cp, ub_p_a_pairs, c->bindings, c->dataline, c->data_lineno, c->pos);
+ debug_frame(sym, args, ub_p_a_pairs, c->bindings, c->dataline, c->data_lineno, c->pos);
result = match_line(ml_bindings_specline(*c, bindings_cp, body));
@@ -3584,9 +3589,11 @@ static val v_fun(match_files_ctx *c)
}
{
+ struct args *args = args_alloc(ARGS_MIN);
+ args_init_list(args, ARGS_MIN, bindings_cp);
uw_block_begin(nil, result);
uw_env_begin;
- debug_frame(sym, bindings_cp, ub_p_a_pairs, c->bindings, if2(consp(c->data), car(c->data)),
+ debug_frame(sym, args, ub_p_a_pairs, c->bindings, if2(consp(c->data), car(c->data)),
c->data_lineno, nil);
result = match_files(mf_spec_bindings(*c, body, bindings_cp));
debug_end;