ByteCodeCompiler.st
changeset 15 992c3d87edbf
parent 13 30e69e21d1d1
child 19 84a1ddf215a5
equal deleted inserted replaced
14:f08ffd9958a5 15:992c3d87edbf
    24 ByteCodeCompiler comment:'
    24 ByteCodeCompiler comment:'
    25 
    25 
    26 COPYRIGHT (c) 1989 by Claus Gittinger
    26 COPYRIGHT (c) 1989 by Claus Gittinger
    27              All Rights Reserved
    27              All Rights Reserved
    28 
    28 
    29 $Header: /cvs/stx/stx/libcomp/ByteCodeCompiler.st,v 1.8 1994-01-16 03:51:28 claus Exp $
    29 $Header: /cvs/stx/stx/libcomp/ByteCodeCompiler.st,v 1.9 1994-02-25 12:50:45 claus Exp $
    30 '!
    30 '!
    31 
    31 
    32 !ByteCodeCompiler class methodsFor:'documentation'!
    32 !ByteCodeCompiler class methodsFor:'documentation'!
    33 
    33 
    34 documentation
    34 documentation
   126      will go into the classes method-table, otherwise the method is simply
   126      will go into the classes method-table, otherwise the method is simply
   127      returned (for anonymous methods).
   127      returned (for anonymous methods).
   128      If skipIsSame is true, and the source is the same as an existing
   128      If skipIsSame is true, and the source is the same as an existing
   129      methods source, this is a noop (for fast fileIn)."
   129      methods source, this is a noop (for fast fileIn)."
   130 
   130 
   131     |compiler newMethod tree lits machineCode 
   131     |compiler newMethod tree lits symbolicCodeArray oldMethod|
   132      symbolicCodeArray sharedCode sharedCodeSymbol oldMethod|
       
   133 
   132 
   134     aString isNil ifTrue:[^ nil].
   133     aString isNil ifTrue:[^ nil].
   135 
   134 
   136     "create a compiler, let it parse and create the parsetree"
   135     "create a compiler, let it parse and create the parsetree"
   137 
   136 
   189         ].
   188         ].
   190         Transcript showCr:'relocation error - must be simplified'.
   189         Transcript showCr:'relocation error - must be simplified'.
   191         ^ #Error
   190         ^ #Error
   192     ].
   191     ].
   193 
   192 
   194     (OperatingSystem getSystemType = 'hpux') ifFalse:[
       
   195         "check for primitive code"
       
   196         compiler primitiveNumber notNil ifTrue:[
       
   197             machineCode := compiler checkForPrimitiveCode:compiler primitiveNumber.
       
   198             machineCode isNil ifTrue:[
       
   199                 Transcript showCr:'primitive ', compiler primitiveNumber printString , ' is not supported'.
       
   200                 ^ #Error
       
   201             ]
       
   202         ].
       
   203 
       
   204         machineCode isNil ifTrue:[
       
   205             "check for shared-code (only trivial methods)"
       
   206 
       
   207             sharedCodeSymbol := compiler checkForSharedCode:symbolicCodeArray.
       
   208             sharedCodeSymbol notNil ifTrue:[
       
   209                 sharedCode := self sharedCodeFunctionFor:sharedCodeSymbol
       
   210             ].
       
   211             "try to make it machine code"
       
   212 
       
   213             machineCode := compiler checkForMachineCode:symbolicCodeArray
       
   214         ].
       
   215     ].
       
   216 
       
   217     "finally create the new method-object"
   193     "finally create the new method-object"
   218 
   194 
   219     newMethod := Method new.
   195     newMethod := Method new.
   220     lits := compiler literalArray.
   196     lits := compiler literalArray.
   221     lits notNil ifTrue:[
   197     lits notNil ifTrue:[
   222         "literals MUST be an array - not just any Collection"
   198         "literals MUST be an array - not just any Collection"
   223         lits := Array withAll:lits.
   199         lits := Array withAll:lits.
   224         newMethod literals:lits
   200         newMethod literals:lits
   225     ].
   201     ].
   226     newMethod byteCode:(compiler code).
   202     newMethod byteCode:(compiler code).
   227     sharedCode notNil ifTrue:[
       
   228         newMethod code:sharedCode
       
   229     ] ifFalse:[
       
   230         machineCode notNil ifTrue:[
       
   231             newMethod code:machineCode.
       
   232             newMethod dynamic:true
       
   233         ]
       
   234     ].
       
   235     newMethod source:aString.
   203     newMethod source:aString.
   236     newMethod category:cat.
   204     newMethod category:cat.
   237     newMethod numberOfMethodVars:(compiler numberOfMethodVars).
   205     newMethod numberOfMethodVars:(compiler numberOfMethodVars).
   238     newMethod numberOfMethodArgs:(compiler numberOfMethodArgs).
   206     newMethod numberOfMethodArgs:(compiler numberOfMethodArgs).
   239     newMethod stackSize:(compiler maxStackDepth).
   207     newMethod stackSize:(compiler maxStackDepth).
   245     SilentLoading ifFalse:[
   213     SilentLoading ifFalse:[
   246         Transcript showCr:('compiled: ',aClass name,' ',compiler selector)
   214         Transcript showCr:('compiled: ',aClass name,' ',compiler selector)
   247     ].
   215     ].
   248 
   216 
   249     ^ newMethod
   217     ^ newMethod
       
   218 ! !
       
   219 
       
   220 !ByteCodeCompiler class methodsFor:'constants'!
       
   221 
       
   222 byteCodeFor:aSymbol
       
   223     "only some exported codes handled here (for BlockNode)"
       
   224 
       
   225     (aSymbol == #blockRetTop) ifTrue:[^ 6].
       
   226     (aSymbol == #push0) ifTrue:[^120].
       
   227     (aSymbol == #push1) ifTrue:[^121].
       
   228     (aSymbol == #push2) ifTrue:[^139].
       
   229     (aSymbol == #pushMinus1) ifTrue:[^122].
       
   230     (aSymbol == #pushNil) ifTrue:[^ 10].
       
   231     (aSymbol == #pushTrue) ifTrue:[^ 11].
       
   232     (aSymbol == #pushFalse) ifTrue:[^ 12].
       
   233     (aSymbol == #pushSelf) ifTrue:[^ 15].
       
   234     self error
   250 ! !
   235 ! !
   251 
   236 
   252 !ByteCodeCompiler methodsFor:'accessing'!
   237 !ByteCodeCompiler methodsFor:'accessing'!
   253 
   238 
   254 literalArray
   239 literalArray
   951     (aSymbol == #pushThisContext) ifTrue:[stackDelta := 1. ^ 144].
   936     (aSymbol == #pushThisContext) ifTrue:[stackDelta := 1. ^ 144].
   952 
   937 
   953     self error:'invalid code symbol'.
   938     self error:'invalid code symbol'.
   954     errorFlag := #Error
   939     errorFlag := #Error
   955 ! !
   940 ! !
   956 
       
   957 !ByteCodeCompiler class methodsFor:'machine code constants'!
       
   958 
       
   959 sharedCodeFunctionFor:aSymbol
       
   960     "return the address of a shared code-function;
       
   961      the code below looks ugly, but adds some speed to instvar-access
       
   962      methods"
       
   963 
       
   964     |codeSymbol|
       
   965 
       
   966     (aSymbol == #retSelf) ifTrue:[
       
   967 %{
       
   968         extern OBJ __retSelf();
       
   969 #if defined(SYSV4) && defined(i386)
       
   970         OBJ (*dummy)() = __retSelf;
       
   971 #endif
       
   972         RETURN ( _MKSMALLINT((int)__retSelf) );
       
   973 %}
       
   974     ].
       
   975     (aSymbol == #retNil) ifTrue:[
       
   976 %{
       
   977         extern OBJ __retNil();
       
   978 #if defined(SYSV4) && defined(i386)
       
   979         OBJ (*dummy)() = __retNil;
       
   980 #endif
       
   981         RETURN ( _MKSMALLINT((int)__retNil) );
       
   982 %}
       
   983     ].
       
   984     (aSymbol == #retTrue) ifTrue:[
       
   985 %{
       
   986         extern OBJ __retTrue();
       
   987 #if defined(SYSV4) && defined(i386)
       
   988         OBJ (*dummy)() = __retTrue;
       
   989 #endif
       
   990         RETURN ( _MKSMALLINT((int)__retTrue) );
       
   991 %}
       
   992     ].
       
   993     (aSymbol == #retFalse) ifTrue:[
       
   994 %{
       
   995         extern OBJ __retFalse();
       
   996 #if defined(SYSV4) && defined(i386)
       
   997         OBJ (*dummy)() = __retFalse;
       
   998 #endif
       
   999         RETURN ( _MKSMALLINT((int)__retFalse) );
       
  1000 %}
       
  1001     ].
       
  1002     (aSymbol == #ret0) ifTrue:[
       
  1003 %{
       
  1004         extern OBJ __ret0();
       
  1005 #if defined(SYSV4) && defined(i386)
       
  1006         OBJ (*dummy)() = __ret0;
       
  1007 #endif
       
  1008         RETURN ( _MKSMALLINT((int)__ret0) );
       
  1009 %}
       
  1010     ].
       
  1011     (aSymbol == #blockRet0) ifTrue:[
       
  1012 %{
       
  1013         extern OBJ __bRet0();
       
  1014 #if defined(SYSV4) && defined(i386)
       
  1015         OBJ (*dummy)() = __bRet0;
       
  1016 #endif
       
  1017         RETURN ( _MKSMALLINT((int)__bRet0) );
       
  1018 %}
       
  1019     ].
       
  1020     (aSymbol == #blockRetNil) ifTrue:[
       
  1021 %{
       
  1022         extern OBJ __bRetNil();
       
  1023 #if defined(SYSV4) && defined(i386)
       
  1024         OBJ (*dummy)() = __bRetNil;
       
  1025 #endif
       
  1026         RETURN ( _MKSMALLINT((int)__bRetNil) );
       
  1027 %}
       
  1028     ].
       
  1029     (aSymbol == #blockRetTrue) ifTrue:[
       
  1030 %{
       
  1031         extern OBJ __bRetTrue();
       
  1032 #if defined(SYSV4) && defined(i386)
       
  1033         OBJ (*dummy)() = __bRetTrue;
       
  1034 #endif
       
  1035         RETURN ( _MKSMALLINT((int)__bRetTrue) );
       
  1036 %}
       
  1037     ].
       
  1038     (aSymbol == #blockRetFalse) ifTrue:[
       
  1039 %{
       
  1040         extern OBJ __bRetFalse();
       
  1041 #if defined(SYSV4) && defined(i386)
       
  1042         OBJ (*dummy)() = __bRetFalse;
       
  1043 #endif
       
  1044         RETURN ( _MKSMALLINT((int)__bRetFalse) );
       
  1045 %}
       
  1046     ].
       
  1047     (aSymbol == #retInstVar1) ifTrue:[
       
  1048 %{
       
  1049         extern OBJ __retInst0();
       
  1050 #if defined(SYSV4) && defined(i386)
       
  1051         OBJ (*dummy)() = __retInst0;
       
  1052 #endif
       
  1053         RETURN ( _MKSMALLINT((int)__retInst0) );
       
  1054 %}
       
  1055     ].
       
  1056     (aSymbol == #retInstVar2) ifTrue:[
       
  1057 %{
       
  1058         extern OBJ __retInst1();
       
  1059 #if defined(SYSV4) && defined(i386)
       
  1060         OBJ (*dummy)() = __retInst1;
       
  1061 #endif
       
  1062         RETURN ( _MKSMALLINT((int)__retInst1) );
       
  1063 %}
       
  1064     ].
       
  1065     (aSymbol == #retInstVar3) ifTrue:[
       
  1066 %{
       
  1067         extern OBJ __retInst2();
       
  1068 #if defined(SYSV4) && defined(i386)
       
  1069         OBJ (*dummy)() = __retInst2;
       
  1070 #endif
       
  1071         RETURN ( _MKSMALLINT((int)__retInst2) );
       
  1072 %}
       
  1073     ].
       
  1074     (aSymbol == #retInstVar4) ifTrue:[
       
  1075 %{
       
  1076         extern OBJ __retInst3();
       
  1077 #if defined(SYSV4) && defined(i386)
       
  1078         OBJ (*dummy)() = __retInst3;
       
  1079 #endif
       
  1080         RETURN ( _MKSMALLINT((int)__retInst3) );
       
  1081 %}
       
  1082     ].
       
  1083     (aSymbol == #retInstVar5) ifTrue:[
       
  1084 %{
       
  1085         extern OBJ __retInst4();
       
  1086 #if defined(SYSV4) && defined(i386)
       
  1087         OBJ (*dummy)() = __retInst4;
       
  1088 #endif
       
  1089         RETURN ( _MKSMALLINT((int)__retInst4) );
       
  1090 %}
       
  1091     ].
       
  1092     (aSymbol == #retInstVar6) ifTrue:[
       
  1093 %{
       
  1094         extern OBJ __retInst5();
       
  1095 #if defined(SYSV4) && defined(i386)
       
  1096         OBJ (*dummy)() = __retInst5;
       
  1097 #endif
       
  1098         RETURN ( _MKSMALLINT((int)__retInst5) );
       
  1099 %}
       
  1100     ].
       
  1101     (aSymbol == #retInstVar7) ifTrue:[
       
  1102 %{
       
  1103         extern OBJ __retInst6();
       
  1104 #if defined(SYSV4) && defined(i386)
       
  1105         OBJ (*dummy)() = __retInst6;
       
  1106 #endif
       
  1107         RETURN ( _MKSMALLINT((int)__retInst6) );
       
  1108 %}
       
  1109     ].
       
  1110     (aSymbol == #retInstVar8) ifTrue:[
       
  1111 %{
       
  1112         extern OBJ __retInst7();
       
  1113 #if defined(SYSV4) && defined(i386)
       
  1114         OBJ (*dummy)() = __retInst7;
       
  1115 #endif
       
  1116         RETURN ( _MKSMALLINT((int)__retInst7) );
       
  1117 %}
       
  1118     ].
       
  1119     (aSymbol == #retInstVar9) ifTrue:[
       
  1120 %{
       
  1121         extern OBJ __retInst8();
       
  1122 #if defined(SYSV4) && defined(i386)
       
  1123         OBJ (*dummy)() = __retInst8;
       
  1124 #endif
       
  1125         RETURN ( _MKSMALLINT((int)__retInst8) );
       
  1126 %}
       
  1127     ].
       
  1128     (aSymbol == #retInstVar10) ifTrue:[
       
  1129 %{
       
  1130         extern OBJ __retInst9();
       
  1131 #if defined(SYSV4) && defined(i386)
       
  1132         OBJ (*dummy)() = __retInst9;
       
  1133 #endif
       
  1134         RETURN ( _MKSMALLINT((int)__retInst9) );
       
  1135 %}
       
  1136     ].
       
  1137     (aSymbol == #retInstVar11) ifTrue:[
       
  1138 %{
       
  1139         extern OBJ __retInst10();
       
  1140 #if defined(SYSV4) && defined(i386)
       
  1141         OBJ (*dummy)() = __retInst10;
       
  1142 #endif
       
  1143         RETURN ( _MKSMALLINT((int)__retInst10) );
       
  1144 %}
       
  1145     ].
       
  1146     (aSymbol == #retInstVar12) ifTrue:[
       
  1147 %{
       
  1148         extern OBJ __retInst11();
       
  1149 #if defined(SYSV4) && defined(i386)
       
  1150         OBJ (*dummy)() = __retInst11;
       
  1151 #endif
       
  1152         RETURN ( _MKSMALLINT((int)__retInst11) );
       
  1153 %}
       
  1154     ].
       
  1155     (aSymbol == #retInstVar13) ifTrue:[
       
  1156 %{
       
  1157         extern OBJ __retInst12();
       
  1158 #if defined(SYSV4) && defined(i386)
       
  1159         OBJ (*dummy)() = __retInst12;
       
  1160 #endif
       
  1161         RETURN ( _MKSMALLINT((int)__retInst12) );
       
  1162 %}
       
  1163     ].
       
  1164     (aSymbol == #retInstVar14) ifTrue:[
       
  1165 %{
       
  1166         extern OBJ __retInst13();
       
  1167 #if defined(SYSV4) && defined(i386)
       
  1168         OBJ (*dummy)() = __retInst13;
       
  1169 #endif
       
  1170         RETURN ( _MKSMALLINT((int)__retInst13) );
       
  1171 %}
       
  1172     ].
       
  1173     (aSymbol == #retInstVar15) ifTrue:[
       
  1174 %{
       
  1175         extern OBJ __retInst14();
       
  1176 #if defined(SYSV4) && defined(i386)
       
  1177         OBJ (*dummy)() = __retInst14;
       
  1178 #endif
       
  1179         RETURN ( _MKSMALLINT((int)__retInst14) );
       
  1180 %}
       
  1181     ].
       
  1182     (aSymbol == #retInstVar16) ifTrue:[
       
  1183 %{
       
  1184         extern OBJ __retInst15();
       
  1185 #if defined(SYSV4) && defined(i386)
       
  1186         OBJ (*dummy)() = __retInst15;
       
  1187 #endif
       
  1188         RETURN ( _MKSMALLINT((int)__retInst15) );
       
  1189 %}
       
  1190     ].
       
  1191     (aSymbol == #retInstVar17) ifTrue:[
       
  1192 %{
       
  1193         extern OBJ __retInst16();
       
  1194 #if defined(SYSV4) && defined(i386)
       
  1195         OBJ (*dummy)() = __retInst16;
       
  1196 #endif
       
  1197         RETURN ( _MKSMALLINT((int)__retInst16) );
       
  1198 %}
       
  1199     ].
       
  1200     (aSymbol == #retInstVar18) ifTrue:[
       
  1201 %{
       
  1202         extern OBJ __retInst17();
       
  1203 #if defined(SYSV4) && defined(i386)
       
  1204         OBJ (*dummy)() = __retInst17;
       
  1205 #endif
       
  1206         RETURN ( _MKSMALLINT((int)__retInst17) );
       
  1207 %}
       
  1208     ].
       
  1209     (aSymbol == #retInstVar19) ifTrue:[
       
  1210 %{
       
  1211         extern OBJ __retInst18();
       
  1212 #if defined(SYSV4) && defined(i386)
       
  1213         OBJ (*dummy)() = __retInst18;
       
  1214 #endif
       
  1215         RETURN ( _MKSMALLINT((int)__retInst18) );
       
  1216 %}
       
  1217     ].
       
  1218     (aSymbol == #retInstVar20) ifTrue:[
       
  1219 %{
       
  1220         extern OBJ __retInst19();
       
  1221 #if defined(SYSV4) && defined(i386)
       
  1222         OBJ (*dummy)() = __retInst19;
       
  1223 #endif
       
  1224         RETURN ( _MKSMALLINT((int)__retInst19) );
       
  1225 %}
       
  1226     ].
       
  1227     (aSymbol == #retInstVar21) ifTrue:[
       
  1228 %{
       
  1229         extern OBJ __retInst20();
       
  1230 #if defined(SYSV4) && defined(i386)
       
  1231         OBJ (*dummy)() = __retInst20;
       
  1232 #endif
       
  1233         RETURN ( _MKSMALLINT((int)__retInst20) );
       
  1234 %}
       
  1235     ].
       
  1236     (aSymbol == #retInstVar22) ifTrue:[
       
  1237 %{
       
  1238         extern OBJ __retInst21();
       
  1239 #if defined(SYSV4) && defined(i386)
       
  1240         OBJ (*dummy)() = __retInst21;
       
  1241 #endif
       
  1242         RETURN ( _MKSMALLINT((int)__retInst21) );
       
  1243 %}
       
  1244     ].
       
  1245     (aSymbol == #retInstVar23) ifTrue:[
       
  1246 %{
       
  1247         extern OBJ __retInst22();
       
  1248 #if defined(SYSV4) && defined(i386)
       
  1249         OBJ (*dummy)() = __retInst22;
       
  1250 #endif
       
  1251         RETURN ( _MKSMALLINT((int)__retInst22) );
       
  1252 %}
       
  1253     ].
       
  1254     (aSymbol == #retInstVar24) ifTrue:[
       
  1255 %{
       
  1256         extern OBJ __retInst23();
       
  1257 #if defined(SYSV4) && defined(i386)
       
  1258         OBJ (*dummy)() = __retInst23;
       
  1259 #endif
       
  1260         RETURN ( _MKSMALLINT((int)__retInst23) );
       
  1261 %}
       
  1262     ].
       
  1263     (aSymbol == #retInstVar25) ifTrue:[
       
  1264 %{
       
  1265         extern OBJ __retInst24();
       
  1266 #if defined(SYSV4) && defined(i386)
       
  1267         OBJ (*dummy)() = __retInst24;
       
  1268 #endif
       
  1269         RETURN ( _MKSMALLINT((int)__retInst24) );
       
  1270 %}
       
  1271     ].
       
  1272     (aSymbol == #retInstVar26) ifTrue:[
       
  1273 %{
       
  1274         extern OBJ __retInst25();
       
  1275 #if defined(SYSV4) && defined(i386)
       
  1276         OBJ (*dummy)() = __retInst25;
       
  1277 #endif
       
  1278         RETURN ( _MKSMALLINT((int)__retInst25) );
       
  1279 %}
       
  1280     ].
       
  1281     (aSymbol == #retInstVar27) ifTrue:[
       
  1282 %{
       
  1283         extern OBJ __retInst26();
       
  1284 #if defined(SYSV4) && defined(i386)
       
  1285         OBJ (*dummy)() = __retInst26;
       
  1286 #endif
       
  1287         RETURN ( _MKSMALLINT((int)__retInst26) );
       
  1288 %}
       
  1289     ].
       
  1290     (aSymbol == #retInstVar28) ifTrue:[
       
  1291 %{
       
  1292         extern OBJ __retInst27();
       
  1293 #if defined(SYSV4) && defined(i386)
       
  1294         OBJ (*dummy)() = __retInst27;
       
  1295 #endif
       
  1296         RETURN ( _MKSMALLINT((int)__retInst27) );
       
  1297 %}
       
  1298     ].
       
  1299     (aSymbol == #retInstVar29) ifTrue:[
       
  1300 %{
       
  1301         extern OBJ __retInst28();
       
  1302 #if defined(SYSV4) && defined(i386)
       
  1303         OBJ (*dummy)() = __retInst28;
       
  1304 #endif
       
  1305         RETURN ( _MKSMALLINT((int)__retInst28) );
       
  1306 %}
       
  1307     ].
       
  1308     (aSymbol == #retInstVar30) ifTrue:[
       
  1309 %{
       
  1310         extern OBJ __retInst29();
       
  1311 #if defined(SYSV4) && defined(i386)
       
  1312         OBJ (*dummy)() = __retInst29;
       
  1313 #endif
       
  1314         RETURN ( _MKSMALLINT((int)__retInst29) );
       
  1315 %}
       
  1316     ].
       
  1317     (aSymbol == #retInstVar31) ifTrue:[
       
  1318 %{
       
  1319         extern OBJ __retInst30();
       
  1320 #if defined(SYSV4) && defined(i386)
       
  1321         OBJ (*dummy)() = __retInst30;
       
  1322 #endif
       
  1323         RETURN ( _MKSMALLINT((int)__retInst30) );
       
  1324 %}
       
  1325     ].
       
  1326 
       
  1327     (aSymbol == #storeInstVar1) ifTrue:[
       
  1328 %{
       
  1329         extern OBJ __setInst0();
       
  1330 #if defined(SYSV4) && defined(i386)
       
  1331         OBJ (*dummy)() = __setInst0;
       
  1332 #endif
       
  1333         RETURN ( _MKSMALLINT((int)__setInst0) );
       
  1334 %}
       
  1335     ].
       
  1336     (aSymbol == #storeInstVar2) ifTrue:[
       
  1337 %{
       
  1338         extern OBJ __setInst1();
       
  1339 #if defined(SYSV4) && defined(i386)
       
  1340         OBJ (*dummy)() = __setInst1;
       
  1341 #endif
       
  1342         RETURN ( _MKSMALLINT((int)__setInst1) );
       
  1343 %}
       
  1344     ].
       
  1345     (aSymbol == #storeInstVar3) ifTrue:[
       
  1346 %{
       
  1347         extern OBJ __setInst2();
       
  1348 #if defined(SYSV4) && defined(i386)
       
  1349         OBJ (*dummy)() = __setInst2;
       
  1350 #endif
       
  1351         RETURN ( _MKSMALLINT((int)__setInst2) );
       
  1352 %}
       
  1353     ].
       
  1354     (aSymbol == #storeInstVar4) ifTrue:[
       
  1355 %{
       
  1356         extern OBJ __setInst3();
       
  1357 #if defined(SYSV4) && defined(i386)
       
  1358         OBJ (*dummy)() = __setInst3;
       
  1359 #endif
       
  1360         RETURN ( _MKSMALLINT((int)__setInst3) );
       
  1361 %}
       
  1362     ].
       
  1363     (aSymbol == #storeInstVar5) ifTrue:[
       
  1364 %{
       
  1365         extern OBJ __setInst4();
       
  1366 #if defined(SYSV4) && defined(i386)
       
  1367         OBJ (*dummy)() = __setInst4;
       
  1368 #endif
       
  1369         RETURN ( _MKSMALLINT((int)__setInst4) );
       
  1370 %}
       
  1371     ].
       
  1372     (aSymbol == #storeInstVar6) ifTrue:[
       
  1373 %{
       
  1374         extern OBJ __setInst5();
       
  1375 #if defined(SYSV4) && defined(i386)
       
  1376         OBJ (*dummy)() = __setInst5;
       
  1377 #endif
       
  1378         RETURN ( _MKSMALLINT((int)__setInst5) );
       
  1379 %}
       
  1380     ].
       
  1381     (aSymbol == #storeInstVar7) ifTrue:[
       
  1382 %{
       
  1383         extern OBJ __setInst6();
       
  1384 #if defined(SYSV4) && defined(i386)
       
  1385         OBJ (*dummy)() = __setInst6;
       
  1386 #endif
       
  1387         RETURN ( _MKSMALLINT((int)__setInst6) );
       
  1388 %}
       
  1389     ].
       
  1390     (aSymbol == #storeInstVar8) ifTrue:[
       
  1391 %{
       
  1392         extern OBJ __setInst7();
       
  1393 #if defined(SYSV4) && defined(i386)
       
  1394         OBJ (*dummy)() = __setInst7;
       
  1395 #endif
       
  1396         RETURN ( _MKSMALLINT((int)__setInst7) );
       
  1397 %}
       
  1398     ].
       
  1399     (aSymbol == #storeInstVar9) ifTrue:[
       
  1400 %{
       
  1401         extern OBJ __setInst8();
       
  1402 #if defined(SYSV4) && defined(i386)
       
  1403         OBJ (*dummy)() = __setInst8;
       
  1404 #endif
       
  1405         RETURN ( _MKSMALLINT((int)__setInst8) );
       
  1406 %}
       
  1407     ].
       
  1408     (aSymbol == #storeInstVar10) ifTrue:[
       
  1409 %{
       
  1410         extern OBJ __setInst9();
       
  1411 #if defined(SYSV4) && defined(i386)
       
  1412         OBJ (*dummy)() = __setInst9;
       
  1413 #endif
       
  1414         RETURN ( _MKSMALLINT((int)__setInst9) );
       
  1415 %}
       
  1416     ].
       
  1417     (aSymbol == #storeInstVar11) ifTrue:[
       
  1418 %{
       
  1419         extern OBJ __setInst10();
       
  1420 #if defined(SYSV4) && defined(i386)
       
  1421         OBJ (*dummy)() = __setInst10;
       
  1422 #endif
       
  1423         RETURN ( _MKSMALLINT((int)__setInst10) );
       
  1424 %}
       
  1425     ].
       
  1426     (aSymbol == #storeInstVar12) ifTrue:[
       
  1427 %{
       
  1428         extern OBJ __setInst11();
       
  1429 #if defined(SYSV4) && defined(i386)
       
  1430         OBJ (*dummy)() = __setInst11;
       
  1431 #endif
       
  1432         RETURN ( _MKSMALLINT((int)__setInst11) );
       
  1433 %}
       
  1434     ].
       
  1435     (aSymbol == #storeInstVar13) ifTrue:[
       
  1436 %{
       
  1437         extern OBJ __setInst12();
       
  1438 #if defined(SYSV4) && defined(i386)
       
  1439         OBJ (*dummy)() = __setInst12;
       
  1440 #endif
       
  1441         RETURN ( _MKSMALLINT((int)__setInst12) );
       
  1442 %}
       
  1443     ].
       
  1444     (aSymbol == #storeInstVar13) ifTrue:[
       
  1445 %{
       
  1446         extern OBJ __setInst12();
       
  1447 #if defined(SYSV4) && defined(i386)
       
  1448         OBJ (*dummy)() = __setInst12;
       
  1449 #endif
       
  1450         RETURN ( _MKSMALLINT((int)__setInst12) );
       
  1451 %}
       
  1452     ].
       
  1453     (aSymbol == #storeInstVar14) ifTrue:[
       
  1454 %{
       
  1455         extern OBJ __setInst13();
       
  1456 #if defined(SYSV4) && defined(i386)
       
  1457         OBJ (*dummy)() = __setInst13;
       
  1458 #endif
       
  1459         RETURN ( _MKSMALLINT((int)__setInst13) );
       
  1460 %}
       
  1461     ].
       
  1462     (aSymbol == #storeInstVar15) ifTrue:[
       
  1463 %{
       
  1464         extern OBJ __setInst14();
       
  1465 #if defined(SYSV4) && defined(i386)
       
  1466         OBJ (*dummy)() = __setInst14;
       
  1467 #endif
       
  1468         RETURN ( _MKSMALLINT((int)__setInst14) );
       
  1469 %}
       
  1470     ].
       
  1471     (aSymbol == #storeInstVar16) ifTrue:[
       
  1472 %{
       
  1473         extern OBJ __setInst15();
       
  1474 #if defined(SYSV4) && defined(i386)
       
  1475         OBJ (*dummy)() = __setInst15;
       
  1476 #endif
       
  1477         RETURN ( _MKSMALLINT((int)__setInst15) );
       
  1478 %}
       
  1479     ].
       
  1480     (aSymbol == #storeInstVar17) ifTrue:[
       
  1481 %{
       
  1482         extern OBJ __setInst16();
       
  1483 #if defined(SYSV4) && defined(i386)
       
  1484         OBJ (*dummy)() = __setInst16;
       
  1485 #endif
       
  1486         RETURN ( _MKSMALLINT((int)__setInst16) );
       
  1487 %}
       
  1488     ].
       
  1489     (aSymbol == #storeInstVar18) ifTrue:[
       
  1490 %{
       
  1491         extern OBJ __setInst17();
       
  1492 #if defined(SYSV4) && defined(i386)
       
  1493         OBJ (*dummy)() = __setInst17;
       
  1494 #endif
       
  1495         RETURN ( _MKSMALLINT((int)__setInst17) );
       
  1496 %}
       
  1497     ].
       
  1498     (aSymbol == #storeInstVar19) ifTrue:[
       
  1499 %{
       
  1500         extern OBJ __setInst18();
       
  1501 #if defined(SYSV4) && defined(i386)
       
  1502         OBJ (*dummy)() = __setInst18;
       
  1503 #endif
       
  1504         RETURN ( _MKSMALLINT((int)__setInst18) );
       
  1505 %}
       
  1506     ].
       
  1507     (aSymbol == #storeInstVar20) ifTrue:[
       
  1508 %{
       
  1509         extern OBJ __setInst19();
       
  1510 #if defined(SYSV4) && defined(i386)
       
  1511         OBJ (*dummy)() = __setInst19;
       
  1512 #endif
       
  1513         RETURN ( _MKSMALLINT((int)__setInst19) );
       
  1514 %}
       
  1515     ].
       
  1516     (aSymbol == #storeInstVar21) ifTrue:[
       
  1517 %{
       
  1518         extern OBJ __setInst20();
       
  1519 #if defined(SYSV4) && defined(i386)
       
  1520         OBJ (*dummy)() = __setInst20;
       
  1521 #endif
       
  1522         RETURN ( _MKSMALLINT((int)__setInst20) );
       
  1523 %}
       
  1524     ].
       
  1525     (aSymbol == #storeInstVar22) ifTrue:[
       
  1526 %{
       
  1527         extern OBJ __setInst21();
       
  1528 #if defined(SYSV4) && defined(i386)
       
  1529         OBJ (*dummy)() = __setInst21;
       
  1530 #endif
       
  1531         RETURN ( _MKSMALLINT((int)__setInst21) );
       
  1532 %}
       
  1533     ].
       
  1534     (aSymbol == #storeInstVar23) ifTrue:[
       
  1535 %{
       
  1536         extern OBJ __setInst22();
       
  1537 #if defined(SYSV4) && defined(i386)
       
  1538         OBJ (*dummy)() = __setInst22;
       
  1539 #endif
       
  1540         RETURN ( _MKSMALLINT((int)__setInst22) );
       
  1541 %}
       
  1542     ].
       
  1543     (aSymbol == #storeInstVar23) ifTrue:[
       
  1544 %{
       
  1545         extern OBJ __setInst22();
       
  1546 #if defined(SYSV4) && defined(i386)
       
  1547         OBJ (*dummy)() = __setInst22;
       
  1548 #endif
       
  1549         RETURN ( _MKSMALLINT((int)__setInst22) );
       
  1550 %}
       
  1551     ].
       
  1552     (aSymbol == #storeInstVar24) ifTrue:[
       
  1553 %{
       
  1554         extern OBJ __setInst23();
       
  1555 #if defined(SYSV4) && defined(i386)
       
  1556         OBJ (*dummy)() = __setInst23;
       
  1557 #endif
       
  1558         RETURN ( _MKSMALLINT((int)__setInst23) );
       
  1559 %}
       
  1560     ].
       
  1561     (aSymbol == #storeInstVar25) ifTrue:[
       
  1562 %{
       
  1563         extern OBJ __setInst24();
       
  1564 #if defined(SYSV4) && defined(i386)
       
  1565         OBJ (*dummy)() = __setInst24;
       
  1566 #endif
       
  1567         RETURN ( _MKSMALLINT((int)__setInst24) );
       
  1568 %}
       
  1569     ].
       
  1570     (aSymbol == #storeInstVar26) ifTrue:[
       
  1571 %{
       
  1572         extern OBJ __setInst25();
       
  1573 #if defined(SYSV4) && defined(i386)
       
  1574         OBJ (*dummy)() = __setInst25;
       
  1575 #endif
       
  1576         RETURN ( _MKSMALLINT((int)__setInst25) );
       
  1577 %}
       
  1578     ].
       
  1579     (aSymbol == #storeInstVar27) ifTrue:[
       
  1580 %{
       
  1581         extern OBJ __setInst26();
       
  1582 #if defined(SYSV4) && defined(i386)
       
  1583         OBJ (*dummy)() = __setInst26;
       
  1584 #endif
       
  1585         RETURN ( _MKSMALLINT((int)__setInst26) );
       
  1586 %}
       
  1587     ].
       
  1588     (aSymbol == #storeInstVar28) ifTrue:[
       
  1589 %{
       
  1590         extern OBJ __setInst27();
       
  1591 #if defined(SYSV4) && defined(i386)
       
  1592         OBJ (*dummy)() = __setInst27;
       
  1593 #endif
       
  1594         RETURN ( _MKSMALLINT((int)__setInst27) );
       
  1595 %}
       
  1596     ].
       
  1597     (aSymbol == #storeInstVar29) ifTrue:[
       
  1598 %{
       
  1599         extern OBJ __setInst28();
       
  1600 #if defined(SYSV4) && defined(i386)
       
  1601         OBJ (*dummy)() = __setInst28;
       
  1602 #endif
       
  1603         RETURN ( _MKSMALLINT((int)__setInst28) );
       
  1604 %}
       
  1605     ].
       
  1606     (aSymbol == #storeInstVar30) ifTrue:[
       
  1607 %{
       
  1608         extern OBJ __setInst29();
       
  1609 #if defined(SYSV4) && defined(i386)
       
  1610         OBJ (*dummy)() = __setInst29;
       
  1611 #endif
       
  1612         RETURN ( _MKSMALLINT((int)__setInst29) );
       
  1613 %}
       
  1614     ].
       
  1615     (aSymbol == #storeInstVar31) ifTrue:[
       
  1616 %{
       
  1617         extern OBJ __setInst30();
       
  1618 #if defined(SYSV4) && defined(i386)
       
  1619         OBJ (*dummy)() = __setInst30;
       
  1620 #endif
       
  1621         RETURN ( _MKSMALLINT((int)__setInst30) );
       
  1622 %}
       
  1623     ].
       
  1624     ^  nil
       
  1625 ! !
       
  1626 
       
  1627 !ByteCodeCompiler methodsFor:'machine code generation'!
       
  1628 
       
  1629 checkForSharedCode:symbolicCodeArray
       
  1630     "if this method is a very simple one,
       
  1631      we can use the shared compiled code"
       
  1632 
       
  1633     |codeSymbol nArgs index|
       
  1634 
       
  1635     symbolicCodeArray isNil ifTrue:[^ nil].
       
  1636     codeSymbol := symbolicCodeArray at:1.
       
  1637     nArgs := methodArgs size.
       
  1638     (nArgs == 0) ifTrue:[
       
  1639         (codeSymbol == #retSelf) ifTrue:[^ codeSymbol].
       
  1640         (codeSymbol == #retTrue) ifTrue:[^ codeSymbol].
       
  1641         (codeSymbol == #retFalse) ifTrue:[^ codeSymbol].
       
  1642         (codeSymbol == #retNil) ifTrue:[^ codeSymbol].
       
  1643         (codeSymbol == #ret0) ifTrue:[^ codeSymbol].
       
  1644         ('retInstVar*' match:codeSymbol) ifTrue:[^ codeSymbol].
       
  1645 
       
  1646         (codeSymbol == #pushMethodArg1) ifTrue:[
       
  1647             ((symbolicCodeArray at:2) == #storeInstVar) ifTrue:[
       
  1648                 index := symbolicCodeArray at:3.
       
  1649                 ((symbolicCodeArray at:4) == #retSelf) ifTrue:[
       
  1650                     ^ ('storeInstVar' , index printString) asSymbol
       
  1651                 ].
       
  1652                 ^ nil
       
  1653             ].
       
  1654             ('storeInstVar*' match:(symbolicCodeArray at:2)) ifTrue:[
       
  1655                 ((symbolicCodeArray at:3) == #retSelf) ifTrue:[^ symbolicCodeArray at:2]
       
  1656             ].
       
  1657             ^ nil
       
  1658         ].
       
  1659 
       
  1660         codeSymbol == #pushInstVar ifTrue:[
       
  1661             index := symbolicCodeArray at:2.
       
  1662             (symbolicCodeArray at:3) == #retTop ifTrue:[
       
  1663                 ^ ('retInstVar' , index printString) asSymbol
       
  1664             ].
       
  1665             ^ nil
       
  1666         ]
       
  1667     ].
       
  1668     ^ nil
       
  1669 !
       
  1670 
       
  1671 checkForMachineCode:symbolicCodeArray
       
  1672     "if this method is a simple one,
       
  1673      we can compile it into machine code"
       
  1674 
       
  1675     |code1 code2 code3 name|
       
  1676 
       
  1677     symbolicCodeArray isNil ifTrue:[^ nil].
       
  1678 
       
  1679     code1 := symbolicCodeArray at:1.
       
  1680     (code1 == #retNum) ifTrue:[
       
  1681         ^ self codeForRetNum:(symbolicCodeArray at:2)
       
  1682     ].
       
  1683     (code1 == #pushNum) ifTrue:[
       
  1684         code2 := symbolicCodeArray at:3.
       
  1685         (code2 == #retTop) ifTrue:[
       
  1686             ^ self codeForRetNum:(symbolicCodeArray at:2)
       
  1687         ].
       
  1688         ^ nil
       
  1689     ].
       
  1690     (code1 == #pushMethodArg1) ifTrue:[
       
  1691         code2 := symbolicCodeArray at:2.
       
  1692         ((code2 == #storeGlobal)
       
  1693         or:[code2 == #storeClassVar]) ifTrue:[
       
  1694             code3 := symbolicCodeArray at:4.
       
  1695             (code3 == #retSelf) ifTrue:[
       
  1696                 name := symbolicCodeArray at:3.
       
  1697                 ^ self codeForSetCell:name
       
  1698             ]
       
  1699         ].
       
  1700         ^ nil
       
  1701     ].
       
  1702     (code1 == #pushGlobal) ifTrue:[
       
  1703         code2 := symbolicCodeArray at:8.
       
  1704         (code2 == #retTop) ifTrue:[
       
  1705             name := symbolicCodeArray at:2.
       
  1706             ^ self codeForRetCell:name
       
  1707         ].
       
  1708         ^ nil
       
  1709     ].
       
  1710     (code1 == #pushClassVar) ifTrue:[
       
  1711         code2 := symbolicCodeArray at:8.
       
  1712         (code2 == #retTop) ifTrue:[
       
  1713             name := symbolicCodeArray at:2.
       
  1714             ^ self codeForRetCell:name
       
  1715         ].
       
  1716         ^ nil
       
  1717     ].
       
  1718     (code1 == #pushLit) ifTrue:[
       
  1719         code2 := symbolicCodeArray at:3.
       
  1720         (code2 == #retTop) ifTrue:[
       
  1721             ^ nil
       
  1722         ].
       
  1723         ^ nil
       
  1724     ].
       
  1725     ^ nil
       
  1726 !
       
  1727 
       
  1728 codeForRetNum:value
       
  1729      "^ number will be coded into machine code"
       
  1730 
       
  1731     |count b conIndex tagHi newCode|
       
  1732 
       
  1733     count := self codeProtoForRetNumEnd - self codeProtoForRetNum.
       
  1734 
       
  1735     b := ExternalBytes address:(self codeProtoForRetNum).
       
  1736 
       
  1737     "search for sequence 0x92345678"
       
  1738 
       
  1739     tagHi := false.
       
  1740     1 to:count-3 do:[:index |
       
  1741         (b at:index) == 16r92 ifTrue:[
       
  1742             (b at:index+1) == 16r34 ifTrue:[
       
  1743                 (b at:index+2) == 16r56 ifTrue:[
       
  1744                     (b at:index+3) == 16r78 ifTrue:[
       
  1745                         conIndex := index.
       
  1746                         tagHi := true
       
  1747                     ]
       
  1748                 ]
       
  1749             ]
       
  1750         ]
       
  1751     ].
       
  1752 
       
  1753     conIndex isNil ifTrue:["'search failed' printNewline. "^ nil].
       
  1754     tagHi ifFalse:['low tag unsupported' printNewline. ^ nil].
       
  1755 
       
  1756     "allocate code ..."
       
  1757 
       
  1758     newCode := ExternalBytes newForText:count.
       
  1759     newCode isNil ifTrue:[
       
  1760         'alloc of text (size ' print. count print. ') failed' printNewline.
       
  1761         ^ nil
       
  1762     ].
       
  1763 
       
  1764     "copy from proto"
       
  1765     1 to:count do:[:index |
       
  1766         newCode at:index put:(b at:index)
       
  1767     ].
       
  1768     "put in ret-value"
       
  1769     newCode at:conIndex   put:((value bitShift:-24) bitAnd:16rFF).
       
  1770     newCode at:conIndex+1 put:((value bitShift:-16) bitAnd:16rFF).
       
  1771     newCode at:conIndex+2 put:((value bitShift:-8) bitAnd:16rFF).
       
  1772     newCode at:conIndex+3 put:(value bitAnd:16rFF).
       
  1773     tagHi ifTrue:[
       
  1774         newCode at:conIndex
       
  1775                put:((newCode at:conIndex) bitOr:16r80)
       
  1776     ] ifFalse:[
       
  1777     ].
       
  1778 'address is:' print. (newCode address printStringRadix:16) printNewline.
       
  1779     ^ newCode address
       
  1780 
       
  1781     "ByteCodeCompiler new codeForRetNum:15"
       
  1782 !
       
  1783 codeForRetCell:aGlobalOrClassVariableSymbol
       
  1784      "^ global will be coded into machine code"
       
  1785 
       
  1786     |cell count b conIndex newCode msbFirst|
       
  1787 
       
  1788     cell := Smalltalk cellAt:aGlobalOrClassVariableSymbol.
       
  1789     cell isNil ifTrue:[^ nil].
       
  1790 
       
  1791     count := self codeProtoForRetCellEnd - self codeProtoForRetCell.
       
  1792 
       
  1793     b := ExternalBytes address:(self codeProtoForRetCell).
       
  1794 
       
  1795     msbFirst := true.
       
  1796 
       
  1797     "search for sequence 0x12345678 // 78563412"
       
  1798     1 to:count - 3 do:[:index |
       
  1799         (b at:index) == 16r12 ifTrue:[
       
  1800             (b at:index+1) == 16r34 ifTrue:[
       
  1801                 (b at:index+2) == 16r56 ifTrue:[
       
  1802                     (b at:index+3) == 16r78 ifTrue:[
       
  1803                         conIndex := index
       
  1804                     ]
       
  1805                 ]
       
  1806             ]
       
  1807         ].
       
  1808         conIndex isNil ifTrue:[
       
  1809             (b at:index) == 16r78 ifTrue:[
       
  1810                 (b at:index+1) == 16r56 ifTrue:[
       
  1811                     (b at:index+2) == 16r34 ifTrue:[
       
  1812                         (b at:index+3) == 16r12 ifTrue:[
       
  1813                             conIndex := index.
       
  1814                             msbFirst := false
       
  1815                         ]
       
  1816                     ]
       
  1817                 ]
       
  1818             ]
       
  1819         ]
       
  1820     ].
       
  1821 
       
  1822     conIndex isNil ifTrue:["'search failed' printNewline. " ^ nil].
       
  1823 
       
  1824     "allocate code ..."
       
  1825 
       
  1826     newCode := ExternalBytes newForText:count.
       
  1827     newCode isNil ifTrue:['alloc of text (size ' print. count print. ') failed' printNewline.^ nil].
       
  1828 
       
  1829     "copy from proto"
       
  1830     1 to:count do:[:index |
       
  1831         newCode at:index put:(b at:index)
       
  1832     ].
       
  1833     "put in cell address"
       
  1834     msbFirst ifTrue:[
       
  1835         newCode at:conIndex   put:((cell bitShift:-24) bitAnd:16rFF).
       
  1836         newCode at:conIndex+1 put:((cell bitShift:-16) bitAnd:16rFF).
       
  1837         newCode at:conIndex+2 put:((cell bitShift:-8) bitAnd:16rFF).
       
  1838         newCode at:conIndex+3 put:(cell bitAnd:16rFF).
       
  1839     ] ifFalse:[
       
  1840         newCode at:conIndex+3 put:((cell bitShift:-24) bitAnd:16rFF).
       
  1841         newCode at:conIndex+2 put:((cell bitShift:-16) bitAnd:16rFF).
       
  1842         newCode at:conIndex+1 put:((cell bitShift:-8) bitAnd:16rFF).
       
  1843         newCode at:conIndex   put:(cell bitAnd:16rFF).
       
  1844     ].
       
  1845 
       
  1846 'address is:' print. (newCode address printStringRadix:16) printNewline.
       
  1847     ^ newCode address
       
  1848 
       
  1849     "ByteCodeCompiler new codeForRetCell:#Transcript"
       
  1850 !
       
  1851 
       
  1852 codeForSetCell:aGlobalOrClassVariableSymbol
       
  1853      "global := arg will be coded into machine code"
       
  1854 
       
  1855     |cell count b conIndex newCode|
       
  1856 
       
  1857     cell := Smalltalk cellAt:aGlobalOrClassVariableSymbol.
       
  1858     cell isNil ifTrue:[^ nil].
       
  1859 
       
  1860     count := self codeProtoForSetCellEnd - self codeProtoForSetCell.
       
  1861 
       
  1862     b := ExternalBytes address:(self codeProtoForSetCell).
       
  1863 
       
  1864     "search for sequence 0x12345678"
       
  1865     1 to:count - 3 do:[:index |
       
  1866         (b at:index) == 16r12 ifTrue:[
       
  1867             (b at:index+1) == 16r34 ifTrue:[
       
  1868                 (b at:index+2) == 16r56 ifTrue:[
       
  1869                     (b at:index+3) == 16r78 ifTrue:[
       
  1870                         conIndex := index
       
  1871                     ]
       
  1872                 ]
       
  1873             ]
       
  1874         ]
       
  1875     ].
       
  1876 
       
  1877     conIndex isNil ifTrue:["'search failed' printNewline." ^ nil].
       
  1878 
       
  1879     "allocate code ..."
       
  1880 
       
  1881     newCode := ExternalBytes newForData:count.
       
  1882     newCode isNil ifTrue:['alloc of data (size ' print. count print. ') failed' printNewline.^ nil].
       
  1883 
       
  1884     "copy from proto"
       
  1885     1 to:count do:[:index |
       
  1886         newCode at:index put:(b at:index)
       
  1887     ].
       
  1888     "put in cell address"
       
  1889     newCode at:conIndex   put:((cell bitShift:-24) bitAnd:16rFF).
       
  1890     newCode at:conIndex+1 put:((cell bitShift:-16) bitAnd:16rFF).
       
  1891     newCode at:conIndex+2 put:((cell bitShift:-8) bitAnd:16rFF).
       
  1892     newCode at:conIndex+3 put:(cell bitAnd:16rFF).
       
  1893 
       
  1894 'address is:' print. (newCode address printStringRadix:16) printNewline.
       
  1895     ^ newCode address
       
  1896 
       
  1897     "ByteCodeCompiler new codeForSetCell:#xyz"
       
  1898 !
       
  1899 
       
  1900 codeProtoForRetNum
       
  1901 %{   /* NOCONTEXT */
       
  1902      extern OBJ __retNumProto();
       
  1903 #if defined(SYSV4) && defined(i386)
       
  1904      OBJ (*dummy)() = __retNumProto;
       
  1905 #endif
       
  1906      RETURN ( _MKSMALLINT((int)__retNumProto) );
       
  1907 %}
       
  1908 !
       
  1909 
       
  1910 codeProtoForRetNumEnd
       
  1911 %{   /* NOCONTEXT */
       
  1912      extern OBJ __retNumProtoEnd();
       
  1913 #if defined(SYSV4) && defined(i386)
       
  1914      OBJ (*dummy)() = __retNumProtoEnd;
       
  1915 #endif
       
  1916      RETURN ( _MKSMALLINT((int)__retNumProtoEnd) );
       
  1917 %}
       
  1918 !
       
  1919 
       
  1920 codeProtoForRetCell
       
  1921 %{   /* NOCONTEXT */
       
  1922      extern OBJ __retCellProto();
       
  1923 #if defined(SYSV4) && defined(i386)
       
  1924      OBJ (*dummy)() = __retCellProto;
       
  1925 #endif
       
  1926      RETURN ( _MKSMALLINT((int)__retCellProto) );
       
  1927 %}
       
  1928 !
       
  1929 
       
  1930 codeProtoForRetCellEnd
       
  1931 %{   /* NOCONTEXT */
       
  1932      extern OBJ __retCellProtoEnd();
       
  1933 #if defined(SYSV4) && defined(i386)
       
  1934      OBJ (*dummy)() = __retCellProtoEnd;
       
  1935 #endif
       
  1936      RETURN ( _MKSMALLINT((int)__retCellProtoEnd) );
       
  1937 %}
       
  1938 !
       
  1939 
       
  1940 codeProtoForSetCell
       
  1941 %{   /* NOCONTEXT */
       
  1942      extern OBJ __setCellProto();
       
  1943 #if defined(SYSV4) && defined(i386)
       
  1944      OBJ (*dummy)() = __setCellProto;
       
  1945 #endif
       
  1946      RETURN ( _MKSMALLINT((int)__setCellProto) );
       
  1947 %}
       
  1948 !
       
  1949 
       
  1950 codeProtoForSetCellEnd
       
  1951 %{   /* NOCONTEXT */
       
  1952      extern OBJ __setCellProtoEnd();
       
  1953 #if defined(SYSV4) && defined(i386)
       
  1954      OBJ (*dummy)() = __setCellProtoEnd;
       
  1955 #endif
       
  1956      RETURN ( _MKSMALLINT((int)__setCellProtoEnd) );
       
  1957 %}
       
  1958 
       
  1959 ! !