1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-06-09 23:39:51 +02:00
gnupg/tests/gpgscm
Justus Winter 8a168a6d40
gpgscm: Create and re-use frame objects.
* tests/gpgscm/scheme-private.h (struct scheme): New field
'frame_freelist'.
* tests/gpgscm/scheme.c (enum scheme_types): New type 'T_FRAME'.
(type_to_string): Handle new type.
(settype): New macro.
(gc_disable): Make sure there is at least one frame in the free list.
(mark): Handle frame objects.
(finalize_cell): Likewise.
(dump_stack_initialize): Initialize free list.
(dump_stack_free): Simplify.
(frame_length): New variable.
(dump_stack_make_frame): New function.
(frame_slots): Likewise.
(frame_payload): New macro.
(dump_stack_allocate_frame): New function.
(dump_stack_deallocate_frame): Likewise.
(dump_stack_preallocate_frame): Likewise.
(_s_return): Unpack frame object and deallocate it.
(s_save): Wrap state in an frame object.
(dump_stack_mark): Mark the free list.
--

TinySCHEME being a SECD-machine needs to push frames onto the dump
stack.  Previously, the dump stack was a list.  This required four
cells for the spine, as well as up to one additional cell to encode
the current opcode.  This was quite inefficient despite the fact that
we recovered the spine as well as the integer cell.

We introduce frame objects, which are a special variant of vectors of
length four.  Since the length is fixed, this frees up the length
field of the vector object to store the unboxed opcode.  A frame
object now fits in two cells.

Saving two or three cells is a mere byproduct, the performance gain
comes from increased locality, unboxed opcode representation, and the
ability to easily put the objects in a free list, keeping the garbage
collector out of the continuous motion of the virtual machine.

Signed-off-by: Justus Winter <justus@g10code.com>
2017-05-03 15:36:16 +02:00
..
ffi-private.h Change all http://www.gnu.org in license notices to https:// 2016-11-05 12:02:19 +01:00
ffi.c tests,w32: Use GetTempPath to get the path for temporary files. 2017-03-21 15:52:47 +01:00
ffi.h Change all http://www.gnu.org in license notices to https:// 2016-11-05 12:02:19 +01:00
ffi.scm tests: Check expiration times of created keys. 2017-02-15 14:53:07 +01:00
gnupg.scm tests: Move common functionality. 2017-04-11 10:43:52 +02:00
init.scm gpgscm: Tweak error message display. 2017-04-24 16:00:51 +02:00
lib.scm gpgscm: Emit JUnit-style XML reports. 2017-04-24 14:28:57 +02:00
LICENSE.TinySCHEME Add license notices for TinySCHEME. 2016-06-17 18:53:45 +02:00
main.c gpgscm: Emit JUnit-style XML reports. 2017-04-24 14:28:57 +02:00
Makefile.am gpgscm: Emit JUnit-style XML reports. 2017-04-24 14:28:57 +02:00
Manual.txt Fix more spelling 2016-09-17 16:00:37 +09:00
opdefines.h gpgscm: Make tags mandatory. 2017-04-10 14:57:30 +02:00
private.h Change all http://www.gnu.org in license notices to https:// 2016-11-05 12:02:19 +01:00
repl.scm gpgscm: Better error reporting. 2016-12-08 17:22:50 +01:00
scheme-config.h gpgscm: Use system strlwr if available. 2017-03-07 14:33:27 +01:00
scheme-private.h gpgscm: Create and re-use frame objects. 2017-05-03 15:36:16 +02:00
scheme.c gpgscm: Create and re-use frame objects. 2017-05-03 15:36:16 +02:00
scheme.h gpgscm: Mmap script files. 2017-04-10 14:57:35 +02:00
small-integers.h gpgscm: Allocate small integers in the rodata section. 2017-04-07 13:50:20 +02:00
t-child.c gpgscm: Fix test program. 2017-04-12 12:05:53 +09:00
t-child.scm gpgscm: Fix test. 2017-04-24 15:47:29 +02:00
tests.scm Spelling fixes in docs and comments. 2017-04-28 10:06:33 +09:00
time.scm tests: Check expiration times of created keys. 2017-02-15 14:53:07 +01:00
xml.scm gpgscm: Emit JUnit-style XML reports. 2017-04-24 14:28:57 +02:00