| 1 | /* |
| 2 | * This Source Code Form is subject to the terms of the Mozilla Public |
| 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| 5 | * |
| 6 | * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V. |
| 7 | */ |
| 8 | |
| 9 | #ifndef _MAL_INSTR_H |
| 10 | #define _MAL_INSTR_H |
| 11 | |
| 12 | #include "mal_type.h" |
| 13 | #include "mal_stack.h" |
| 14 | #include "mal_namespace.h" |
| 15 | |
| 16 | #define isaSignature(P) ((P)->token >=COMMANDsymbol) |
| 17 | |
| 18 | #ifdef HAVE_SYS_TIMES_H |
| 19 | # include <sys/times.h> |
| 20 | #endif |
| 21 | |
| 22 | #define DEBUG_MAL_INSTR |
| 23 | /* #define DEBUG_REDUCE */ |
| 24 | #define MAXARG 8 /* was 4 BEWARE the code depends on this knowledge, where? */ |
| 25 | #define STMT_INCREMENT 4 |
| 26 | #define MAL_VAR_WINDOW 32 |
| 27 | #define MAXLISTING (64*1024) |
| 28 | |
| 29 | /* Allocation of space assumes a rather exotic number of |
| 30 | * arguments. Access to module and function name are cast in macros to |
| 31 | * prepare for separate name space management. */ |
| 32 | #define getModuleId(P) (P)->modname |
| 33 | #define setModuleId(P,S) (P)->modname= S |
| 34 | #define setModuleScope(P,S) do {(P)->modname= (S)==NULL?NULL: (S)->name;} while (0) |
| 35 | |
| 36 | #define getFunctionId(P) (P)->fcnname |
| 37 | #define setFunctionId(P,S) (P)->fcnname= S |
| 38 | #define garbageControl(P) ((P)->gc & GARBAGECONTROL) |
| 39 | |
| 40 | #define getInstrPtr(M,I) (M)->stmt[I] |
| 41 | #define getSignature(S) getInstrPtr((S)->def,0) |
| 42 | #define isMain(M) ((getInstrPtr(M,0))->fcnname== putName("main",4)) |
| 43 | #define getFcnName(M) getFunctionId(getInstrPtr(M,0)) |
| 44 | #define getArgCount(M) getInstrPtr(M,0)->argc |
| 45 | #define getModName(M) getModuleId(getInstrPtr(M,0)) |
| 46 | #define getPrgSize(M) (M)->stop |
| 47 | |
| 48 | #define getVar(M,I) (&(M)->var[I]) |
| 49 | #define getVarType(M,I) ((M)->var[I].type) |
| 50 | #define getVarName(M,I) ((M)->var[I].id) |
| 51 | #define getVarGDKType(M,I) getGDKType((M)->var[I].type) |
| 52 | #define setVarType(M,I,V) (M)->var[I].type = V |
| 53 | |
| 54 | #define clrVarFixed(M,I) ((M)->var[I].fixedtype = 0) |
| 55 | #define setVarFixed(M,I) ((M)->var[I].fixedtype =1) |
| 56 | #define isVarFixed(M,I) ((M)->var[I].fixedtype) |
| 57 | |
| 58 | #define clrVarCleanup(M,I) ((M)->var[I].cleanup = 0) |
| 59 | #define setVarCleanup(M,I) ((M)->var[I].cleanup = 1) |
| 60 | #define isVarCleanup(M,I) ((M)->var[I].cleanup ) |
| 61 | |
| 62 | #define isTmpVar(M,I) (*getVarName(M,I) == REFMARKER && *(getVarName(M,I)+1) == TMPMARKER) |
| 63 | |
| 64 | #define clrVarUsed(M,I) ((M)->var[I].used = 0) |
| 65 | #define setVarUsed(M,I) ((M)->var[I].used = 1) |
| 66 | #define isVarUsed(M,I) ((M)->var[I].used) |
| 67 | |
| 68 | #define clrVarDisabled(M,I) ((M)->var[I].disabled= 0 ) |
| 69 | #define setVarDisabled(M,I) ((M)->var[I].disabled = 1) |
| 70 | #define isVarDisabled(M,I) ((M)->var[I].disabled) |
| 71 | |
| 72 | #define clrVarInit(M,I) ((M)->var[I].initialized = 0) |
| 73 | #define setVarInit(M,I) ((M)->var[I].initialized = 1) |
| 74 | #define isVarInit(M,I) ((M)->var[I].initialized) |
| 75 | |
| 76 | #define clrVarTypedef(M,I) ((M)->var[I].typevar = 0) |
| 77 | #define setVarTypedef(M,I) ((M)->var[I].typevar = 1) |
| 78 | #define isVarTypedef(M,I) ((M)->var[I].typevar) |
| 79 | |
| 80 | #define clrVarUDFtype(M,I) ((M)->var[I].udftype = 0) |
| 81 | #define setVarUDFtype(M,I) ((M)->var[I].udftype = 1) |
| 82 | #define isVarUDFtype(M,I) ((M)->var[I].udftype) |
| 83 | |
| 84 | #define clrVarConstant(M,I) ((M)->var[I].constant = 0) |
| 85 | #define setVarConstant(M,I) ((M)->var[I].constant = 1) |
| 86 | #define isVarConstant(M,I) ((M)->var[I].constant) |
| 87 | |
| 88 | #define setVarDeclared(M,I,X) ((M)->var[I].declared = X ) |
| 89 | #define getVarDeclared(M,I) ((M)->var[I].declared) |
| 90 | |
| 91 | #define setVarUpdated(M,I,X) ((M)->var[I].updated = X ) |
| 92 | #define getVarUpdated(M,I) ((M)->var[I].updated) |
| 93 | |
| 94 | #define setVarEolife(M,I,X) ((M)->var[I].eolife = X ) |
| 95 | #define getVarEolife(M,I) ((M)->var[I].eolife) |
| 96 | |
| 97 | #define setVarWorker(M,I,S) ((M)->var[I].worker = S) |
| 98 | #define getVarWorker(M,I) ((M)->var[I].worker) |
| 99 | |
| 100 | #define setVarScope(M,I,S) ((M)->var[I].depth = S) |
| 101 | #define getVarScope(M,I) ((M)->var[I].depth) |
| 102 | |
| 103 | #define clrVarCList(M,I) ((M)->var[I].id[0]= REFMARKER) |
| 104 | #define setVarCList(M,I) ((M)->var[I].id[0]= REFMARKERC) |
| 105 | #define isVarCList(M,I) ((M)->var[I].id[0] == REFMARKERC) |
| 106 | |
| 107 | #define getVarConstant(M,I) ((M)->var[I].value) |
| 108 | #define getVarValue(M,I) VALget(&(M)->var[I].value) |
| 109 | |
| 110 | #define setRowCnt(M,I,C) (M)->var[I].rowcnt = C |
| 111 | #define getRowCnt(M,I) ((M)->var[I].rowcnt) |
| 112 | |
| 113 | #define setMitosisPartition(P,C) (P)->mitosis = C |
| 114 | #define getMitosisPartition(P) ((P)->mitosis) |
| 115 | |
| 116 | #define getVarSTC(M,I) ((M)->var[I].stc) |
| 117 | |
| 118 | #define getDestVar(P) (P)->argv[0] |
| 119 | #define setDestVar(P,X) (P)->argv[0] =X |
| 120 | #define setDestType(M,P,V) setVarType((M),getDestVar(P),V) |
| 121 | #define getDestType(M,P) destinationType((M),(P)) |
| 122 | #define getArg(P,I) (P)->argv[I] |
| 123 | #define setArg(P,I,R) (P)->argv[I]= R |
| 124 | #define getArgName(M,P,I) getVarName((M),(P)->argv[I]) |
| 125 | #define getArgType(M,P,I) getVarType((M),(P)->argv[I]) |
| 126 | #define getArgGDKType(M,P,I) getVarGDKType((M),(P)->argv[I]) |
| 127 | #define getGDKType(T) ( T <= TYPE_str ? T : (T == TYPE_any ? TYPE_void : findGDKtype(T))) |
| 128 | |
| 129 | mal_export void addMalException(MalBlkPtr mb, str msg); |
| 130 | mal_export void mal_instruction_reset(void); |
| 131 | mal_export InstrPtr newInstruction(MalBlkPtr mb, str modnme, str fcnnme); |
| 132 | mal_export InstrPtr newInstructionArgs(MalBlkPtr mb, str modnme, str fcnnme, int args); |
| 133 | mal_export InstrPtr copyInstruction(InstrPtr p); |
| 134 | mal_export void oldmoveInstruction(InstrPtr dst, InstrPtr src); |
| 135 | mal_export void clrInstruction(InstrPtr p); |
| 136 | mal_export void freeInstruction(InstrPtr p); |
| 137 | mal_export void clrFunction(InstrPtr p); |
| 138 | mal_export Symbol newSymbol(str nme, int kind); |
| 139 | mal_export void freeSymbol(Symbol s); |
| 140 | mal_export void freeSymbolList(Symbol s); |
| 141 | mal_export void printSignature(stream *fd, Symbol s, int flg); |
| 142 | |
| 143 | mal_export MalBlkPtr newMalBlk(int elements); |
| 144 | mal_export void resetMalBlk(MalBlkPtr mb, int stop); |
| 145 | mal_export void resetMalBlkAndFreeInstructions(MalBlkPtr mb, int stop); |
| 146 | mal_export int newMalBlkStmt(MalBlkPtr mb, int elements); |
| 147 | mal_export int resizeMalBlk(MalBlkPtr mb, int elements); |
| 148 | mal_export int prepareMalBlk(MalBlkPtr mb, str s); |
| 149 | mal_export void freeMalBlk(MalBlkPtr mb); |
| 150 | mal_export MalBlkPtr copyMalBlk(MalBlkPtr mb); |
| 151 | mal_export void addtoMalBlkHistory(MalBlkPtr mb); |
| 152 | mal_export MalBlkPtr getMalBlkHistory(MalBlkPtr mb, int idx); |
| 153 | mal_export MalBlkPtr getMalBlkOptimized(MalBlkPtr mb, str name); |
| 154 | mal_export void trimMalVariables(MalBlkPtr mb, MalStkPtr stk); |
| 155 | mal_export void trimMalVariables_(MalBlkPtr mb, MalStkPtr glb); |
| 156 | mal_export void moveInstruction(MalBlkPtr mb, int pc, int target); |
| 157 | mal_export void removeInstruction(MalBlkPtr mb, InstrPtr p); |
| 158 | mal_export void removeInstructionBlock(MalBlkPtr mb, int pc, int cnt); |
| 159 | mal_export str operatorName(int i); |
| 160 | |
| 161 | mal_export int findVariable(MalBlkPtr mb, const char *name); |
| 162 | mal_export int findVariableLength(MalBlkPtr mb, str name, int len); |
| 163 | mal_export malType getType(MalBlkPtr mb, str nme); |
| 164 | mal_export str getArgDefault(MalBlkPtr mb, InstrPtr p, int idx); |
| 165 | mal_export int newVariable(MalBlkPtr mb, const char *name, size_t len, malType type); |
| 166 | mal_export int cloneVariable(MalBlkPtr dst, MalBlkPtr src, int varid); |
| 167 | /* generate a new variable name based on a pattern with 1 %d argument |
| 168 | * -- not used, but this is how to do it */ |
| 169 | /* #define renameVariable(mb, id, pattern, newid) snprintf(getVarName(mb,id),IDLENGTH,pattern,newid) */ |
| 170 | mal_export int newTmpVariable(MalBlkPtr mb, malType type); |
| 171 | mal_export int newTypeVariable(MalBlkPtr mb, malType type); |
| 172 | mal_export void freeVariable(MalBlkPtr mb, int varid); |
| 173 | mal_export void clearVariable(MalBlkPtr mb, int varid); |
| 174 | mal_export int cpyConstant(MalBlkPtr mb, VarPtr vr); |
| 175 | mal_export int defConstant(MalBlkPtr mb, int type, ValPtr cst); |
| 176 | mal_export int fndConstant(MalBlkPtr mb, const ValRecord *cst, int depth); |
| 177 | mal_export str convertConstant(malType type, ValPtr vr); |
| 178 | |
| 179 | mal_export void pushInstruction(MalBlkPtr mb, InstrPtr p); |
| 180 | mal_export InstrPtr pushArgument(MalBlkPtr mb, InstrPtr p, int varid); |
| 181 | mal_export InstrPtr setArgument(MalBlkPtr mb, InstrPtr p, int idx, int varid); |
| 182 | mal_export InstrPtr pushReturn(MalBlkPtr mb, InstrPtr p, int varid); |
| 183 | mal_export InstrPtr pushArgumentId(MalBlkPtr mb, InstrPtr p, const char *name); |
| 184 | mal_export void delArgument(InstrPtr p, int varid); |
| 185 | mal_export void setArgType(MalBlkPtr mb, InstrPtr p, int i, int tpe); |
| 186 | mal_export void setReturnArgument(InstrPtr p, int varid); |
| 187 | mal_export malType destinationType(MalBlkPtr mb, InstrPtr p); |
| 188 | mal_export void setPolymorphic(InstrPtr p, int tpe, int force); |
| 189 | /* Utility macros to inspect an instruction */ |
| 190 | #define functionStart(X) ((X)->token == FUNCTIONsymbol || \ |
| 191 | (X)->token == COMMANDsymbol || \ |
| 192 | (X)->token == FACTORYsymbol ) |
| 193 | #define patternStart(X) ((X)->token == PATTERNsymbol) |
| 194 | #define functionExit(X) ((X)->token == ENDsymbol) |
| 195 | |
| 196 | #define blockStart(X) ((X)->barrier && (((X)->barrier == BARRIERsymbol || \ |
| 197 | (X)->barrier == CATCHsymbol ))) |
| 198 | #define blockExit(X) ((X)->barrier == EXITsymbol) |
| 199 | #define blockReturn(X) ((X)->barrier == RETURNsymbol) |
| 200 | #define blockCntrl(X) ( (X)->barrier== LEAVEsymbol || \ |
| 201 | (X)->barrier== REDOsymbol || (X)->barrier== RETURNsymbol ) |
| 202 | #define isLinearFlow(X) (!(blockStart(X) || blockExit(X) || \ |
| 203 | (X)->barrier== LEAVEsymbol || (X)->barrier== REDOsymbol )) |
| 204 | |
| 205 | mal_export void strBeforeCall(ValPtr v, ValPtr bak); |
| 206 | mal_export void strAfterCall(ValPtr v, ValPtr bak); |
| 207 | mal_export void batBeforeCall(ValPtr v, ValPtr bak); |
| 208 | mal_export void batAfterCall(ValPtr v, ValPtr bak); |
| 209 | #endif /* _MAL_INSTR_H */ |
| 210 | |