/* 'InitLibrary' sets up gvars, rnams, functions */ static Int InitLibrary ( StructInitInfo * module ) { Obj func1; Obj body1; /* Complete Copy/Fopy registration */ UpdateCopyFopyInfo(); /* global variables used in handlers */ G_IS__FUNCTION = GVarName( "IS_FUNCTION" ); G_ADD__LIST = GVarName( "ADD_LIST" ); G_Error = GVarName( "Error" ); G_IS__IDENTICAL__OBJ = GVarName( "IS_IDENTICAL_OBJ" ); G_AND__FLAGS = GVarName( "AND_FLAGS" ); G_HASH__FLAGS = GVarName( "HASH_FLAGS" ); G_IS__SUBSET__FLAGS = GVarName( "IS_SUBSET_FLAGS" ); G_TRUES__FLAGS = GVarName( "TRUES_FLAGS" ); G_FLAGS__FILTER = GVarName( "FLAGS_FILTER" ); G_LEN__LIST = GVarName( "LEN_LIST" ); G_HIDDEN__IMPS = GVarName( "HIDDEN_IMPS" ); G_WITH__HIDDEN__IMPS__FLAGS__CACHE = GVarName( "WITH_HIDDEN_IMPS_FLAGS_CACHE" ); G_WITH__HIDDEN__IMPS__FLAGS__COUNT = GVarName( "WITH_HIDDEN_IMPS_FLAGS_COUNT" ); G_WITH__HIDDEN__IMPS__FLAGS__CACHE__MISS = GVarName( "WITH_HIDDEN_IMPS_FLAGS_CACHE_MISS" ); G_WITH__HIDDEN__IMPS__FLAGS__CACHE__HIT = GVarName( "WITH_HIDDEN_IMPS_FLAGS_CACHE_HIT" ); G_CLEAR__HIDDEN__IMP__CACHE = GVarName( "CLEAR_HIDDEN_IMP_CACHE" ); G_BIND__GLOBAL = GVarName( "BIND_GLOBAL" ); G_IMPLICATIONS = GVarName( "IMPLICATIONS" ); G_WITH__IMPS__FLAGS__CACHE = GVarName( "WITH_IMPS_FLAGS_CACHE" ); G_WITH__IMPS__FLAGS__COUNT = GVarName( "WITH_IMPS_FLAGS_COUNT" ); G_WITH__IMPS__FLAGS__CACHE__HIT = GVarName( "WITH_IMPS_FLAGS_CACHE_HIT" ); G_WITH__IMPS__FLAGS__CACHE__MISS = GVarName( "WITH_IMPS_FLAGS_CACHE_MISS" ); G_CLEAR__IMP__CACHE = GVarName( "CLEAR_IMP_CACHE" ); G_UNBIND__GLOBAL = GVarName( "UNBIND_GLOBAL" ); G_WITH__HIDDEN__IMPS__FLAGS = GVarName( "WITH_HIDDEN_IMPS_FLAGS" ); G_RANK__FILTERS = GVarName( "RANK_FILTERS" ); G_RankFilter = GVarName( "RankFilter" ); G_RANK__FILTER = GVarName( "RANK_FILTER" ); G_RANK__FILTER__LIST__CURRENT = GVarName( "RANK_FILTER_LIST_CURRENT" ); G_RANK__FILTER__LIST = GVarName( "RANK_FILTER_LIST" ); G_RANK__FILTER__COUNT = GVarName( "RANK_FILTER_COUNT" ); /* record names used in handlers */ /* information for the functions */ C_NEW_STRING( DefaultName, 14, "local function" ); C_NEW_STRING( FileName, 21, "GAPROOT/lib/filter1.g" ); NameFunc[1] = DefaultName; NamsFunc[1] = 0; NargFunc[1] = 0; NameFunc[2] = DefaultName; NamsFunc[2] = 0; NargFunc[2] = 1; NameFunc[3] = DefaultName; NamsFunc[3] = 0; NargFunc[3] = 1; NameFunc[4] = DefaultName; NamsFunc[4] = 0; NargFunc[4] = 0; NameFunc[5] = DefaultName; NamsFunc[5] = 0; NargFunc[5] = 1; NameFunc[6] = DefaultName; NamsFunc[6] = 0; NargFunc[6] = 1; NameFunc[7] = DefaultName; NamsFunc[7] = 0; NargFunc[7] = 1; NameFunc[8] = DefaultName; NamsFunc[8] = 0; NargFunc[8] = 1; /* create all the functions defined in this module */ func1 = NewFunction(NameFunc[1],NargFunc[1],NamsFunc[1],HdlrFunc1); ENVI_FUNC( func1 ) = TLS(CurrLVars); CHANGED_BAG( TLS(CurrLVars) ); body1 = NewBag( T_BODY, NUMBER_HEADER_ITEMS_BODY*sizeof(Obj)); BODY_FUNC( func1 ) = body1; CHANGED_BAG( func1 ); CALL_0ARGS( func1 ); /* return success */ return 0; }
void YpFunc(int isMain, int eol) { long codeSize, i, pc; Function *parsedFunc= 0; DataBlock *oldDB; Symbol *cTable; if (!eol || ypErrors) { if (!eol) YpError("garbage after func or struct definition"); ClearParser((void *)0); return; } if (isMain && nextPC==0) return; /* NOTE- if stackDepth!=0 here, there is a bug in the parser... (unless a previous error involving matrix multiplication?) */ if (previousOp!=&Return) YpReturn(NONE); if (isMain) nLocal= 0; /* end of function marked by code.Action==&Return followed by code.Action==0, followed by code.index==codeSize to enable error recovery to find beginning of function */ if (CheckCodeSpace(2)) { ClearParser((void *)0); return; } vmCode[nextPC++].Action= previousOp= 0; vmCode[nextPC].index= codeSize= 1+nPos+(hasPosList&1)+nKey+nLocal+ nextPC; nextPC++; /* fill in all forward-referenced goto targets */ if (nTarget) { YpError("missing goto label at end of func"); ClearParser((void *)0); return; } for (i=0 ; i<nGotoTargets ; i++) { pc= gotoTargets[i]; SetBranchTarget(pc, (literalTypes[vmCode[pc].index]>>3)); } nGotoTargets= 0; /* shorten constant table to its final size */ if (nConstants) { constantTable= p_realloc(constantTable, nConstants*sizeof(Symbol)); maxConstants= nConstants; } /* fill in all references to constants */ if (!reparsing) cTable= constantTable; else cTable= reparsing->constantTable; for (i=0 ; i<nConstantRefs ; i++) { pc= constantRefs[i]; vmCode[pc].constant= cTable+vmCode[pc].index; } nConstantRefs= 0; /* locate or create all referenced variable names in globTab -- reuse literalTypes array to hold globTab index */ if (CheckCodeSpace(1+nPos+(hasPosList&1)+nKey+nLocal)) { ClearParser((void *)0); return; } if (isMain) { for (i=0 ; i<literalTable.nItems ; i++) if (literalTypes[i]&(L_REFERENCE|L_LOCAL)) literalTypes[i]= Globalize(literalTable.names[i], 0L); vmCode[nextPC++].index= Globalize(isMain==1? "*main*" : literalTable.names[0], 0L); } else { for (i=0 ; i<literalTable.nItems ; i++) { /* Note that function name is first, then positional parameters, then optional *va* parameter, then keyword parameters. */ if (literalTypes[i]&(L_REFERENCE|L_LOCAL)) { if ((literalTypes[i]&(L_REFERENCE|L_LOCAL)) == (L_REFERENCE|L_LOCAL)) vmCode[nextPC++].index= literalTypes[i]= Globalize(literalTable.names[i], 0L); else literalTypes[i]= Globalize(literalTable.names[i], 0L); } } } /* fill in all references to variables */ for (i=0 ; i<nVariableRefs ; i++) { pc= variableRefs[i]; vmCode[pc].index= literalTypes[vmCode[pc].index]; } nVariableRefs= 0; /* done with literal table */ HashClear(&literalTable); /* sets literalTable.maxItems==0 */ p_free(literalTypes); literalTypes= 0; if (!reparsing) parsedFunc= NewFunction(constantTable, nConstants, nPos, nKey, nLocal, hasPosList, maxStackDepth, vmCode, codeSize); else ypReMatch= YpReCompare(reparsing, constantTable, nConstants, nPos, nKey, nLocal, hasPosList, maxStackDepth, vmCode, codeSize); nConstants= maxConstants= 0; constantTable= 0; if (reparsing) return; i= parsedFunc->code[0].index; oldDB= globTab[i].value.db; globTab[i].value.db= (DataBlock *)parsedFunc; if (globTab[i].ops==&dataBlockSym) { Unref(oldDB); } else globTab[i].ops= &dataBlockSym; /* A main function must be pushed onto the stack here; anything else (func or struct definitions) is recorded in the sourceList for the current include file (see also YpExtern). */ if (isMain) PushTask(parsedFunc); else parsedFunc->isrc = RecordSource(i); }
/* handler for function 1 */ static Obj HdlrFunc1 ( Obj self ) { Obj t_1 = 0; Obj t_2 = 0; Bag oldFrame; /* allocate new stack frame */ SWITCH_TO_NEW_FRAME(self,0,0,oldFrame); /* f1 := function ( a ) Print( "f1:", a, "\n" ); return; end; */ t_1 = NewFunction( NameFunc[2], 1, 0, HdlrFunc2 ); SET_ENVI_FUNC( t_1, STATE(CurrLVars) ); t_2 = NewBag( T_BODY, sizeof(BodyHeader) ); SET_STARTLINE_BODY(t_2, 1); SET_ENDLINE_BODY(t_2, 3); SET_FILENAME_BODY(t_2, FileName); SET_BODY_FUNC(t_1, t_2); CHANGED_BAG( STATE(CurrLVars) ); AssGVar( G_f1, t_1 ); /* f2 := function ( a, b ) Print( "f2:", a, ":", b, "\n" ); return; end; */ t_1 = NewFunction( NameFunc[3], 2, 0, HdlrFunc3 ); SET_ENVI_FUNC( t_1, STATE(CurrLVars) ); t_2 = NewBag( T_BODY, sizeof(BodyHeader) ); SET_STARTLINE_BODY(t_2, 5); SET_ENDLINE_BODY(t_2, 7); SET_FILENAME_BODY(t_2, FileName); SET_BODY_FUNC(t_1, t_2); CHANGED_BAG( STATE(CurrLVars) ); AssGVar( G_f2, t_1 ); /* f3 := function ( a... ) Print( "f3:", a, "\n" ); return; end; */ t_1 = NewFunction( NameFunc[4], -1, 0, HdlrFunc4 ); SET_ENVI_FUNC( t_1, STATE(CurrLVars) ); t_2 = NewBag( T_BODY, sizeof(BodyHeader) ); SET_STARTLINE_BODY(t_2, 9); SET_ENDLINE_BODY(t_2, 11); SET_FILENAME_BODY(t_2, FileName); SET_BODY_FUNC(t_1, t_2); CHANGED_BAG( STATE(CurrLVars) ); AssGVar( G_f3, t_1 ); /* f4 := function ( a, b... ) Print( "f4:", a, ":", b, "\n" ); return; end; */ t_1 = NewFunction( NameFunc[5], -2, 0, HdlrFunc5 ); SET_ENVI_FUNC( t_1, STATE(CurrLVars) ); t_2 = NewBag( T_BODY, sizeof(BodyHeader) ); SET_STARTLINE_BODY(t_2, 13); SET_ENDLINE_BODY(t_2, 15); SET_FILENAME_BODY(t_2, FileName); SET_BODY_FUNC(t_1, t_2); CHANGED_BAG( STATE(CurrLVars) ); AssGVar( G_f4, t_1 ); /* runtest := function ( ) f1( 2 ); f2( 2, 3 ); f3( ); f3( 2 ); f3( 2, 3, 4 ); f4( 1 ); f4( 1, 2 ); f4( 1, 2, 3 ); return; end; */ t_1 = NewFunction( NameFunc[6], 0, 0, HdlrFunc6 ); SET_ENVI_FUNC( t_1, STATE(CurrLVars) ); t_2 = NewBag( T_BODY, sizeof(BodyHeader) ); SET_STARTLINE_BODY(t_2, 17); SET_ENDLINE_BODY(t_2, 26); SET_FILENAME_BODY(t_2, FileName); SET_BODY_FUNC(t_1, t_2); CHANGED_BAG( STATE(CurrLVars) ); AssGVar( G_runtest, t_1 ); /* return; */ SWITCH_TO_OLD_FRAME(oldFrame); return 0; /* return; */ SWITCH_TO_OLD_FRAME(oldFrame); return 0; }
/* Initialize the IO functions and library */ void LoadIO(){ NewFunction("print", "(a)", &PrintObjFun); }
/* handler for function 1 */ static Obj HdlrFunc1 ( Obj self ) { Obj t_1 = 0; Obj t_2 = 0; Bag oldFrame; /* allocate new stack frame */ SWITCH_TO_NEW_FRAME(self,0,0,oldFrame); /* range2 := function ( a, b ) return [ a .. b ]; end; */ t_1 = NewFunction( NameFunc[2], 2, ArgStringToList("a,b"), HdlrFunc2 ); SET_ENVI_FUNC( t_1, STATE(CurrLVars) ); t_2 = NewFunctionBody(); SET_STARTLINE_BODY(t_2, 1); SET_ENDLINE_BODY(t_2, 1); SET_FILENAME_BODY(t_2, FileName); SET_BODY_FUNC(t_1, t_2); AssGVar( G_range2, t_1 ); /* range3 := function ( a, b, c ) return [ a, b .. c ]; end; */ t_1 = NewFunction( NameFunc[3], 3, ArgStringToList("a,b,c"), HdlrFunc3 ); SET_ENVI_FUNC( t_1, STATE(CurrLVars) ); t_2 = NewFunctionBody(); SET_STARTLINE_BODY(t_2, 2); SET_ENDLINE_BODY(t_2, 2); SET_FILENAME_BODY(t_2, FileName); SET_BODY_FUNC(t_1, t_2); AssGVar( G_range3, t_1 ); /* runtest := function ( ) BreakOnError := false; CALL_WITH_CATCH( range2, [ 1, 2 ^ 80 ] ); CALL_WITH_CATCH( range2, [ - 2 ^ 80, 0 ] ); CALL_WITH_CATCH( range3, [ 1, 2, 2 ^ 80 ] ); CALL_WITH_CATCH( range3, [ - 2 ^ 80, 0, 1 ] ); CALL_WITH_CATCH( range3, [ 0, 2 ^ 80, 2 ^ 81 ] ); Display( [ 1, 2 .. 2 ] ); CALL_WITH_CATCH( range3, [ 2, 2, 2 ] ); Display( [ 2, 4 .. 6 ] ); CALL_WITH_CATCH( range3, [ 2, 4, 7 ] ); Display( [ 2, 4 .. 2 ] ); Display( [ 2, 4 .. 0 ] ); CALL_WITH_CATCH( range3, [ 4, 2, 1 ] ); Display( [ 4, 2 .. 0 ] ); Display( [ 4, 2 .. 8 ] ); return; end; */ t_1 = NewFunction( NameFunc[4], 0, 0, HdlrFunc4 ); SET_ENVI_FUNC( t_1, STATE(CurrLVars) ); t_2 = NewFunctionBody(); SET_STARTLINE_BODY(t_2, 4); SET_ENDLINE_BODY(t_2, 26); SET_FILENAME_BODY(t_2, FileName); SET_BODY_FUNC(t_1, t_2); AssGVar( G_runtest, t_1 ); /* return; */ SWITCH_TO_OLD_FRAME(oldFrame); return 0; /* return; */ SWITCH_TO_OLD_FRAME(oldFrame); return 0; }