nabaztag_hack_kit 0.1.0.beta3 → 0.1.0.beta8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -2
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +2 -2
  5. data/CHANGELOG.md +17 -2
  6. data/LICENSE +21 -0
  7. data/README.md +115 -44
  8. data/Rakefile +2 -6
  9. data/bytecode/{Commands.md → _docs/commands.md} +0 -0
  10. data/bytecode/{Docs.md → _docs/grammar.md} +0 -0
  11. data/bytecode/_docs/grammar.pdf +0 -0
  12. data/bytecode/{src → _original}/README.md +0 -0
  13. data/bytecode/{src → _original}/lib/arp.mtl +0 -0
  14. data/bytecode/{src → _original}/lib/cfg.mtl +0 -0
  15. data/bytecode/{src → _original}/lib/choreos.mtl +0 -0
  16. data/bytecode/{src → _original}/lib/dhcp.mtl +0 -0
  17. data/bytecode/{src → _original}/lib/dns.mtl +0 -0
  18. data/bytecode/{src → _original}/lib/http.mtl +0 -0
  19. data/bytecode/{src → _original}/lib/tcp.mtl +0 -0
  20. data/bytecode/{src → _original}/lib/udp.mtl +0 -0
  21. data/bytecode/{src → _original}/lib/util.mtl +0 -0
  22. data/bytecode/{src → _original}/lib/var.mtl +0 -0
  23. data/bytecode/{src → _original}/lib/wav.mtl +0 -0
  24. data/bytecode/{src → _original}/lib/wifi.mtl +0 -0
  25. data/bytecode/{src → _original}/nominal-ping.mtl +0 -0
  26. data/bytecode/main.mtl +11 -11
  27. data/bytecode/test/test.mtl +8 -8
  28. data/examples/basic/Gemfile +1 -3
  29. data/examples/basic/config.ru +14 -4
  30. data/examples/record/Gemfile +0 -5
  31. data/examples/record/{config.ru.example → config.ru} +2 -2
  32. data/examples/record/server.rb +0 -2
  33. data/ext/Makefile +10 -0
  34. data/ext/bin/mtl_comp +29 -0
  35. data/{bytecode → ext}/bin/mtl_merge +0 -0
  36. data/ext/bin/mtl_simu +29 -0
  37. data/{bytecode/src/mtl → ext}/extconf.rb +0 -0
  38. data/ext/mtl_linux/.gitignore +7 -0
  39. data/ext/mtl_linux/LICENSE +21 -0
  40. data/ext/mtl_linux/Makefile +116 -0
  41. data/ext/mtl_linux/MetalC.project +196 -0
  42. data/ext/mtl_linux/conf.bin +0 -0
  43. data/{bytecode/src/mtl → ext/mtl_linux}/conf.bin.sans_password +0 -0
  44. data/{bytecode/src/mtl → ext/mtl_linux}/config.txt +0 -0
  45. data/ext/mtl_linux/inc/log.h +21 -0
  46. data/{bytecode/src/mtl → ext/mtl_linux/inc}/properties.h +0 -0
  47. data/{bytecode/src/mtl/linux_simuaudio.h → ext/mtl_linux/inc/simu/linux/simuaudio.h} +0 -0
  48. data/{bytecode/src/mtl/linux_simunet.h → ext/mtl_linux/inc/simu/linux/simunet.h} +0 -0
  49. data/{bytecode/src/mtl → ext/mtl_linux/inc/simu/win}/simuaudio.h +18 -18
  50. data/{bytecode/src/mtl → ext/mtl_linux/inc/simu/win}/simunet.h +0 -0
  51. data/ext/mtl_linux/inc/vcomp/compiler.h +200 -0
  52. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/file.h +11 -11
  53. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/filesystem.h +0 -0
  54. data/ext/mtl_linux/inc/vcomp/interpreter.h +121 -0
  55. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/memory.h +120 -92
  56. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/param.h +0 -0
  57. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/parser.h +27 -27
  58. data/ext/mtl_linux/inc/vcomp/prodbuffer.h +42 -0
  59. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/resource.h +1 -1
  60. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/terminal.h +8 -8
  61. data/{bytecode/src/mtl → ext/mtl_linux/inc}/vcomp/util.h +7 -7
  62. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vaudio.h +0 -0
  63. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vbc.h +1 -1
  64. data/ext/mtl_linux/inc/vm/vbc_str.h +167 -0
  65. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vinterp.h +0 -0
  66. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vloader.h +0 -0
  67. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vlog.h +0 -0
  68. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vmem.h +0 -0
  69. data/{bytecode/src/mtl → ext/mtl_linux/inc/vm}/vnet.h +0 -0
  70. data/ext/mtl_linux/nominal.mtl +3959 -0
  71. data/ext/mtl_linux/src/comp/main.cpp +123 -0
  72. data/ext/mtl_linux/src/simu/dumpbc.c +2566 -0
  73. data/ext/mtl_linux/src/simu/linux/main.cpp +288 -0
  74. data/ext/mtl_linux/src/simu/linux/simu.c +309 -0
  75. data/ext/mtl_linux/src/simu/linux/simuaudio.c +44 -0
  76. data/ext/mtl_linux/src/simu/linux/simunet.c +707 -0
  77. data/ext/mtl_linux/src/simu/log.c +340 -0
  78. data/ext/mtl_linux/src/simu/properties.c +368 -0
  79. data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/GTKANAL.H +0 -0
  80. data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/LAYER3.C +0 -0
  81. data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/TABINIT.C +0 -0
  82. data/ext/mtl_linux/src/simu/win/mp3/common.c +302 -0
  83. data/ext/mtl_linux/src/simu/win/mp3/dct64_i386.c +316 -0
  84. data/ext/mtl_linux/src/simu/win/mp3/decode_i386.c +160 -0
  85. data/ext/mtl_linux/src/simu/win/mp3/huffman.h +332 -0
  86. data/ext/mtl_linux/src/simu/win/mp3/interface.c +276 -0
  87. data/{bytecode/src/mtl → ext/mtl_linux/src/simu/win}/mp3/mpg123.h +34 -30
  88. data/ext/mtl_linux/src/simu/win/mp3/mpglib.h +47 -0
  89. data/ext/mtl_linux/src/simu/win/simu.c +819 -0
  90. data/ext/mtl_linux/src/simu/win/simuaudio.c +787 -0
  91. data/ext/mtl_linux/src/simu/win/simunet.c +489 -0
  92. data/ext/mtl_linux/src/vcomp/bootstrap.cpp +95 -0
  93. data/ext/mtl_linux/src/vcomp/compiler.cpp +587 -0
  94. data/ext/mtl_linux/src/vcomp/compiler_file.cpp +1253 -0
  95. data/ext/mtl_linux/src/vcomp/compiler_prog.cpp +437 -0
  96. data/ext/mtl_linux/src/vcomp/compiler_term.cpp +1500 -0
  97. data/ext/mtl_linux/src/vcomp/compiler_type.cpp +1238 -0
  98. data/ext/mtl_linux/src/vcomp/compiler_var.cpp +502 -0
  99. data/ext/mtl_linux/src/vcomp/file.cpp +100 -0
  100. data/ext/mtl_linux/src/vcomp/interpreter.cpp +93 -0
  101. data/ext/mtl_linux/src/vcomp/memory.cpp +313 -0
  102. data/ext/mtl_linux/src/vcomp/parser.cpp +584 -0
  103. data/ext/mtl_linux/src/vcomp/parser_xml.cpp +137 -0
  104. data/{bytecode/src/mtl → ext/mtl_linux/src}/vcomp/prodbuffer.cpp +57 -36
  105. data/ext/mtl_linux/src/vcomp/stdlib_core.cpp +130 -0
  106. data/ext/mtl_linux/src/vcomp/terminal.cpp +80 -0
  107. data/{bytecode/src/mtl → ext/mtl_linux/src}/vcomp/util.cpp +18 -11
  108. data/ext/mtl_linux/src/vm/vaudio.c +830 -0
  109. data/ext/mtl_linux/src/vm/vinterp.c +1780 -0
  110. data/ext/mtl_linux/src/vm/vloader.c +139 -0
  111. data/ext/mtl_linux/src/vm/vlog.c +782 -0
  112. data/ext/mtl_linux/src/vm/vmem.c +461 -0
  113. data/ext/mtl_linux/src/vm/vnet.c +298 -0
  114. data/{bytecode/src/mtl → ext/mtl_linux}/utils/correct_const.sh +0 -0
  115. data/lib/nabaztag_hack_kit/server.rb +4 -7
  116. data/lib/nabaztag_hack_kit/version.rb +1 -1
  117. data/lib/nabaztag_hack_kit.rb +2 -2
  118. data/nabaztag_hack_kit.gemspec +10 -11
  119. data/spec/integration/server_spec.rb +3 -3
  120. data/spec/spec_helper.rb +2 -0
  121. data/spec/unit/message_spec.rb +12 -18
  122. data/spec/unit/server_spec.rb +13 -10
  123. metadata +145 -137
  124. data/bytecode/bin/mtl_comp +0 -50
  125. data/bytecode/bin/mtl_simu +0 -49
  126. data/bytecode/src/mtl/Makefile +0 -42
  127. data/bytecode/src/mtl/README.md +0 -13
  128. data/bytecode/src/mtl/bc.cpp +0 -1891
  129. data/bytecode/src/mtl/dumpbc.c +0 -2566
  130. data/bytecode/src/mtl/linux_simu.c +0 -271
  131. data/bytecode/src/mtl/linux_simuaudio.c +0 -16
  132. data/bytecode/src/mtl/linux_simunet.c +0 -620
  133. data/bytecode/src/mtl/log.c +0 -297
  134. data/bytecode/src/mtl/log.h +0 -20
  135. data/bytecode/src/mtl/main_compiler.cpp +0 -104
  136. data/bytecode/src/mtl/main_simu.cpp +0 -221
  137. data/bytecode/src/mtl/mp3/common.c +0 -265
  138. data/bytecode/src/mtl/mp3/dct64_i386.c +0 -316
  139. data/bytecode/src/mtl/mp3/decode_i386.c +0 -155
  140. data/bytecode/src/mtl/mp3/huffman.h +0 -332
  141. data/bytecode/src/mtl/mp3/interface.c +0 -258
  142. data/bytecode/src/mtl/mp3/mpglib.h +0 -44
  143. data/bytecode/src/mtl/properties.c +0 -293
  144. data/bytecode/src/mtl/simu.c +0 -750
  145. data/bytecode/src/mtl/simuaudio.c +0 -662
  146. data/bytecode/src/mtl/simunet.c +0 -400
  147. data/bytecode/src/mtl/vaudio.c +0 -677
  148. data/bytecode/src/mtl/vbc_str.h +0 -166
  149. data/bytecode/src/mtl/vcomp/Makefile +0 -29
  150. data/bytecode/src/mtl/vcomp/bootstrap.cpp +0 -89
  151. data/bytecode/src/mtl/vcomp/compiler.cpp +0 -470
  152. data/bytecode/src/mtl/vcomp/compiler.h +0 -200
  153. data/bytecode/src/mtl/vcomp/compiler_file.cpp +0 -929
  154. data/bytecode/src/mtl/vcomp/compiler_prog.cpp +0 -250
  155. data/bytecode/src/mtl/vcomp/compiler_term.cpp +0 -1053
  156. data/bytecode/src/mtl/vcomp/compiler_type.cpp +0 -872
  157. data/bytecode/src/mtl/vcomp/compiler_var.cpp +0 -289
  158. data/bytecode/src/mtl/vcomp/file.cpp +0 -79
  159. data/bytecode/src/mtl/vcomp/interpreter.cpp +0 -85
  160. data/bytecode/src/mtl/vcomp/interpreter.h +0 -121
  161. data/bytecode/src/mtl/vcomp/memory.cpp +0 -241
  162. data/bytecode/src/mtl/vcomp/parser.cpp +0 -427
  163. data/bytecode/src/mtl/vcomp/parser_xml.cpp +0 -124
  164. data/bytecode/src/mtl/vcomp/prodbuffer.h +0 -42
  165. data/bytecode/src/mtl/vcomp/stdlib_core.cpp +0 -122
  166. data/bytecode/src/mtl/vcomp/terminal.cpp +0 -73
  167. data/bytecode/src/mtl/vinterp.c +0 -1349
  168. data/bytecode/src/mtl/vloader.c +0 -127
  169. data/bytecode/src/mtl/vlog.c +0 -589
  170. data/bytecode/src/mtl/vmem.c +0 -424
  171. data/bytecode/src/mtl/vnet.c +0 -255
  172. data/examples/basic/Procfile +0 -2
  173. data/examples/basic/server.rb +0 -14
