[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Guile-commits] GNU Guile branch, master, updated. release_1-9-1-16-ge5d
From: |
Andy Wingo |
Subject: |
[Guile-commits] GNU Guile branch, master, updated. release_1-9-1-16-ge5dc27b |
Date: |
Sun, 26 Jul 2009 12:44:28 +0000 |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Guile".
http://git.savannah.gnu.org/cgit/guile.git/commit/?id=e5dc27b86d0eaa470f92cdaa9f4ed2a961338c49
The branch, master has been updated
via e5dc27b86d0eaa470f92cdaa9f4ed2a961338c49 (commit)
via 28b119ee3da0f4b14cb87e638794d22843778cda (commit)
via 9efc2d1404aa7705f38aa1ceaebf4c4893e68b83 (commit)
via 9557ecc6620c83a9254649e63248ce997d749cde (commit)
via cb8ab66c6657a61797399e5f63c7942ae7cd20e3 (commit)
from 74deff3c431245b282903d46eb7e571ace8759f3 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit e5dc27b86d0eaa470f92cdaa9f4ed2a961338c49
Author: Andy Wingo <address@hidden>
Date: Sun Jul 26 14:01:56 2009 +0200
increase range of relative jumps by aligning blocks to 8-byte boundaries
* libguile/objcodes.c (OBJCODE_COOKIE): Bump again, as our jump offsets
are now multiplied by 8.
* libguile/vm-i-system.c (BR): Interpret the 16-bit offset as a relative
jump to the nearest 8-byte-aligned block -- increasing relative jump
range from +/-32K to +/-240K.
(mvra): Do the same for the mvra jump.
* libguile/vm.c (really_make_boot_program): Align the mvra.
* module/language/assembly.scm (align-block): New export, for aligning
blocks.
* module/language/assembly/compile-bytecode.scm (write-bytecode): Emit
jumps to the nearest 8-byte-aligned block. Effectively our range is 18
bits in either direction. I would like to do this differently -- have
long-br and long-br-if, and all the other br instructions go to 8 bits
only. But the assembler doesn't have an appropriate representation to
allow me to do this yet, so for now this is what we have.
* module/language/assembly/decompile-bytecode.scm (decode-load-program):
Decode the 19-bit jumps.
commit 28b119ee3da0f4b14cb87e638794d22843778cda
Author: Andy Wingo <address@hidden>
Date: Sun Jul 26 12:56:11 2009 +0200
make sure all programs are 8-byte aligned
* libguile/objcodes.c (OBJCODE_COOKIE): Bump objcode cookie, as we added
to struct scm_objcode.
* libguile/objcodes.h (struct scm_objcode): Add a uint32 after metalen
and before base, so that if the structure has 8-byte alignment, base
will have 8-byte alignment too. (Before, base was 12 bytes from the
start of the structure, now it's 16 bytes.)
* libguile/vm-engine.h (ASSERT_ALIGNED_PROCEDURE): Add a check that can
be turned on with VM_ENABLE_PARANOID_ASSERTIONS.
(CACHE_PROGRAM): Call ASSERT_ALIGNED_PROCEDURE.
* libguile/vm-i-system.c (long-local-ref): Add a missing semicolon.
* libguile/vm.c (really_make_boot_program): Rework to operate directly
on a malloc'd buffer, so that the program will be 8-byte aligned.
* module/language/assembly.scm (*program-header-len*): Add another 4 for
the padding.
(object->assembly): Fix case in which we would return (make-int8 0)
instead of (make-int8:0). This would throw off compile-assembly.scm's
use of addr+.
* module/language/assembly/compile-bytecode.scm (write-bytecode): Write
out the padding int.
* module/language/assembly/decompile-bytecode.scm (decode-load-program):
And pop off the padding int too.
* module/language/glil/compile-assembly.scm (glil->assembly): Don't pack
the assembly, assume that assembly.scm has done it for us. If a
program has a meta, pad out the program so that meta will be aligned.
* test-suite/tests/asm-to-bytecode.test: Adapt to expect programs to
have the extra 4-byte padding int.
commit 9efc2d1404aa7705f38aa1ceaebf4c4893e68b83
Author: Andy Wingo <address@hidden>
Date: Sun Jul 26 11:54:05 2009 +0200
fix alignment of subprograms of subprograms
* module/language/glil/compile-assembly.scm (glil->assembly)
(dump-object): Fix an exciting bug! Subprograms of subprograms were
not being aligned correctly, because the code was generated too early.
So instead delay dumping the object table until the proper time.
commit 9557ecc6620c83a9254649e63248ce997d749cde
Author: Andy Wingo <address@hidden>
Date: Sun Jul 26 11:21:18 2009 +0200
fix unused SCM_FRAME_SET_DYNAMIC_LINK macro
* libguile/frames.h (SCM_FRAME_SET_DYNAMIC_LINK): Fix for new stack
layout, though this macro is not used.
commit cb8ab66c6657a61797399e5f63c7942ae7cd20e3
Author: Andy Wingo <address@hidden>
Date: Sun Jul 26 11:20:39 2009 +0200
fix vmstack gdb macro for new stack frame layout
* gdbinit (vmstack): No more external link.
-----------------------------------------------------------------------
Summary of changes:
gdbinit | 5 --
libguile/frames.h | 2 +-
libguile/objcodes.c | 2 +-
libguile/objcodes.h | 1 +
libguile/vm-engine.h | 4 ++
libguile/vm-i-system.c | 22 ++++++-----
libguile/vm.c | 49 +++++++++--------------
module/language/assembly.scm | 23 +++++++----
module/language/assembly/compile-bytecode.scm | 11 +++--
module/language/assembly/decompile-bytecode.scm | 4 +-
module/language/glil/compile-assembly.scm | 43 ++++++++++++--------
test-suite/tests/asm-to-bytecode.test | 15 +++++--
12 files changed, 100 insertions(+), 81 deletions(-)
diff --git a/gdbinit b/gdbinit
index 381cf84..b66e3e2 100644
--- a/gdbinit
+++ b/gdbinit
@@ -148,11 +148,6 @@ define nextframe
output $vmdl
newline
set $vmsp=$vmsp-1
- sputs "el:\t"
- output $vmsp
- sputs "\t"
- gwrite *$vmsp
- set $vmsp=$vmsp-1
set $vmnlocs=(int)$vmbp->nlocs
while $vmnlocs > 0
sputs "loc #"
diff --git a/libguile/frames.h b/libguile/frames.h
index 1d8a30f..1b3153a 100644
--- a/libguile/frames.h
+++ b/libguile/frames.h
@@ -63,7 +63,7 @@
#define SCM_FRAME_DYNAMIC_LINK(fp) \
(SCM_FRAME_STACK_CAST (SCM_FRAME_DATA_ADDRESS (fp)[0]))
#define SCM_FRAME_SET_DYNAMIC_LINK(fp, dl) \
- ((SCM_FRAME_DATA_ADDRESS (fp)[1])) = (SCM)(dl);
+ ((SCM_FRAME_DATA_ADDRESS (fp)[0])) = (SCM)(dl);
#define SCM_FRAME_VARIABLE(fp,i) fp[i]
#define SCM_FRAME_PROGRAM(fp) fp[-1]
diff --git a/libguile/objcodes.c b/libguile/objcodes.c
index 5a43edb..91691a7 100644
--- a/libguile/objcodes.c
+++ b/libguile/objcodes.c
@@ -50,7 +50,7 @@
/* The objcode magic header. */
#define OBJCODE_COOKIE \
- "GOOF-0.7-" OBJCODE_ENDIANNESS "-" OBJCODE_WORD_SIZE "---"
+ "GOOF-0.9-" OBJCODE_ENDIANNESS "-" OBJCODE_WORD_SIZE "---"
/* The length of the header must be a multiple of 8 bytes. */
verify (((sizeof (OBJCODE_COOKIE) - 1) & 7) == 0);
diff --git a/libguile/objcodes.h b/libguile/objcodes.h
index d50f6dc..2bb4e60 100644
--- a/libguile/objcodes.h
+++ b/libguile/objcodes.h
@@ -29,6 +29,7 @@ struct scm_objcode {
scm_t_uint32 len; /* the maximum index of base[] */
scm_t_uint32 metalen; /* well, i lie. this many bytes at the end of
base[] for metadata */
+ scm_t_uint32 unused; /* pad so that `base' is 8-byte aligned */
scm_t_uint8 base[0];
};
diff --git a/libguile/vm-engine.h b/libguile/vm-engine.h
index 15ebb53..c0f772f 100644
--- a/libguile/vm-engine.h
+++ b/libguile/vm-engine.h
@@ -130,11 +130,14 @@
#ifdef VM_ENABLE_PARANOID_ASSERTIONS
#define CHECK_IP() \
do { if (ip < bp->base || ip - bp->base > bp->len) abort (); } while (0)
+#define ASSERT_ALIGNED_PROCEDURE() \
+ do { if ((scm_t_bits)bp % 8) abort (); } while (0)
#define ASSERT_BOUND(x) \
do { if ((x) == SCM_UNDEFINED) { SYNC_REGISTER (); abort(); } \
} while (0)
#else
#define CHECK_IP()
+#define ASSERT_ALIGNED_PROCEDURE()
#define ASSERT_BOUND(x)
#endif
@@ -143,6 +146,7 @@
{ \
if (bp != SCM_PROGRAM_DATA (program)) { \
bp = SCM_PROGRAM_DATA (program); \
+ ASSERT_ALIGNED_PROCEDURE (); \
if (SCM_I_IS_VECTOR (SCM_PROGRAM_OBJTABLE (program))) { \
objects = SCM_I_VECTOR_WELTS (SCM_PROGRAM_OBJTABLE (program)); \
object_count = SCM_I_VECTOR_LENGTH (SCM_PROGRAM_OBJTABLE (program)); \
diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c
index c2c674d..726112c 100644
--- a/libguile/vm-i-system.c
+++ b/libguile/vm-i-system.c
@@ -283,7 +283,7 @@ VM_DEFINE_INSTRUCTION (26, long_local_ref,
"long-local-ref", 2, 0, 1)
unsigned int i = FETCH ();
i <<= 8;
i += FETCH ();
- PUSH (LOCAL_REF (i))
+ PUSH (LOCAL_REF (i));
ASSERT_BOUND (*sp);
NEXT;
}
@@ -426,7 +426,7 @@ VM_DEFINE_INSTRUCTION (34, long_toplevel_set,
"long-toplevel-set", 2, 1, 0)
* branch and jump
*/
-/* offset must be a signed short!!! */
+/* offset must be a signed 16 bit int!!! */
#define FETCH_OFFSET(offset) \
{ \
int h = FETCH (); \
@@ -436,10 +436,10 @@ VM_DEFINE_INSTRUCTION (34, long_toplevel_set,
"long-toplevel-set", 2, 1, 0)
#define BR(p) \
{ \
- signed short offset; \
+ scm_t_int16 offset; \
FETCH_OFFSET (offset); \
if (p) \
- ip += offset; \
+ ip += ((scm_t_ptrdiff)offset) * 8 - (((unsigned long)ip) % 8); \
NULLSTACK (1); \
DROP (); \
NEXT; \
@@ -447,9 +447,9 @@ VM_DEFINE_INSTRUCTION (34, long_toplevel_set,
"long-toplevel-set", 2, 1, 0)
VM_DEFINE_INSTRUCTION (35, br, "br", 2, 0, 0)
{
- int h = FETCH ();
- int l = FETCH ();
- ip += (signed short) (h << 8) + l;
+ scm_t_int16 offset;
+ FETCH_OFFSET (offset);
+ ip += ((scm_t_ptrdiff)offset) * 8 - (((unsigned long)ip) % 8);
NEXT;
}
@@ -812,10 +812,12 @@ VM_DEFINE_INSTRUCTION (46, call_nargs, "call/nargs", 0,
0, 1)
VM_DEFINE_INSTRUCTION (47, mv_call, "mv-call", 3, -1, 1)
{
SCM x;
- signed short offset;
+ scm_t_int16 offset;
+ scm_t_uint8 *mvra;
nargs = FETCH ();
FETCH_OFFSET (offset);
+ mvra = ip + ((scm_t_ptrdiff)offset) * 8 - ((unsigned long)ip) % 8;
x = sp[-nargs];
@@ -828,7 +830,7 @@ VM_DEFINE_INSTRUCTION (47, mv_call, "mv-call", 3, -1, 1)
CACHE_PROGRAM ();
INIT_ARGS ();
NEW_FRAME ();
- SCM_FRAME_DATA_ADDRESS (fp)[1] = (SCM)(SCM_FRAME_RETURN_ADDRESS (fp) +
offset);
+ SCM_FRAME_DATA_ADDRESS (fp)[1] = (SCM)mvra;
ENTER_HOOK ();
APPLY_HOOK ();
NEXT;
@@ -853,7 +855,7 @@ VM_DEFINE_INSTRUCTION (47, mv_call, "mv-call", 3, -1, 1)
len = scm_length (values);
PUSH_LIST (values, SCM_NULLP);
PUSH (len);
- ip += offset;
+ ip = mvra;
}
NEXT;
}
diff --git a/libguile/vm.c b/libguile/vm.c
index 41eacd7..cc5e4f9 100644
--- a/libguile/vm.c
+++ b/libguile/vm.c
@@ -220,44 +220,33 @@ static SCM sym_vm_run;
static SCM sym_vm_error;
static SCM sym_debug;
-static SCM make_u8vector (const scm_t_uint8 *bytes, size_t len)
-{
- scm_t_uint8 *new_bytes = scm_gc_malloc (len, "make-u8vector");
- memcpy (new_bytes, bytes, len);
- return scm_take_u8vector (new_bytes, len);
-}
-
-/* Dummy structure to guarantee 32-bit alignment. */
-struct t_32bit_aligned
-{
- scm_t_int32 dummy;
- scm_t_uint8 bytes[18];
-};
-
static SCM
really_make_boot_program (long nargs)
{
SCM u8vec;
- struct t_32bit_aligned bytes =
- {
- .dummy = 0,
- .bytes = { 0, 0, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- scm_op_mv_call, 0, 0, 1,
- scm_op_make_int8_1, scm_op_halt }
- };
-
+ /* Make sure "bytes" is 64-bit aligned. */
+ scm_t_uint8 text[] = { scm_op_mv_call, 0, 0, 1,
+ scm_op_make_int8_1, scm_op_nop, scm_op_nop,
scm_op_nop,
+ scm_op_halt };
+ struct scm_objcode *bp;
SCM ret;
- /* Set length in current endianness, no meta. */
- ((scm_t_uint32 *) bytes.bytes)[1] = 6;
-
if (SCM_UNLIKELY (nargs > 255 || nargs < 0))
abort ();
- bytes.bytes[13] = (scm_byte_t) nargs;
-
- u8vec = make_u8vector (bytes.bytes, sizeof (bytes.bytes));
+ text[1] = (scm_t_uint8)nargs;
+
+ bp = scm_gc_malloc (sizeof (struct scm_objcode) + sizeof (text),
+ "make-u8vector");
+ memcpy (bp->base, text, sizeof (text));
+ bp->nargs = 0;
+ bp->nrest = 0;
+ bp->nlocs = 0;
+ bp->len = sizeof(text);
+ bp->metalen = 0;
+ bp->unused = 0;
+
+ u8vec = scm_take_u8vector ((scm_t_uint8*)bp,
+ sizeof (struct scm_objcode) + sizeof (text));
ret = scm_make_program (scm_bytecode_to_objcode (u8vec),
SCM_BOOL_F, SCM_BOOL_F);
SCM_SET_SMOB_FLAGS (ret, SCM_F_PROGRAM_IS_BOOT);
diff --git a/module/language/assembly.scm b/module/language/assembly.scm
index 0ad94be..e7308ac 100644
--- a/module/language/assembly.scm
+++ b/module/language/assembly.scm
@@ -24,12 +24,12 @@
#:use-module (system vm instruction)
#:use-module ((srfi srfi-1) #:select (fold))
#:export (byte-length
- addr+ align-program align-code
+ addr+ align-program align-code align-block
assembly-pack assembly-unpack
object->assembly assembly->object))
-;; nargs, nrest, nlocs, <unused>, len, metalen
-(define *program-header-len* (+ 1 1 1 1 4 4))
+;; nargs, nrest, nlocs, len, metalen, padding
+(define *program-header-len* (+ 1 1 2 4 4 4))
;; lengths are encoded in 3 bytes
(define *len-len* 3)
@@ -63,17 +63,24 @@
(define *program-alignment* 8)
+(define *block-alignment* 8)
+
(define (addr+ addr code)
(fold (lambda (x len) (+ (byte-length x) len))
addr
code))
+(define (code-alignment addr alignment header-len)
+ (make-list (modulo (- alignment
+ (modulo (+ addr header-len) alignment))
+ alignment)
+ '(nop)))
+
+(define (align-block addr)
+ (code-alignment addr *block-alignment* 0))
(define (align-code code addr alignment header-len)
- `(,@(make-list (modulo (- alignment
- (modulo (+ addr header-len) alignment))
- alignment)
- '(nop))
+ `(,@(code-alignment addr alignment header-len)
,code))
(define (align-program prog addr)
@@ -109,7 +116,7 @@
((null? x) `(make-eol))
((and (integer? x) (exact? x))
(cond ((and (<= -128 x) (< x 128))
- `(make-int8 ,(modulo x 256)))
+ (assembly-pack `(make-int8 ,(modulo x 256))))
((and (<= -32768 x) (< x 32768))
(let ((n (if (< x 0) (+ x 65536) x)))
`(make-int16 ,(quotient n 256) ,(modulo n 256))))
diff --git a/module/language/assembly/compile-bytecode.scm
b/module/language/assembly/compile-bytecode.scm
index 80dee83..bf6c5f7 100644
--- a/module/language/assembly/compile-bytecode.scm
+++ b/module/language/assembly/compile-bytecode.scm
@@ -77,10 +77,12 @@
;; Ew!
(for-each write-byte (bytevector->u8-list bv)))
(define (write-break label)
- (let ((offset (- (assq-ref labels label) (+ (get-addr) 2))))
- (cond ((>= offset (ash 1 15)) (error "jump too big" offset))
- ((< offset (- (ash 1 15))) (error "reverse jump too big" offset))
- (else (write-uint16-be offset)))))
+ (let ((offset (- (assq-ref labels label)
+ (logand (+ (get-addr) 2) (lognot #x7)))))
+ (cond ((not (= 0 (modulo offset 8))) (error "unaligned jump" offset))
+ ((>= offset (ash 1 18)) (error "jump too far forward" offset))
+ ((< offset (- (ash 1 18))) (error "jump too far backwards" offset))
+ (else (write-uint16-be (ash offset -3))))))
(let ((inst (car asm))
(args (cdr asm))
@@ -102,6 +104,7 @@
(write-uint16 nlocs)
(write-uint32 length)
(write-uint32 (if meta (1- (byte-length meta)) 0))
+ (write-uint32 0) ; padding
(letrec ((i 0)
(write (lambda (x) (set! i (1+ i)) (write-byte x)))
(get-addr (lambda () i)))
diff --git a/module/language/assembly/decompile-bytecode.scm
b/module/language/assembly/decompile-bytecode.scm
index 231205d..0e34ab4 100644
--- a/module/language/assembly/decompile-bytecode.scm
+++ b/module/language/assembly/decompile-bytecode.scm
@@ -57,10 +57,12 @@
(len (+ a (ash b 8) (ash c 16) (ash d 24)))
(metalen (+ e (ash f 8) (ash g 16) (ash h 24)))
(totlen (+ len metalen))
+ (pad0 (pop)) (pad1 (pop)) (pad2 (pop)) (pad3 (pop))
(labels '())
(i 0))
(define (ensure-label rel1 rel2)
- (let ((where (+ i (bytes->s16 rel1 rel2))))
+ (let ((where (+ (logand i (lognot #x7))
+ (* (bytes->s16 rel1 rel2) 8))))
(or (assv-ref labels where)
(begin
(let ((l (gensym ":L")))
diff --git a/module/language/glil/compile-assembly.scm
b/module/language/glil/compile-assembly.scm
index 9a5cae0..fa58057 100644
--- a/module/language/glil/compile-assembly.scm
+++ b/module/language/glil/compile-assembly.scm
@@ -137,9 +137,9 @@
(define (glil->assembly glil toplevel? bindings
source-alist label-alist object-alist addr)
(define (emit-code x)
- (values (map assembly-pack x) bindings source-alist label-alist
object-alist))
+ (values x bindings source-alist label-alist object-alist))
(define (emit-code/object x object-alist)
- (values (map assembly-pack x) bindings source-alist label-alist
object-alist))
+ (values x bindings source-alist label-alist object-alist))
(record-case glil
((<glil-program> nargs nrest nlocs meta body)
@@ -164,10 +164,15 @@
(receive (code bindings sources labels objects len)
(process-body)
- (let ((prog `(load-program ,nargs ,nrest ,nlocs ,labels
- ,len
- ,(make-meta bindings sources meta)
- . ,code)))
+ (let* ((meta (make-meta bindings sources meta))
+ (meta-pad (if meta (modulo (- 8 (modulo len 8)) 8) 0))
+ (prog `(load-program ,nargs ,nrest ,nlocs ,labels
+ ,(+ len meta-pad)
+ ,meta
+ ,@code
+ ,@(if meta
+ (make-list meta-pad '(nop))
+ '()))))
(cond
(toplevel?
;; toplevel bytecode isn't loaded by the vm, no way to do
@@ -175,7 +180,7 @@
;; anyway)
(emit-code (align-program prog addr)))
(else
- (let ((table (dump-object (make-object-table objects) addr)))
+ (let ((table (make-object-table objects)))
(cond
(object-alist
;; if we are being compiled from something with an object
@@ -190,8 +195,10 @@
object-alist)))
(else
;; otherwise emit a load directly
- (emit-code `(,@table ,@(align-program prog (addr+ addr
table))))))))))))
-
+ (let ((table-code (dump-object table addr)))
+ (emit-code
+ `(,@table-code
+ ,@(align-program prog (addr+ addr table-code)))))))))))))
((<glil-bind> vars)
(values '()
@@ -333,11 +340,12 @@
(error "unknown module var kind" op key)))))
((<glil-label> label)
- (values '()
- bindings
- source-alist
- (acons label addr label-alist)
- object-alist))
+ (let ((code (align-block addr)))
+ (values code
+ bindings
+ source-alist
+ (acons label (addr+ addr code) label-alist)
+ object-alist)))
((<glil-branch> inst label)
(emit-code `((,inst ,label))))
@@ -370,9 +378,10 @@
((object->assembly x) => list)
((variable-cache-cell? x) (dump-object (variable-cache-cell-key x) addr))
((subprogram? x)
- `(,@(subprogram-table x)
- ,@(align-program (subprogram-prog x)
- (addr+ addr (subprogram-table x)))))
+ (let ((table-code (dump-object (subprogram-table x) addr)))
+ `(,@table-code
+ ,@(align-program (subprogram-prog x)
+ (addr+ addr table-code)))))
((number? x)
`((load-number ,(number->string x))))
((string? x)
diff --git a/test-suite/tests/asm-to-bytecode.test
b/test-suite/tests/asm-to-bytecode.test
index fb598a6..33a2a45 100644
--- a/test-suite/tests/asm-to-bytecode.test
+++ b/test-suite/tests/asm-to-bytecode.test
@@ -95,22 +95,29 @@
3 2 (uint16 1) ;; nargs, nrest, nlocs
(uint32 3) ;; len
(uint32 0) ;; metalen
+ (uint32 0) ;; padding
make-int8 3
return))
- (comp-test '(load-program 3 2 1 () 3
+ ;; the nops are to pad meta to an 8-byte alignment. not strictly
+ ;; necessary for this test, but representative of the common case.
+ (comp-test '(load-program 3 2 1 () 8
(load-program 3 2 1 () 3
#f
(make-int8 3) (return))
- (make-int8 3) (return))
+ (make-int8 3) (return)
+ (nop) (nop) (nop) (nop) (nop))
#(load-program
3 2 (uint16 1) ;; nargs, nrest, nlocs
- (uint32 3) ;; len
- (uint32 15) ;; metalen
+ (uint32 8) ;; len
+ (uint32 19) ;; metalen
+ (uint32 0) ;; padding
make-int8 3
return
+ nop nop nop nop nop
3 2 (uint16 1) ;; nargs, nrest, nlocs
(uint32 3) ;; len
(uint32 0) ;; metalen
+ (uint32 0) ;; padding
make-int8 3
return))))
hooks/post-receive
--
GNU Guile
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Guile-commits] GNU Guile branch, master, updated. release_1-9-1-16-ge5dc27b,
Andy Wingo <=