clipsruby 0.0.2
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.
- checksums.yaml +7 -0
- data/ext/clipsruby/agenda.c +1373 -0
- data/ext/clipsruby/agenda.h +169 -0
- data/ext/clipsruby/analysis.c +1142 -0
- data/ext/clipsruby/analysis.h +61 -0
- data/ext/clipsruby/argacces.c +526 -0
- data/ext/clipsruby/argacces.h +77 -0
- data/ext/clipsruby/bload.c +884 -0
- data/ext/clipsruby/bload.h +94 -0
- data/ext/clipsruby/bmathfun.c +557 -0
- data/ext/clipsruby/bmathfun.h +66 -0
- data/ext/clipsruby/bsave.c +634 -0
- data/ext/clipsruby/bsave.h +130 -0
- data/ext/clipsruby/classcom.c +976 -0
- data/ext/clipsruby/classcom.h +115 -0
- data/ext/clipsruby/classexm.c +1376 -0
- data/ext/clipsruby/classexm.h +97 -0
- data/ext/clipsruby/classfun.c +1392 -0
- data/ext/clipsruby/classfun.h +164 -0
- data/ext/clipsruby/classinf.c +1245 -0
- data/ext/clipsruby/classinf.h +94 -0
- data/ext/clipsruby/classini.c +843 -0
- data/ext/clipsruby/classini.h +75 -0
- data/ext/clipsruby/classpsr.c +957 -0
- data/ext/clipsruby/classpsr.h +73 -0
- data/ext/clipsruby/clips.h +133 -0
- data/ext/clipsruby/clipsruby.c +619 -0
- data/ext/clipsruby/clsltpsr.c +931 -0
- data/ext/clipsruby/clsltpsr.h +72 -0
- data/ext/clipsruby/commline.c +1217 -0
- data/ext/clipsruby/commline.h +131 -0
- data/ext/clipsruby/conscomp.c +1593 -0
- data/ext/clipsruby/conscomp.h +150 -0
- data/ext/clipsruby/constant.h +264 -0
- data/ext/clipsruby/constrct.c +1090 -0
- data/ext/clipsruby/constrct.h +216 -0
- data/ext/clipsruby/constrnt.c +554 -0
- data/ext/clipsruby/constrnt.h +132 -0
- data/ext/clipsruby/crstrtgy.c +1088 -0
- data/ext/clipsruby/crstrtgy.h +85 -0
- data/ext/clipsruby/cstrcbin.c +185 -0
- data/ext/clipsruby/cstrcbin.h +61 -0
- data/ext/clipsruby/cstrccmp.h +43 -0
- data/ext/clipsruby/cstrccom.c +1791 -0
- data/ext/clipsruby/cstrccom.h +115 -0
- data/ext/clipsruby/cstrcpsr.c +835 -0
- data/ext/clipsruby/cstrcpsr.h +97 -0
- data/ext/clipsruby/cstrnbin.c +282 -0
- data/ext/clipsruby/cstrnbin.h +55 -0
- data/ext/clipsruby/cstrnchk.c +826 -0
- data/ext/clipsruby/cstrnchk.h +91 -0
- data/ext/clipsruby/cstrncmp.c +238 -0
- data/ext/clipsruby/cstrncmp.h +57 -0
- data/ext/clipsruby/cstrnops.c +1176 -0
- data/ext/clipsruby/cstrnops.h +47 -0
- data/ext/clipsruby/cstrnpsr.c +1394 -0
- data/ext/clipsruby/cstrnpsr.h +88 -0
- data/ext/clipsruby/cstrnutl.c +564 -0
- data/ext/clipsruby/cstrnutl.h +54 -0
- data/ext/clipsruby/default.c +454 -0
- data/ext/clipsruby/default.h +57 -0
- data/ext/clipsruby/defins.c +971 -0
- data/ext/clipsruby/defins.h +127 -0
- data/ext/clipsruby/developr.c +677 -0
- data/ext/clipsruby/developr.h +69 -0
- data/ext/clipsruby/dffctbin.c +477 -0
- data/ext/clipsruby/dffctbin.h +76 -0
- data/ext/clipsruby/dffctbsc.c +308 -0
- data/ext/clipsruby/dffctbsc.h +72 -0
- data/ext/clipsruby/dffctcmp.c +297 -0
- data/ext/clipsruby/dffctcmp.h +44 -0
- data/ext/clipsruby/dffctdef.c +364 -0
- data/ext/clipsruby/dffctdef.h +104 -0
- data/ext/clipsruby/dffctpsr.c +179 -0
- data/ext/clipsruby/dffctpsr.h +49 -0
- data/ext/clipsruby/dffnxbin.c +520 -0
- data/ext/clipsruby/dffnxbin.h +67 -0
- data/ext/clipsruby/dffnxcmp.c +378 -0
- data/ext/clipsruby/dffnxcmp.h +54 -0
- data/ext/clipsruby/dffnxexe.c +241 -0
- data/ext/clipsruby/dffnxexe.h +58 -0
- data/ext/clipsruby/dffnxfun.c +1192 -0
- data/ext/clipsruby/dffnxfun.h +155 -0
- data/ext/clipsruby/dffnxpsr.c +514 -0
- data/ext/clipsruby/dffnxpsr.h +57 -0
- data/ext/clipsruby/dfinsbin.c +509 -0
- data/ext/clipsruby/dfinsbin.h +66 -0
- data/ext/clipsruby/dfinscmp.c +345 -0
- data/ext/clipsruby/dfinscmp.h +48 -0
- data/ext/clipsruby/drive.c +1191 -0
- data/ext/clipsruby/drive.h +65 -0
- data/ext/clipsruby/emathfun.c +1213 -0
- data/ext/clipsruby/emathfun.h +99 -0
- data/ext/clipsruby/engine.c +1568 -0
- data/ext/clipsruby/engine.h +203 -0
- data/ext/clipsruby/entities.h +276 -0
- data/ext/clipsruby/envrnbld.c +514 -0
- data/ext/clipsruby/envrnbld.h +40 -0
- data/ext/clipsruby/envrnmnt.c +257 -0
- data/ext/clipsruby/envrnmnt.h +112 -0
- data/ext/clipsruby/evaluatn.c +1736 -0
- data/ext/clipsruby/evaluatn.h +211 -0
- data/ext/clipsruby/expressn.c +494 -0
- data/ext/clipsruby/expressn.h +154 -0
- data/ext/clipsruby/exprnbin.c +538 -0
- data/ext/clipsruby/exprnbin.h +60 -0
- data/ext/clipsruby/exprnops.c +564 -0
- data/ext/clipsruby/exprnops.h +67 -0
- data/ext/clipsruby/exprnpsr.c +1112 -0
- data/ext/clipsruby/exprnpsr.h +98 -0
- data/ext/clipsruby/extconf.rb +2 -0
- data/ext/clipsruby/extnfunc.c +1015 -0
- data/ext/clipsruby/extnfunc.h +157 -0
- data/ext/clipsruby/factbin.c +447 -0
- data/ext/clipsruby/factbin.h +56 -0
- data/ext/clipsruby/factbld.c +1035 -0
- data/ext/clipsruby/factbld.h +63 -0
- data/ext/clipsruby/factcmp.c +386 -0
- data/ext/clipsruby/factcmp.h +46 -0
- data/ext/clipsruby/factcom.c +759 -0
- data/ext/clipsruby/factcom.h +80 -0
- data/ext/clipsruby/factfile.c +1761 -0
- data/ext/clipsruby/factfile.h +54 -0
- data/ext/clipsruby/factfun.c +682 -0
- data/ext/clipsruby/factfun.h +77 -0
- data/ext/clipsruby/factgen.c +1305 -0
- data/ext/clipsruby/factgen.h +229 -0
- data/ext/clipsruby/facthsh.c +438 -0
- data/ext/clipsruby/facthsh.h +81 -0
- data/ext/clipsruby/factlhs.c +250 -0
- data/ext/clipsruby/factlhs.h +54 -0
- data/ext/clipsruby/factmch.c +905 -0
- data/ext/clipsruby/factmch.h +68 -0
- data/ext/clipsruby/factmngr.c +3373 -0
- data/ext/clipsruby/factmngr.h +325 -0
- data/ext/clipsruby/factprt.c +498 -0
- data/ext/clipsruby/factprt.h +60 -0
- data/ext/clipsruby/factqpsr.c +796 -0
- data/ext/clipsruby/factqpsr.h +61 -0
- data/ext/clipsruby/factqury.c +1267 -0
- data/ext/clipsruby/factqury.h +112 -0
- data/ext/clipsruby/factrete.c +978 -0
- data/ext/clipsruby/factrete.h +70 -0
- data/ext/clipsruby/factrhs.c +667 -0
- data/ext/clipsruby/factrhs.h +55 -0
- data/ext/clipsruby/filecom.c +353 -0
- data/ext/clipsruby/filecom.h +137 -0
- data/ext/clipsruby/filertr.c +481 -0
- data/ext/clipsruby/filertr.h +94 -0
- data/ext/clipsruby/fileutil.c +1020 -0
- data/ext/clipsruby/fileutil.h +50 -0
- data/ext/clipsruby/generate.c +1079 -0
- data/ext/clipsruby/generate.h +57 -0
- data/ext/clipsruby/genrcbin.c +902 -0
- data/ext/clipsruby/genrcbin.h +69 -0
- data/ext/clipsruby/genrccmp.c +640 -0
- data/ext/clipsruby/genrccmp.h +59 -0
- data/ext/clipsruby/genrccom.c +2017 -0
- data/ext/clipsruby/genrccom.h +119 -0
- data/ext/clipsruby/genrcexe.c +737 -0
- data/ext/clipsruby/genrcexe.h +73 -0
- data/ext/clipsruby/genrcfun.c +890 -0
- data/ext/clipsruby/genrcfun.h +185 -0
- data/ext/clipsruby/genrcpsr.c +1618 -0
- data/ext/clipsruby/genrcpsr.h +80 -0
- data/ext/clipsruby/globlbin.c +458 -0
- data/ext/clipsruby/globlbin.h +71 -0
- data/ext/clipsruby/globlbsc.c +361 -0
- data/ext/clipsruby/globlbsc.h +83 -0
- data/ext/clipsruby/globlcmp.c +330 -0
- data/ext/clipsruby/globlcmp.h +52 -0
- data/ext/clipsruby/globlcom.c +289 -0
- data/ext/clipsruby/globlcom.h +63 -0
- data/ext/clipsruby/globldef.c +1087 -0
- data/ext/clipsruby/globldef.h +151 -0
- data/ext/clipsruby/globlpsr.c +530 -0
- data/ext/clipsruby/globlpsr.h +59 -0
- data/ext/clipsruby/immthpsr.c +431 -0
- data/ext/clipsruby/immthpsr.h +55 -0
- data/ext/clipsruby/incrrset.c +530 -0
- data/ext/clipsruby/incrrset.h +73 -0
- data/ext/clipsruby/inherpsr.c +850 -0
- data/ext/clipsruby/inherpsr.h +52 -0
- data/ext/clipsruby/inscom.c +2076 -0
- data/ext/clipsruby/inscom.h +182 -0
- data/ext/clipsruby/insfile.c +1764 -0
- data/ext/clipsruby/insfile.h +96 -0
- data/ext/clipsruby/insfun.c +1451 -0
- data/ext/clipsruby/insfun.h +134 -0
- data/ext/clipsruby/insmngr.c +2550 -0
- data/ext/clipsruby/insmngr.h +125 -0
- data/ext/clipsruby/insmoddp.c +1041 -0
- data/ext/clipsruby/insmoddp.h +91 -0
- data/ext/clipsruby/insmult.c +804 -0
- data/ext/clipsruby/insmult.h +62 -0
- data/ext/clipsruby/inspsr.c +602 -0
- data/ext/clipsruby/inspsr.h +60 -0
- data/ext/clipsruby/insquery.c +1278 -0
- data/ext/clipsruby/insquery.h +115 -0
- data/ext/clipsruby/insqypsr.c +729 -0
- data/ext/clipsruby/insqypsr.h +63 -0
- data/ext/clipsruby/iofun.c +2045 -0
- data/ext/clipsruby/iofun.h +116 -0
- data/ext/clipsruby/lgcldpnd.c +644 -0
- data/ext/clipsruby/lgcldpnd.h +75 -0
- data/ext/clipsruby/main.c +112 -0
- data/ext/clipsruby/match.h +142 -0
- data/ext/clipsruby/memalloc.c +481 -0
- data/ext/clipsruby/memalloc.h +197 -0
- data/ext/clipsruby/miscfun.c +1801 -0
- data/ext/clipsruby/miscfun.h +132 -0
- data/ext/clipsruby/modulbin.c +607 -0
- data/ext/clipsruby/modulbin.h +84 -0
- data/ext/clipsruby/modulbsc.c +347 -0
- data/ext/clipsruby/modulbsc.h +67 -0
- data/ext/clipsruby/modulcmp.c +499 -0
- data/ext/clipsruby/modulcmp.h +54 -0
- data/ext/clipsruby/moduldef.c +817 -0
- data/ext/clipsruby/moduldef.h +271 -0
- data/ext/clipsruby/modulpsr.c +1150 -0
- data/ext/clipsruby/modulpsr.h +69 -0
- data/ext/clipsruby/modulutl.c +1036 -0
- data/ext/clipsruby/modulutl.h +84 -0
- data/ext/clipsruby/msgcom.c +1221 -0
- data/ext/clipsruby/msgcom.h +125 -0
- data/ext/clipsruby/msgfun.c +1076 -0
- data/ext/clipsruby/msgfun.h +118 -0
- data/ext/clipsruby/msgpass.c +1441 -0
- data/ext/clipsruby/msgpass.h +103 -0
- data/ext/clipsruby/msgpsr.c +698 -0
- data/ext/clipsruby/msgpsr.h +73 -0
- data/ext/clipsruby/multifld.c +1404 -0
- data/ext/clipsruby/multifld.h +130 -0
- data/ext/clipsruby/multifun.c +2182 -0
- data/ext/clipsruby/multifun.h +102 -0
- data/ext/clipsruby/network.h +142 -0
- data/ext/clipsruby/objbin.c +1522 -0
- data/ext/clipsruby/objbin.h +79 -0
- data/ext/clipsruby/objcmp.c +1507 -0
- data/ext/clipsruby/objcmp.h +71 -0
- data/ext/clipsruby/object.h +260 -0
- data/ext/clipsruby/objrtbin.c +701 -0
- data/ext/clipsruby/objrtbin.h +79 -0
- data/ext/clipsruby/objrtbld.c +2393 -0
- data/ext/clipsruby/objrtbld.h +66 -0
- data/ext/clipsruby/objrtcmp.c +734 -0
- data/ext/clipsruby/objrtcmp.h +66 -0
- data/ext/clipsruby/objrtfnx.c +1330 -0
- data/ext/clipsruby/objrtfnx.h +222 -0
- data/ext/clipsruby/objrtgen.c +736 -0
- data/ext/clipsruby/objrtgen.h +63 -0
- data/ext/clipsruby/objrtmch.c +1524 -0
- data/ext/clipsruby/objrtmch.h +160 -0
- data/ext/clipsruby/parsefun.c +415 -0
- data/ext/clipsruby/parsefun.h +67 -0
- data/ext/clipsruby/pattern.c +1265 -0
- data/ext/clipsruby/pattern.h +163 -0
- data/ext/clipsruby/pprint.c +328 -0
- data/ext/clipsruby/pprint.h +79 -0
- data/ext/clipsruby/prccode.c +1478 -0
- data/ext/clipsruby/prccode.h +145 -0
- data/ext/clipsruby/prcdrfun.c +640 -0
- data/ext/clipsruby/prcdrfun.h +95 -0
- data/ext/clipsruby/prcdrpsr.c +1068 -0
- data/ext/clipsruby/prcdrpsr.h +79 -0
- data/ext/clipsruby/prdctfun.c +869 -0
- data/ext/clipsruby/prdctfun.h +77 -0
- data/ext/clipsruby/prntutil.c +878 -0
- data/ext/clipsruby/prntutil.h +125 -0
- data/ext/clipsruby/proflfun.c +827 -0
- data/ext/clipsruby/proflfun.h +118 -0
- data/ext/clipsruby/reorder.c +2082 -0
- data/ext/clipsruby/reorder.h +172 -0
- data/ext/clipsruby/reteutil.c +1732 -0
- data/ext/clipsruby/reteutil.h +111 -0
- data/ext/clipsruby/retract.c +710 -0
- data/ext/clipsruby/retract.h +74 -0
- data/ext/clipsruby/router.c +737 -0
- data/ext/clipsruby/router.h +147 -0
- data/ext/clipsruby/rulebin.c +1136 -0
- data/ext/clipsruby/rulebin.h +153 -0
- data/ext/clipsruby/rulebld.c +1328 -0
- data/ext/clipsruby/rulebld.h +62 -0
- data/ext/clipsruby/rulebsc.c +517 -0
- data/ext/clipsruby/rulebsc.h +91 -0
- data/ext/clipsruby/rulecmp.c +733 -0
- data/ext/clipsruby/rulecmp.h +63 -0
- data/ext/clipsruby/rulecom.c +1583 -0
- data/ext/clipsruby/rulecom.h +116 -0
- data/ext/clipsruby/rulecstr.c +892 -0
- data/ext/clipsruby/rulecstr.h +53 -0
- data/ext/clipsruby/ruledef.c +559 -0
- data/ext/clipsruby/ruledef.h +179 -0
- data/ext/clipsruby/ruledlt.c +599 -0
- data/ext/clipsruby/ruledlt.h +58 -0
- data/ext/clipsruby/rulelhs.c +1216 -0
- data/ext/clipsruby/rulelhs.h +52 -0
- data/ext/clipsruby/rulepsr.c +1073 -0
- data/ext/clipsruby/rulepsr.h +61 -0
- data/ext/clipsruby/scanner.c +856 -0
- data/ext/clipsruby/scanner.h +112 -0
- data/ext/clipsruby/setup.h +488 -0
- data/ext/clipsruby/sortfun.c +433 -0
- data/ext/clipsruby/sortfun.h +55 -0
- data/ext/clipsruby/strngfun.c +1173 -0
- data/ext/clipsruby/strngfun.h +96 -0
- data/ext/clipsruby/strngrtr.c +523 -0
- data/ext/clipsruby/strngrtr.h +97 -0
- data/ext/clipsruby/symblbin.c +648 -0
- data/ext/clipsruby/symblbin.h +64 -0
- data/ext/clipsruby/symblcmp.c +893 -0
- data/ext/clipsruby/symblcmp.h +61 -0
- data/ext/clipsruby/symbol.c +1961 -0
- data/ext/clipsruby/symbol.h +243 -0
- data/ext/clipsruby/sysdep.c +894 -0
- data/ext/clipsruby/sysdep.h +164 -0
- data/ext/clipsruby/textpro.c +1388 -0
- data/ext/clipsruby/textpro.h +77 -0
- data/ext/clipsruby/tmpltbin.c +609 -0
- data/ext/clipsruby/tmpltbin.h +108 -0
- data/ext/clipsruby/tmpltbsc.c +327 -0
- data/ext/clipsruby/tmpltbsc.h +87 -0
- data/ext/clipsruby/tmpltcmp.c +450 -0
- data/ext/clipsruby/tmpltcmp.h +57 -0
- data/ext/clipsruby/tmpltdef.c +584 -0
- data/ext/clipsruby/tmpltdef.h +155 -0
- data/ext/clipsruby/tmpltfun.c +2477 -0
- data/ext/clipsruby/tmpltfun.h +122 -0
- data/ext/clipsruby/tmpltlhs.c +379 -0
- data/ext/clipsruby/tmpltlhs.h +50 -0
- data/ext/clipsruby/tmpltpsr.c +819 -0
- data/ext/clipsruby/tmpltpsr.h +59 -0
- data/ext/clipsruby/tmpltrhs.c +595 -0
- data/ext/clipsruby/tmpltrhs.h +55 -0
- data/ext/clipsruby/tmpltutl.c +637 -0
- data/ext/clipsruby/tmpltutl.h +82 -0
- data/ext/clipsruby/userdata.c +156 -0
- data/ext/clipsruby/userdata.h +72 -0
- data/ext/clipsruby/userfunctions.c +70 -0
- data/ext/clipsruby/usrsetup.h +7 -0
- data/ext/clipsruby/utility.c +1594 -0
- data/ext/clipsruby/utility.h +250 -0
- data/ext/clipsruby/watch.c +865 -0
- data/ext/clipsruby/watch.h +124 -0
- data/lib/clipsruby.rb +1 -0
- metadata +388 -0
@@ -0,0 +1,737 @@
|
|
1
|
+
/*******************************************************/
|
2
|
+
/* "C" Language Integrated Production System */
|
3
|
+
/* */
|
4
|
+
/* CLIPS Version 6.40 10/01/16 */
|
5
|
+
/* */
|
6
|
+
/* */
|
7
|
+
/*******************************************************/
|
8
|
+
|
9
|
+
/*************************************************************/
|
10
|
+
/* Purpose: Generic Function Execution Routines */
|
11
|
+
/* */
|
12
|
+
/* Principal Programmer(s): */
|
13
|
+
/* Brian L. Dantes */
|
14
|
+
/* */
|
15
|
+
/* Contributing Programmer(s): */
|
16
|
+
/* */
|
17
|
+
/* Revision History: */
|
18
|
+
/* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
|
19
|
+
/* */
|
20
|
+
/* 6.24: Removed IMPERATIVE_METHODS compilation flag. */
|
21
|
+
/* */
|
22
|
+
/* 6.30: Changed garbage collection algorithm. */
|
23
|
+
/* */
|
24
|
+
/* Support for long long integers. */
|
25
|
+
/* */
|
26
|
+
/* Changed integer type/precision. */
|
27
|
+
/* */
|
28
|
+
/* Added const qualifiers to remove C++ */
|
29
|
+
/* deprecation warnings. */
|
30
|
+
/* */
|
31
|
+
/* 6.40: Added Env prefix to GetEvaluationError and */
|
32
|
+
/* SetEvaluationError functions. */
|
33
|
+
/* */
|
34
|
+
/* Pragma once and other inclusion changes. */
|
35
|
+
/* */
|
36
|
+
/* Added support for booleans with <stdbool.h>. */
|
37
|
+
/* */
|
38
|
+
/* Removed use of void pointers for specific */
|
39
|
+
/* data structures. */
|
40
|
+
/* */
|
41
|
+
/* UDF redesign. */
|
42
|
+
/* */
|
43
|
+
/* Added GCBlockStart and GCBlockEnd functions */
|
44
|
+
/* for garbage collection blocks. */
|
45
|
+
/* */
|
46
|
+
/*************************************************************/
|
47
|
+
|
48
|
+
/* =========================================
|
49
|
+
*****************************************
|
50
|
+
EXTERNAL DEFINITIONS
|
51
|
+
=========================================
|
52
|
+
***************************************** */
|
53
|
+
#include "setup.h"
|
54
|
+
|
55
|
+
#if DEFGENERIC_CONSTRUCT
|
56
|
+
|
57
|
+
#include <string.h>
|
58
|
+
|
59
|
+
#if OBJECT_SYSTEM
|
60
|
+
#include "classcom.h"
|
61
|
+
#include "classfun.h"
|
62
|
+
#include "insfun.h"
|
63
|
+
#endif
|
64
|
+
|
65
|
+
#include "argacces.h"
|
66
|
+
#include "constrct.h"
|
67
|
+
#include "envrnmnt.h"
|
68
|
+
#include "genrccom.h"
|
69
|
+
#include "prcdrfun.h"
|
70
|
+
#include "prccode.h"
|
71
|
+
#include "prntutil.h"
|
72
|
+
#include "proflfun.h"
|
73
|
+
#include "router.h"
|
74
|
+
#include "utility.h"
|
75
|
+
|
76
|
+
#include "genrcexe.h"
|
77
|
+
|
78
|
+
/* =========================================
|
79
|
+
*****************************************
|
80
|
+
CONSTANTS
|
81
|
+
=========================================
|
82
|
+
***************************************** */
|
83
|
+
|
84
|
+
#define BEGIN_TRACE ">>"
|
85
|
+
#define END_TRACE "<<"
|
86
|
+
|
87
|
+
/* =========================================
|
88
|
+
*****************************************
|
89
|
+
INTERNALLY VISIBLE FUNCTION HEADERS
|
90
|
+
=========================================
|
91
|
+
***************************************** */
|
92
|
+
|
93
|
+
static Defmethod *FindApplicableMethod(Environment *,Defgeneric *,Defmethod *);
|
94
|
+
|
95
|
+
#if DEBUGGING_FUNCTIONS
|
96
|
+
static void WatchGeneric(Environment *,const char *);
|
97
|
+
static void WatchMethod(Environment *,const char *);
|
98
|
+
#endif
|
99
|
+
|
100
|
+
#if OBJECT_SYSTEM
|
101
|
+
static Defclass *DetermineRestrictionClass(Environment *,UDFValue *);
|
102
|
+
#endif
|
103
|
+
|
104
|
+
/* =========================================
|
105
|
+
*****************************************
|
106
|
+
EXTERNALLY VISIBLE FUNCTIONS
|
107
|
+
=========================================
|
108
|
+
***************************************** */
|
109
|
+
|
110
|
+
/***********************************************************************************
|
111
|
+
NAME : GenericDispatch
|
112
|
+
DESCRIPTION : Executes the most specific applicable method
|
113
|
+
INPUTS : 1) The generic function
|
114
|
+
2) The method to start after in the search for an applicable
|
115
|
+
method (ignored if arg #3 is not NULL).
|
116
|
+
3) A specific method to call (NULL if want highest precedence
|
117
|
+
method to be called)
|
118
|
+
4) The generic function argument expressions
|
119
|
+
5) The caller's result value buffer
|
120
|
+
RETURNS : Nothing useful
|
121
|
+
SIDE EFFECTS : Any side-effects of evaluating the generic function arguments
|
122
|
+
Any side-effects of evaluating query functions on method parameter
|
123
|
+
restrictions when determining the core (see warning #1)
|
124
|
+
Any side-effects of actual execution of methods (see warning #2)
|
125
|
+
Caller's buffer set to the result of the generic function call
|
126
|
+
|
127
|
+
In case of errors, the result is false, otherwise it is the
|
128
|
+
result returned by the most specific method (which can choose
|
129
|
+
to ignore or return the values of more general methods)
|
130
|
+
NOTES : WARNING #1: Query functions on method parameter restrictions
|
131
|
+
should not have side-effects, for they might be evaluated even
|
132
|
+
for methods that aren't applicable to the generic function call.
|
133
|
+
WARNING #2: Side-effects of method execution should not always rely
|
134
|
+
on only being executed once per generic function call. Every
|
135
|
+
time a method calls (shadow-call) the same next-most-specific
|
136
|
+
method is executed. Thus, it is possible for a method to be
|
137
|
+
executed multiple times per generic function call.
|
138
|
+
***********************************************************************************/
|
139
|
+
void GenericDispatch(
|
140
|
+
Environment *theEnv,
|
141
|
+
Defgeneric *gfunc,
|
142
|
+
Defmethod *prevmeth,
|
143
|
+
Defmethod *meth,
|
144
|
+
Expression *params,
|
145
|
+
UDFValue *returnValue)
|
146
|
+
{
|
147
|
+
Defgeneric *previousGeneric;
|
148
|
+
Defmethod *previousMethod;
|
149
|
+
bool oldce;
|
150
|
+
#if PROFILING_FUNCTIONS
|
151
|
+
struct profileFrameInfo profileFrame;
|
152
|
+
#endif
|
153
|
+
GCBlock gcb;
|
154
|
+
|
155
|
+
returnValue->value = FalseSymbol(theEnv);
|
156
|
+
EvaluationData(theEnv)->EvaluationError = false;
|
157
|
+
if (EvaluationData(theEnv)->HaltExecution)
|
158
|
+
return;
|
159
|
+
|
160
|
+
GCBlockStart(theEnv,&gcb);
|
161
|
+
|
162
|
+
oldce = ExecutingConstruct(theEnv);
|
163
|
+
SetExecutingConstruct(theEnv,true);
|
164
|
+
previousGeneric = DefgenericData(theEnv)->CurrentGeneric;
|
165
|
+
previousMethod = DefgenericData(theEnv)->CurrentMethod;
|
166
|
+
DefgenericData(theEnv)->CurrentGeneric = gfunc;
|
167
|
+
EvaluationData(theEnv)->CurrentEvaluationDepth++;
|
168
|
+
gfunc->busy++;
|
169
|
+
PushProcParameters(theEnv,params,CountArguments(params),
|
170
|
+
DefgenericName(gfunc),
|
171
|
+
"generic function",UnboundMethodErr);
|
172
|
+
if (EvaluationData(theEnv)->EvaluationError)
|
173
|
+
{
|
174
|
+
gfunc->busy--;
|
175
|
+
DefgenericData(theEnv)->CurrentGeneric = previousGeneric;
|
176
|
+
DefgenericData(theEnv)->CurrentMethod = previousMethod;
|
177
|
+
EvaluationData(theEnv)->CurrentEvaluationDepth--;
|
178
|
+
|
179
|
+
GCBlockEndUDF(theEnv,&gcb,returnValue);
|
180
|
+
CallPeriodicTasks(theEnv);
|
181
|
+
|
182
|
+
SetExecutingConstruct(theEnv,oldce);
|
183
|
+
return;
|
184
|
+
}
|
185
|
+
if (meth != NULL)
|
186
|
+
{
|
187
|
+
if (IsMethodApplicable(theEnv,meth))
|
188
|
+
{
|
189
|
+
meth->busy++;
|
190
|
+
DefgenericData(theEnv)->CurrentMethod = meth;
|
191
|
+
}
|
192
|
+
else
|
193
|
+
{
|
194
|
+
PrintErrorID(theEnv,"GENRCEXE",4,false);
|
195
|
+
SetEvaluationError(theEnv,true);
|
196
|
+
DefgenericData(theEnv)->CurrentMethod = NULL;
|
197
|
+
WriteString(theEnv,STDERR,"Generic function '");
|
198
|
+
WriteString(theEnv,STDERR,DefgenericName(gfunc));
|
199
|
+
WriteString(theEnv,STDERR,"' method #");
|
200
|
+
PrintUnsignedInteger(theEnv,STDERR,meth->index);
|
201
|
+
WriteString(theEnv,STDERR," is not applicable to the given arguments.\n");
|
202
|
+
}
|
203
|
+
}
|
204
|
+
else
|
205
|
+
DefgenericData(theEnv)->CurrentMethod = FindApplicableMethod(theEnv,gfunc,prevmeth);
|
206
|
+
if (DefgenericData(theEnv)->CurrentMethod != NULL)
|
207
|
+
{
|
208
|
+
#if DEBUGGING_FUNCTIONS
|
209
|
+
if (DefgenericData(theEnv)->CurrentGeneric->trace)
|
210
|
+
WatchGeneric(theEnv,BEGIN_TRACE);
|
211
|
+
if (DefgenericData(theEnv)->CurrentMethod->trace)
|
212
|
+
WatchMethod(theEnv,BEGIN_TRACE);
|
213
|
+
#endif
|
214
|
+
if (DefgenericData(theEnv)->CurrentMethod->system)
|
215
|
+
{
|
216
|
+
Expression fcall;
|
217
|
+
|
218
|
+
fcall.type = FCALL;
|
219
|
+
fcall.value = DefgenericData(theEnv)->CurrentMethod->actions->value;
|
220
|
+
fcall.nextArg = NULL;
|
221
|
+
fcall.argList = GetProcParamExpressions(theEnv);
|
222
|
+
EvaluateExpression(theEnv,&fcall,returnValue);
|
223
|
+
}
|
224
|
+
else
|
225
|
+
{
|
226
|
+
#if PROFILING_FUNCTIONS
|
227
|
+
StartProfile(theEnv,&profileFrame,
|
228
|
+
&DefgenericData(theEnv)->CurrentMethod->header.usrData,
|
229
|
+
ProfileFunctionData(theEnv)->ProfileConstructs);
|
230
|
+
#endif
|
231
|
+
|
232
|
+
EvaluateProcActions(theEnv,DefgenericData(theEnv)->CurrentGeneric->header.whichModule->theModule,
|
233
|
+
DefgenericData(theEnv)->CurrentMethod->actions,DefgenericData(theEnv)->CurrentMethod->localVarCount,
|
234
|
+
returnValue,UnboundMethodErr);
|
235
|
+
|
236
|
+
#if PROFILING_FUNCTIONS
|
237
|
+
EndProfile(theEnv,&profileFrame);
|
238
|
+
#endif
|
239
|
+
}
|
240
|
+
DefgenericData(theEnv)->CurrentMethod->busy--;
|
241
|
+
#if DEBUGGING_FUNCTIONS
|
242
|
+
if (DefgenericData(theEnv)->CurrentMethod->trace)
|
243
|
+
WatchMethod(theEnv,END_TRACE);
|
244
|
+
if (DefgenericData(theEnv)->CurrentGeneric->trace)
|
245
|
+
WatchGeneric(theEnv,END_TRACE);
|
246
|
+
#endif
|
247
|
+
}
|
248
|
+
else if (! EvaluationData(theEnv)->EvaluationError)
|
249
|
+
{
|
250
|
+
PrintErrorID(theEnv,"GENRCEXE",1,false);
|
251
|
+
WriteString(theEnv,STDERR,"No applicable methods for '");
|
252
|
+
WriteString(theEnv,STDERR,DefgenericName(gfunc));
|
253
|
+
WriteString(theEnv,STDERR,"'.\n");
|
254
|
+
SetEvaluationError(theEnv,true);
|
255
|
+
}
|
256
|
+
gfunc->busy--;
|
257
|
+
ProcedureFunctionData(theEnv)->ReturnFlag = false;
|
258
|
+
PopProcParameters(theEnv);
|
259
|
+
DefgenericData(theEnv)->CurrentGeneric = previousGeneric;
|
260
|
+
DefgenericData(theEnv)->CurrentMethod = previousMethod;
|
261
|
+
EvaluationData(theEnv)->CurrentEvaluationDepth--;
|
262
|
+
|
263
|
+
GCBlockEndUDF(theEnv,&gcb,returnValue);
|
264
|
+
CallPeriodicTasks(theEnv);
|
265
|
+
|
266
|
+
SetExecutingConstruct(theEnv,oldce);
|
267
|
+
}
|
268
|
+
|
269
|
+
/*******************************************************
|
270
|
+
NAME : UnboundMethodErr
|
271
|
+
DESCRIPTION : Print out a synopis of the currently
|
272
|
+
executing method for unbound variable
|
273
|
+
errors
|
274
|
+
INPUTS : None
|
275
|
+
RETURNS : Nothing useful
|
276
|
+
SIDE EFFECTS : Error synopsis printed to STDERR
|
277
|
+
NOTES : None
|
278
|
+
*******************************************************/
|
279
|
+
void UnboundMethodErr(
|
280
|
+
Environment *theEnv,
|
281
|
+
const char *logName)
|
282
|
+
{
|
283
|
+
WriteString(theEnv,logName,"generic function '");
|
284
|
+
WriteString(theEnv,logName,DefgenericName(DefgenericData(theEnv)->CurrentGeneric));
|
285
|
+
WriteString(theEnv,logName,"' method #");
|
286
|
+
PrintUnsignedInteger(theEnv,logName,DefgenericData(theEnv)->CurrentMethod->index);
|
287
|
+
WriteString(theEnv,logName,".\n");
|
288
|
+
}
|
289
|
+
|
290
|
+
/***********************************************************************
|
291
|
+
NAME : IsMethodApplicable
|
292
|
+
DESCRIPTION : Tests to see if a method satsifies the arguments of a
|
293
|
+
generic function
|
294
|
+
A method is applicable if all its restrictions are
|
295
|
+
satisfied by the corresponding arguments
|
296
|
+
INPUTS : The method address
|
297
|
+
RETURNS : True if method is applicable, false otherwise
|
298
|
+
SIDE EFFECTS : Any query functions are evaluated
|
299
|
+
NOTES : Uses globals ProcParamArraySize and ProcParamArray
|
300
|
+
***********************************************************************/
|
301
|
+
bool IsMethodApplicable(
|
302
|
+
Environment *theEnv,
|
303
|
+
Defmethod *meth)
|
304
|
+
{
|
305
|
+
UDFValue temp;
|
306
|
+
unsigned int i,j,k;
|
307
|
+
RESTRICTION *rp;
|
308
|
+
#if OBJECT_SYSTEM
|
309
|
+
Defclass *type;
|
310
|
+
#else
|
311
|
+
int type;
|
312
|
+
#endif
|
313
|
+
|
314
|
+
if (((ProceduralPrimitiveData(theEnv)->ProcParamArraySize < meth->minRestrictions) && (meth->minRestrictions != RESTRICTIONS_UNBOUNDED)) ||
|
315
|
+
((ProceduralPrimitiveData(theEnv)->ProcParamArraySize > meth->minRestrictions) && (meth->maxRestrictions != RESTRICTIONS_UNBOUNDED))) // TBD minRestrictions || maxRestrictions
|
316
|
+
return false;
|
317
|
+
for (i = 0 , k = 0 ; i < ProceduralPrimitiveData(theEnv)->ProcParamArraySize ; i++)
|
318
|
+
{
|
319
|
+
rp = &meth->restrictions[k];
|
320
|
+
if (rp->tcnt != 0)
|
321
|
+
{
|
322
|
+
#if OBJECT_SYSTEM
|
323
|
+
type = DetermineRestrictionClass(theEnv,&ProceduralPrimitiveData(theEnv)->ProcParamArray[i]);
|
324
|
+
if (type == NULL)
|
325
|
+
return false;
|
326
|
+
for (j = 0 ; j < rp->tcnt ; j++)
|
327
|
+
{
|
328
|
+
if (type == rp->types[j])
|
329
|
+
break;
|
330
|
+
if (HasSuperclass(type,(Defclass *) rp->types[j]))
|
331
|
+
break;
|
332
|
+
if (rp->types[j] == (void *) DefclassData(theEnv)->PrimitiveClassMap[INSTANCE_ADDRESS_TYPE])
|
333
|
+
{
|
334
|
+
if (ProceduralPrimitiveData(theEnv)->ProcParamArray[i].header->type == INSTANCE_ADDRESS_TYPE)
|
335
|
+
break;
|
336
|
+
}
|
337
|
+
else if (rp->types[j] == (void *) DefclassData(theEnv)->PrimitiveClassMap[INSTANCE_NAME_TYPE])
|
338
|
+
{
|
339
|
+
if (ProceduralPrimitiveData(theEnv)->ProcParamArray[i].header->type == INSTANCE_NAME_TYPE)
|
340
|
+
break;
|
341
|
+
}
|
342
|
+
else if (rp->types[j] ==
|
343
|
+
DefclassData(theEnv)->PrimitiveClassMap[INSTANCE_NAME_TYPE]->directSuperclasses.classArray[0])
|
344
|
+
{
|
345
|
+
if ((ProceduralPrimitiveData(theEnv)->ProcParamArray[i].header->type == INSTANCE_NAME_TYPE) ||
|
346
|
+
(ProceduralPrimitiveData(theEnv)->ProcParamArray[i].header->type == INSTANCE_ADDRESS_TYPE))
|
347
|
+
break;
|
348
|
+
}
|
349
|
+
}
|
350
|
+
#else
|
351
|
+
type = ProceduralPrimitiveData(theEnv)->ProcParamArray[i].header->type;
|
352
|
+
for (j = 0 ; j < rp->tcnt ; j++)
|
353
|
+
{
|
354
|
+
if (type == ((CLIPSInteger *) (rp->types[j]))->contents)
|
355
|
+
break;
|
356
|
+
if (SubsumeType(type,((CLIPSInteger *) (rp->types[j]))->contents))
|
357
|
+
break;
|
358
|
+
}
|
359
|
+
#endif
|
360
|
+
if (j == rp->tcnt)
|
361
|
+
return false;
|
362
|
+
}
|
363
|
+
if (rp->query != NULL)
|
364
|
+
{
|
365
|
+
DefgenericData(theEnv)->GenericCurrentArgument = &ProceduralPrimitiveData(theEnv)->ProcParamArray[i];
|
366
|
+
EvaluateExpression(theEnv,rp->query,&temp);
|
367
|
+
if (temp.value == FalseSymbol(theEnv))
|
368
|
+
return false;
|
369
|
+
}
|
370
|
+
if ((k + 1) != meth->restrictionCount)
|
371
|
+
k++;
|
372
|
+
}
|
373
|
+
return true;
|
374
|
+
}
|
375
|
+
|
376
|
+
/***************************************************
|
377
|
+
NAME : NextMethodP
|
378
|
+
DESCRIPTION : Determines if a shadowed generic
|
379
|
+
function method is available for
|
380
|
+
execution
|
381
|
+
INPUTS : None
|
382
|
+
RETURNS : True if there is a method available,
|
383
|
+
false otherwise
|
384
|
+
SIDE EFFECTS : None
|
385
|
+
NOTES : H/L Syntax: (next-methodp)
|
386
|
+
***************************************************/
|
387
|
+
bool NextMethodP(
|
388
|
+
Environment *theEnv)
|
389
|
+
{
|
390
|
+
Defmethod *meth;
|
391
|
+
|
392
|
+
if (DefgenericData(theEnv)->CurrentMethod == NULL)
|
393
|
+
{ return false; }
|
394
|
+
|
395
|
+
meth = FindApplicableMethod(theEnv,DefgenericData(theEnv)->CurrentGeneric,DefgenericData(theEnv)->CurrentMethod);
|
396
|
+
if (meth != NULL)
|
397
|
+
{
|
398
|
+
meth->busy--;
|
399
|
+
return true;
|
400
|
+
}
|
401
|
+
else
|
402
|
+
{ return false; }
|
403
|
+
}
|
404
|
+
|
405
|
+
void NextMethodPCommand(
|
406
|
+
Environment *theEnv,
|
407
|
+
UDFContext *context,
|
408
|
+
UDFValue *returnValue)
|
409
|
+
{
|
410
|
+
returnValue->lexemeValue = CreateBoolean(theEnv,NextMethodP(theEnv));
|
411
|
+
}
|
412
|
+
|
413
|
+
/****************************************************
|
414
|
+
NAME : CallNextMethod
|
415
|
+
DESCRIPTION : Executes the next available method
|
416
|
+
in the core for a generic function
|
417
|
+
INPUTS : Caller's buffer for the result
|
418
|
+
RETURNS : Nothing useful
|
419
|
+
SIDE EFFECTS : Side effects of execution of shadow
|
420
|
+
EvaluationError set if no method
|
421
|
+
is available to execute.
|
422
|
+
NOTES : H/L Syntax: (call-next-method)
|
423
|
+
****************************************************/
|
424
|
+
void CallNextMethod(
|
425
|
+
Environment *theEnv,
|
426
|
+
UDFContext *context,
|
427
|
+
UDFValue *returnValue)
|
428
|
+
{
|
429
|
+
Defmethod *oldMethod;
|
430
|
+
#if PROFILING_FUNCTIONS
|
431
|
+
struct profileFrameInfo profileFrame;
|
432
|
+
#endif
|
433
|
+
|
434
|
+
returnValue->lexemeValue = FalseSymbol(theEnv);
|
435
|
+
|
436
|
+
if (EvaluationData(theEnv)->HaltExecution)
|
437
|
+
return;
|
438
|
+
oldMethod = DefgenericData(theEnv)->CurrentMethod;
|
439
|
+
if (DefgenericData(theEnv)->CurrentMethod != NULL)
|
440
|
+
DefgenericData(theEnv)->CurrentMethod = FindApplicableMethod(theEnv,DefgenericData(theEnv)->CurrentGeneric,DefgenericData(theEnv)->CurrentMethod);
|
441
|
+
if (DefgenericData(theEnv)->CurrentMethod == NULL)
|
442
|
+
{
|
443
|
+
DefgenericData(theEnv)->CurrentMethod = oldMethod;
|
444
|
+
PrintErrorID(theEnv,"GENRCEXE",2,false);
|
445
|
+
WriteString(theEnv,STDERR,"Shadowed methods not applicable in current context.\n");
|
446
|
+
SetEvaluationError(theEnv,true);
|
447
|
+
return;
|
448
|
+
}
|
449
|
+
|
450
|
+
#if DEBUGGING_FUNCTIONS
|
451
|
+
if (DefgenericData(theEnv)->CurrentMethod->trace)
|
452
|
+
WatchMethod(theEnv,BEGIN_TRACE);
|
453
|
+
#endif
|
454
|
+
if (DefgenericData(theEnv)->CurrentMethod->system)
|
455
|
+
{
|
456
|
+
Expression fcall;
|
457
|
+
|
458
|
+
fcall.type = FCALL;
|
459
|
+
fcall.value = DefgenericData(theEnv)->CurrentMethod->actions->value;
|
460
|
+
fcall.nextArg = NULL;
|
461
|
+
fcall.argList = GetProcParamExpressions(theEnv);
|
462
|
+
EvaluateExpression(theEnv,&fcall,returnValue);
|
463
|
+
}
|
464
|
+
else
|
465
|
+
{
|
466
|
+
#if PROFILING_FUNCTIONS
|
467
|
+
StartProfile(theEnv,&profileFrame,
|
468
|
+
&DefgenericData(theEnv)->CurrentGeneric->header.usrData,
|
469
|
+
ProfileFunctionData(theEnv)->ProfileConstructs);
|
470
|
+
#endif
|
471
|
+
|
472
|
+
EvaluateProcActions(theEnv,DefgenericData(theEnv)->CurrentGeneric->header.whichModule->theModule,
|
473
|
+
DefgenericData(theEnv)->CurrentMethod->actions,DefgenericData(theEnv)->CurrentMethod->localVarCount,
|
474
|
+
returnValue,UnboundMethodErr);
|
475
|
+
|
476
|
+
#if PROFILING_FUNCTIONS
|
477
|
+
EndProfile(theEnv,&profileFrame);
|
478
|
+
#endif
|
479
|
+
}
|
480
|
+
|
481
|
+
DefgenericData(theEnv)->CurrentMethod->busy--;
|
482
|
+
#if DEBUGGING_FUNCTIONS
|
483
|
+
if (DefgenericData(theEnv)->CurrentMethod->trace)
|
484
|
+
WatchMethod(theEnv,END_TRACE);
|
485
|
+
#endif
|
486
|
+
DefgenericData(theEnv)->CurrentMethod = oldMethod;
|
487
|
+
ProcedureFunctionData(theEnv)->ReturnFlag = false;
|
488
|
+
}
|
489
|
+
|
490
|
+
/**************************************************************************
|
491
|
+
NAME : CallSpecificMethod
|
492
|
+
DESCRIPTION : Allows a specific method to be called without regards to
|
493
|
+
higher precedence methods which might also be applicable
|
494
|
+
However, shadowed methods can still be called.
|
495
|
+
INPUTS : A data object buffer to hold the method evaluation result
|
496
|
+
RETURNS : Nothing useful
|
497
|
+
SIDE EFFECTS : Side-effects of method applicability tests and the
|
498
|
+
evaluation of methods
|
499
|
+
NOTES : H/L Syntax: (call-specific-method
|
500
|
+
<generic-function> <method-index> <args>)
|
501
|
+
**************************************************************************/
|
502
|
+
void CallSpecificMethod(
|
503
|
+
Environment *theEnv,
|
504
|
+
UDFContext *context,
|
505
|
+
UDFValue *returnValue)
|
506
|
+
{
|
507
|
+
UDFValue theArg;
|
508
|
+
Defgeneric *gfunc;
|
509
|
+
int mi;
|
510
|
+
|
511
|
+
returnValue->lexemeValue = FalseSymbol(theEnv);
|
512
|
+
|
513
|
+
if (! UDFFirstArgument(context,SYMBOL_BIT,&theArg)) return;
|
514
|
+
|
515
|
+
gfunc = CheckGenericExists(theEnv,"call-specific-method",theArg.lexemeValue->contents);
|
516
|
+
if (gfunc == NULL) return;
|
517
|
+
|
518
|
+
if (! UDFNextArgument(context,INTEGER_BIT,&theArg)) return;
|
519
|
+
|
520
|
+
mi = CheckMethodExists(theEnv,"call-specific-method",gfunc,(unsigned short) theArg.integerValue->contents);
|
521
|
+
if (mi == METHOD_NOT_FOUND)
|
522
|
+
return;
|
523
|
+
gfunc->methods[mi].busy++;
|
524
|
+
GenericDispatch(theEnv,gfunc,NULL,&gfunc->methods[mi],
|
525
|
+
GetFirstArgument()->nextArg->nextArg,returnValue);
|
526
|
+
gfunc->methods[mi].busy--;
|
527
|
+
}
|
528
|
+
|
529
|
+
/***********************************************************************
|
530
|
+
NAME : OverrideNextMethod
|
531
|
+
DESCRIPTION : Changes the arguments to shadowed methods, thus the set
|
532
|
+
of applicable methods to this call may change
|
533
|
+
INPUTS : A buffer to hold the result of the call
|
534
|
+
RETURNS : Nothing useful
|
535
|
+
SIDE EFFECTS : Any of evaluating method restrictions and bodies
|
536
|
+
NOTES : H/L Syntax: (override-next-method <args>)
|
537
|
+
***********************************************************************/
|
538
|
+
void OverrideNextMethod(
|
539
|
+
Environment *theEnv,
|
540
|
+
UDFContext *context,
|
541
|
+
UDFValue *returnValue)
|
542
|
+
{
|
543
|
+
returnValue->lexemeValue = FalseSymbol(theEnv);
|
544
|
+
if (EvaluationData(theEnv)->HaltExecution)
|
545
|
+
return;
|
546
|
+
if (DefgenericData(theEnv)->CurrentMethod == NULL)
|
547
|
+
{
|
548
|
+
PrintErrorID(theEnv,"GENRCEXE",2,false);
|
549
|
+
WriteString(theEnv,STDERR,"Shadowed methods not applicable in current context.\n");
|
550
|
+
SetEvaluationError(theEnv,true);
|
551
|
+
return;
|
552
|
+
}
|
553
|
+
GenericDispatch(theEnv,DefgenericData(theEnv)->CurrentGeneric,DefgenericData(theEnv)->CurrentMethod,NULL,
|
554
|
+
GetFirstArgument(),returnValue);
|
555
|
+
}
|
556
|
+
|
557
|
+
/***********************************************************
|
558
|
+
NAME : GetGenericCurrentArgument
|
559
|
+
DESCRIPTION : Returns the value of the generic function
|
560
|
+
argument being tested in the method
|
561
|
+
applicability determination process
|
562
|
+
INPUTS : A data-object buffer
|
563
|
+
RETURNS : Nothing useful
|
564
|
+
SIDE EFFECTS : Data-object set
|
565
|
+
NOTES : Useful for queries in wildcard restrictions
|
566
|
+
***********************************************************/
|
567
|
+
void GetGenericCurrentArgument(
|
568
|
+
Environment *theEnv,
|
569
|
+
UDFContext *context,
|
570
|
+
UDFValue *returnValue)
|
571
|
+
{
|
572
|
+
returnValue->value = DefgenericData(theEnv)->GenericCurrentArgument->value;
|
573
|
+
returnValue->begin = DefgenericData(theEnv)->GenericCurrentArgument->begin;
|
574
|
+
returnValue->range = DefgenericData(theEnv)->GenericCurrentArgument->range;
|
575
|
+
}
|
576
|
+
|
577
|
+
/* =========================================
|
578
|
+
*****************************************
|
579
|
+
INTERNALLY VISIBLE FUNCTIONS
|
580
|
+
=========================================
|
581
|
+
***************************************** */
|
582
|
+
|
583
|
+
/************************************************************
|
584
|
+
NAME : FindApplicableMethod
|
585
|
+
DESCRIPTION : Finds the first/next applicable
|
586
|
+
method for a generic function call
|
587
|
+
INPUTS : 1) The generic function pointer
|
588
|
+
2) The address of the current method
|
589
|
+
(NULL to find the first)
|
590
|
+
RETURNS : The address of the first/next
|
591
|
+
applicable method (NULL on errors)
|
592
|
+
SIDE EFFECTS : Any from evaluating query restrictions
|
593
|
+
Methoid busy count incremented if applicable
|
594
|
+
NOTES : None
|
595
|
+
************************************************************/
|
596
|
+
static Defmethod *FindApplicableMethod(
|
597
|
+
Environment *theEnv,
|
598
|
+
Defgeneric *gfunc,
|
599
|
+
Defmethod *meth)
|
600
|
+
{
|
601
|
+
if (meth != NULL)
|
602
|
+
meth++;
|
603
|
+
else
|
604
|
+
meth = gfunc->methods;
|
605
|
+
for ( ; meth < &gfunc->methods[gfunc->mcnt] ; meth++)
|
606
|
+
{
|
607
|
+
meth->busy++;
|
608
|
+
if (IsMethodApplicable(theEnv,meth))
|
609
|
+
return(meth);
|
610
|
+
meth->busy--;
|
611
|
+
}
|
612
|
+
return NULL;
|
613
|
+
}
|
614
|
+
|
615
|
+
#if DEBUGGING_FUNCTIONS
|
616
|
+
|
617
|
+
/**********************************************************************
|
618
|
+
NAME : WatchGeneric
|
619
|
+
DESCRIPTION : Prints out a trace of the beginning or end
|
620
|
+
of the execution of a generic function
|
621
|
+
INPUTS : A string to indicate beginning or end of execution
|
622
|
+
RETURNS : Nothing useful
|
623
|
+
SIDE EFFECTS : None
|
624
|
+
NOTES : Uses the globals CurrentGeneric, ProcParamArraySize and
|
625
|
+
ProcParamArray for other trace info
|
626
|
+
**********************************************************************/
|
627
|
+
static void WatchGeneric(
|
628
|
+
Environment *theEnv,
|
629
|
+
const char *tstring)
|
630
|
+
{
|
631
|
+
if (ConstructData(theEnv)->ClearReadyInProgress ||
|
632
|
+
ConstructData(theEnv)->ClearInProgress)
|
633
|
+
{ return; }
|
634
|
+
|
635
|
+
WriteString(theEnv,STDOUT,"GNC ");
|
636
|
+
WriteString(theEnv,STDOUT,tstring);
|
637
|
+
WriteString(theEnv,STDOUT," ");
|
638
|
+
if (DefgenericData(theEnv)->CurrentGeneric->header.whichModule->theModule != GetCurrentModule(theEnv))
|
639
|
+
{
|
640
|
+
WriteString(theEnv,STDOUT,DefgenericModule(DefgenericData(theEnv)->CurrentGeneric));
|
641
|
+
WriteString(theEnv,STDOUT,"::");
|
642
|
+
}
|
643
|
+
WriteString(theEnv,STDOUT,DefgenericData(theEnv)->CurrentGeneric->header.name->contents);
|
644
|
+
WriteString(theEnv,STDOUT," ");
|
645
|
+
WriteString(theEnv,STDOUT," ED:");
|
646
|
+
WriteInteger(theEnv,STDOUT,EvaluationData(theEnv)->CurrentEvaluationDepth);
|
647
|
+
PrintProcParamArray(theEnv,STDOUT);
|
648
|
+
}
|
649
|
+
|
650
|
+
/**********************************************************************
|
651
|
+
NAME : WatchMethod
|
652
|
+
DESCRIPTION : Prints out a trace of the beginning or end
|
653
|
+
of the execution of a generic function
|
654
|
+
method
|
655
|
+
INPUTS : A string to indicate beginning or end of execution
|
656
|
+
RETURNS : Nothing useful
|
657
|
+
SIDE EFFECTS : None
|
658
|
+
NOTES : Uses the globals CurrentGeneric, CurrentMethod,
|
659
|
+
ProcParamArraySize and ProcParamArray for
|
660
|
+
other trace info
|
661
|
+
**********************************************************************/
|
662
|
+
static void WatchMethod(
|
663
|
+
Environment *theEnv,
|
664
|
+
const char *tstring)
|
665
|
+
{
|
666
|
+
if (ConstructData(theEnv)->ClearReadyInProgress ||
|
667
|
+
ConstructData(theEnv)->ClearInProgress)
|
668
|
+
{ return; }
|
669
|
+
|
670
|
+
WriteString(theEnv,STDOUT,"MTH ");
|
671
|
+
WriteString(theEnv,STDOUT,tstring);
|
672
|
+
WriteString(theEnv,STDOUT," ");
|
673
|
+
if (DefgenericData(theEnv)->CurrentGeneric->header.whichModule->theModule != GetCurrentModule(theEnv))
|
674
|
+
{
|
675
|
+
WriteString(theEnv,STDOUT,DefgenericModule(DefgenericData(theEnv)->CurrentGeneric));
|
676
|
+
WriteString(theEnv,STDOUT,"::");
|
677
|
+
}
|
678
|
+
WriteString(theEnv,STDOUT,DefgenericData(theEnv)->CurrentGeneric->header.name->contents);
|
679
|
+
WriteString(theEnv,STDOUT,":#");
|
680
|
+
if (DefgenericData(theEnv)->CurrentMethod->system)
|
681
|
+
WriteString(theEnv,STDOUT,"SYS");
|
682
|
+
PrintUnsignedInteger(theEnv,STDOUT,DefgenericData(theEnv)->CurrentMethod->index);
|
683
|
+
WriteString(theEnv,STDOUT," ");
|
684
|
+
WriteString(theEnv,STDOUT," ED:");
|
685
|
+
WriteInteger(theEnv,STDOUT,EvaluationData(theEnv)->CurrentEvaluationDepth);
|
686
|
+
PrintProcParamArray(theEnv,STDOUT);
|
687
|
+
}
|
688
|
+
|
689
|
+
#endif
|
690
|
+
|
691
|
+
#if OBJECT_SYSTEM
|
692
|
+
|
693
|
+
/***************************************************
|
694
|
+
NAME : DetermineRestrictionClass
|
695
|
+
DESCRIPTION : Finds the class of an argument in
|
696
|
+
the ProcParamArray
|
697
|
+
INPUTS : The argument data object
|
698
|
+
RETURNS : The class address, NULL if error
|
699
|
+
SIDE EFFECTS : EvaluationError set on errors
|
700
|
+
NOTES : None
|
701
|
+
***************************************************/
|
702
|
+
static Defclass *DetermineRestrictionClass(
|
703
|
+
Environment *theEnv,
|
704
|
+
UDFValue *dobj)
|
705
|
+
{
|
706
|
+
Instance *ins;
|
707
|
+
Defclass *cls;
|
708
|
+
|
709
|
+
if (dobj->header->type == INSTANCE_NAME_TYPE)
|
710
|
+
{
|
711
|
+
ins = FindInstanceBySymbol(theEnv,dobj->lexemeValue);
|
712
|
+
cls = (ins != NULL) ? ins->cls : NULL;
|
713
|
+
}
|
714
|
+
else if (dobj->header->type == INSTANCE_ADDRESS_TYPE)
|
715
|
+
{
|
716
|
+
ins = dobj->instanceValue;
|
717
|
+
cls = (ins->garbage == 0) ? ins->cls : NULL;
|
718
|
+
}
|
719
|
+
else
|
720
|
+
return(DefclassData(theEnv)->PrimitiveClassMap[dobj->header->type]);
|
721
|
+
if (cls == NULL)
|
722
|
+
{
|
723
|
+
SetEvaluationError(theEnv,true);
|
724
|
+
PrintErrorID(theEnv,"GENRCEXE",3,false);
|
725
|
+
WriteString(theEnv,STDERR,"Unable to determine class of ");
|
726
|
+
WriteUDFValue(theEnv,STDERR,dobj);
|
727
|
+
WriteString(theEnv,STDERR," in generic function '");
|
728
|
+
WriteString(theEnv,STDERR,DefgenericName(DefgenericData(theEnv)->CurrentGeneric));
|
729
|
+
WriteString(theEnv,STDERR,"'.\n");
|
730
|
+
}
|
731
|
+
return(cls);
|
732
|
+
}
|
733
|
+
|
734
|
+
#endif
|
735
|
+
|
736
|
+
#endif
|
737
|
+
|