nabaztag_hack_kit 0.1.0.beta3 → 0.1.0.beta8

Sign up to get free protection for your applications and to get access to all the features.
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
+