guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 01/01: VM type checking refactor


From: Andy Wingo
Subject: [Guile-commits] 01/01: VM type checking refactor
Date: Sat, 11 Jun 2016 11:09:48 +0000 (UTC)

wingo pushed a commit to branch master
in repository guile.

commit 100b0480971239cf26779e6e9b3465db31d0a489
Author: Andy Wingo <address@hidden>
Date:   Sat Jun 11 13:01:56 2016 +0200

    VM type checking refactor
    
    * libguile/vm-engine.c (VM_VALIDATE): Refactor some type-related
      assertions to use a common macro.
      (vector-length, vector-set!/immediate): Fix the proc mentioned in the
      error message.
---
 libguile/vm-engine.c |   79 +++++++++++++++++++++++---------------------------
 1 file changed, 37 insertions(+), 42 deletions(-)

diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c
index 3af66b6..dfdf0a1 100644
--- a/libguile/vm-engine.c
+++ b/libguile/vm-engine.c
@@ -423,7 +423,7 @@
   ((scm_t_signed_bits) SCM_UNPACK (SCM_INUM1)    \
    - (scm_t_signed_bits) SCM_UNPACK (SCM_INUM0))
 
-#define BINARY_INTEGER_OP(CFUNC,SFUNC)                                      \
+#define BINARY_INTEGER_OP(CFUNC,SFUNC)                          \
   {                                                             \
     ARGS2 (x, y);                                              \
     if (SCM_I_INUMP (x) && SCM_I_INUMP (y))                     \
@@ -435,14 +435,26 @@
     RETURN_EXP (SFUNC (x, y));                                  \
   }
 
-#define VM_VALIDATE_PAIR(x, proc)              \
-  VM_ASSERT (scm_is_pair (x), vm_error_not_a_pair (proc, x))
-  
-#define VM_VALIDATE_STRUCT(obj, proc)           \
-  VM_ASSERT (SCM_STRUCTP (obj), vm_error_not_a_pair (proc, obj))
-
-#define VM_VALIDATE_BYTEVECTOR(x, proc)                \
-  VM_ASSERT (SCM_BYTEVECTOR_P (x), vm_error_not_a_bytevector (proc, x))
+#define VM_VALIDATE(x, pred, proc, what)                                \
+  VM_ASSERT (pred (x), vm_error_not_a_ ## what (proc, x))
+
+#define VM_VALIDATE_BYTEVECTOR(x, proc)                                 \
+  VM_VALIDATE (x, SCM_BYTEVECTOR_P, proc, bytevector)
+#define VM_VALIDATE_CHAR(x, proc)                                       \
+  VM_VALIDATE (x, SCM_CHARP, proc, char);
+#define VM_VALIDATE_PAIR(x, proc)                                       \
+  VM_VALIDATE (x, scm_is_pair, proc, pair)
+#define VM_VALIDATE_STRING(obj, proc)                                   \
+  VM_VALIDATE (obj, scm_is_string, proc, string)
+#define VM_VALIDATE_STRUCT(obj, proc)                                   \
+  VM_VALIDATE (obj, SCM_STRUCTP, proc, struct)
+#define VM_VALIDATE_VARIABLE(obj, proc)                                 \
+  VM_VALIDATE (obj, SCM_VARIABLEP, proc, variable)
+#define VM_VALIDATE_VECTOR(obj, proc)                                   \
+  VM_VALIDATE (obj, SCM_I_IS_VECTOR, proc, vector)
+
+#define VM_VALIDATE_INDEX(u64, size, proc)                              \
+  VM_ASSERT (u64 < size, vm_error_out_of_range_uint64 (proc, u64))
 
 /* Return true (non-zero) if PTR has suitable alignment for TYPE.  */
 #define ALIGNED_P(ptr, type)                   \
@@ -1599,8 +1611,7 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
       SCM var;
       UNPACK_12_12 (op, dst, src);
       var = SP_REF (src);
-      VM_ASSERT (SCM_VARIABLEP (var),
-                 vm_error_not_a_variable ("variable-ref", var));
+      VM_VALIDATE_VARIABLE (var, "variable-ref");
       VM_ASSERT (VARIABLE_BOUNDP (var), vm_error_unbound (var));
       SP_SET (dst, VARIABLE_REF (var));
       NEXT (1);
@@ -1616,8 +1627,7 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
       SCM var;
       UNPACK_12_12 (op, dst, src);
       var = SP_REF (dst);
-      VM_ASSERT (SCM_VARIABLEP (var),
-                 vm_error_not_a_variable ("variable-set!", var));
+      VM_VALIDATE_VARIABLE (var, "variable-set!");
       VARIABLE_SET (var, SP_REF (src));
       NEXT (1);
     }
@@ -2235,8 +2245,7 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
   VM_DEFINE_OP (76, string_length, "string-length", OP1 (X8_S12_S12) | OP_DST)
     {
       ARGS1 (str);
-      VM_ASSERT (scm_is_string (str),
-                 vm_error_not_a_string ("string-length", str));
+      VM_VALIDATE_STRING (str, "string-length");
       SP_SET_U64 (dst, scm_i_string_length (str));
       NEXT (1);
     }
