diff --git a/libguile/_scm.h b/libguile/_scm.h index b4416fff7..a1884cad4 100644 --- a/libguile/_scm.h +++ b/libguile/_scm.h @@ -178,7 +178,7 @@ /* Major and minor versions must be single characters. */ #define SCM_OBJCODE_MAJOR_VERSION 0 -#define SCM_OBJCODE_MINOR_VERSION O +#define SCM_OBJCODE_MINOR_VERSION P #define SCM_OBJCODE_MAJOR_VERSION_STRING \ SCM_CPP_STRINGIFY(SCM_OBJCODE_MAJOR_VERSION) #define SCM_OBJCODE_MINOR_VERSION_STRING \ diff --git a/libguile/vm-i-loader.c b/libguile/vm-i-loader.c index ef53cdd02..a9326c9c6 100644 --- a/libguile/vm-i-loader.c +++ b/libguile/vm-i-loader.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001,2008,2009 Free Software Foundation, Inc. +/* Copyright (C) 2001,2008,2009,2010 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -20,7 +20,7 @@ /* This file is included in vm_engine.c */ -VM_DEFINE_LOADER (82, load_number, "load-number") +VM_DEFINE_LOADER (101, load_number, "load-number") { size_t len; @@ -33,7 +33,7 @@ VM_DEFINE_LOADER (82, load_number, "load-number") NEXT; } -VM_DEFINE_LOADER (83, load_string, "load-string") +VM_DEFINE_LOADER (102, load_string, "load-string") { size_t len; char *buf; @@ -46,7 +46,7 @@ VM_DEFINE_LOADER (83, load_string, "load-string") NEXT; } -VM_DEFINE_LOADER (84, load_symbol, "load-symbol") +VM_DEFINE_LOADER (103, load_symbol, "load-symbol") { size_t len; FETCH_LENGTH (len); @@ -57,7 +57,7 @@ VM_DEFINE_LOADER (84, load_symbol, "load-symbol") NEXT; } -VM_DEFINE_LOADER (86, load_program, "load-program") +VM_DEFINE_LOADER (104, load_program, "load-program") { scm_t_uint32 len; SCM objs, objcode; @@ -78,7 +78,7 @@ VM_DEFINE_LOADER (86, load_program, "load-program") NEXT; } -VM_DEFINE_INSTRUCTION (87, link_now, "link-now", 0, 1, 1) +VM_DEFINE_INSTRUCTION (105, link_now, "link-now", 0, 1, 1) { SCM what; POP (what); @@ -87,7 +87,7 @@ VM_DEFINE_INSTRUCTION (87, link_now, "link-now", 0, 1, 1) NEXT; } -VM_DEFINE_LOADER (89, load_array, "load-array") +VM_DEFINE_LOADER (106, load_array, "load-array") { SCM type, shape; size_t len; @@ -100,7 +100,7 @@ VM_DEFINE_LOADER (89, load_array, "load-array") NEXT; } -VM_DEFINE_LOADER (90, load_wide_string, "load-wide-string") +VM_DEFINE_LOADER (107, load_wide_string, "load-wide-string") { size_t len; scm_t_wchar *wbuf; @@ -124,7 +124,7 @@ VM_DEFINE_LOADER (90, load_wide_string, "load-wide-string") "start from top of buffer and renumber 'VM_DEFINE_FOO (\n' sequences" (interactive "") (save-excursion - (let ((counter 79)) (goto-char (point-min)) + (let ((counter 100)) (goto-char (point-min)) (while (re-search-forward "^VM_DEFINE_[^ ]+ (\\([^,]+\\)," (point-max) t) (replace-match (number-to-string (setq counter (1+ counter))) diff --git a/libguile/vm-i-scheme.c b/libguile/vm-i-scheme.c index e5e73dd99..20ec9f6af 100644 --- a/libguile/vm-i-scheme.c +++ b/libguile/vm-i-scheme.c @@ -29,43 +29,43 @@ #define RETURN(x) do { *sp = x; NEXT; } while (0) -VM_DEFINE_FUNCTION (100, not, "not", 1) +VM_DEFINE_FUNCTION (128, not, "not", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_is_false_or_nil (x))); } -VM_DEFINE_FUNCTION (101, not_not, "not-not", 1) +VM_DEFINE_FUNCTION (129, not_not, "not-not", 1) { ARGS1 (x); RETURN (scm_from_bool (!scm_is_false_or_nil (x))); } -VM_DEFINE_FUNCTION (102, eq, "eq?", 2) +VM_DEFINE_FUNCTION (130, eq, "eq?", 2) { ARGS2 (x, y); RETURN (scm_from_bool (scm_is_eq (x, y))); } -VM_DEFINE_FUNCTION (103, not_eq, "not-eq?", 2) +VM_DEFINE_FUNCTION (131, not_eq, "not-eq?", 2) { ARGS2 (x, y); RETURN (scm_from_bool (!scm_is_eq (x, y))); } -VM_DEFINE_FUNCTION (104, nullp, "null?", 1) +VM_DEFINE_FUNCTION (132, nullp, "null?", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_is_null_or_nil (x))); } -VM_DEFINE_FUNCTION (105, not_nullp, "not-null?", 1) +VM_DEFINE_FUNCTION (133, not_nullp, "not-null?", 1) { ARGS1 (x); RETURN (scm_from_bool (!scm_is_null_or_nil (x))); } -VM_DEFINE_FUNCTION (106, eqv, "eqv?", 2) +VM_DEFINE_FUNCTION (134, eqv, "eqv?", 2) { ARGS2 (x, y); if (scm_is_eq (x, y)) @@ -76,7 +76,7 @@ VM_DEFINE_FUNCTION (106, eqv, "eqv?", 2) RETURN (scm_eqv_p (x, y)); } -VM_DEFINE_FUNCTION (107, equal, "equal?", 2) +VM_DEFINE_FUNCTION (135, equal, "equal?", 2) { ARGS2 (x, y); if (scm_is_eq (x, y)) @@ -87,13 +87,13 @@ VM_DEFINE_FUNCTION (107, equal, "equal?", 2) RETURN (scm_equal_p (x, y)); } -VM_DEFINE_FUNCTION (108, pairp, "pair?", 1) +VM_DEFINE_FUNCTION (136, pairp, "pair?", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_is_pair (x))); } -VM_DEFINE_FUNCTION (109, listp, "list?", 1) +VM_DEFINE_FUNCTION (137, listp, "list?", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_ilength (x) >= 0)); @@ -104,7 +104,7 @@ VM_DEFINE_FUNCTION (109, listp, "list?", 1) * Basic data */ -VM_DEFINE_FUNCTION (110, cons, "cons", 2) +VM_DEFINE_FUNCTION (138, cons, "cons", 2) { ARGS2 (x, y); CONS (x, x, y); @@ -117,21 +117,21 @@ VM_DEFINE_FUNCTION (110, cons, "cons", 2) goto vm_error_not_a_pair; \ } -VM_DEFINE_FUNCTION (111, car, "car", 1) +VM_DEFINE_FUNCTION (139, car, "car", 1) { ARGS1 (x); VM_VALIDATE_CONS (x); RETURN (SCM_CAR (x)); } -VM_DEFINE_FUNCTION (112, cdr, "cdr", 1) +VM_DEFINE_FUNCTION (140, cdr, "cdr", 1) { ARGS1 (x); VM_VALIDATE_CONS (x); RETURN (SCM_CDR (x)); } -VM_DEFINE_INSTRUCTION (113, set_car, "set-car!", 0, 2, 0) +VM_DEFINE_INSTRUCTION (141, set_car, "set-car!", 0, 2, 0) { SCM x, y; POP (y); @@ -141,7 +141,7 @@ VM_DEFINE_INSTRUCTION (113, set_car, "set-car!", 0, 2, 0) NEXT; } -VM_DEFINE_INSTRUCTION (114, set_cdr, "set-cdr!", 0, 2, 0) +VM_DEFINE_INSTRUCTION (142, set_cdr, "set-cdr!", 0, 2, 0) { SCM x, y; POP (y); @@ -166,27 +166,27 @@ VM_DEFINE_INSTRUCTION (114, set_cdr, "set-cdr!", 0, 2, 0) RETURN (srel (x, y)); \ } -VM_DEFINE_FUNCTION (115, ee, "ee?", 2) +VM_DEFINE_FUNCTION (143, ee, "ee?", 2) { REL (==, scm_num_eq_p); } -VM_DEFINE_FUNCTION (116, lt, "lt?", 2) +VM_DEFINE_FUNCTION (144, lt, "lt?", 2) { REL (<, scm_less_p); } -VM_DEFINE_FUNCTION (117, le, "le?", 2) +VM_DEFINE_FUNCTION (145, le, "le?", 2) { REL (<=, scm_leq_p); } -VM_DEFINE_FUNCTION (118, gt, "gt?", 2) +VM_DEFINE_FUNCTION (146, gt, "gt?", 2) { REL (>, scm_gr_p); } -VM_DEFINE_FUNCTION (119, ge, "ge?", 2) +VM_DEFINE_FUNCTION (147, ge, "ge?", 2) { REL (>=, scm_geq_p); } @@ -210,12 +210,12 @@ VM_DEFINE_FUNCTION (119, ge, "ge?", 2) RETURN (SFUNC (x, y)); \ } -VM_DEFINE_FUNCTION (120, add, "add", 2) +VM_DEFINE_FUNCTION (148, add, "add", 2) { FUNC2 (+, scm_sum); } -VM_DEFINE_FUNCTION (167, add1, "add1", 1) +VM_DEFINE_FUNCTION (149, add1, "add1", 1) { ARGS1 (x); if (SCM_I_INUMP (x)) @@ -228,12 +228,12 @@ VM_DEFINE_FUNCTION (167, add1, "add1", 1) RETURN (scm_sum (x, SCM_I_MAKINUM (1))); } -VM_DEFINE_FUNCTION (121, sub, "sub", 2) +VM_DEFINE_FUNCTION (150, sub, "sub", 2) { FUNC2 (-, scm_difference); } -VM_DEFINE_FUNCTION (168, sub1, "sub1", 1) +VM_DEFINE_FUNCTION (151, sub1, "sub1", 1) { ARGS1 (x); if (SCM_I_INUMP (x)) @@ -246,42 +246,42 @@ VM_DEFINE_FUNCTION (168, sub1, "sub1", 1) RETURN (scm_difference (x, SCM_I_MAKINUM (1))); } -VM_DEFINE_FUNCTION (122, mul, "mul", 2) +VM_DEFINE_FUNCTION (152, mul, "mul", 2) { ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_product (x, y)); } -VM_DEFINE_FUNCTION (123, div, "div", 2) +VM_DEFINE_FUNCTION (153, div, "div", 2) { ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_divide (x, y)); } -VM_DEFINE_FUNCTION (124, quo, "quo", 2) +VM_DEFINE_FUNCTION (154, quo, "quo", 2) { ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_quotient (x, y)); } -VM_DEFINE_FUNCTION (125, rem, "rem", 2) +VM_DEFINE_FUNCTION (155, rem, "rem", 2) { ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_remainder (x, y)); } -VM_DEFINE_FUNCTION (126, mod, "mod", 2) +VM_DEFINE_FUNCTION (156, mod, "mod", 2) { ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_modulo (x, y)); } -VM_DEFINE_FUNCTION (170, ash, "ash", 2) +VM_DEFINE_FUNCTION (157, ash, "ash", 2) { ARGS2 (x, y); if (SCM_I_INUMP (x) && SCM_I_INUMP (y)) @@ -297,7 +297,7 @@ VM_DEFINE_FUNCTION (170, ash, "ash", 2) RETURN (scm_ash (x, y)); } -VM_DEFINE_FUNCTION (171, logand, "logand", 2) +VM_DEFINE_FUNCTION (158, logand, "logand", 2) { ARGS2 (x, y); if (SCM_I_INUMP (x) && SCM_I_INUMP (y)) @@ -306,7 +306,7 @@ VM_DEFINE_FUNCTION (171, logand, "logand", 2) RETURN (scm_logand (x, y)); } -VM_DEFINE_FUNCTION (172, logior, "logior", 2) +VM_DEFINE_FUNCTION (159, logior, "logior", 2) { ARGS2 (x, y); if (SCM_I_INUMP (x) && SCM_I_INUMP (y)) @@ -315,7 +315,7 @@ VM_DEFINE_FUNCTION (172, logior, "logior", 2) RETURN (scm_logior (x, y)); } -VM_DEFINE_FUNCTION (173, logxor, "logxor", 2) +VM_DEFINE_FUNCTION (160, logxor, "logxor", 2) { ARGS2 (x, y); if (SCM_I_INUMP (x) && SCM_I_INUMP (y)) @@ -326,35 +326,10 @@ VM_DEFINE_FUNCTION (173, logxor, "logxor", 2) /* - * GOOPS support + * Vectors and arrays */ -VM_DEFINE_FUNCTION (169, class_of, "class-of", 1) -{ - ARGS1 (obj); - RETURN (SCM_INSTANCEP (obj) ? SCM_CLASS_OF (obj) : scm_class_of (obj)); -} -VM_DEFINE_FUNCTION (127, slot_ref, "slot-ref", 2) -{ - size_t slot; - ARGS2 (instance, idx); - slot = SCM_I_INUM (idx); - RETURN (SCM_PACK (SCM_STRUCT_DATA (instance) [slot])); -} - -VM_DEFINE_INSTRUCTION (128, slot_set, "slot-set", 0, 3, 0) -{ - SCM instance, idx, val; - size_t slot; - POP (val); - POP (idx); - POP (instance); - slot = SCM_I_INUM (idx); - SCM_STRUCT_DATA (instance) [slot] = SCM_UNPACK (val); - NEXT; -} - -VM_DEFINE_FUNCTION (129, vector_ref, "vector-ref", 2) +VM_DEFINE_FUNCTION (161, vector_ref, "vector-ref", 2) { long i = 0; ARGS2 (vect, idx); @@ -370,7 +345,7 @@ VM_DEFINE_FUNCTION (129, vector_ref, "vector-ref", 2) } } -VM_DEFINE_INSTRUCTION (130, vector_set, "vector-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (162, vector_set, "vector-set", 0, 3, 0) { long i = 0; SCM vect, idx, val; @@ -388,6 +363,169 @@ VM_DEFINE_INSTRUCTION (130, vector_set, "vector-set", 0, 3, 0) NEXT; } +VM_DEFINE_INSTRUCTION (163, make_array, "make-array", 3, -1, 1) +{ + scm_t_uint32 len; + SCM shape, ret; + + len = FETCH (); + len = (len << 8) + FETCH (); + len = (len << 8) + FETCH (); + POP (shape); + SYNC_REGISTER (); + ret = scm_from_contiguous_array (shape, sp - len + 1, len); + DROPN (len); + PUSH (ret); + NEXT; +} + + +/* + * Structs + */ +#define VM_VALIDATE_STRUCT(obj) \ + if (SCM_UNLIKELY (!SCM_STRUCTP (obj))) \ + { \ + finish_args = (obj); \ + goto vm_error_not_a_struct; \ + } + +VM_DEFINE_FUNCTION (164, struct_p, "struct?", 1) +{ + ARGS1 (obj); + RETURN (scm_from_bool (SCM_STRUCTP (obj))); +} + +VM_DEFINE_FUNCTION (165, struct_vtable, "struct-vtable", 1) +{ + ARGS1 (obj); + VM_VALIDATE_STRUCT (obj); + RETURN (SCM_STRUCT_VTABLE (obj)); +} + +VM_DEFINE_INSTRUCTION (166, make_struct, "make-struct", 2, -1, 1) +{ + unsigned h = FETCH (); + unsigned l = FETCH (); + scm_t_bits 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; + + if (SCM_LIKELY (SCM_STRUCTP (vtable) + && SCM_VTABLE_FLAG_IS_SET (vtable, SCM_VTABLE_FLAG_SIMPLE) + && SCM_I_INUMP (n_tail))) + { + scm_t_bits n_inits, len; + + n_inits = SCM_I_INUM (n_tail) + n_args - 2; + len = SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size); + + if (SCM_LIKELY (n_inits == len)) + { + SCM obj; + + obj = scm_i_alloc_struct (SCM_STRUCT_DATA (vtable), n_inits); + memcpy (SCM_STRUCT_DATA (obj), inits, n_inits * sizeof (SCM)); + + RETURN (obj); + } + } + + SYNC_REGISTER (); + RETURN (scm_c_make_structv (vtable, scm_to_size_t (n_tail), + n_args - 2, (scm_t_bits *) inits)); +} + +VM_DEFINE_FUNCTION (167, struct_ref, "struct-ref", 2) +{ + ARGS2 (obj, pos); + + if (SCM_LIKELY (SCM_STRUCTP (obj) + && SCM_STRUCT_VTABLE_FLAG_IS_SET (obj, + SCM_VTABLE_FLAG_SIMPLE) + && SCM_I_INUMP (pos))) + { + SCM vtable; + scm_t_bits index, len; + + index = SCM_I_INUM (pos); + vtable = SCM_STRUCT_VTABLE (obj); + len = SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size); + + if (SCM_LIKELY (index < len)) + { + scm_t_bits *data = SCM_STRUCT_DATA (obj); + RETURN (SCM_PACK (data[index])); + } + } + + RETURN (scm_struct_ref (obj, pos)); +} + +VM_DEFINE_FUNCTION (168, struct_set, "struct-set", 3) +{ + ARGS3 (obj, pos, val); + + if (SCM_LIKELY (SCM_STRUCTP (obj) + && SCM_STRUCT_VTABLE_FLAG_IS_SET (obj, + SCM_VTABLE_FLAG_SIMPLE) + && SCM_STRUCT_VTABLE_FLAG_IS_SET (obj, + SCM_VTABLE_FLAG_SIMPLE_RW) + && SCM_I_INUMP (pos))) + { + SCM vtable; + scm_t_bits index, len; + + index = SCM_I_INUM (pos); + vtable = SCM_STRUCT_VTABLE (obj); + len = SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size); + if (SCM_LIKELY (index < len)) + { + scm_t_bits *data = SCM_STRUCT_DATA (obj); + data[index] = SCM_UNPACK (val); + RETURN (val); + } + } + + RETURN (scm_struct_set_x (obj, pos, val)); +} + + +/* + * GOOPS support + */ +VM_DEFINE_FUNCTION (169, class_of, "class-of", 1) +{ + ARGS1 (obj); + RETURN (SCM_INSTANCEP (obj) ? SCM_CLASS_OF (obj) : scm_class_of (obj)); +} + +VM_DEFINE_FUNCTION (170, slot_ref, "slot-ref", 2) +{ + size_t slot; + ARGS2 (instance, idx); + slot = SCM_I_INUM (idx); + RETURN (SCM_PACK (SCM_STRUCT_DATA (instance) [slot])); +} + +VM_DEFINE_INSTRUCTION (171, slot_set, "slot-set", 0, 3, 0) +{ + SCM instance, idx, val; + size_t slot; + POP (val); + POP (idx); + POP (instance); + slot = SCM_I_INUM (idx); + SCM_STRUCT_DATA (instance) [slot] = SCM_UNPACK (val); + NEXT; +} + + +/* + * Bytevectors + */ #define VM_VALIDATE_BYTEVECTOR(x) \ if (SCM_UNLIKELY (!SCM_BYTEVECTOR_P (x))) \ { finish_args = x; \ @@ -406,21 +544,21 @@ VM_DEFINE_INSTRUCTION (130, vector_set, "vector-set", 0, 3, 0) } \ } -VM_DEFINE_FUNCTION (131, bv_u16_ref, "bv-u16-ref", 3) +VM_DEFINE_FUNCTION (172, bv_u16_ref, "bv-u16-ref", 3) BV_REF_WITH_ENDIANNESS (u16, u16) -VM_DEFINE_FUNCTION (132, bv_s16_ref, "bv-s16-ref", 3) +VM_DEFINE_FUNCTION (173, bv_s16_ref, "bv-s16-ref", 3) BV_REF_WITH_ENDIANNESS (s16, s16) -VM_DEFINE_FUNCTION (133, bv_u32_ref, "bv-u32-ref", 3) +VM_DEFINE_FUNCTION (174, bv_u32_ref, "bv-u32-ref", 3) BV_REF_WITH_ENDIANNESS (u32, u32) -VM_DEFINE_FUNCTION (134, bv_s32_ref, "bv-s32-ref", 3) +VM_DEFINE_FUNCTION (175, bv_s32_ref, "bv-s32-ref", 3) BV_REF_WITH_ENDIANNESS (s32, s32) -VM_DEFINE_FUNCTION (135, bv_u64_ref, "bv-u64-ref", 3) +VM_DEFINE_FUNCTION (176, bv_u64_ref, "bv-u64-ref", 3) BV_REF_WITH_ENDIANNESS (u64, u64) -VM_DEFINE_FUNCTION (136, bv_s64_ref, "bv-s64-ref", 3) +VM_DEFINE_FUNCTION (177, bv_s64_ref, "bv-s64-ref", 3) BV_REF_WITH_ENDIANNESS (s64, s64) -VM_DEFINE_FUNCTION (137, bv_f32_ref, "bv-f32-ref", 3) +VM_DEFINE_FUNCTION (178, bv_f32_ref, "bv-f32-ref", 3) BV_REF_WITH_ENDIANNESS (f32, ieee_single) -VM_DEFINE_FUNCTION (138, bv_f64_ref, "bv-f64-ref", 3) +VM_DEFINE_FUNCTION (179, bv_f64_ref, "bv-f64-ref", 3) BV_REF_WITH_ENDIANNESS (f64, ieee_double) #undef BV_REF_WITH_ENDIANNESS @@ -473,33 +611,33 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double) RETURN (scm_bytevector_##fn_stem##_native_ref (bv, idx)); \ } -VM_DEFINE_FUNCTION (139, bv_u8_ref, "bv-u8-ref", 2) +VM_DEFINE_FUNCTION (180, bv_u8_ref, "bv-u8-ref", 2) BV_FIXABLE_INT_REF (u8, u8, uint8, 1) -VM_DEFINE_FUNCTION (140, bv_s8_ref, "bv-s8-ref", 2) +VM_DEFINE_FUNCTION (181, bv_s8_ref, "bv-s8-ref", 2) BV_FIXABLE_INT_REF (s8, s8, int8, 1) -VM_DEFINE_FUNCTION (141, bv_u16_native_ref, "bv-u16-native-ref", 2) +VM_DEFINE_FUNCTION (182, bv_u16_native_ref, "bv-u16-native-ref", 2) BV_FIXABLE_INT_REF (u16, u16_native, uint16, 2) -VM_DEFINE_FUNCTION (142, bv_s16_native_ref, "bv-s16-native-ref", 2) +VM_DEFINE_FUNCTION (183, bv_s16_native_ref, "bv-s16-native-ref", 2) BV_FIXABLE_INT_REF (s16, s16_native, int16, 2) -VM_DEFINE_FUNCTION (143, bv_u32_native_ref, "bv-u32-native-ref", 2) +VM_DEFINE_FUNCTION (184, bv_u32_native_ref, "bv-u32-native-ref", 2) #if SIZEOF_VOID_P > 4 BV_FIXABLE_INT_REF (u32, u32_native, uint32, 4) #else BV_INT_REF (u32, uint32, 4) #endif -VM_DEFINE_FUNCTION (144, bv_s32_native_ref, "bv-s32-native-ref", 2) +VM_DEFINE_FUNCTION (185, bv_s32_native_ref, "bv-s32-native-ref", 2) #if SIZEOF_VOID_P > 4 BV_FIXABLE_INT_REF (s32, s32_native, int32, 4) #else BV_INT_REF (s32, int32, 4) #endif -VM_DEFINE_FUNCTION (145, bv_u64_native_ref, "bv-u64-native-ref", 2) +VM_DEFINE_FUNCTION (186, bv_u64_native_ref, "bv-u64-native-ref", 2) BV_INT_REF (u64, uint64, 8) -VM_DEFINE_FUNCTION (146, bv_s64_native_ref, "bv-s64-native-ref", 2) +VM_DEFINE_FUNCTION (187, bv_s64_native_ref, "bv-s64-native-ref", 2) BV_INT_REF (s64, int64, 8) -VM_DEFINE_FUNCTION (147, bv_f32_native_ref, "bv-f32-native-ref", 2) +VM_DEFINE_FUNCTION (188, bv_f32_native_ref, "bv-f32-native-ref", 2) BV_FLOAT_REF (f32, ieee_single, float, 4) -VM_DEFINE_FUNCTION (148, bv_f64_native_ref, "bv-f64-native-ref", 2) +VM_DEFINE_FUNCTION (189, bv_f64_native_ref, "bv-f64-native-ref", 2) BV_FLOAT_REF (f64, ieee_double, double, 8) #undef BV_FIXABLE_INT_REF @@ -521,21 +659,21 @@ BV_FLOAT_REF (f64, ieee_double, double, 8) } \ } -VM_DEFINE_INSTRUCTION (149, bv_u16_set, "bv-u16-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (190, bv_u16_set, "bv-u16-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (u16, u16) -VM_DEFINE_INSTRUCTION (150, bv_s16_set, "bv-s16-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (191, bv_s16_set, "bv-s16-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (s16, s16) -VM_DEFINE_INSTRUCTION (151, bv_u32_set, "bv-u32-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (192, bv_u32_set, "bv-u32-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (u32, u32) -VM_DEFINE_INSTRUCTION (152, bv_s32_set, "bv-s32-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (193, bv_s32_set, "bv-s32-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (s32, s32) -VM_DEFINE_INSTRUCTION (153, bv_u64_set, "bv-u64-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (194, bv_u64_set, "bv-u64-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (u64, u64) -VM_DEFINE_INSTRUCTION (154, bv_s64_set, "bv-s64-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (195, bv_s64_set, "bv-s64-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (s64, s64) -VM_DEFINE_INSTRUCTION (155, bv_f32_set, "bv-f32-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (196, bv_f32_set, "bv-f32-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (f32, ieee_single) -VM_DEFINE_INSTRUCTION (156, bv_f64_set, "bv-f64-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (197, bv_f64_set, "bv-f64-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (f64, ieee_double) #undef BV_SET_WITH_ENDIANNESS @@ -588,170 +726,45 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double) NEXT; \ } -VM_DEFINE_INSTRUCTION (157, bv_u8_set, "bv-u8-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (198, bv_u8_set, "bv-u8-set", 0, 3, 0) BV_FIXABLE_INT_SET (u8, u8, uint8, 0, SCM_T_UINT8_MAX, 1) -VM_DEFINE_INSTRUCTION (158, bv_s8_set, "bv-s8-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (199, bv_s8_set, "bv-s8-set", 0, 3, 0) BV_FIXABLE_INT_SET (s8, s8, int8, SCM_T_INT8_MIN, SCM_T_INT8_MAX, 1) -VM_DEFINE_INSTRUCTION (159, bv_u16_native_set, "bv-u16-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (200, bv_u16_native_set, "bv-u16-native-set", 0, 3, 0) BV_FIXABLE_INT_SET (u16, u16_native, uint16, 0, SCM_T_UINT16_MAX, 2) -VM_DEFINE_INSTRUCTION (160, bv_s16_native_set, "bv-s16-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (201, bv_s16_native_set, "bv-s16-native-set", 0, 3, 0) BV_FIXABLE_INT_SET (s16, s16_native, int16, SCM_T_INT16_MIN, SCM_T_INT16_MAX, 2) -VM_DEFINE_INSTRUCTION (161, bv_u32_native_set, "bv-u32-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (202, bv_u32_native_set, "bv-u32-native-set", 0, 3, 0) #if SIZEOF_VOID_P > 4 BV_FIXABLE_INT_SET (u32, u32_native, uint32, 0, SCM_T_UINT32_MAX, 4) #else BV_INT_SET (u32, uint32, 4) #endif -VM_DEFINE_INSTRUCTION (162, bv_s32_native_set, "bv-s32-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (203, bv_s32_native_set, "bv-s32-native-set", 0, 3, 0) #if SIZEOF_VOID_P > 4 BV_FIXABLE_INT_SET (s32, s32_native, int32, SCM_T_INT32_MIN, SCM_T_INT32_MAX, 4) #else BV_INT_SET (s32, int32, 4) #endif -VM_DEFINE_INSTRUCTION (163, bv_u64_native_set, "bv-u64-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (204, bv_u64_native_set, "bv-u64-native-set", 0, 3, 0) BV_INT_SET (u64, uint64, 8) -VM_DEFINE_INSTRUCTION (164, bv_s64_native_set, "bv-s64-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (205, bv_s64_native_set, "bv-s64-native-set", 0, 3, 0) BV_INT_SET (s64, int64, 8) -VM_DEFINE_INSTRUCTION (165, bv_f32_native_set, "bv-f32-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (206, bv_f32_native_set, "bv-f32-native-set", 0, 3, 0) BV_FLOAT_SET (f32, ieee_single, float, 4) -VM_DEFINE_INSTRUCTION (166, bv_f64_native_set, "bv-f64-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (207, bv_f64_native_set, "bv-f64-native-set", 0, 3, 0) BV_FLOAT_SET (f64, ieee_double, double, 8) #undef BV_FIXABLE_INT_SET #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 (); - scm_t_bits 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; - - if (SCM_LIKELY (SCM_STRUCTP (vtable) - && SCM_VTABLE_FLAG_IS_SET (vtable, SCM_VTABLE_FLAG_SIMPLE) - && SCM_I_INUMP (n_tail))) - { - scm_t_bits n_inits, len; - - n_inits = SCM_I_INUM (n_tail) + n_args - 2; - len = SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size); - - if (SCM_LIKELY (n_inits == len)) - { - SCM obj; - - obj = scm_i_alloc_struct (SCM_STRUCT_DATA (vtable), n_inits); - memcpy (SCM_STRUCT_DATA (obj), inits, n_inits * sizeof (SCM)); - - RETURN (obj); - } - } - - SYNC_REGISTER (); - RETURN (scm_c_make_structv (vtable, scm_to_size_t (n_tail), - n_args - 2, (scm_t_bits *) inits)); -} - -VM_DEFINE_INSTRUCTION (177, make_array, "make-array", 3, -1, 1) -{ - scm_t_uint32 len; - SCM shape, ret; - - len = FETCH (); - len = (len << 8) + FETCH (); - len = (len << 8) + FETCH (); - POP (shape); - SYNC_REGISTER (); - ret = scm_from_contiguous_array (shape, sp - len + 1, len); - DROPN (len); - PUSH (ret); - NEXT; -} - -VM_DEFINE_FUNCTION (178, struct_ref, "struct-ref", 2) -{ - ARGS2 (obj, pos); - - if (SCM_LIKELY (SCM_STRUCTP (obj) - && SCM_STRUCT_VTABLE_FLAG_IS_SET (obj, - SCM_VTABLE_FLAG_SIMPLE) - && SCM_I_INUMP (pos))) - { - SCM vtable; - scm_t_bits index, len; - - index = SCM_I_INUM (pos); - vtable = SCM_STRUCT_VTABLE (obj); - len = SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size); - - if (SCM_LIKELY (index < len)) - { - scm_t_bits *data = SCM_STRUCT_DATA (obj); - RETURN (SCM_PACK (data[index])); - } - } - - RETURN (scm_struct_ref (obj, pos)); -} - -VM_DEFINE_FUNCTION (179, struct_set, "struct-set", 3) -{ - ARGS3 (obj, pos, val); - - if (SCM_LIKELY (SCM_STRUCTP (obj) - && SCM_STRUCT_VTABLE_FLAG_IS_SET (obj, - SCM_VTABLE_FLAG_SIMPLE) - && SCM_STRUCT_VTABLE_FLAG_IS_SET (obj, - SCM_VTABLE_FLAG_SIMPLE_RW) - && SCM_I_INUMP (pos))) - { - SCM vtable; - scm_t_bits index, len; - - index = SCM_I_INUM (pos); - vtable = SCM_STRUCT_VTABLE (obj); - len = SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size); - if (SCM_LIKELY (index < len)) - { - scm_t_bits *data = SCM_STRUCT_DATA (obj); - data[index] = SCM_UNPACK (val); - RETURN (val); - } - } - - RETURN (scm_struct_set_x (obj, pos, val)); -} - /* (defun renumber-ops () "start from top of buffer and renumber 'VM_DEFINE_FOO (\n' sequences" (interactive "") (save-excursion - (let ((counter 99)) (goto-char (point-min)) + (let ((counter 127)) (goto-char (point-min)) (while (re-search-forward "^VM_DEFINE_[^ ]+ (\\([^,]+\\)," (point-max) t) (replace-match (number-to-string (setq counter (1+ counter))) diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c index c9c743792..3ddc7ea80 100644 --- a/libguile/vm-i-system.c +++ b/libguile/vm-i-system.c @@ -835,7 +835,7 @@ VM_DEFINE_INSTRUCTION (55, tail_call, "tail-call", 1, -1, 1) } } -VM_DEFINE_INSTRUCTION (80, subr_call, "subr-call", 1, -1, -1) +VM_DEFINE_INSTRUCTION (56, subr_call, "subr-call", 1, -1, -1) { SCM foreign, ret; SCM (*subr)(); @@ -903,7 +903,7 @@ VM_DEFINE_INSTRUCTION (80, subr_call, "subr-call", 1, -1, -1) } } -VM_DEFINE_INSTRUCTION (81, smob_call, "smob-call", 1, -1, -1) +VM_DEFINE_INSTRUCTION (57, smob_call, "smob-call", 1, -1, -1) { SCM smob, ret; SCM (*subr)(); @@ -950,7 +950,35 @@ VM_DEFINE_INSTRUCTION (81, smob_call, "smob-call", 1, -1, -1) } } -VM_DEFINE_INSTRUCTION (56, tail_call_nargs, "tail-call/nargs", 0, 0, 1) +VM_DEFINE_INSTRUCTION (58, foreign_call, "foreign-call", 1, -1, -1) +{ + SCM foreign, ret; + nargs = FETCH (); + POP (foreign); + + VM_HANDLE_INTERRUPTS; + SYNC_REGISTER (); + + ret = SCM_BOOL_F; /* scm_i_foreign_call (foreign, sp - nargs + 1); */ + + NULLSTACK_FOR_NONLOCAL_EXIT (); + + if (SCM_UNLIKELY (SCM_VALUESP (ret))) + { + /* multiple values returned to continuation */ + ret = scm_struct_ref (ret, SCM_INUM0); + nvalues = scm_ilength (ret); + PUSH_LIST (ret, scm_is_null); + goto vm_return_values; + } + else + { + PUSH (ret); + goto vm_return; + } +} + +VM_DEFINE_INSTRUCTION (59, tail_call_nargs, "tail-call/nargs", 0, 0, 1) { SCM x; POP (x); @@ -959,7 +987,7 @@ VM_DEFINE_INSTRUCTION (56, tail_call_nargs, "tail-call/nargs", 0, 0, 1) goto vm_tail_call; } -VM_DEFINE_INSTRUCTION (57, call_nargs, "call/nargs", 0, 0, 1) +VM_DEFINE_INSTRUCTION (60, call_nargs, "call/nargs", 0, 0, 1) { SCM x; POP (x); @@ -968,7 +996,7 @@ VM_DEFINE_INSTRUCTION (57, call_nargs, "call/nargs", 0, 0, 1) goto vm_call; } -VM_DEFINE_INSTRUCTION (58, mv_call, "mv-call", 4, -1, 1) +VM_DEFINE_INSTRUCTION (61, mv_call, "mv-call", 4, -1, 1) { scm_t_int32 offset; scm_t_uint8 *mvra; @@ -1012,7 +1040,7 @@ VM_DEFINE_INSTRUCTION (58, mv_call, "mv-call", 4, -1, 1) NEXT; } -VM_DEFINE_INSTRUCTION (59, apply, "apply", 1, -1, 1) +VM_DEFINE_INSTRUCTION (62, apply, "apply", 1, -1, 1) { int len; SCM ls; @@ -1031,7 +1059,7 @@ VM_DEFINE_INSTRUCTION (59, apply, "apply", 1, -1, 1) goto vm_call; } -VM_DEFINE_INSTRUCTION (60, tail_apply, "tail-apply", 1, -1, 1) +VM_DEFINE_INSTRUCTION (63, tail_apply, "tail-apply", 1, -1, 1) { int len; SCM ls; @@ -1050,7 +1078,7 @@ VM_DEFINE_INSTRUCTION (60, tail_apply, "tail-apply", 1, -1, 1) goto vm_tail_call; } -VM_DEFINE_INSTRUCTION (61, call_cc, "call/cc", 0, 1, 1) +VM_DEFINE_INSTRUCTION (64, call_cc, "call/cc", 0, 1, 1) { int first; SCM proc, cont; @@ -1087,7 +1115,7 @@ VM_DEFINE_INSTRUCTION (61, call_cc, "call/cc", 0, 1, 1) } } -VM_DEFINE_INSTRUCTION (62, tail_call_cc, "tail-call/cc", 0, 1, 1) +VM_DEFINE_INSTRUCTION (65, tail_call_cc, "tail-call/cc", 0, 1, 1) { int first; SCM proc, cont; @@ -1119,7 +1147,7 @@ VM_DEFINE_INSTRUCTION (62, tail_call_cc, "tail-call/cc", 0, 1, 1) } } -VM_DEFINE_INSTRUCTION (63, return, "return", 0, 1, 1) +VM_DEFINE_INSTRUCTION (66, return, "return", 0, 1, 1) { vm_return: EXIT_HOOK (); @@ -1156,7 +1184,7 @@ VM_DEFINE_INSTRUCTION (63, return, "return", 0, 1, 1) NEXT; } -VM_DEFINE_INSTRUCTION (64, return_values, "return/values", 1, -1, -1) +VM_DEFINE_INSTRUCTION (67, return_values, "return/values", 1, -1, -1) { /* nvalues declared at top level, because for some reason gcc seems to think that perhaps it might be used without declaration. Fooey to that, I say. */ @@ -1213,7 +1241,7 @@ VM_DEFINE_INSTRUCTION (64, return_values, "return/values", 1, -1, -1) NEXT; } -VM_DEFINE_INSTRUCTION (65, return_values_star, "return/values*", 1, -1, -1) +VM_DEFINE_INSTRUCTION (68, return_values_star, "return/values*", 1, -1, -1) { SCM l; @@ -1236,7 +1264,7 @@ VM_DEFINE_INSTRUCTION (65, return_values_star, "return/values*", 1, -1, -1) goto vm_return_values; } -VM_DEFINE_INSTRUCTION (66, truncate_values, "truncate-values", 2, -1, -1) +VM_DEFINE_INSTRUCTION (69, truncate_values, "truncate-values", 2, -1, -1) { SCM x; int nbinds, rest; @@ -1259,7 +1287,7 @@ VM_DEFINE_INSTRUCTION (66, truncate_values, "truncate-values", 2, -1, -1) NEXT; } -VM_DEFINE_INSTRUCTION (67, box, "box", 1, 1, 0) +VM_DEFINE_INSTRUCTION (70, box, "box", 1, 1, 0) { SCM val; POP (val); @@ -1273,7 +1301,7 @@ VM_DEFINE_INSTRUCTION (67, box, "box", 1, 1, 0) (set! a (lambda () (b ...))) ...) */ -VM_DEFINE_INSTRUCTION (68, empty_box, "empty-box", 1, 0, 0) +VM_DEFINE_INSTRUCTION (71, empty_box, "empty-box", 1, 0, 0) { SYNC_BEFORE_GC (); LOCAL_SET (FETCH (), @@ -1281,7 +1309,7 @@ VM_DEFINE_INSTRUCTION (68, empty_box, "empty-box", 1, 0, 0) NEXT; } -VM_DEFINE_INSTRUCTION (69, local_boxed_ref, "local-boxed-ref", 1, 0, 1) +VM_DEFINE_INSTRUCTION (72, local_boxed_ref, "local-boxed-ref", 1, 0, 1) { SCM v = LOCAL_REF (FETCH ()); ASSERT_BOUND_VARIABLE (v); @@ -1289,7 +1317,7 @@ VM_DEFINE_INSTRUCTION (69, local_boxed_ref, "local-boxed-ref", 1, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (70, local_boxed_set, "local-boxed-set", 1, 1, 0) +VM_DEFINE_INSTRUCTION (73, local_boxed_set, "local-boxed-set", 1, 1, 0) { SCM v, val; v = LOCAL_REF (FETCH ()); @@ -1299,7 +1327,7 @@ VM_DEFINE_INSTRUCTION (70, local_boxed_set, "local-boxed-set", 1, 1, 0) NEXT; } -VM_DEFINE_INSTRUCTION (71, free_ref, "free-ref", 1, 0, 1) +VM_DEFINE_INSTRUCTION (74, free_ref, "free-ref", 1, 0, 1) { scm_t_uint8 idx = FETCH (); @@ -1310,7 +1338,7 @@ VM_DEFINE_INSTRUCTION (71, free_ref, "free-ref", 1, 0, 1) /* no free-set -- if a var is assigned, it should be in a box */ -VM_DEFINE_INSTRUCTION (72, free_boxed_ref, "free-boxed-ref", 1, 0, 1) +VM_DEFINE_INSTRUCTION (75, free_boxed_ref, "free-boxed-ref", 1, 0, 1) { SCM v; scm_t_uint8 idx = FETCH (); @@ -1321,7 +1349,7 @@ VM_DEFINE_INSTRUCTION (72, free_boxed_ref, "free-boxed-ref", 1, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (73, free_boxed_set, "free-boxed-set", 1, 1, 0) +VM_DEFINE_INSTRUCTION (76, free_boxed_set, "free-boxed-set", 1, 1, 0) { SCM v, val; scm_t_uint8 idx = FETCH (); @@ -1333,7 +1361,7 @@ VM_DEFINE_INSTRUCTION (73, free_boxed_set, "free-boxed-set", 1, 1, 0) NEXT; } -VM_DEFINE_INSTRUCTION (74, make_closure, "make-closure", 2, -1, 1) +VM_DEFINE_INSTRUCTION (77, make_closure, "make-closure", 2, -1, 1) { size_t n, len; SCM closure; @@ -1352,7 +1380,7 @@ VM_DEFINE_INSTRUCTION (74, make_closure, "make-closure", 2, -1, 1) NEXT; } -VM_DEFINE_INSTRUCTION (75, make_variable, "make-variable", 0, 0, 1) +VM_DEFINE_INSTRUCTION (78, make_variable, "make-variable", 0, 0, 1) { SYNC_BEFORE_GC (); /* fixme underflow */ @@ -1360,7 +1388,7 @@ VM_DEFINE_INSTRUCTION (75, make_variable, "make-variable", 0, 0, 1) NEXT; } -VM_DEFINE_INSTRUCTION (76, fix_closure, "fix-closure", 2, -1, 0) +VM_DEFINE_INSTRUCTION (79, fix_closure, "fix-closure", 2, -1, 0) { SCM x; unsigned int i = FETCH (); @@ -1377,7 +1405,7 @@ VM_DEFINE_INSTRUCTION (76, fix_closure, "fix-closure", 2, -1, 0) NEXT; } -VM_DEFINE_INSTRUCTION (77, define, "define", 0, 0, 2) +VM_DEFINE_INSTRUCTION (80, define, "define", 0, 0, 2) { SCM sym, val; POP (sym); @@ -1389,7 +1417,7 @@ VM_DEFINE_INSTRUCTION (77, define, "define", 0, 0, 2) NEXT; } -VM_DEFINE_INSTRUCTION (78, make_keyword, "make-keyword", 0, 1, 1) +VM_DEFINE_INSTRUCTION (81, make_keyword, "make-keyword", 0, 1, 1) { CHECK_UNDERFLOW (); SYNC_REGISTER (); @@ -1397,7 +1425,7 @@ VM_DEFINE_INSTRUCTION (78, make_keyword, "make-keyword", 0, 1, 1) NEXT; } -VM_DEFINE_INSTRUCTION (79, make_symbol, "make-symbol", 0, 1, 1) +VM_DEFINE_INSTRUCTION (82, make_symbol, "make-symbol", 0, 1, 1) { CHECK_UNDERFLOW (); SYNC_REGISTER ();