@@ -0,0 +1,587 @@
1
+ //-------------------
2
+ // MV
3
+ // version WIN32 et POCKETPC
4
+ // Sylvain Huet
5
+ // Derniere mise a jour : 07/01/2003
6
+ //
7
+
8
+ #include <stdio.h>
9
+ #include <string.h>
10
+ #include <stdint.h>
11
+
12
+ #include "param.h"
13
+ #include "terminal.h"
14
+ #include "memory.h"
15
+ #include "prodbuffer.h"
16
+ #include "interpreter.h"
17
+ #include "compiler.h"
18
+
19
+
20
+ Compiler::Compiler(Memory* mem)
21
+ {
22
+ m=mem;
23
+ bc=new Prodbuffer();
24
+ outputbuf=new Prodbuffer();
25
+ brelease=new Prodbuffer();
26
+ };
27
+
28
+ Compiler::~Compiler()
29
+ {
30
+ delete bc;
31
+ delete outputbuf;
32
+ delete brelease;
33
+ };
34
+
35
+
36
+ int Compiler::start()
37
+ {
38
+ int k;
39
+
40
+ // création du package systeme
41
+ if (k=createpackage("system",8))
42
+ {
43
+ return k;
44
+ }
45
+ systempackage=STACKGET(m,0);
46
+ m->addroot(VALTOPNT(systempackage)); // le package systeme devient une racine
47
+ if (k=addstdlibcore())
48
+ {
49
+ return k;
50
+ }
51
+ int pck=STACKREF(m);
52
+
53
+ // création du tableau des types utilisés par le compilateur
54
+ if (k=creategraph("I",systempackage,0))
55
+ {
56
+ return k;
57
+ }
58
+ if (k=creategraph("F",systempackage,0))
59
+ {
60
+ return k;
61
+ }
62
+ if (k=creategraph("S",systempackage,0))
63
+ {
64
+ return k;
65
+ }
66
+ if (k=creategraph("Env",systempackage,0))
67
+ {
68
+ return k;
69
+ }
70
+ if (k=creategraph("Xml",systempackage,0))
71
+ {
72
+ return k;
73
+ }
74
+
75
+ if (k=creategraph("fun[u0 list u0]list u0",systempackage,0))
76
+ {
77
+ return k;
78
+ }
79
+ if (k=creategraph("fun[tab u0 I]u0",systempackage,0))
80
+ {
81
+ return k;
82
+ }
83
+ if (k=creategraph("fun[fun u0 u1 u0]u1",systempackage,0))
84
+ {
85
+ return k;
86
+ }
87
+ if (k=DEFTAB(m,STDTYPE_LENGTH))
88
+ {
89
+ return k;
90
+ }
91
+ stdtypes=VALTOPNT(STACKPULL(m));
92
+ m->addroot(stdtypes);
93
+
94
+ // dumppackage(systempackage);
95
+ return 0;
96
+ }
97
+
98
+ void Compiler::stop()
99
+ {
100
+ }
101
+
102
+ int Compiler::getsystempackage()
103
+ {
104
+ return systempackage;
105
+ }
106
+
107
+ // crée et empile un package
108
+ intptr_t Compiler::createpackage(const char* name,int loghach)
109
+ {
110
+ intptr_t k;
111
+ if (k=PUSHMALLOCCLEAR(m,PACK_LENGTH))
112
+ {
113
+ return k;
114
+ }
115
+ intptr_t* p=VALTOPNT(STACKGET(m,0));
116
+
117
+ if (k=STRPUSH(m,name))
118
+ {
119
+ return k;
120
+ }
121
+ TABSET(m,p,PACK_NAME,STACKPULL(m));
122
+
123
+ if (k=PUSHMALLOCCLEAR(m,1+(1<<loghach)))
124
+ {
125
+ return k;
126
+ }
127
+ TABSET(m,p,PACK_HACH,STACKPULL(m));
128
+
129
+ return 0;
130
+ }
131
+
132
+ // calcule la fonction de hachage d'une chaine (entre 0 et 255)
133
+ int Compiler::hash(const char* name)
134
+ {
135
+ int v=0;
136
+ int i=0;
137
+ while(*name)
138
+ {
139
+ int c=(*name++)&255;
140
+ c=c<<i;
141
+ v+=c+(c>>8);
142
+ i=(i+1)&7;
143
+ }
144
+ return v&255;
145
+ }
146
+
147
+ // ajoute une référence à un package
148
+ // [ref package] -> [package]
149
+ void Compiler::addreftopackage(intptr_t* ref,intptr_t* package)
150
+ {
151
+ int v;
152
+ if (TABGET(ref,REF_NAME)!=NIL)
153
+ {
154
+ v=hash(STRSTART(VALTOPNT(TABGET(ref,REF_NAME))));
155
+ }
156
+ else
157
+ {
158
+ v=hash(STRSTART(VALTOPNT(TABGET(VALTOPNT(TABGET(ref,REF_TYPE)),TYPEHEADER_LENGTH+1))));
159
+ }
160
+
161
+ intptr_t* p=VALTOPNT(TABGET(package,PACK_HACH));
162
+
163
+ // TABSET(m,ref,REF_PACKAGE,PNTTOVAL(package));
164
+ v&=TABLEN(p)-2;
165
+ TABSET(m,ref,REF_NEXT,TABGET(p,v));
166
+ TABSET(m,p,v,PNTTOVAL(ref));
167
+ v=TABLEN(p)-1;
168
+ TABSET(m,ref,REF_NEXTALL,TABGET(p,v));
169
+ TABSET(m,p,v,PNTTOVAL(ref));
170
+ }
171
+
172
+ // recherche d'un type dans un environnement
173
+ intptr_t* Compiler::searchtype(int env,const char* name)
174
+ {
175
+ intptr_t v=hash(name);
176
+ while(env!=NIL)
177
+ {
178
+ intptr_t* p=VALTOPNT(TABGET(VALTOPNT(env),PACK_HACH));
179
+ intptr_t vref=TABGET(p,v&(TABLEN(p)-2));
180
+ while(vref!=NIL)
181
+ {
182
+ intptr_t* ref=VALTOPNT(vref);
183
+ if ((TABGET(ref,REF_NAME)==NIL)
184
+ &&(!strcmp(name,STRSTART(VALTOPNT(TABGET(VALTOPNT(TABGET(ref,REF_TYPE)),TYPEHEADER_LENGTH+1))))) )
185
+ {
186
+ return ref;
187
+ }
188
+ vref=TABGET(ref,REF_NEXT);
189
+ }
190
+ env=TABGET(VALTOPNT(env),PACK_NEXT);
191
+ }
192
+ return NULL;
193
+ }
194
+
195
+ // recherche d'un type non défini dans un environnement
196
+ intptr_t* Compiler::searchemptytype(int env,const char* name)
197
+ {
198
+ intptr_t v=hash(name);
199
+ while(env!=NIL)
200
+ {
201
+ intptr_t* p=VALTOPNT(TABGET(VALTOPNT(env),PACK_HACH));
202
+ intptr_t vref=TABGET(p,v&(TABLEN(p)-2));
203
+ while(vref!=NIL)
204
+ {
205
+ intptr_t* ref=VALTOPNT(vref);
206
+ if ((TABGET(ref,REF_CODE)==INTTOVAL(CODE_EMPTYTYPE))
207
+ &&(!strcmp(name,STRSTART(VALTOPNT(TABGET(VALTOPNT(TABGET(ref,REF_TYPE)),TYPEHEADER_LENGTH+1))))) )
208
+ {
209
+ return ref;
210
+ }
211
+ vref=TABGET(ref,REF_NEXT);
212
+ }
213
+ env=TABGET(VALTOPNT(env),PACK_NEXT);
214
+ }
215
+ return NULL;
216
+ }
217
+
218
+ void Compiler::dumppackage(int env)
219
+ {
220
+ while(env!=NIL)
221
+ {
222
+ PRINTF(m)(LOG_DEVCORE,"package %s",STRSTART(VALTOPNT(TABGET(VALTOPNT(env),PACK_NAME))));
223
+ intptr_t* p=VALTOPNT(TABGET(VALTOPNT(env),PACK_HACH));
224
+ intptr_t vref=TABGET(p,TABLEN(p)-1);
225
+ while(vref!=NIL)
226
+ {
227
+ intptr_t* ref=VALTOPNT(vref);
228
+ char* name=NULL;
229
+ if (TABGET(ref,REF_NAME)!=NIL)
230
+ {
231
+ name=STRSTART(VALTOPNT(TABGET(ref,REF_NAME)));
232
+ }
233
+ if (!name)
234
+ {
235
+ name=STRSTART(VALTOPNT(TABGET(VALTOPNT(TABGET(ref,REF_TYPE)),TYPEHEADER_LENGTH+1)));
236
+ }
237
+ if (name)
238
+ {
239
+ PRINTF(m)(LOG_DEVCORE," %s",name);
240
+ }
241
+ vref=TABGET(ref,REF_NEXTALL);
242
+ }
243
+ PRINTF(m)(LOG_DEVCORE,"\n");
244
+ env=TABGET(VALTOPNT(env),PACK_NEXT);
245
+ }
246
+ }
247
+
248
+ intptr_t Compiler::searchbytype(int env,int type)
249
+ {
250
+ while(env!=NIL)
251
+ {
252
+ intptr_t* p=VALTOPNT(TABGET(VALTOPNT(env),PACK_HACH));
253
+ intptr_t vref=TABGET(p,TABLEN(p)-1);
254
+ while(vref!=NIL)
255
+ {
256
+ if (TABGET(VALTOPNT(vref),REF_TYPE)==type)
257
+ {
258
+ return vref;
259
+ }
260
+ vref=TABGET(VALTOPNT(vref),REF_NEXTALL);
261
+ }
262
+ env=TABGET(VALTOPNT(env),PACK_NEXT);
263
+ }
264
+ return NIL;
265
+ }
266
+
267
+ intptr_t Compiler::fillproto(int env,intptr_t* fun)
268
+ {
269
+ intptr_t k;
270
+ intptr_t v=hash(STRSTART(VALTOPNT(TABGET(fun,REF_NAME))));
271
+ while(env!=NIL)
272
+ {
273
+ intptr_t* p=VALTOPNT(TABGET(VALTOPNT(env),PACK_HACH));
274
+ intptr_t vref=TABGET(p,v&(TABLEN(p)-2));
275
+ while(vref!=NIL)
276
+ {
277
+ intptr_t* ref=VALTOPNT(vref);
278
+ if ((ref!=fun)&&(VALTOINT(TABGET(ref,REF_CODE))>=0)) // on recherche des fonctions
279
+ {
280
+ if ( (!strcmp(STRSTART(VALTOPNT(TABGET(fun,REF_NAME))),STRSTART(VALTOPNT(TABGET(ref,REF_NAME)))))
281
+ &&(TABGET(ref,REF_VAL)==NIL) )
282
+ {
283
+ if (k=unifbigger(VALTOPNT(TABGET(fun,REF_TYPE)),VALTOPNT(TABGET(ref,REF_TYPE))))
284
+ {
285
+ PRINTF(m)(LOG_COMPILER,"Compiler : prototype does not match\n");
286
+ return k;
287
+ }
288
+ TABSET(m,ref,REF_VAL,TABGET(fun,REF_VAL));
289
+ // TABSET(m,ref,REF_PACKAGE,TABGET(fun,REF_PACKAGE));
290
+ }
291
+ }
292
+ vref=TABGET(ref,REF_NEXT);
293
+ }
294
+ env=TABGET(VALTOPNT(env),PACK_NEXT);
295
+ }
296
+ return 0;
297
+ }
298
+
299
+ intptr_t Compiler::findproto(int env,intptr_t* fun)
300
+ {
301
+ intptr_t v=hash(STRSTART(VALTOPNT(TABGET(fun,REF_NAME))));
302
+ while(env!=NIL)
303
+ {
304
+ intptr_t* p=VALTOPNT(TABGET(VALTOPNT(env),PACK_HACH));
305
+ intptr_t vref=TABGET(p,v&(TABLEN(p)-2));
306
+ while(vref!=NIL)
307
+ {
308
+ intptr_t* ref=VALTOPNT(vref);
309
+ if ((ref!=fun)&&(VALTOINT(TABGET(ref,REF_CODE))>=0)) // on recherche des fonctions
310
+ {
311
+ if ( (!strcmp(STRSTART(VALTOPNT(TABGET(fun,REF_NAME))),STRSTART(VALTOPNT(TABGET(ref,REF_NAME)))))
312
+ &&(TABGET(ref,REF_VAL)==NIL) )
313
+ {
314
+ return TABGET(ref,REF_PACKAGE);
315
+ }
316
+ }
317
+ vref=TABGET(ref,REF_NEXT);
318
+ }
319
+ env=TABGET(VALTOPNT(env),PACK_NEXT);
320
+ }
321
+ return NIL;
322
+ }
323
+
324
+ // recherche d'une référence dans un environnement
325
+ intptr_t* Compiler::searchref(int env,char* name)
326
+ {
327
+ intptr_t v=hash(name);
328
+ while(env!=NIL)
329
+ {
330
+ intptr_t* p=VALTOPNT(TABGET(VALTOPNT(env),PACK_HACH));
331
+ intptr_t vref=TABGET(p,v&(TABLEN(p)-2));
332
+ while(vref!=NIL)
333
+ {
334
+ intptr_t* ref=VALTOPNT(vref);
335
+ if ((TABGET(ref,REF_NAME)!=NIL)
336
+ &&(!strcmp(name,STRSTART(VALTOPNT(TABGET(ref,REF_NAME))))) )
337
+ {
338
+ // à partir du moment où on recherche cette référence, c'est
339
+ // qu'elle est utlisé quelque part, donc...
340
+ TABSET(m,ref,REF_USED,INTTOVAL(1));
341
+
342
+ return ref;
343
+ }
344
+ vref=TABGET(ref,REF_NEXT);
345
+ }
346
+ env=TABGET(VALTOPNT(env),PACK_NEXT);
347
+ }
348
+ return NULL;
349
+ }
350
+
351
+ // recherche d'une référence dans un environnement, ne marque pas la référence comme utilisée
352
+ intptr_t* Compiler::searchref_nosetused(int env,char* name)
353
+ {
354
+ intptr_t v=hash(name);
355
+ while(env!=NIL)
356
+ {
357
+ intptr_t* p=VALTOPNT(TABGET(VALTOPNT(env),PACK_HACH));
358
+ intptr_t vref=TABGET(p,v&(TABLEN(p)-2));
359
+ while(vref!=NIL)
360
+ {
361
+ intptr_t* ref=VALTOPNT(vref);
362
+ if ((TABGET(ref,REF_NAME)!=NIL)
363
+ &&(!strcmp(name,STRSTART(VALTOPNT(TABGET(ref,REF_NAME))))) )
364
+ {
365
+ return ref;
366
+ }
367
+ vref=TABGET(ref,REF_NEXT);
368
+ }
369
+ env=TABGET(VALTOPNT(env),PACK_NEXT);
370
+ }
371
+ return NULL;
372
+ }
373
+
374
+ // ajout d'un label dans une liste de labels
375
+ intptr_t Compiler::addlabel(intptr_t base,const char* name,int val,intptr_t ref)
376
+ {
377
+ intptr_t k;
378
+ intptr_t* p=MALLOCCLEAR(m,LABELLIST_LENGTH);
379
+ if (!p)
380
+ {
381
+ return MTLERR_OM;
382
+ }
383
+ TABSET(m,p,LABELLIST_NEXT,STACKGETFROMREF(m,base,0));
384
+ STACKSETFROMREF(m,base,0,PNTTOVAL(p));
385
+
386
+ if (k=STRPUSH(m,name))
387
+ {
388
+ return k;
389
+ }
390
+ TABSET(m,p,LABELLIST_NAME,STACKPULL(m));
391
+ TABSET(m,p,LABELLIST_VAL,val);
392
+ TABSET(m,p,LABELLIST_REF,ref);
393
+ return 0;
394
+ }
395
+
396
+ // compte le nombre de labels
397
+ int Compiler::nblabels(intptr_t base)
398
+ {
399
+ int n=0;
400
+ intptr_t vlab=STACKGETFROMREF(m,base,0);
401
+ while(vlab!=NIL)
402
+ {
403
+ n++;
404
+ vlab=TABGET(VALTOPNT(vlab),LABELLIST_NEXT);
405
+ }
406
+ return n;
407
+ }
408
+
409
+ void Compiler::removenlabels(intptr_t base,int n)
410
+ {
411
+ while(n>0)
412
+ {
413
+ STACKSETFROMREF(m,base,0,TABGET(VALTOPNT(STACKGETFROMREF(m,base,0)),LABELLIST_NEXT));
414
+ n--;
415
+ }
416
+ }
417
+
418
+ // recherche d'un label dans une liste de labels
419
+ int Compiler::searchlabel_byname(intptr_t base,const char* name,int* val,intptr_t* ref)
420
+ {
421
+ intptr_t vlab=STACKGETFROMREF(m,base,0);
422
+ while(vlab!=NIL)
423
+ {
424
+ intptr_t* lab=VALTOPNT(vlab);
425
+ if (!strcmp(name,STRSTART(VALTOPNT(TABGET(lab,LABELLIST_NAME)))) )
426
+ {
427
+ if (val)
428
+ {
429
+ *val=TABGET(lab,LABELLIST_VAL);
430
+ }
431
+ if (ref)
432
+ {
433
+ *ref=TABGET(lab,LABELLIST_REF);
434
+ }
435
+ return 0;
436
+ }
437
+ vlab=TABGET(lab,LABELLIST_NEXT);
438
+ }
439
+ return -1;
440
+ }
441
+
442
+ // recherche d'un label dans une liste de labels
443
+ int Compiler::searchlabel_byval(intptr_t base,int val, char** name)
444
+ {
445
+ intptr_t vlab=STACKGETFROMREF(m,base,0);
446
+ while(vlab!=NIL)
447
+ {
448
+ intptr_t* lab=VALTOPNT(vlab);
449
+ if (val==TABGET(lab,LABELLIST_VAL))
450
+ {
451
+ *name=STRSTART(VALTOPNT(TABGET(lab,LABELLIST_NAME)));
452
+ return 0;
453
+ }
454
+ vlab=TABGET(lab,LABELLIST_NEXT);
455
+ }
456
+ return -1;
457
+ }
458
+
459
+ // création d'un tuple à partir d'une liste de labels
460
+ intptr_t* Compiler::tuplefromlabels(intptr_t base)
461
+ {
462
+ int n=nblabels(base);
463
+ intptr_t* t=MALLOC(m,n,TYPE_TAB);
464
+ if (!t)
465
+ {
466
+ return t;
467
+ }
468
+
469
+ intptr_t vlab=STACKGETFROMREF(m,base,0);
470
+ int i;
471
+ for(i=n-1; i>=0; i--)
472
+ {
473
+ intptr_t* lab=VALTOPNT(vlab);
474
+ TABSET(m,t,i,TABGET(lab,LABELLIST_REF));
475
+ vlab=TABGET(lab,LABELLIST_NEXT);
476
+ }
477
+ return t;
478
+ }
479
+
480
+
481
+ // ajoute des fonctions à un package
482
+ intptr_t Compiler::addnative(int nref, const char** nameref, int* valref
483
+ , int* coderef, const char** typeref,void* arg)
484
+ {
485
+ int i,k;
486
+
487
+ for(i=0; i<nref; i++)
488
+ {
489
+ intptr_t* p=MALLOCCLEAR(m,REF_LENGTH);
490
+ if (!p)
491
+ {
492
+ return MTLERR_OM;
493
+ }
494
+ if (k=STACKPUSH(m,PNTTOVAL(p)))
495
+ {
496
+ return MTLERR_OM;
497
+ }
498
+
499
+ if (nameref[i])
500
+ {
501
+ if (k=STRPUSH(m,nameref[i]))
502
+ {
503
+ return k;
504
+ }
505
+ TABSET(m,p,REF_NAME,STACKPULL(m));
506
+ }
507
+
508
+ TABSET(m,p,REF_CODE,INTTOVAL(coderef[i]));
509
+
510
+ if (coderef[i]>=0)
511
+ {
512
+ if (k=creategraph(typeref[i],systempackage,0))
513
+ {
514
+ return k;
515
+ }
516
+ TABSET(m,p,REF_TYPE,STACKPULL(m));
517
+
518
+ // if (k=PUSHPNT(m,(int*)valref[i])) return k;
519
+ if (k=STACKPUSH(m,INTTOVAL(valref[i])))
520
+ {
521
+ return k;
522
+ }
523
+
524
+ intptr_t* fun=MALLOCCLEAR(m,FUN_LENGTH);
525
+ if (!fun)
526
+ {
527
+ return MTLERR_OM;
528
+ }
529
+ TABSET(m,p,REF_VAL,PNTTOVAL(fun));
530
+
531
+ TABSET(m,fun,FUN_NBARGS,INTTOVAL(coderef[i]));
532
+ TABSET(m,fun,FUN_NBLOCALS,NIL);
533
+ // PRINTF(m)(1,"valref %s = %x\n",nameref[i],valref[i]);
534
+ // TABSET(m,fun,FUN_BC,((int)valref[i])<<1);
535
+ TABSET(m,fun,FUN_BC,STACKPULL(m));
536
+ TABSET(m,fun,FUN_REF,*((int*)arg));
537
+ TABSET(m,fun,FUN_REFERENCE,PNTTOVAL(p));
538
+ }
539
+ else if ((coderef[i]==CODE_VAR)
540
+ ||(coderef[i]==CODE_CONS)||(coderef[i]==CODE_CONS0))
541
+ {
542
+ if (k=creategraph(typeref[i],systempackage,0))
543
+ {
544
+ return k;
545
+ }
546
+ TABSET(m,p,REF_TYPE,STACKPULL(m));
547
+ TABSET(m,p,REF_VAL,(int)valref[i]);
548
+ }
549
+ else if (coderef[i]==CODE_FIELD)
550
+ {
551
+ if (k=creategraph(typeref[i],systempackage,0))
552
+ {
553
+ return k;
554
+ }
555
+ if (k=STACKPUSH(m,(int)valref[i]))
556
+ {
557
+ return k;
558
+ }
559
+ int vtype=searchbytype(systempackage,
560
+ TABGET(argsfromfun(VALTOPNT(STACKGET(m,1))),TYPEHEADER_LENGTH));
561
+ if (k=STACKPUSH(m,vtype))
562
+ {
563
+ return k;
564
+ }
565
+ if (k=DEFTAB(m,2))
566
+ {
567
+ return k;
568
+ }
569
+ TABSET(m,p,REF_VAL,STACKPULL(m));
570
+ TABSET(m,p,REF_TYPE,STACKPULL(m));
571
+ }
572
+ else if ((coderef[i]==CODE_TYPE)||(coderef[i]==CODE_SUM)||(coderef[i]==CODE_STRUCT))
573
+ {
574
+ if (k=createnodetypecore(typeref[i]))
575
+ {
576
+ return k;
577
+ }
578
+ TABSET(m,p,REF_TYPE,STACKPULL(m));
579
+ TABSET(m,p,REF_VAL,(int)valref[i]);
580
+ }
581
+ addreftopackage(p,VALTOPNT(systempackage));
582
+ STACKDROP(m);
583
+ }
584
+ return 0;
585
+ }
586
+
587
+