@@ -2256,10 +2265,8 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
       str = SP_REF (src);
       c_idx = SP_REF_U64 (idx);
 
-      VM_ASSERT (scm_is_string (str),
-                 vm_error_not_a_string ("string-ref", str));
-      VM_ASSERT (c_idx < scm_i_string_length (str),
-                 vm_error_out_of_range_uint64 ("string-ref", c_idx));
+      VM_VALIDATE_STRING (str, "string-ref");
+      VM_VALIDATE_INDEX (c_idx, scm_i_string_length (str), "string-ref");
 
       RETURN (SCM_MAKE_CHAR (scm_i_string_ref (str, c_idx)));
     }
@@ -2590,8 +2597,7 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
 
       UNPACK_8_8_8 (op, dst, length, init);
       length_val = SP_REF_U64 (length);
-      VM_ASSERT (length_val < (size_t) -1,
-                 vm_error_out_of_range_uint64 ("make-vector", length_val));
+      VM_VALIDATE_INDEX (length_val, (size_t) -1, "make-vector");
 
       /* TODO: Inline this allocation.  */
       SYNC_IP ();
@@ -2631,9 +2637,7 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
   VM_DEFINE_OP (101, vector_length, "vector-length", OP1 (X8_S12_S12) | OP_DST)
     {
       ARGS1 (vect);
-      VM_ASSERT (SCM_I_IS_VECTOR (vect),
-                 vm_error_not_a_vector ("vector-ref", vect));
-
+      VM_VALIDATE_VECTOR (vect, "vector-length");
       SP_SET_U64 (dst, SCM_I_VECTOR_LENGTH (vect));
       NEXT (1);
     }
@@ -2653,10 +2657,8 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
       vect = SP_REF (src);
       c_idx = SP_REF_U64 (idx);
 
-      VM_ASSERT (SCM_I_IS_VECTOR (vect),
-                 vm_error_not_a_vector ("vector-ref", vect));
-      VM_ASSERT (c_idx < SCM_I_VECTOR_LENGTH (vect),
-                 vm_error_out_of_range_uint64 ("vector-ref", c_idx));
+      VM_VALIDATE_VECTOR (vect, "vector-ref");
+      VM_VALIDATE_INDEX (c_idx, SCM_I_VECTOR_LENGTH (vect), "vector-ref");
       RETURN (SCM_I_VECTOR_ELTS (vect)[c_idx]);
     }
 
@@ -2672,10 +2674,8 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
       
       UNPACK_8_8_8 (op, dst, src, idx);
       vect = SP_REF (src);
-      VM_ASSERT (SCM_I_IS_VECTOR (vect),
-                 vm_error_not_a_vector ("vector-ref", vect));
-      VM_ASSERT (idx < SCM_I_VECTOR_LENGTH (vect),
-                 vm_error_out_of_range_uint64 ("vector-ref", idx));
+      VM_VALIDATE_VECTOR (vect, "vector-ref");
+      VM_VALIDATE_INDEX (idx, SCM_I_VECTOR_LENGTH (vect), "vector-ref");
       SP_SET (dst, SCM_I_VECTOR_ELTS (vect)[idx]);
       NEXT (1);
     }
@@ -2695,10 +2695,8 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
       c_idx = SP_REF_U64 (idx);
       val = SP_REF (src);
 
-      VM_ASSERT (SCM_I_IS_VECTOR (vect),
-                 vm_error_not_a_vector ("vector-set!", vect));
-      VM_ASSERT (c_idx < SCM_I_VECTOR_LENGTH (vect),
-                 vm_error_out_of_range_uint64 ("vector-set!", c_idx));
+      VM_VALIDATE_VECTOR (vect, "vector-set!");
+      VM_VALIDATE_INDEX (c_idx, SCM_I_VECTOR_LENGTH (vect), "vector-set!");
       SCM_I_VECTOR_WELTS (vect)[c_idx] = val;
       NEXT (1);
     }
@@ -2717,10 +2715,8 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
       vect = SP_REF (dst);
       val = SP_REF (src);
 
-      VM_ASSERT (SCM_I_IS_VECTOR (vect),
-                 vm_error_not_a_vector ("vector-ref", vect));
-      VM_ASSERT (idx < SCM_I_VECTOR_LENGTH (vect),
-                 vm_error_out_of_range_uint64 ("vector-ref", idx));
+      VM_VALIDATE_VECTOR (vect, "vector-set!");
+      VM_VALIDATE_INDEX (idx, SCM_I_VECTOR_LENGTH (vect), "vector-set!");
       SCM_I_VECTOR_WELTS (vect)[idx] = val;
       NEXT (1);
     }
@@ -3778,8 +3774,7 @@ VM_NAME (scm_i_thread *thread, struct scm_vm *vp,
       UNPACK_12_12 (op, dst, src);
       x = SP_REF (src);
 
-      VM_ASSERT (SCM_CHARP (x), vm_error_not_a_char ("char->integer", x));
-
+      VM_VALIDATE_CHAR (x, "char->integer");
       SP_SET_U64 (dst, SCM_CHAR (x));
 
       NEXT (1);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]