euphoria
view tests/t_memstruct.e @ 5037:78edc3d4f6d8
* add test for memstructs
| author | Matt Lewis |
|---|---|
| date | Wed Jun 29 12:41:55 2011 -0400 (23 months ago) |
| parents | |
| children | 2afb44c0dfb6 |
line source
1 with trace
2 trace(3)
4 include std/unittest.e
6 include std/dll.e
7 include std/machine.e
10 set_test_verbosity( TEST_SHOW_ALL )
11 memstruct Var
12 pointer symtab_entry declared_in
13 end memstruct
15 memstruct Block
16 unsigned int first_line
17 unsigned int last_line
18 end memstruct
20 memstruct private_block
21 int task_number
22 pointer private_block next
23 object block[2]
24 end memstruct
26 memstruct Subp
27 pointer object code
28 pointer symtab_entry temps
29 pointer private_block saved_privates
30 pointer object block
31 pointer int linetab
32 unsigned int firstline
33 unsigned int num_args
34 int resident_task
35 unsigned int stack_space
36 end memstruct
38 memunion U
39 Var var
40 Subp subp
41 Block block
42 end memunion
44 memstruct symtab_entry
45 object obj
46 pointer symtab_entry next
47 pointer symtab_entry next_in_block
48 char mode
49 char scope
50 unsigned char file_no
51 unsigned char dummy
52 int token
53 pointer char name
54 U u
55 end memstruct
57 memstruct SymbolTable
58 symtab_entry entries[5]
59 end memstruct
61 integer bits32 = sizeof( C_POINTER ) = 4
62 procedure basic()
63 atom symtab = allocate( 5 * sizeof( symtab_entry ) )
64 poke( symtab, repeat( 0, 5 * sizeof( symtab_entry ) ) )
65 symtab.symtab_entry.obj = 9
66 symtab.symtab_entry.obj += 5
67 symtab.symtab_entry.obj -= 2
68 symtab.symtab_entry.obj *= 6
69 symtab.symtab_entry.obj /= 3
71 test_equal("object read / write assignment / read", peek_pointer( symtab ), symtab.symtab_entry.obj )
73 symtab.symtab_entry[1].obj = 1
74 symtab.symtab_entry.next = symtab.symtab_entry[1]
76 integer offset
77 if bits32 then
78 offset = 4
79 else
80 offset = 8
81 end if
83 test_equal("pointer read / write", peek_pointer( symtab + offset ), symtab.symtab_entry.next)
85 symtab.symtab_entry.next.obj = -42
86 if bits32 then
87 test_equal( "read / write following pointer (32)", peek4s( symtab + sizeof( symtab_entry)), symtab.symtab_entry.next.obj )
88 else
89 test_equal( "read / write following pointer (64)", peek8s( symtab + sizeof( symtab_entry)), symtab.symtab_entry.next.obj )
90 end if
92 symtab.symtab_entry.u.var.declared_in = 0x01010101
93 test_equal("read / write union member", 0x01010101, symtab.symtab_entry.u.var.declared_in )
94 object serialized = symtab.symtab_entry.u.*
95 test_equal("serialize union", {1,1,1,1} & repeat( 0, sizeof( U ) - 4), serialized )
96 serialized = {
97 symtab.symtab_entry.obj,
98 symtab.symtab_entry.next,
99 symtab.symtab_entry.next_in_block,
100 symtab.symtab_entry.mode,
101 symtab.symtab_entry.scope,
102 symtab.symtab_entry.file_no,
103 symtab.symtab_entry.dummy,
104 symtab.symtab_entry.token,
105 symtab.symtab_entry.name,
106 symtab.symtab_entry.u.*
107 }
108 test_equal("serialize struct", serialized, symtab.symtab_entry.* )
110 test_equal( "sizeof arrays of structs", sizeof( symtab_entry ) * 5, sizeof( SymbolTable ) )
111 test_equal( "serialize array length", 5, length( symtab.SymbolTable.* ) )
112 end procedure
113 basic()
115 test_report()
