#ifndef Emojicode_h
#define Emojicode_h
#include "EmojicodeAPI.hpp"
#include <cstdio>
namespace Emojicode {
class ObjectVariableRecord {
public:
unsigned int variableIndex;
unsigned int condition;
ObjectVariableType type;
};
class FunctionObjectVariableRecord : public ObjectVariableRecord {
public:
int from;
int to;
};
struct BoxObjectVariableRecords {
unsigned int count;
ObjectVariableRecord *records;
};
struct Block {
EmojicodeInstruction *instructions;
unsigned int instructionCount;
};
struct Function {
int argumentCount;
int frameSize;
FunctionObjectVariableRecord *objectVariableRecords;
unsigned int objectVariableRecordsCount;
ContextType context;
Block block;
FunctionFunctionPointer handler;
};
struct ProtocolDispatchTable {
Function ***protocolsTable;
uint_fast16_t protocolsOffset;
uint_fast16_t protocolsMaxIndex;
Function* dispatch(uint_fast16_t protocolIndex, uint_fast16_t functionIndex) const {
return protocolsTable[protocolIndex - protocolsOffset][functionIndex];
}
bool conformsTo(uint_fast16_t protocolIndex) const {
if (protocolsTable == nullptr || protocolIndex < protocolsOffset || protocolIndex > protocolsMaxIndex) {
return false;
}
return protocolsTable[protocolIndex - protocolsOffset] != nullptr;
}
};
extern Class **classTable;
extern Function **functionTable;
extern ProtocolDispatchTable *protocolDispatchTableTable;
extern uint32_t protocolDTTOffset;
extern BoxObjectVariableRecords *boxObjectVariableRecordTable;
extern uint_fast16_t stringPoolCount;
extern Object **stringPool;
extern char **cliArguments;
extern int cliArgumentCount;
extern const char *packageDirectory;
struct CaptureInformation {
int size;
int destination;
};
struct Closure {
Function *function;
unsigned int captureCount;
unsigned int recordsCount;
Object *capturedVariables;
Object *capturesInformation;
Object *objectVariableRecords;
Value thisContext;
};
[[noreturn]] void error(const char *err, ...);
typedef void (*PrepareClassFunction)(Class *cl, EmojicodeChar name);
extern FunctionFunctionPointer sLinkingTable[100];
void sPrepareClass(Class *klass, EmojicodeChar name);
}
#endif