#include "setup.h"
#if OBJECT_SYSTEM && CONSTRUCT_COMPILER && (! RUN_TIME)
#include "conscomp.h"
#include "classcom.h"
#include "classfun.h"
#include "classini.h"
#include "cstrncmp.h"
#include "envrnmnt.h"
#include "objrtfnx.h"
#include "sysdep.h"
#if DEFRULE_CONSTRUCT
#include "objrtcmp.h"
#endif
#include "objcmp.h"
#define MODULEI 0
#define CLASSI 1
#define LINKI 2
#define SLOTI 3
#define TSLOTI 4
#define OSLOTI 5
#define HANDLERI 6
#define OHANDLERI 7
#define SAVE_ITEMS 8
#define ClassPrefix() ConstructPrefix(ObjectCompilerData(theEnv)->ObjectCodeItem)
#define ClassLinkPrefix() ArbitraryPrefix(ObjectCompilerData(theEnv)->ObjectCodeItem,2)
#define SlotPrefix() ArbitraryPrefix(ObjectCompilerData(theEnv)->ObjectCodeItem,3)
#define TemplateSlotPrefix() ArbitraryPrefix(ObjectCompilerData(theEnv)->ObjectCodeItem,4)
#define OrderedSlotPrefix() ArbitraryPrefix(ObjectCompilerData(theEnv)->ObjectCodeItem,5)
#define HandlerPrefix() ArbitraryPrefix(ObjectCompilerData(theEnv)->ObjectCodeItem,6)
#define OrderedHandlerPrefix() ArbitraryPrefix(ObjectCompilerData(theEnv)->ObjectCodeItem,7)
#define SlotNamePrefix() ArbitraryPrefix(ObjectCompilerData(theEnv)->ObjectCodeItem,8)
#define SlotNameHashPrefix() ArbitraryPrefix(ObjectCompilerData(theEnv)->ObjectCodeItem,9)
#define ClassHashPrefix() ArbitraryPrefix(ObjectCompilerData(theEnv)->ObjectCodeItem,10)
#define ClassIDPrefix() ArbitraryPrefix(ObjectCompilerData(theEnv)->ObjectCodeItem,11)
#define MaxClassIDPrefix() ArbitraryPrefix(ObjectCompilerData(theEnv)->ObjectCodeItem,12)
typedef struct
{
unsigned long classCount;
unsigned short currentPartition;
unsigned short slotCount;
unsigned int maxIndices;
} MARK_INFO;
typedef union
{
struct
{
unsigned thePartition : 16;
unsigned theOffset : 16;
} theLocation;
unsigned long theLong;
} PACKED_LOCATION_INFO;
static void ReadyObjectsForCode(Environment *);
static void MarkDefclassAndSlots(Environment *,ConstructHeader *,void *);
static void PrintSlotNameReference(Environment *,FILE *,SLOT_NAME *,unsigned int,unsigned int);
static void InitObjectsCode(Environment *,FILE *,unsigned int,unsigned int);
static bool ObjectsToCode(Environment *,const char *,const char *,char *,unsigned int,
FILE *,unsigned int,unsigned int);
static bool ClassIDMapToCode(Environment *,const char *,const char *,char *,unsigned int,
FILE *,unsigned int,unsigned int,unsigned int *);
static bool ClassHashTableToCode(Environment *,const char *,const char *,char *,unsigned int,
FILE *,unsigned int,unsigned int,unsigned int *);
static bool SlotNameHashTableToCode(Environment *,const char *,const char *,char *,unsigned int,
FILE *,unsigned int,unsigned int,unsigned int *);
static bool SlotNameEntriesToCode(Environment *,const char *,const char *,char *,unsigned int,
FILE *,unsigned int,unsigned int,unsigned int *);
static void CloseObjectFiles(Environment *,FILE *[SAVE_ITEMS],bool [SAVE_ITEMS],
struct CodeGeneratorFile [SAVE_ITEMS],unsigned int);
static void DefclassModuleToCode(Environment *,FILE *,Defmodule *,unsigned int,unsigned int);
static void SingleDefclassToCode(Environment *,FILE *,unsigned int,unsigned int,Defclass *,unsigned int,
unsigned int,unsigned int,unsigned int,unsigned int,unsigned int,unsigned int,
unsigned int,unsigned int,unsigned int,unsigned int,unsigned int,unsigned int);
static bool InheritanceLinksToCode(Environment *,FILE **,const char *,const char *,char *,
unsigned int,unsigned int,FILE *,
unsigned int *,unsigned int,Defclass *,unsigned int *,
unsigned int *,bool *,struct CodeGeneratorFile *);
static bool SlotsToCode(Environment *,FILE **,const char *,const char *,char *,unsigned int,unsigned int,FILE *,
unsigned int *,unsigned int,Defclass *,unsigned int *,
unsigned int *,bool *,struct CodeGeneratorFile *);
static bool TemplateSlotsToCode(Environment *,FILE **,const char *,const char *,char *,
unsigned int,unsigned int,FILE *,
unsigned int *,unsigned int,Defclass *,unsigned int *,
unsigned int *,bool *,struct CodeGeneratorFile *);
static bool OrderedSlotsToCode(Environment *,FILE **,const char *,const char *,char *,
unsigned int,unsigned int,FILE *,
unsigned int *,unsigned int,Defclass *,unsigned int *,
unsigned int *,bool *,struct CodeGeneratorFile *);
static bool HandlersToCode(Environment *,FILE **,const char *,const char *,char *,
unsigned int,unsigned int,FILE *,
unsigned int *,unsigned int,Defclass *,unsigned int,unsigned int *,
unsigned int *,bool *,struct CodeGeneratorFile *);
static bool OrderedHandlersToCode(Environment *,FILE **,const char *,const char *,char *,
unsigned int,unsigned int,FILE *,
unsigned int *,unsigned int,Defclass *,unsigned int *,
unsigned int *,bool *,struct CodeGeneratorFile *);
void SetupObjectsCompiler(
Environment *theEnv)
{
AllocateEnvironmentData(theEnv,OBJECT_COMPILER_DATA,sizeof(struct objectCompilerData),NULL);
ObjectCompilerData(theEnv)->ObjectCodeItem = AddCodeGeneratorItem(theEnv,"objects",0,ReadyObjectsForCode,
InitObjectsCode,ObjectsToCode,13);
}
void PrintClassReference(
Environment *theEnv,
FILE *fp,
Defclass *cls,
unsigned int imageID,
unsigned int maxIndices)
{
if (cls == NULL)
fprintf(fp,"NULL");
else
fprintf(fp,"&%s%u_%lu[%lu]",
ClassPrefix(),
imageID,
((cls->header.bsaveID / maxIndices) + 1),
(cls->header.bsaveID % maxIndices));
}
void DefclassCModuleReference(
Environment *theEnv,
FILE *theFile,
unsigned long count,
unsigned int imageID,
unsigned int maxIndices)
{
fprintf(theFile,"MIHS &%s%u_%lu[%lu]",
ModulePrefix(ObjectCompilerData(theEnv)->ObjectCodeItem),
imageID,
(count / maxIndices) + 1,
(count % maxIndices));
}
static void ReadyObjectsForCode(
Environment *theEnv)
{
MARK_INFO markInfo;
unsigned long i;
int j;
SLOT_NAME *snp;
markInfo.classCount = 0L;
markInfo.currentPartition = 1;
markInfo.slotCount = 0;
markInfo.maxIndices = ConstructCompilerData(theEnv)->MaxIndices;
DoForAllConstructs(theEnv,MarkDefclassAndSlots,DefclassData(theEnv)->DefclassModuleIndex,
false,&markInfo);
i = 0L;
for (j = 0 ; j < SLOT_NAME_TABLE_HASH_SIZE ; j++)
for (snp = DefclassData(theEnv)->SlotNameTable[j] ; snp != NULL ; snp = snp->nxt)
snp->bsaveIndex = i++;
}
static void MarkDefclassAndSlots(
Environment *theEnv,
ConstructHeader *vTheDefclass,
void *vTheBuffer)
{
Defclass *theDefclass = (Defclass *) vTheDefclass;
MARK_INFO *markInfo = (MARK_INFO *) vTheBuffer;
long i;
PACKED_LOCATION_INFO theLocationInfo;
#if MAC_XCD
#pragma unused(theEnv)
#endif
theDefclass->header.bsaveID = markInfo->classCount++;
for (i = 0 ; i < theDefclass->slotCount ; i++)
{
theLocationInfo.theLocation.thePartition = markInfo->currentPartition;
theLocationInfo.theLocation.theOffset = markInfo->slotCount;
theDefclass->slots[i].bsaveIndex = theLocationInfo.theLong;
markInfo->slotCount++;
if (markInfo->slotCount >= markInfo->maxIndices)
{
markInfo->currentPartition++;
markInfo->slotCount = 0;
}
}
}
static void PrintSlotNameReference(
Environment *theEnv,
FILE *fp,
SLOT_NAME *snp,
unsigned int imageID,
unsigned int maxIndices)
{
if (snp == NULL)
fprintf(fp,"NULL");
else
fprintf(fp,"&%s%u_%lu[%lu]",
SlotNamePrefix(),
imageID,
((snp->bsaveIndex / maxIndices) + 1),
(snp->bsaveIndex % maxIndices));
}
static void InitObjectsCode(
Environment *theEnv,
FILE *initFP,
unsigned int imageID,
unsigned int maxIndices)
{
#if MAC_XCD
#pragma unused(maxIndices)
#endif
fprintf(initFP," ObjectsRunTimeInitialize(theEnv,%s%u_1,%s%u_1,%s%u_1,%s%u);\n",
ClassHashPrefix(),imageID,SlotNameHashPrefix(),imageID,
ClassIDPrefix(),imageID,MaxClassIDPrefix(),imageID);
}
static bool ObjectsToCode(
Environment *theEnv,
const char *fileName,
const char *pathName,
char *fileNameBuffer,
unsigned int fileID,
FILE *headerFP,
unsigned int imageID,
unsigned int maxIndices)
{
unsigned int fileCount = 1;
Defmodule *theModule;
Defclass *theDefclass;
int i;
unsigned int moduleCount = 0;
unsigned int itemArrayCounts[SAVE_ITEMS];
unsigned int itemArrayVersions[SAVE_ITEMS];
FILE *itemFiles[SAVE_ITEMS];
bool itemReopenFlags[SAVE_ITEMS];
struct CodeGeneratorFile itemCodeFiles[SAVE_ITEMS];
for (i = 0 ; i < SAVE_ITEMS ; i++)
{
itemArrayCounts[i] = 0;
itemArrayVersions[i] = 1;
itemFiles[i] = NULL;
itemReopenFlags[i] = false;
itemCodeFiles[i].filePrefix = NULL;
itemCodeFiles[i].pathName = pathName;
itemCodeFiles[i].fileNameBuffer = fileNameBuffer;
}
fprintf(headerFP,"#include \"classcom.h\"\n");
fprintf(headerFP,"#include \"classini.h\"\n");
if (ClassIDMapToCode(theEnv,fileName,pathName,fileNameBuffer,fileID,headerFP,imageID,maxIndices,&fileCount)
== false)
return false;
if (ClassHashTableToCode(theEnv,fileName,pathName,fileNameBuffer,fileID,headerFP,imageID,maxIndices,&fileCount)
== false)
return false;
if (SlotNameHashTableToCode(theEnv,fileName,pathName,fileNameBuffer,fileID,headerFP,imageID,maxIndices,&fileCount)
== false)
return false;
if (SlotNameEntriesToCode(theEnv,fileName,pathName,fileNameBuffer,fileID,headerFP,imageID,maxIndices,&fileCount)
== false)
return false;
theModule = GetNextDefmodule(theEnv,NULL);
while (theModule != NULL)
{
SetCurrentModule(theEnv,theModule);
itemFiles[MODULEI] =
OpenFileIfNeeded(theEnv,itemFiles[MODULEI],fileName,pathName,fileNameBuffer,fileID,imageID,&fileCount,
itemArrayVersions[MODULEI],headerFP,
"DEFCLASS_MODULE",ModulePrefix(ObjectCompilerData(theEnv)->ObjectCodeItem),
itemReopenFlags[MODULEI],&itemCodeFiles[MODULEI]);
if (itemFiles[MODULEI] == NULL)
goto ObjectCodeError;
DefclassModuleToCode(theEnv,itemFiles[MODULEI],theModule,imageID,maxIndices);
itemFiles[MODULEI] =
CloseFileIfNeeded(theEnv,itemFiles[MODULEI],&itemArrayCounts[MODULEI],
&itemArrayVersions[MODULEI],maxIndices,
&itemReopenFlags[MODULEI],&itemCodeFiles[MODULEI]);
for (theDefclass = GetNextDefclass(theEnv,NULL) ;
theDefclass != NULL ;
theDefclass = GetNextDefclass(theEnv,theDefclass))
{
itemFiles[CLASSI] =
OpenFileIfNeeded(theEnv,itemFiles[CLASSI],fileName,pathName,fileNameBuffer,fileID,imageID,&fileCount,
itemArrayVersions[CLASSI],headerFP,
"Defclass",ClassPrefix(),
itemReopenFlags[CLASSI],&itemCodeFiles[CLASSI]);
if (itemFiles[CLASSI] == NULL)
goto ObjectCodeError;
SingleDefclassToCode(theEnv,itemFiles[CLASSI],imageID,maxIndices,
theDefclass,moduleCount,
itemArrayVersions[LINKI],itemArrayCounts[LINKI],
itemArrayVersions[SLOTI],itemArrayCounts[SLOTI],
itemArrayVersions[TSLOTI],itemArrayCounts[TSLOTI],
itemArrayVersions[OSLOTI],itemArrayCounts[OSLOTI],
itemArrayVersions[HANDLERI],itemArrayCounts[HANDLERI],
itemArrayVersions[OHANDLERI],itemArrayCounts[OHANDLERI]);
itemArrayCounts[CLASSI]++;
itemFiles[CLASSI] =
CloseFileIfNeeded(theEnv,itemFiles[CLASSI],&itemArrayCounts[CLASSI],
&itemArrayVersions[CLASSI],maxIndices,
&itemReopenFlags[CLASSI],&itemCodeFiles[CLASSI]);
if (InheritanceLinksToCode(theEnv,&itemFiles[LINKI],fileName,pathName,fileNameBuffer,fileID,imageID,
headerFP,&fileCount,maxIndices,theDefclass,
&itemArrayVersions[LINKI],&itemArrayCounts[LINKI],
&itemReopenFlags[LINKI],&itemCodeFiles[LINKI])
== false)
goto ObjectCodeError;
if (SlotsToCode(theEnv,&itemFiles[SLOTI],fileName,pathName,fileNameBuffer,fileID,imageID,
headerFP,&fileCount,maxIndices,theDefclass,
&itemArrayVersions[SLOTI],&itemArrayCounts[SLOTI],
&itemReopenFlags[SLOTI],&itemCodeFiles[SLOTI])
== false)
goto ObjectCodeError;
if (TemplateSlotsToCode(theEnv,&itemFiles[TSLOTI],fileName,pathName,fileNameBuffer,fileID,imageID,
headerFP,&fileCount,maxIndices,theDefclass,
&itemArrayVersions[TSLOTI],&itemArrayCounts[TSLOTI],
&itemReopenFlags[TSLOTI],&itemCodeFiles[TSLOTI])
== false)
goto ObjectCodeError;
if (OrderedSlotsToCode(theEnv,&itemFiles[OSLOTI],fileName,pathName,fileNameBuffer,fileID,imageID,
headerFP,&fileCount,maxIndices,theDefclass,
&itemArrayVersions[OSLOTI],&itemArrayCounts[OSLOTI],
&itemReopenFlags[OSLOTI],&itemCodeFiles[OSLOTI])
== false)
goto ObjectCodeError;
if (HandlersToCode(theEnv,&itemFiles[HANDLERI],fileName,pathName,fileNameBuffer,fileID,imageID,
headerFP,&fileCount,maxIndices,theDefclass,moduleCount,
&itemArrayVersions[HANDLERI],&itemArrayCounts[HANDLERI],
&itemReopenFlags[HANDLERI],&itemCodeFiles[HANDLERI])
== false)
goto ObjectCodeError;
if (OrderedHandlersToCode(theEnv,&itemFiles[OHANDLERI],fileName,pathName,fileNameBuffer,fileID,imageID,
headerFP,&fileCount,maxIndices,theDefclass,
&itemArrayVersions[OHANDLERI],&itemArrayCounts[OHANDLERI],
&itemReopenFlags[OHANDLERI],&itemCodeFiles[OHANDLERI])
== false)
goto ObjectCodeError;
}
theModule = GetNextDefmodule(theEnv,theModule);
moduleCount++;
itemArrayCounts[MODULEI]++;
}
CloseObjectFiles(theEnv,itemFiles,itemReopenFlags,itemCodeFiles,maxIndices);
return true;
ObjectCodeError:
CloseObjectFiles(theEnv,itemFiles,itemReopenFlags,itemCodeFiles,maxIndices);
return false;
}
static bool ClassIDMapToCode(
Environment *theEnv,
const char *fileName,
const char *pathName,
char *fileNameBuffer,
unsigned int fileID,
FILE *headerFP,
unsigned int imageID,
unsigned int maxIndices,
unsigned int *fileCount)
{
FILE *classIDMapFile = NULL;
unsigned int classIDMapArrayCount;
unsigned int classIDMapArrayVersion = 1;
classIDMapFile = OpenFileIfNeeded(theEnv,classIDMapFile,fileName,pathName,fileNameBuffer,fileID,imageID,fileCount,
classIDMapArrayVersion,headerFP,
"Defclass *",ClassIDPrefix(),false,NULL);
if (classIDMapFile == NULL)
return false;
for (classIDMapArrayCount = 0 ;
classIDMapArrayCount < DefclassData(theEnv)->MaxClassID ;
classIDMapArrayCount++)
{
if (classIDMapArrayCount > 0)
fprintf(classIDMapFile,",\n");
PrintClassReference(theEnv,classIDMapFile,DefclassData(theEnv)->ClassIDMap[classIDMapArrayCount],
imageID,maxIndices);
}
fprintf(classIDMapFile,"};\n\n");
fprintf(classIDMapFile,"unsigned %s%d = %u;\n",
MaxClassIDPrefix(),imageID,(unsigned) DefclassData(theEnv)->MaxClassID);
fprintf(headerFP,"extern unsigned %s%d;\n",MaxClassIDPrefix(),imageID);
GenClose(theEnv,classIDMapFile);
return true;
}
static bool ClassHashTableToCode(
Environment *theEnv,
const char *fileName,
const char *pathName,
char *fileNameBuffer,
unsigned int fileID,
FILE *headerFP,
unsigned int imageID,
unsigned int maxIndices,
unsigned int *fileCount)
{
FILE *classHashFile = NULL;
unsigned int classHashArrayCount,
classHashArrayVersion = 1;
classHashFile = OpenFileIfNeeded(theEnv,classHashFile,fileName,pathName,fileNameBuffer,fileID,imageID,fileCount,
classHashArrayVersion,headerFP,
"Defclass *",ClassHashPrefix(),false,NULL);
if (classHashFile == NULL)
return false;
for (classHashArrayCount = 0 ;
classHashArrayCount < CLASS_TABLE_HASH_SIZE ;
classHashArrayCount++)
{
if (classHashArrayCount > 0)
fprintf(classHashFile,",\n");
PrintClassReference(theEnv,classHashFile,DefclassData(theEnv)->ClassTable[classHashArrayCount],
imageID,maxIndices);
}
CloseFileIfNeeded(theEnv,classHashFile,&classHashArrayCount,
&classHashArrayVersion,classHashArrayCount,NULL,NULL);
return true;
}
static bool SlotNameHashTableToCode(
Environment *theEnv,
const char *fileName,
const char *pathName,
char *fileNameBuffer,
unsigned int fileID,
FILE *headerFP,
unsigned int imageID,
unsigned int maxIndices,
unsigned int *fileCount)
{
FILE *slotNameHashFile = NULL;
unsigned int slotNameHashArrayCount,
slotNameHashArrayVersion = 1;
slotNameHashFile = OpenFileIfNeeded(theEnv,slotNameHashFile,fileName,pathName,fileNameBuffer,fileID,
imageID,fileCount,
slotNameHashArrayVersion,headerFP,
"SLOT_NAME *",SlotNameHashPrefix(),false,NULL);
if (slotNameHashFile == NULL)
return false;
for (slotNameHashArrayCount = 0 ;
slotNameHashArrayCount < SLOT_NAME_TABLE_HASH_SIZE ;
slotNameHashArrayCount++)
{
if (slotNameHashArrayCount > 0)
fprintf(slotNameHashFile,",\n");
PrintSlotNameReference(theEnv,slotNameHashFile,DefclassData(theEnv)->SlotNameTable[slotNameHashArrayCount],
imageID,maxIndices);
}
CloseFileIfNeeded(theEnv,slotNameHashFile,&slotNameHashArrayCount,
&slotNameHashArrayVersion,slotNameHashArrayCount,
NULL,NULL);
return true;
}
static bool SlotNameEntriesToCode(
Environment *theEnv,
const char *fileName,
const char *pathName,
char *fileNameBuffer,
unsigned int fileID,
FILE *headerFP,
unsigned int imageID,
unsigned int maxIndices,
unsigned int *fileCount)
{
FILE *slotNameFile = NULL;
unsigned int slotNameArrayCount = 0,
slotNameArrayVersion = 1;
SLOT_NAME *snp;
unsigned i;
for (i = 0 ; i < SLOT_NAME_TABLE_HASH_SIZE ; i++)
{
for (snp = DefclassData(theEnv)->SlotNameTable[i] ; snp != NULL ; snp = snp->nxt)
{
slotNameFile = OpenFileIfNeeded(theEnv,slotNameFile,fileName,pathName,fileNameBuffer,fileID,
imageID,fileCount,
slotNameArrayVersion,headerFP,
"SLOT_NAME",SlotNamePrefix(),false,NULL);
if (slotNameFile == NULL)
return false;
fprintf(slotNameFile,"{ %u,1,%d,",snp->hashTableIndex,snp->id);
PrintSymbolReference(theEnv,slotNameFile,snp->name);
fprintf(slotNameFile,",");
PrintSymbolReference(theEnv,slotNameFile,snp->putHandlerName);
fprintf(slotNameFile,",");
PrintSlotNameReference(theEnv,slotNameFile,snp->nxt,imageID,maxIndices);
fprintf(slotNameFile,",0L }");
slotNameArrayCount++;
slotNameFile = CloseFileIfNeeded(theEnv,slotNameFile,&slotNameArrayCount,
&slotNameArrayVersion,maxIndices,NULL,NULL);
}
}
if (slotNameFile != NULL)
CloseFileIfNeeded(theEnv,slotNameFile,&slotNameArrayCount,
&slotNameArrayVersion,slotNameArrayCount,NULL,NULL);
return true;
}
static void CloseObjectFiles(
Environment *theEnv,
FILE *itemFiles[SAVE_ITEMS],
bool itemReopenFlags[SAVE_ITEMS],
struct CodeGeneratorFile itemCodeFiles[SAVE_ITEMS],
unsigned int maxIndices)
{
unsigned int count = maxIndices;
unsigned int arrayVersion = 0;
int i;
for (i = 0 ; i < SAVE_ITEMS ; i++)
{
count = maxIndices;
itemFiles[i] = CloseFileIfNeeded(theEnv,itemFiles[i],&count,&arrayVersion,
maxIndices,&itemReopenFlags[i],
&itemCodeFiles[i]);
}
}
static void DefclassModuleToCode(
Environment *theEnv,
FILE *theFile,
Defmodule *theModule,
unsigned int imageID,
unsigned int maxIndices)
{
fprintf(theFile,"{");
ConstructModuleToCode(theEnv,theFile,theModule,imageID,maxIndices,
DefclassData(theEnv)->DefclassModuleIndex,ClassPrefix());
fprintf(theFile,"}");
}
static void SingleDefclassToCode(
Environment *theEnv,
FILE *theFile,
unsigned int imageID,
unsigned int maxIndices,
Defclass *theDefclass,
unsigned int moduleCount,
unsigned int classLinkArrayVersion,
unsigned int classLinkArrayCount,
unsigned int slotArrayVersion,
unsigned int slotArrayCount,
unsigned int templateSlotArrayVersion,
unsigned int templateSlotArrayCount,
unsigned int orderedSlotArrayVersion,
unsigned int orderedSlotArrayCount,
unsigned int handlerArrayVersion,
unsigned int handlerArrayCount,
unsigned int orderedHandlerArrayVersion,
unsigned int orderedHandlerArrayCount)
{
fprintf(theFile,"{");
ConstructHeaderToCode(theEnv,theFile,&theDefclass->header,imageID,maxIndices,moduleCount,
ModulePrefix(ObjectCompilerData(theEnv)->ObjectCodeItem),ClassPrefix());
fprintf(theFile,",1,%u,%u,%u,0,0,%u,0,%u,\n ",
theDefclass->system,theDefclass->abstract,
theDefclass->reactive,(unsigned) theDefclass->id,
theDefclass->hashTableIndex);
if (theDefclass->directSuperclasses.classCount > 0)
fprintf(theFile,"{ %lu,&%s%d_%d[%d] },",
theDefclass->directSuperclasses.classCount,
ClassLinkPrefix(),
imageID,classLinkArrayVersion,classLinkArrayCount);
else
fprintf(theFile,"{ 0,NULL },");
classLinkArrayCount += theDefclass->directSuperclasses.classCount;
if (theDefclass->directSubclasses.classCount > 0)
fprintf(theFile,"{ %lu,&%s%d_%d[%d] },",
theDefclass->directSubclasses.classCount,
ClassLinkPrefix(),
imageID,classLinkArrayVersion,classLinkArrayCount);
else
fprintf(theFile,"{ 0,NULL },");
classLinkArrayCount += theDefclass->directSubclasses.classCount;
if (theDefclass->allSuperclasses.classCount > 0)
fprintf(theFile,"{ %lu,&%s%d_%d[%d] },",
theDefclass->allSuperclasses.classCount,
ClassLinkPrefix(),
imageID,classLinkArrayVersion,classLinkArrayCount);
else
fprintf(theFile,"{ 0,NULL },\n ");
if (theDefclass->slots != NULL)
fprintf(theFile,"&%s%d_%d[%d],",
SlotPrefix(),imageID,
slotArrayVersion,slotArrayCount);
else
fprintf(theFile,"NULL,");
if (theDefclass->instanceTemplate != NULL)
fprintf(theFile,"&%s%d_%d[%d],",
TemplateSlotPrefix(),imageID,
templateSlotArrayVersion,templateSlotArrayCount);
else
fprintf(theFile,"NULL,");
if (theDefclass->slotNameMap != NULL)
fprintf(theFile,"&%s%d_%d[%d],",
OrderedSlotPrefix(),imageID,
orderedSlotArrayVersion,orderedSlotArrayCount);
else
fprintf(theFile,"NULL,");
fprintf(theFile,"%u,%u,%u,%u,NULL,NULL,\n ",
theDefclass->slotCount,theDefclass->localInstanceSlotCount,
theDefclass->instanceSlotCount,theDefclass->maxSlotNameID);
if (theDefclass->handlers != NULL)
fprintf(theFile,"&%s%d_%d[%d],",
HandlerPrefix(),imageID,
handlerArrayVersion,handlerArrayCount);
else
fprintf(theFile,"NULL,");
if (theDefclass->handlerOrderMap != NULL)
fprintf(theFile,"&%s%d_%d[%d],",
OrderedHandlerPrefix(),imageID,
orderedHandlerArrayVersion,orderedHandlerArrayCount);
else
fprintf(theFile,"NULL,");
fprintf(theFile,"%u,",theDefclass->handlerCount);
PrintClassReference(theEnv,theFile,theDefclass->nxtHash,imageID,maxIndices);
fprintf(theFile,",");
PrintBitMapReference(theEnv,theFile,theDefclass->scopeMap);
#if DEFRULE_CONSTRUCT
fprintf(theFile,",");
ClassAlphaLinkReference(theEnv,theDefclass->relevant_terminal_alpha_nodes,theFile,imageID,maxIndices);
#endif
fprintf(theFile,",\"\"");
fprintf(theFile,"}");
}
static bool InheritanceLinksToCode(
Environment *theEnv,
FILE **classLinkFile,
const char *fileName,
const char *pathName,
char *fileNameBuffer,
unsigned int fileID,
unsigned int imageID,
FILE *headerFP,
unsigned int *fileCount,
unsigned int maxIndices,
Defclass *theDefclass,
unsigned int *classLinkArrayVersion,
unsigned int *classLinkArrayCount,
bool *reopenClassLinkFile,
struct CodeGeneratorFile *classLinkCodeFile)
{
unsigned long i;
unsigned long inheritanceLinkCount;
bool linkPrinted = false;
inheritanceLinkCount = theDefclass->directSuperclasses.classCount +
theDefclass->directSubclasses.classCount +
theDefclass->allSuperclasses.classCount;
if (inheritanceLinkCount == 0)
return true;
*classLinkFile = OpenFileIfNeeded(theEnv,*classLinkFile,fileName,pathName,fileNameBuffer,fileID,
imageID,fileCount,
*classLinkArrayVersion,headerFP,
"Defclass *",ClassLinkPrefix(),
*reopenClassLinkFile,classLinkCodeFile);
if (*classLinkFile == NULL)
return false;
for (i = 0 ; i < theDefclass->directSuperclasses.classCount ; i++)
{
if (linkPrinted)
fprintf(*classLinkFile,",");
PrintClassReference(theEnv,*classLinkFile,
theDefclass->directSuperclasses.classArray[i],
imageID,maxIndices);
linkPrinted = true;
}
for (i = 0 ; i < theDefclass->directSubclasses.classCount ; i++)
{
if (linkPrinted)
fprintf(*classLinkFile,",");
PrintClassReference(theEnv,*classLinkFile,
theDefclass->directSubclasses.classArray[i],
imageID,maxIndices);
linkPrinted = true;
}
for (i = 0 ; i < theDefclass->allSuperclasses.classCount ; i++)
{
if (linkPrinted)
fprintf(*classLinkFile,",");
PrintClassReference(theEnv,*classLinkFile,
theDefclass->allSuperclasses.classArray[i],
imageID,maxIndices);
linkPrinted = true;
}
*classLinkArrayCount += inheritanceLinkCount;
*classLinkFile = CloseFileIfNeeded(theEnv,*classLinkFile,classLinkArrayCount,
classLinkArrayVersion,maxIndices,
reopenClassLinkFile,classLinkCodeFile);
return true;
}
static bool SlotsToCode(
Environment *theEnv,
FILE **slotFile,
const char *fileName,
const char *pathName,
char *fileNameBuffer,
unsigned int fileID,
unsigned int imageID,
FILE *headerFP,
unsigned int *fileCount,
unsigned int maxIndices,
Defclass *theDefclass,
unsigned int *slotArrayVersion,
unsigned int *slotArrayCount,
bool *reopenSlotFile,
struct CodeGeneratorFile *slotCodeFile)
{
long i;
SlotDescriptor *sd;
Expression *tmpexp;
PACKED_LOCATION_INFO theLocationInfo;
if (theDefclass->slotCount == 0)
return true;
*slotFile = OpenFileIfNeeded(theEnv,*slotFile,fileName,pathName,fileNameBuffer,fileID,
imageID,fileCount,
*slotArrayVersion,headerFP,
"SlotDescriptor",SlotPrefix(),
*reopenSlotFile,slotCodeFile);
if (*slotFile == NULL)
return false;
for (i = 0 ; i < theDefclass->slotCount ; i++)
{
sd = &theDefclass->slots[i];
if (i > 0)
fprintf(*slotFile,",\n");
fprintf(*slotFile,"{ %u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,",
sd->shared,sd->multiple,
sd->composite,sd->noInherit,
sd->noWrite,sd->initializeOnly,
sd->dynamicDefault,sd->defaultSpecified,
sd->noDefault,sd->reactive,
sd->publicVisibility,sd->createReadAccessor,
sd->createWriteAccessor,sd->overrideMessageSpecified);
PrintClassReference(theEnv,*slotFile,sd->cls,imageID,maxIndices);
fprintf(*slotFile,",");
PrintSlotNameReference(theEnv,*slotFile,sd->slotName,imageID,maxIndices);
fprintf(*slotFile,",\n ");
PrintSymbolReference(theEnv,*slotFile,sd->overrideMessage);
if (sd->defaultValue != NULL)
{
fprintf(*slotFile,",(void *) ");
if (sd->dynamicDefault)
ExpressionToCode(theEnv,*slotFile,(Expression *) sd->defaultValue);
else
{
tmpexp = ConvertValueToExpression(theEnv,(UDFValue *) sd->defaultValue);
ExpressionToCode(theEnv,*slotFile,tmpexp);
ReturnExpression(theEnv,tmpexp);
}
}
else
fprintf(*slotFile,",NULL");
fprintf(*slotFile,",");
PrintConstraintReference(theEnv,*slotFile,sd->constraint,imageID,maxIndices);
fprintf(*slotFile,",0,0L,");
if (sd->shared)
{
theLocationInfo.theLong = sd->sharedValue.desc->bsaveIndex;
fprintf(*slotFile,"{ &%s%d_%u[%u],0,0,0,{ NULL } } }",
SlotPrefix(),imageID,
theLocationInfo.theLocation.thePartition,
theLocationInfo.theLocation.theOffset);
}
else
fprintf(*slotFile,"{ NULL,0,0,0, { NULL } } }");
}
*slotArrayCount += theDefclass->slotCount;
*slotFile = CloseFileIfNeeded(theEnv,*slotFile,slotArrayCount,
slotArrayVersion,maxIndices,
reopenSlotFile,slotCodeFile);
return true;
}
static bool TemplateSlotsToCode(
Environment *theEnv,
FILE **templateSlotFile,
const char *fileName,
const char *pathName,
char *fileNameBuffer,
unsigned int fileID,
unsigned int imageID,
FILE *headerFP,
unsigned int *fileCount,
unsigned int maxIndices,
Defclass *theDefclass,
unsigned int *templateSlotArrayVersion,
unsigned int *templateSlotArrayCount,
bool *reopenTemplateSlotFile,
struct CodeGeneratorFile *templateSlotCodeFile)
{
unsigned long i;
SlotDescriptor *sd;
PACKED_LOCATION_INFO theLocationInfo;
if (theDefclass->instanceSlotCount == 0)
return true;
*templateSlotFile = OpenFileIfNeeded(theEnv,*templateSlotFile,fileName,pathName,fileNameBuffer,fileID,
imageID,fileCount,
*templateSlotArrayVersion,headerFP,
"SlotDescriptor *",TemplateSlotPrefix(),
*reopenTemplateSlotFile,templateSlotCodeFile);
if (*templateSlotFile == NULL)
return false;
for (i = 0 ; i < theDefclass->instanceSlotCount ; i++)
{
sd = theDefclass->instanceTemplate[i];
if (i > 0)
fprintf(*templateSlotFile,",");
theLocationInfo.theLong = sd->bsaveIndex;
fprintf(*templateSlotFile,"&%s%d_%u[%u]",
SlotPrefix(),imageID,
theLocationInfo.theLocation.thePartition,
theLocationInfo.theLocation.theOffset);
}
*templateSlotArrayCount += theDefclass->instanceSlotCount;
*templateSlotFile = CloseFileIfNeeded(theEnv,*templateSlotFile,templateSlotArrayCount,
templateSlotArrayVersion,maxIndices,
reopenTemplateSlotFile,templateSlotCodeFile);
return true;
}
static bool OrderedSlotsToCode(
Environment *theEnv,
FILE **orderedSlotFile,
const char *fileName,
const char *pathName,
char *fileNameBuffer,
unsigned int fileID,
unsigned int imageID,
FILE *headerFP,
unsigned int *fileCount,
unsigned int maxIndices,
Defclass *theDefclass,
unsigned int *orderedSlotArrayVersion,
unsigned int *orderedSlotArrayCount,
bool *reopenOrderedSlotFile,
struct CodeGeneratorFile *orderedSlotCodeFile)
{
long i;
if (theDefclass->instanceSlotCount == 0)
return true;
*orderedSlotFile = OpenFileIfNeeded(theEnv,*orderedSlotFile,fileName,pathName,fileNameBuffer,fileID,
imageID,fileCount,
*orderedSlotArrayVersion,headerFP,
"unsigned",OrderedSlotPrefix(),
*reopenOrderedSlotFile,orderedSlotCodeFile);
if (*orderedSlotFile == NULL)
return false;
for (i = 0 ; i <= theDefclass->maxSlotNameID ; i++)
{
if (i > 0)
fprintf(*orderedSlotFile,",");
fprintf(*orderedSlotFile,"%u",theDefclass->slotNameMap[i]);
}
*orderedSlotArrayCount += theDefclass->maxSlotNameID + 1;
*orderedSlotFile = CloseFileIfNeeded(theEnv,*orderedSlotFile,orderedSlotArrayCount,
orderedSlotArrayVersion,maxIndices,
reopenOrderedSlotFile,orderedSlotCodeFile);
return true;
}
static bool HandlersToCode(
Environment *theEnv,
FILE **handlerFile,
const char *fileName,
const char *pathName,
char *fileNameBuffer,
unsigned int fileID,
unsigned int imageID,
FILE *headerFP,
unsigned int *fileCount,
unsigned int maxIndices,
Defclass *theDefclass,
unsigned int moduleCount,
unsigned int *handlerArrayVersion,
unsigned int *handlerArrayCount,
bool *reopenHandlerFile,
struct CodeGeneratorFile *handlerCodeFile)
{
unsigned int i;
DefmessageHandler *hnd;
if (theDefclass->handlerCount == 0)
return true;
*handlerFile = OpenFileIfNeeded(theEnv,*handlerFile,fileName,pathName,fileNameBuffer,fileID,
imageID,fileCount,
*handlerArrayVersion,headerFP,
"DefmessageHandler",HandlerPrefix(),*reopenHandlerFile,
handlerCodeFile);
if (*handlerFile == NULL)
return false;
for (i = 0 ; i < theDefclass->handlerCount ; i++)
{
if (i > 0)
fprintf(*handlerFile,",\n");
hnd = &theDefclass->handlers[i];
fprintf(*handlerFile,"{");
ConstructHeaderToCode(theEnv,*handlerFile,&hnd->header,imageID,maxIndices,moduleCount,
ModulePrefix(ObjectCompilerData(theEnv)->ObjectCodeItem),HandlerPrefix());
fprintf(*handlerFile,",%u,%u,0,0,0,",hnd->system,hnd->type);
PrintClassReference(theEnv,*handlerFile,hnd->cls,imageID,maxIndices);
fprintf(*handlerFile,",%hu,%hu,%hu,",hnd->minParams,hnd->maxParams,hnd->localVarCount);
ExpressionToCode(theEnv,*handlerFile,hnd->actions);
fprintf(*handlerFile,"}");
}
*handlerArrayCount += theDefclass->handlerCount;
*handlerFile = CloseFileIfNeeded(theEnv,*handlerFile,handlerArrayCount,
handlerArrayVersion,maxIndices,
reopenHandlerFile,handlerCodeFile);
return true;
}
static bool OrderedHandlersToCode(
Environment *theEnv,
FILE **orderedHandlerFile,
const char *fileName,
const char *pathName,
char *fileNameBuffer,
unsigned int fileID,
unsigned int imageID,
FILE *headerFP,
unsigned int *fileCount,
unsigned int maxIndices,
Defclass *theDefclass,
unsigned int *orderedHandlerArrayVersion,
unsigned int *orderedHandlerArrayCount,
bool *reopenOrderedHandlerFile,
struct CodeGeneratorFile *orderedHandlerCodeFile)
{
long i;
if (theDefclass->handlerCount == 0)
return true;
*orderedHandlerFile = OpenFileIfNeeded(theEnv,*orderedHandlerFile,fileName,pathName,fileNameBuffer,fileID,
imageID,fileCount,
*orderedHandlerArrayVersion,headerFP,
"unsigned",OrderedHandlerPrefix(),
*reopenOrderedHandlerFile,
orderedHandlerCodeFile);
if (*orderedHandlerFile == NULL)
return false;
for (i = 0 ; i < theDefclass->handlerCount ; i++)
{
if (i > 0)
fprintf(*orderedHandlerFile,",");
fprintf(*orderedHandlerFile,"%u",theDefclass->handlerOrderMap[i]);
}
*orderedHandlerArrayCount += theDefclass->handlerCount;
*orderedHandlerFile = CloseFileIfNeeded(theEnv,*orderedHandlerFile,orderedHandlerArrayCount,
orderedHandlerArrayVersion,maxIndices,
reopenOrderedHandlerFile,
orderedHandlerCodeFile);
return true;
}
#endif