/**************************************************************************** ** *FObjLVar(<lvar>)................valueofalocalvariable ** **'ObjLVar'returnsthevalueofthelocalvariable<lvar>.
*/
Obj ObjLVar (
UInt lvar )
{
Obj val; // value result
val = OBJ_LVAR(lvar); if (val == 0) {
ErrorMayQuit("Variable: '%g' must have an assigned value",
(Int)NAME_LVAR(lvar), 0);
} return val;
}
/**************************************************************************** ** *FNewLVarsBag(<slots>)..............allocateanewLVarsbag ** **'NewLVarsBag'allocatesanew'T_LVAR'bag,withthegivennumberof **localvariable<slots>.Ittriestosatisfytherequestfromapoolof **availableLVarswithupto16slots.Iftherequestcannotbesatisfied **fromapool,anewbagisallocatedinstead. ** **Thepoolsarestoredassinglelinkedlists,forwhich'PARENT_LVARS' **isabused.
*/
Bag NewLVarsBag(UInt slots)
{
Bag result; if (slots < ARRAY_SIZE(STATE(LVarsPool))) {
result = STATE(LVarsPool)[slots]; if (result) {
STATE(LVarsPool)[slots] = PARENT_LVARS(result);
CHANGED_BAG(result); return result;
}
} return NewBag(T_LVARS, sizeof(LVarsHeader) + sizeof(Obj) * slots);
}
/**************************************************************************** ** *FFreeLVarsBag(<slots>).................freeanLVarsbag ** **'FreeLVarsBag'returnsanunused'T_LVAR'bagtooneofthe'LVarsPool', **assumingitssize(resp.numberoflocalvariableslots)isnottoobig.
*/ void FreeLVarsBag(Bag bag)
{
GAP_ASSERT(TNUM_OBJ(bag) == T_LVARS);
UInt slots = (SIZE_BAG(bag) - sizeof(LVarsHeader)) / sizeof(Obj); if (slots < ARRAY_SIZE(STATE(LVarsPool))) { // clean the bag
memset(PTR_BAG(bag), 0, SIZE_BAG(bag)); // put it into the linked list of available LVars bags
LVarsHeader * hdr = (LVarsHeader *)ADDR_OBJ(bag);
hdr->parent = STATE(LVarsPool)[slots];
STATE(LVarsPool)[slots] = bag;
}
}
/**************************************************************************** ** *FExecAssLVar(<stat>).........assigntolocalvariable ** **'ExecAssLVar'executesthelocalvariableassignmentstatement<stat>to **thelocalvariablethatisreferencedin<stat>.
*/ static ExecStatus ExecAssLVar(Stat stat)
{
Obj rhs; // value of right hand side
// assign the right hand side to the local variable
rhs = EVAL_EXPR(READ_STAT(stat, 1));
ASS_LVAR(READ_STAT(stat, 0), rhs);
return STATUS_END;
}
static ExecStatus ExecUnbLVar(Stat stat)
{ // unbind the local variable
ASS_LVAR(READ_STAT(stat, 0), (Obj)0);
return STATUS_END;
}
static Obj EvalIsbLVar(Expr expr)
{
Obj val; // value, result
// get the value of the local variable
val = OBJ_LVAR(READ_EXPR(expr, 0));
// return the value return (val != (Obj)0 ? True : False);
}
void ASS_HVAR_WITH_CONTEXT(Obj context, UInt hvar, Obj val)
{ // walk up the environment chain to the correct values bag for (UInt i = 1; i <= (hvar >> MAX_FUNC_LVARS_BITS); i++) {
context = ENVI_FUNC(FUNC_LVARS(context));
}
// assign the value
ASS_LVAR_WITH_CONTEXT(context, hvar & MAX_FUNC_LVARS_MASK, val);
CHANGED_BAG(context);
}
Obj OBJ_HVAR_WITH_CONTEXT(Obj context, UInt hvar)
{ // walk up the environment chain to the correct values bag for (UInt i = 1; i <= (hvar >> MAX_FUNC_LVARS_BITS); i++) {
context = ENVI_FUNC(FUNC_LVARS(context));
}
// get the value
Obj val = OBJ_LVAR_WITH_CONTEXT(context, hvar & MAX_FUNC_LVARS_MASK);
// return the value return val;
}
Obj NAME_HVAR_WITH_CONTEXT(Obj context, UInt hvar)
{ // walk up the environment chain to the correct values bag for (UInt i = 1; i <= (hvar >> MAX_FUNC_LVARS_BITS); i++) {
context = ENVI_FUNC(FUNC_LVARS(context));
}
// get the name return NAME_LVAR_WITH_CONTEXT(context, hvar & MAX_FUNC_LVARS_MASK);
}
/**************************************************************************** ** *FExecAssHVar(<stat>)..............assigntohighervariable ** **'ExecAssHVar'executesthehighervariableassignmentstatement<stat>to **thehighervariablethatisreferencedin<stat>.
*/ static ExecStatus ExecAssHVar(Stat stat)
{
Obj rhs; // value of right hand side
// assign the right hand side to the higher variable
rhs = EVAL_EXPR(READ_STAT(stat, 1));
ASS_HVAR(READ_STAT(stat, 0), rhs);
// get and check the value of the higher variable
val = OBJ_HVAR(hvar); if (val == 0) {
ErrorMayQuit("Variable: '%g' must have an assigned value",
(Int)NAME_HVAR(hvar), 0);
}
// return the value return val;
}
static Obj EvalIsbHVar(Expr expr)
{
Obj val; // value, result
// get the value of the higher variable
val = OBJ_HVAR(READ_EXPR(expr, 0));
// return the value return (val != (Obj)0 ? True : False);
}
/**************************************************************************** ** *FExecAssGVar(<stat>).............assigntoaglobalvariable ** **'ExecAssGVar'executestheglobalvariableassignmentstatement<stat>to **theglobalvariablethatisreferencedin<stat>.
*/ static ExecStatus ExecAssGVar(Stat stat)
{
Obj rhs; // value of right hand side
// assign the right hand side to the global variable
rhs = EVAL_EXPR(READ_STAT(stat, 1));
AssGVar(READ_STAT(stat, 0), rhs);
return STATUS_END;
}
static ExecStatus ExecUnbGVar(Stat stat)
{ // unbind the global variable
AssGVar(READ_STAT(stat, 0), (Obj)0);
// get and check the value of the global variable
val = ValAutoGVar(READ_EXPR(expr, 0)); if (val == 0) {
ErrorMayQuit("Variable: '%g' must have an assigned value",
(Int)NameGVar(READ_EXPR(expr, 0)), 0);
}
// return the value return val;
}
static Obj EvalIsbGVar(Expr expr)
{
Obj val; // value, result
// get the value of the global variable
val = ValAutoGVar(READ_EXPR(expr, 0));
// return the value return (val != (Obj)0 ? True : False);
}
/**************************************************************************** ** *FExecAssList(<ass>)...........assigntoanelementofalist ** **'ExecAssList'executesthelistassignmentstatement<stat>oftheform **'<list>[<position>]:=<rhs>;'.
*/ static ExecStatus ExecAssList(Expr stat)
{
Obj list; // list, left operand
Obj pos; // position, left operand Int p; // position, as C integer
Obj rhs; // right hand side, right operand
// evaluate the list (checking is done by 'ASS_LIST')
list = EVAL_EXPR(READ_STAT(stat, 0));
// evaluate the position
pos = EVAL_EXPR(READ_STAT(stat, 1));
// evaluate the right hand side
rhs = EVAL_EXPR(READ_STAT(stat, 2));
if (IS_POS_INTOBJ(pos)) {
p = INT_INTOBJ(pos);
// special case for plain list if ( TNUM_OBJ(list) == T_PLIST ) { if ( LEN_PLIST(list) < p ) {
GROW_PLIST( list, p );
SET_LEN_PLIST( list, p );
}
SET_ELM_PLIST( list, p, rhs );
CHANGED_BAG( list );
}
return STATUS_END;
} /**************************************************************************** ** *FExecAssMat(<ass>)...........assigntoanelementofamatrix ** **'ExecAssMat'executesthematrixassignmentstatement<stat>oftheform **'<mat>[<row>,<col>]:=<rhs>;'.
*/ static ExecStatus ExecAssMat(Expr stat)
{ // evaluate the matrix (checking is done by 'ASS_MAT')
Obj mat = EVAL_EXPR(READ_STAT(stat, 0));
// evaluate and check the row and column
Obj row = EVAL_EXPR(READ_STAT(stat, 1));
Obj col = EVAL_EXPR(READ_STAT(stat, 2));
// evaluate the right hand side
Obj rhs = EVAL_EXPR(READ_STAT(stat, 3));
ASS_MAT(mat, row, col, rhs);
return STATUS_END;
}
/**************************************************************************** ** *FExecAsssList(<stat>)........assigntoseveralelementsofalist ** **'ExecAsssList'executesthelistassignmentstatement<stat>oftheform **'<list>{<positions>}:=<rhss>;'.
*/ static ExecStatus ExecAsssList(Expr stat)
{
Obj list; // list, left operand
Obj poss; // positions, left operand
Obj rhss; // right hand sides, right operand
// evaluate the list (checking is done by 'ASSS_LIST')
list = EVAL_EXPR(READ_STAT(stat, 0));
// evaluate and check the positions
poss = EVAL_EXPR(READ_STAT(stat, 1));
CheckIsPossList("List Assignments", poss);
// evaluate and check right hand sides
rhss = EVAL_EXPR(READ_STAT(stat, 2));
RequireDenseList("List Assignments", rhss);
RequireSameLength("List Assignments", rhss, poss);
// assign the right hand sides to several elements of the list
ASSS_LIST( list, poss, rhss );
return STATUS_END;
}
/**************************************************************************** ** *FExecAssListLevel(<stat>)......assigntoelementsofseverallists ** **'ExecAssListLevel'executesthelistassignmentstatement<stat>ofthe **form'<list>...{<positions>}...[<position>]:=<rhss>;',wheretheremay **actuallybeseveral'{<positions>}'selectionsbetween<list>and **'[<position>]'.Thenumberofthoseiscalledthelevel. **'ExecAssListLevel'goesthatdeepintotheleftoperandand<rhss>and **assignsthevaluesfrom<rhss>toeachofthoselists.Forexample,if **thelevelis1,theleftoperandmustbealistoflists,<rhss>mustbe **alist,and'ExecAssListLevel'assignstheelement'<rhss>[<i>]'tothe **list'<list>[<i>]'at<position>.
*/ static ExecStatus ExecAssListLevel(Expr stat)
{
Obj lists; // lists, left operand
Obj pos; // position, left operand
Obj rhss; // right hand sides, right operand
UInt level; // level Int narg,i;
Obj ixs;
// evaluate lists (if this works, then <lists> is nested <level> deep, // checking it is nested <level>+1 deep is done by 'AssListLevel')
lists = EVAL_EXPR(READ_STAT(stat, 0));
narg = SIZE_STAT(stat)/sizeof(Stat) -3;
ixs = NEW_PLIST(T_PLIST, narg); for (i = 1; i <= narg; i++) {
pos = EVAL_EXPR(READ_STAT(stat, i));
SET_ELM_PLIST(ixs, i, pos);
CHANGED_BAG(ixs);
}
SET_LEN_PLIST(ixs, narg);
// evaluate right hand sides (checking is done by 'AssListLevel')
rhss = EVAL_EXPR(READ_STAT(stat, narg + 1));
// get the level
level = READ_STAT(stat, narg + 2);
// assign the right hand sides to the elements of several lists
AssListLevel( lists, ixs, rhss, level );
return STATUS_END;
}
/**************************************************************************** ** *FExecAsssListLevel(<stat>)..assigntoseveralelementsofseverallists ** **'ExecAsssListLevel'executesthelistassignmentstatement<stat>ofthe **form'<list>...{<positions>}...{<positions>}:=<rhss>;',wheretheremay **actuallybeseveral'{<positions>}'selectionsbetween<list>and **'{<positions>}'.Thenumberofthoseiscalledthelevel. **'ExecAsssListLevel'goesthatdeepintotheleftoperandand<rhss>and **assignsthesublistsfrom<rhss>toeachofthoselists.Forexample,if **thelevelis1,theleftoperandmustbealistoflists,<rhss>mustbe **alist,and'ExecAsssListLevel'assignstheelements'<rhss>[<i>]'tothe **list'<list>[<i>]'atthepositions<positions>.
*/ static ExecStatus ExecAsssListLevel(Expr stat)
{
Obj lists; // lists, left operand
Obj poss; // position, left operand
Obj rhss; // right hand sides, right operand
UInt level; // level
// evaluate lists (if this works, then <lists> is nested <level> deep, // checking it is nested <level>+1 deep is done by 'AsssListLevel')
lists = EVAL_EXPR(READ_STAT(stat, 0));
// evaluate and check the positions
poss = EVAL_EXPR(READ_EXPR(stat, 1));
CheckIsPossList("List Assignments", poss);
// evaluate right hand sides (checking is done by 'AsssListLevel')
rhss = EVAL_EXPR(READ_STAT(stat, 2));
// get the level
level = READ_STAT(stat, 3);
// assign the right hand sides to several elements of several lists
AsssListLevel( lists, poss, rhss, level );
return STATUS_END;
}
/**************************************************************************** ** *FExecUnbList(<ass>).............unbindanelementofalist ** **'ExecUnbList'executesthelistunbindstatement<stat>oftheform **'Unbind(<list>[<position>]);'.
*/ static ExecStatus ExecUnbList(Expr stat)
{
Obj list; // list, left operand
Obj pos; // position, left operand
Obj ixs; Int narg; Int i;
// evaluate the list (checking is done by 'UNB_LIST')
list = EVAL_EXPR(READ_STAT(stat, 0));
narg = SIZE_STAT(stat)/sizeof(Stat) - 1; if (narg == 1) {
pos = EVAL_EXPR( READ_STAT(stat, 1) ); // unbind the element if (IS_POS_INTOBJ(pos)) {
UNB_LIST( list, INT_INTOBJ(pos) );
} else {
UNBB_LIST( list, pos );
}
} else {
ixs = NEW_PLIST(T_PLIST, narg); for (i = 1; i <= narg; i++) { // evaluate the position
pos = EVAL_EXPR(READ_STAT(stat, i));
SET_ELM_PLIST(ixs,i,pos);
CHANGED_BAG(ixs);
}
SET_LEN_PLIST(ixs, narg);
UNBB_LIST(list, ixs);
}
return STATUS_END;
}
/**************************************************************************** ** *FEvalElmList(<expr>).............selectanelementofalist ** **'EvalElmList'evaluatesthelistelementexpression<expr>oftheform **'<list>[<position>]'.
*/ static Obj EvalElmList(Expr expr)
{
Obj elm; // element, result
Obj list; // list, left operand
Obj pos; // position, right operand Int p; // position, as C integer
// evaluate the list (checking is done by 'ELM_LIST')
list = EVAL_EXPR(READ_EXPR(expr, 0));
// evaluate and check the position
pos = EVAL_EXPR(READ_EXPR(expr, 1));
if (IS_POS_INTOBJ(pos)) {
p = INT_INTOBJ( pos );
// special case for plain lists (use generic code to signal errors) if ( IS_PLIST( list ) ) { if ( LEN_PLIST(list) < p ) { return ELM_LIST( list, p );
}
elm = ELM_PLIST( list, p ); if ( elm == 0 ) { return ELM_LIST( list, p );
}
} // generic case else {
elm = ELM_LIST( list, p );
}
} else {
elm = ELMB_LIST(list, pos);
}
// return the element return elm;
}
/**************************************************************************** ** *FEvalElmMat(<expr>)............selectanelementofamatrix ** **'EvalElmMat'evaluatesthematrixelementexpression<expr>oftheform **'<mat>[<row>,<col>]'.
*/ static Obj EvalElmMat(Expr expr)
{ // evaluate the matrix (checking is done by 'ELM_MAT')
Obj mat = EVAL_EXPR(READ_EXPR(expr, 0));
// evaluate and check the row and column
Obj row = EVAL_EXPR(READ_EXPR(expr, 1));
Obj col = EVAL_EXPR(READ_EXPR(expr, 2));
// return the element return ELM_MAT(mat, row, col);
}
/**************************************************************************** ** *FEvalElmsList(<expr>).........selectseveralelementsofalist ** **'EvalElmsList'evaluatesthelistelementexpression<expr>oftheform **'<list>{<positions>}'.
*/ static Obj EvalElmsList(Expr expr)
{
Obj elms; // elements, result
Obj list; // list, left operand
Obj poss; // positions, right operand
// evaluate the list (checking is done by 'ELMS_LIST')
list = EVAL_EXPR(READ_EXPR(expr, 0));
// evaluate and check the positions
poss = EVAL_EXPR(READ_EXPR(expr, 1));
CheckIsPossList("List Elements", poss);
// select several elements from the list
elms = ELMS_LIST( list, poss );
// return the elements return elms;
}
/**************************************************************************** ** *FEvalElmListLevel(<expr>).......selectelementsofseverallists ** **'EvalElmListLevel'evaluatesthelistelementexpression<expr>ofthe **form'<list>...{<positions>}...[<position>]',wheretheremayactuallybe **several'{<positions>}'selectionsbetween<list>and'[<position>]'. **Thenumberofthoseiscalledthelevel.'EvalElmListLevel'goesthat **deepintotheleftoperandandselectstheelementat<position>from **eachofthoselists.Forexample,ifthelevelis1,theleftoperand **mustbealistoflistsand'EvalElmListLevel'selectstheelementat **<position>fromeachofthelistsandreturnsthelistofthosevalues.
*/ static Obj EvalElmListLevel(Expr expr)
{
Obj lists; // lists, left operand
Obj pos; // position, right operand
Obj ixs;
UInt level; // level Int narg; Int i;
// evaluate lists (if this works, then <lists> is nested <level> deep, // checking it is nested <level>+1 deep is done by 'ElmListLevel')
lists = EVAL_EXPR(READ_EXPR(expr, 0));
narg = SIZE_EXPR(expr)/sizeof(Expr) -2;
ixs = NEW_PLIST(T_PLIST, narg); for (i = 1; i <= narg; i++) {
pos = EVAL_EXPR( READ_EXPR(expr, i));
SET_ELM_PLIST(ixs, i, pos);
CHANGED_BAG(ixs);
}
SET_LEN_PLIST(ixs, narg); // get the level
level = READ_EXPR(expr, narg + 1);
// select the elements from several lists (store them in <lists>)
ElmListLevel( lists, ixs, level );
// evaluate lists (if this works, then <lists> is nested <level> deep, // checking it is nested <level>+1 deep is done by 'ElmsListLevel')
lists = EVAL_EXPR(READ_EXPR(expr, 0));
// evaluate and check the positions
poss = EVAL_EXPR(READ_EXPR(expr, 1));
CheckIsPossList("List Elements", poss);
// get the level
level = READ_EXPR(expr, 2);
// select several elements from several lists (store them in <lists>)
ElmsListLevel( lists, poss, level );
// return the elements return lists;
}
/**************************************************************************** ** *FEvalIsbList(<expr>)........testifanelementofalistisbound ** **'EvalIsbList'evaluatesthelistisboundexpression<expr>oftheform **'IsBound(<list>[<position>])'.
*/ static Obj EvalIsbList(Expr expr)
{
Obj list; // list, left operand
Obj pos; // position, right operand
Obj ixs; Int narg, i;
// evaluate the list (checking is done by 'ISB_LIST')
list = EVAL_EXPR(READ_EXPR(expr, 0));
narg = SIZE_EXPR(expr)/sizeof(Expr) -1; if (narg == 1) { // evaluate and check the position
pos = EVAL_EXPR(READ_EXPR(expr, 1));
/**************************************************************************** ** *FExecAssPosObj(<ass>).........assigntoanelementofaposobj ** **'ExecAssPosObj'executestheposobjassignmentstatement<stat>ofthe **form'<posobj>[<position>]:=<rhs>;'.
*/ static ExecStatus ExecAssPosObj(Expr stat)
{
Obj posobj; // posobj, left operand
Obj pos; // position, left operand Int p; // position, as a C integer
Obj rhs; // right hand side, right operand
// evaluate the posobj (checking is done by 'AssPosObj')
posobj = EVAL_EXPR(READ_STAT(stat, 0));
// evaluate and check the position
pos = EVAL_EXPR(READ_STAT(stat, 1));
p = GetPositiveSmallIntEx("PosObj Assignment", pos, "<position>");
// evaluate the right hand side
rhs = EVAL_EXPR(READ_STAT(stat, 2));
// special case for plain posobj
AssPosObj(posobj, p, rhs);
return STATUS_END;
}
/**************************************************************************** ** *FExecUnbPosObj(<ass>)...........unbindanelementofaposobj ** **'ExecUnbPosObj'executestheposobjunbindstatement<stat>oftheform **'Unbind(<posobj>[<position>]);'.
*/ static ExecStatus ExecUnbPosObj(Expr stat)
{
Obj posobj; // posobj, left operand
Obj pos; // position, left operand Int p; // position, as a C integer
// evaluate the posobj (checking is done by 'UnbPosObj')
posobj = EVAL_EXPR(READ_STAT(stat, 0));
// evaluate and check the position
pos = EVAL_EXPR(READ_STAT(stat, 1));
p = GetPositiveSmallIntEx("PosObj Assignment", pos, "<position>");
// unbind the element
UnbPosObj(posobj, p);
return STATUS_END;
}
/**************************************************************************** ** *FEvalElmPosObj(<expr>)...........selectanelementofaposobj ** **'EvalElmPosObj'evaluatestheposobjelementexpression<expr>ofthe **form'<posobj>[<position>]'.
*/ static Obj EvalElmPosObj(Expr expr)
{
Obj elm; // element, result
Obj posobj; // posobj, left operand
Obj pos; // position, right operand Int p; // position, as C integer
// evaluate the posobj (checking is done by 'ElmPosObj')
posobj = EVAL_EXPR(READ_EXPR(expr, 0));
// evaluate and check the position
pos = EVAL_EXPR(READ_EXPR(expr, 1));
p = GetPositiveSmallIntEx("PosObj Element", pos, "<position>");
// special case for plain posobjs (use generic code to signal errors)
elm = ElmPosObj(posobj, p);
// return the element return elm;
}
/**************************************************************************** ** *FEvalIsbPosObj(<expr>)......testifanelementofaposobjisbound ** **'EvalElmPosObj'evaluatestheposobjisboundexpression<expr>ofthe **form'IsBound(<posobj>[<position>])'.
*/ static Obj EvalIsbPosObj(Expr expr)
{
Obj isb; // isbound, result
Obj posobj; // posobj, left operand
Obj pos; // position, right operand Int p; // position, as C integer
// evaluate the posobj (checking is done by 'IsbPosObj')
posobj = EVAL_EXPR(READ_EXPR(expr, 0));
// evaluate and check the position
pos = EVAL_EXPR(READ_EXPR(expr, 1));
p = GetPositiveSmallIntEx("PosObj Element", pos, "<position>");
// get the result
isb = IsbPosObj(posobj, p) ? True : False;
static Obj FuncGetCurrentLVars(Obj self)
{ // Need to promote to High Vars, else bag will be freed when function exits
MakeHighVars(STATE(CurrLVars)); return STATE(CurrLVars);
}
staticvoid VarsBeforeCollectBags(void)
{ // As an optimization, we never call CHANGED_BAG on CurrLVars directly, // instead thus function is run just before any GC to take care of that. if (STATE(CurrLVars))
CHANGED_BAG( STATE(CurrLVars) );
}
/**************************************************************************** ** *FInitKernel(<module>)........initialisekerneldatastructures
*/ staticInt InitKernel (
StructInitInfo * module )
{ // make 'CurrLVars' known to Gasman
InitGlobalBag( &STATE(CurrLVars), "src/vars.c:CurrLVars" );
InitGlobalBag( &BottomLVars, "src/vars.c:BottomLVars" );
enum { count = ARRAY_SIZE(STATE(LVarsPool)) }; staticchar cookies[count][24]; for (int i = 0; i < count; i++) {
snprintf(cookies[i], sizeof(cookies[i]), "src/vars.c:LVarsPool%d", i);
InitGlobalBag(&STATE(LVarsPool[i]), cookies[i]);
}
// set the bag type names (for error messages and debugging)
InitBagNamesFromTable( BagNames );
// install the marking functions for local variables bag
InitMarkFuncBags( T_LVARS, MarkAllButFirstSubBags );
InitMarkFuncBags( T_HVARS, MarkAllButFirstSubBags );
#ifdef HPCGAP // Make T_LVARS bags public
MakeBagTypePublic(T_LVARS);
MakeBagTypePublic(T_HVARS); #endif
#ifdef GAP_ENABLE_SAVELOAD // and the save restore functions
SaveObjFuncs[ T_LVARS ] = SaveLVars;
LoadObjFuncs[ T_LVARS ] = LoadLVars;
SaveObjFuncs[ T_HVARS ] = SaveLVars;
LoadObjFuncs[ T_HVARS ] = LoadLVars; #endif
// and a type
TypeObjFuncs[ T_LVARS ] = TypeLVars;
TypeObjFuncs[ T_HVARS ] = TypeLVars;
PrintObjFuncs[ T_LVARS ] = PrintLVars;
PrintObjFuncs[ T_HVARS ] = PrintLVars;
// install executors, evaluators, and printers for local variables
InstallExecStatFunc( STAT_ASS_LVAR , ExecAssLVar);
InstallExecStatFunc( STAT_UNB_LVAR , ExecUnbLVar); // no EvalExprFunc for EXPR_REF_LVAR, it is handled immediately by EVAL_EXPR
InstallEvalExprFunc( EXPR_ISB_LVAR , EvalIsbLVar);
#ifdef USE_GASMAN // install before and after actions for garbage collections
RegisterBeforeCollectFuncBags(VarsBeforeCollectBags);
RegisterAfterCollectFuncBags(VarsAfterCollectBags); #endif
// init filters and functions
InitHdlrFuncsFromTable( GVarFuncs );
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.91Bemerkung:
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-10-12)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.