summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/vm-engine.c6
-rw-r--r--libguile/vm-i-scheme.c34
-rw-r--r--module/language/tree-il/compile-glil.scm3
-rw-r--r--module/language/tree-il/primitives.scm3
4 files changed, 46 insertions, 0 deletions
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c
index 7fbb77480..71cb636a6 100644
--- a/libguile/vm-engine.c
+++ b/libguile/vm-engine.c
@@ -206,6 +206,12 @@ VM_NAME (struct scm_vm *vp, SCM program, SCM *argv, int nargs)
/* shouldn't get here */
goto vm_error;
+ vm_error_not_a_struct:
+ SYNC_ALL ();
+ scm_wrong_type_arg_msg (FUNC_NAME, 1, finish_args, "struct");
+ /* shouldn't get here */
+ goto vm_error;
+
vm_error_no_values:
err_msg = scm_from_locale_string ("Zero values returned to single-valued continuation");
finish_args = SCM_EOL;
diff --git a/libguile/vm-i-scheme.c b/libguile/vm-i-scheme.c
index c9b40ee56..6faab9be1 100644
--- a/libguile/vm-i-scheme.c
+++ b/libguile/vm-i-scheme.c
@@ -621,6 +621,40 @@ BV_FLOAT_SET (f64, ieee_double, double, 8)
#undef BV_INT_SET
#undef BV_FLOAT_SET
+#define VM_VALIDATE_STRUCT(obj) \
+ if (SCM_UNLIKELY (!SCM_STRUCTP (obj))) \
+ { \
+ finish_args = (obj); \
+ goto vm_error_not_a_struct; \
+ }
+
+VM_DEFINE_FUNCTION (174, struct_p, "struct?", 1)
+{
+ ARGS1 (obj);
+ RETURN (scm_from_bool (SCM_STRUCTP (obj)));
+}
+
+VM_DEFINE_FUNCTION (175, struct_vtable, "struct-vtable", 1)
+{
+ ARGS1 (obj);
+ VM_VALIDATE_STRUCT (obj);
+ RETURN (SCM_STRUCT_VTABLE (obj));
+}
+
+VM_DEFINE_INSTRUCTION (176, make_struct, "make-struct", 2, -1, 1)
+{
+ unsigned h = FETCH ();
+ unsigned l = FETCH ();
+ int n_args = ((h << 8U) + l);
+ SCM vtable = sp[1 - n_args], n_tail = sp[2 - n_args];
+ const SCM *inits = sp - n_args + 3;
+
+ sp -= n_args - 1;
+
+ RETURN (scm_c_make_structv (vtable, scm_to_size_t (n_tail),
+ n_args - 2, (scm_t_bits *) inits));
+}
+
/*
(defun renumber-ops ()
"start from top of buffer and renumber 'VM_DEFINE_FOO (\n' sequences"
diff --git a/module/language/tree-il/compile-glil.scm b/module/language/tree-il/compile-glil.scm
index f0989a599..c0dae6494 100644
--- a/module/language/tree-il/compile-glil.scm
+++ b/module/language/tree-il/compile-glil.scm
@@ -115,6 +115,9 @@
((variable-ref . 1) . variable-ref)
;; nb, *not* variable-set! -- the args are switched
((variable-set . 2) . variable-set)
+ ((struct? . 1) . struct?)
+ ((struct-vtable . 1) . struct-vtable)
+ (make-struct . make-struct)
;; hack for javascript
((return . 1) return)
diff --git a/module/language/tree-il/primitives.scm b/module/language/tree-il/primitives.scm
index a8767aef8..bfe9af56e 100644
--- a/module/language/tree-il/primitives.scm
+++ b/module/language/tree-il/primitives.scm
@@ -57,6 +57,8 @@
variable-ref variable-set!
;; args of variable-set are switched; it needs special help
+ struct? struct-vtable make-struct
+
bytevector-u8-ref bytevector-u8-set!
bytevector-s8-ref bytevector-s8-set!
@@ -104,6 +106,7 @@
caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr
cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr
vector-ref
+ struct? struct-vtable make-struct
bytevector-u8-ref bytevector-s8-ref
bytevector-u16-ref bytevector-u16-native-ref
bytevector-s16-ref bytevector-s16-native-ref