void installGlobalFunction( JSGlobalContextRef ctx, const char* name, JSFunction function) { auto jsName = String(ctx, name); auto functionObj = makeFunction(ctx, jsName, std::move(function)); Object::getGlobalObject(ctx).setProperty(jsName, Value(ctx, functionObj)); }
void installGlobalFunction( JSGlobalContextRef ctx, const char* name, JSFunction function) { auto jsName = JSStringCreateWithUTF8CString(name); auto functionObj = makeFunction(ctx, jsName, std::move(function)); JSObjectRef globalObject = JSContextGetGlobalObject(ctx); JSObjectSetProperty(ctx, globalObject, jsName, functionObj, 0, NULL); JSStringRelease(jsName); }
void IF_ExecCSf(void) { char * f; void *C; f = getString(); if (f != NULL) { C = VIDE; if (strlen(f)>0) C = makeFunction(f); free((void*)f); if (C != VIDE) { IF_execFct("_f"); rmLastFct(); } } }
JSObjectRef makeFunction( JSContextRef ctx, const char* name, JSFunction function) { return makeFunction(ctx, JSStringCreateWithUTF8CString(name), std::move(function)); }
foreach (FunctionModelItem fun, functions) { if (done.contains(fun->name())) continue; // data function out << endl; QStringList fetchMeType; QStringList fetchMeName; ArgumentList arguments = fun->arguments(); for (int i = 0; i < arguments.count(); ++i) { QString type = arguments[i]->type().toString(); type = type.mid(0, type.indexOf(' ')); QString name = arguments[i]->name(); if (arguments[i]->type().indirections()) { type = "int"; name = name + "Count"; } fetchMeType << type; fetchMeName << name; } if (fun->type().toString() != "void") { QString returnType = fun->type().toString(); fetchMeType << returnType; fetchMeName << fun->name(); } if (fetchMeType.isEmpty()) { fetchMeType << "int"; fetchMeName << "foo"; } QStringList knownTypes; knownTypes << "int" << "qreal" << "bool" << "QString" << "QRectF" << "QPointF" << "QPixmap" << "QFont" << "QUrl" << "uint" << "QImage" << "QStringList"; bool knowAllTypes = true; for (int i = 0; i < fetchMeType.count(); ++i) { if (!knownTypes.contains(fetchMeType[i])) { if (!declared.contains(fetchMeType[i])) { out << "Q_DECLARE_METATYPE(" << fetchMeType[i] << ")" << endl; declared.append(fetchMeType[i]); } knowAllTypes = false; } } out << QString("void %1::%2_data()\n{").arg(tstClassName).arg(fun->name()) << endl; if (!knowAllTypes) out << "#if 0" << endl; for (int i = 0; i < fetchMeType.count(); ++i) out << indent << QString("QTest::addColumn<%1>(\"%2\");").arg(fetchMeType[i]).arg(fetchMeName[i]) << endl; bool stubbed = false; // fill out the most common cases if (fetchMeType.count() == 1 && fetchMeType[0] == "bool") { out << indent << "QTest::newRow(\"true\") << true;" << endl; out << indent << "QTest::newRow(\"false\") << false;" << endl; stubbed = true; } if (fetchMeType.count() == 1 && fetchMeType[0] == "QString") { out << indent << "QTest::newRow(\"null\") << QString();" << endl; out << indent << "QTest::newRow(\"foo\") << QString(\"foo\");" << endl; stubbed = true; } if (fetchMeType.count() == 1 && fetchMeType[0] == "int") { out << indent << "QTest::newRow(\"0\") << 0;" << endl; out << indent << "QTest::newRow(\"-1\") << -1;" << endl; stubbed = true; } if (!stubbed) { out << indent << "QTest::newRow(\"null\")"; for (int i = 0; i < fetchMeType.count(); ++i) { out << " << "; if (fetchMeType[i] == "int") out << "0"; else if (fetchMeType[i] == "qreal") out << "0.0"; else if (fetchMeType[i] == "bool") out << "false"; else if (fetchMeType[i] == "QString") out << "QString()"; else out << fetchMeType[i] << "()"; } out << ";" << endl; } if (!knowAllTypes) out << "#endif" << endl; out << "}" << endl; out << endl; out << "// " << convertAccessPolicy(fun->accessPolicy()) << " " << makeFunction(fun) << endl; out << QString("void %1::%2()").arg(tstClassName).arg(fun->name()) << endl; out << "{" << endl; { out << "#if 0" << endl; for (int i = 0; i < fetchMeType.count(); ++i) out << indent << QString("QFETCH(%1, %2);").arg(fetchMeType[i]).arg(fetchMeName[i]) << endl; out << endl; out << indent << "Sub" << className << " " << shortName << ";" << endl; // any possible spies that the class emits // ### check spy args // ### properties out << endl; int spies = 0; for(int i = 0; i < functions.count(); ++i) { FunctionModelItem funt = functions[i]; if (funt->functionType() == CodeModel::Signal) { ArgumentList arguments = funt->arguments(); QStringList args; for (int i = 0; i < arguments.count(); ++i) { args += arguments[i]->type().toString(); } out << indent << QString("QSignalSpy spy%1(&%2, SIGNAL(%3(%4)));").arg(spies++).arg(shortName).arg(funt->name()).arg(args.join(", ")) << endl; } } if (spies > 0) out << endl; bool returnsSomething = (fun->type().toString() != "void"); out << indent; if (returnsSomething) out << "QCOMPARE("; out << shortName << "."; if (fun->accessPolicy() == CodeModel::Protected) out << "call_"; out << fun->name(); out << "("; QStringList args; for (int i = 0; i < arguments.count(); ++i) args.append(arguments[i]->name()); out << args.join(", "); out << ")"; if (returnsSomething) { out << ", " << fun->name() << ")"; } out << ";" << endl; if (spies > 0) out << endl; spies = 0; for(int i = 0; i < functions.count(); ++i) { FunctionModelItem funt = functions[i]; if (funt->functionType() == CodeModel::Signal) { out << indent << QString("QCOMPARE(spy\%1.count(), 0);").arg(spies++) << endl; } } /* // any classes that can be used to check if (!fun->isConstant()) { out << endl; out << indent << "// This function isn't const so you should be able to do comparisons on all the const functions." << endl; for(int i = 0; i < functions.count(); ++i) { FunctionModelItem funt = functions[i]; if (funt->type().toString() != "void") out << indent << "// QCOMPARE(foo." << funt->name() << "(), something);" << endl; } } */ out << "#endif" << endl; out << indent << "QSKIP(\"Test is not implemented.\", SkipAll);" << endl; } out << "}" << endl; done.append(fun->name()); }
void outputFile(ClassModelItem clazz, FunctionList functions, QList<QPair<QString,QString> > extraFunctions) { // setup QString className = clazz->name(); QString shortName = className.mid(className.lastIndexOf(QRegExp("[A-Z][a-z]*"))).toLower(); QString tstClassName = "tst_" + className; QString indent = " "; QTextStream out(stdout); // Includes out << endl; out << "#include <QtTest/QtTest>" << endl; QString classFileName = clazz->fileName().mid(clazz->fileName().indexOf('/')); if (classFileName[0] == '/') classFileName = classFileName.mid(1); out << "#include <" << classFileName << ">" << endl; // Generate class definition out << endl; out << QString("class %1 : public QObject").arg(tstClassName) << endl; out << "{" << endl; { out << indent << "Q_OBJECT" << endl; out << endl; out << "public slots:" << endl; for(int i = 0; i < extraFunctions.count(); ++i) { out << indent << QString("void %1();").arg(extraFunctions.at(i).first) << endl; } out << endl; out << "private slots:" << endl; out << indent << QString("void %1_data();").arg(className.toLower()) << endl; out << indent << QString("void %1();").arg(className.toLower()) << endl; out << endl; QStringList done; foreach (FunctionModelItem fun, functions) { if (done.contains(fun->name())) continue; out << indent << QString("void %1_data();").arg(fun->name()) << endl; out << indent << QString("void %1();").arg(fun->name()) << endl; done.append(fun->name()); } } out << "};" << endl; // Generate subclass out << endl; out << "// Subclass that exposes the protected functions." << endl; out << "class Sub" + className + " : public " << className << endl; out << "{" << endl; { out << "public:" << endl; foreach (FunctionModelItem fun, functions) { // implement protected or virtual functions if (fun->accessPolicy() != CodeModel::Protected && !fun->isAbstract()) continue; if (fun->isAbstract()) out << indent << QString("// %1::%2 is a pure virtual function.").arg(className).arg(fun->name()) << endl; out << indent << makeFunction(fun, fun->isAbstract() ? "" : "call_") << endl; out << indent << indent << "{ "; { ArgumentList arguments = fun->arguments(); if (!fun->isAbstract()) { QStringList args; for (int j = 0; j < arguments.count(); ++j) { QString arg = arguments[j]->name(); if (arg.isEmpty()) arg = QString("arg%1").arg(j); args += arg; } out << QString("return Sub%1::%2(%3);").arg(className).arg(fun->name()).arg(args.join(", ")); } } out << " }" << endl; out << endl; } } out << "};" << endl; // Generate extra functions for(int i = 0; i < extraFunctions.count(); ++i) { out << endl; out << QString("// %1").arg(extraFunctions.at(i).second) << endl; out << QString("void %1::%2()\n{\n}").arg(tstClassName).arg(extraFunctions.at(i).first) << endl; } QStringList declared; // Make the test that calls every function out << endl; out << QString("void %1::%2_data()\n{\n}\n").arg(tstClassName).arg(className.toLower()) << endl; out << QString("void %1::%2()").arg(tstClassName).arg(className.toLower()) << endl; out << "{" << endl; { out << indent << QString("Sub%1 %2;").arg(className).arg(shortName) << endl; out << "#if 0" << endl; foreach (FunctionModelItem fun, functions) { QStringList args; for (int i = 0; i < fun->arguments().count(); ++i) { QString type= fun->arguments()[i]->type().toString(); args += makeArg(type); } QString returnType = makeArg(fun->type().toString()); out << indent; if (returnType != "void") out << "QCOMPARE("; out << shortName << "."; if (fun->accessPolicy() == CodeModel::Protected) out << "call_"; out << fun->name() << "("; QString functionArgs = args.join(", "); if (functionArgs.endsWith("*")) out << "(" << functionArgs << ")0"; else if (functionArgs == "int") out << "0"; else if (functionArgs == "QString const&") out << "QString()"; else out << functionArgs; out << ")"; if (returnType != "void") { out << ", "; if (returnType == "int") out << "0"; else if (returnType == "int") out << "0"; else out << returnType; out << ")"; } out << ";" << endl; } out << "#endif" << endl; out << indent << "QSKIP(\"Test is not implemented.\", SkipAll);" << endl; }
JSObjectRef makeFunction( JSContextRef ctx, const char* name, JSFunction function) { return makeFunction(ctx, String(ctx, name), std::move(function)); }
void Parser_Perl::parse() { QString continuation; QString *name=new QString(); QString parent; PerlSymbol *parentSymbol=NULL; const char *line; int line_skip = 0; char const *longStringLiteral = NULL; while ((line = (const char *) fileReadLine ()) != NULL) { const char *cp = line; char const *keyword; //int indent; cp = skipSpace (cp); if (*cp == '\0') /* skip blank line */ continue; /* Skip comment if we are not inside a multi-line string. */ if (*cp == '#' && !longStringLiteral) continue; /* Deal with line continuation. */ if (!line_skip) continuation=""; continuation+=QString(line); //vStringStripTrailing(continuation); cp = line = continuation.toLatin1().data(); cp = skipSpace (cp); line_skip = 0; /* Deal with def and class keywords. */ keyword = findDefinitionOrClass (cp); //printf("LINE_:%s\n",line); if (keyword) { bool found = false; bool is_class = false; if (!strncmp (keyword, "sub ", 4) && isspace(keyword[3])) { cp = skipSpace (keyword + 4); found = true; } else if (!strncmp (keyword, "package", 7) && isspace(keyword[7])) { cp = skipSpace (keyword + 7); found = true; is_class = true; } if (found) { PerlSymbol *symbol = NULL; if (is_class) { symbol = makeClass (cp, 0); parentSymbol=symbol; } else symbol = makeFunction(cp, name, parentSymbol); } } /* Find global and class variables */ #ifdef SHOW_VARIABLES //char const *variable = findVariable(line); char const* variable; if (variable) { const char *start = variable; vStringClear (name); while (isIdentifierCharacter ((int) *start)) { vStringPut (name, (int) *start); ++start; } vStringTerminate (name); PerlSymbol *symbol = NULL; PerlSymbol *parentSymbol = getParent(indent); symbol = new PerlSymbol(parentSymbol, vStringToQString(name)); symbol->setIndent(indent); symbol->setLine(this->getSourceLineNumber()); symbol->setIconType(Symbol::IconVar); } #endif /* Find and parse imports */ #ifdef SHOW_IMPORTS parseImports(line); #endif } /* Clean up all memory we allocated. */ if(name)delete name; }
void BuiltIns::defineBuiltIns() { auto factory = SymbolFactory{ }; auto makeRef = [](auto&& type, bool is_const) { return VariableType(TypeFactory::getReference(type.get()), is_const); }; auto global_scope = std::make_shared<GlobalScope>(); auto int_ = factory.makeStruct("int", new StructScope("int", global_scope.get())); auto ref_int = makeRef(int_, false); auto const_ref_int = makeRef(int_, true); auto char_ = factory.makeStruct("char", new StructScope("char", global_scope.get())); auto ref_char = makeRef(char_, false); auto const_ref_char = makeRef(char_, true); auto str = factory.makeStruct("string", new StructScope("string", global_scope.get())); auto ref_str = makeRef(str, false); auto const_ref_str = makeRef(str, true); auto int_builtin = VariableType(new BuiltInTypeSymbol("~~int", Comp::config().int_size), false); auto char_builtin = VariableType(new BuiltInTypeSymbol("~~char", Comp::config().int_size), false); auto simple_traits = FunctionTraits::simple(); auto op_traits = FunctionTraits::methodOper(); auto meth_traits = FunctionTraits::method(); auto constr_traits = FunctionTraits::constructor(); auto tp = FunctionType(int_.get(), {ref_int, int_.get()}); auto void_type = std::make_unique<BuiltInTypeSymbol>("void", 0); global_scope -> define(factory.makeFunction("putchar", FunctionType(void_type.get(), {char_.get()}), simple_traits, false)); global_scope -> define(factory.makeFunction("getchar", FunctionType(int_.get(), { }), simple_traits, false)); auto string_builtin = VariableType(new BuiltInTypeSymbol("~~string", 256), false); str -> defineMember(factory.makeVariable("~~impl", string_builtin, VariableSymbolType::FIELD)); auto str_tp = FunctionType(ref_str, {ref_str, const_ref_str}); int_ -> defineMember(factory.makeVariable("~~impl", int_builtin, VariableSymbolType::FIELD)); int_ -> defineMethod(factory.makeFunction("int", FunctionType(ref_int, {ref_int}), constr_traits, false)); int_ -> defineMethod(factory.makeFunction("int", FunctionType(ref_int, {ref_int, const_ref_int}), constr_traits, false)); int_ -> defineMethod(factory.makeFunction("operator=", FunctionType(ref_int, {ref_int, const_ref_int}), op_traits, false)); int_ -> defineMethod(factory.makeFunction("operator+", tp, op_traits, false)); int_ -> defineMethod(factory.makeFunction("operator-", tp, op_traits, false)); int_ -> defineMethod(factory.makeFunction("operator*", tp, op_traits, false)); int_ -> defineMethod(factory.makeFunction("operator/", tp, op_traits, false)); int_ -> defineMethod(factory.makeFunction("operator%", tp, op_traits, false)); int_ -> defineMethod(factory.makeFunction("operator==", tp, op_traits, false)); int_ -> defineMethod(factory.makeFunction("operator!=", tp, op_traits, false)); int_ -> defineMethod(factory.makeFunction("operator&&", tp, op_traits, false)); int_ -> defineMethod(factory.makeFunction("operator||", tp, op_traits, false)); int_ -> defineMethod(factory.makeFunction("int", FunctionType(ref_int, {ref_int, char_.get()}), constr_traits, false)); char_ -> defineMember(factory.makeVariable("~~impl", char_builtin, VariableSymbolType::FIELD)); char_ -> defineMethod(factory.makeFunction("char", FunctionType(ref_char, {ref_char}), constr_traits, false)); char_ -> defineMethod(factory.makeFunction("char", FunctionType(ref_char, {ref_char, const_ref_char}), constr_traits, false)); char_ -> defineMethod(factory.makeFunction("char", FunctionType(ref_char, {ref_char, const_ref_int}), constr_traits, false)); char_ -> defineMethod(factory.makeFunction("operator=", FunctionType(ref_char, {ref_char, const_ref_char}), constr_traits, false)); str -> defineMethod(factory.makeFunction("string", str_tp, constr_traits, false)); str -> defineMethod(factory.makeFunction("length", FunctionType(int_.get(), {ref_str}), meth_traits, false)); str -> defineMethod(factory.makeFunction("operator[]", FunctionType(ref_char, {ref_str, int_.get()}), op_traits, false)); str -> defineMethod(factory.makeFunction("operator+", FunctionType(str.get(), {ref_str, const_ref_str}), op_traits, false)); str -> defineMethod(factory.makeFunction("operator=", str_tp, op_traits, false)); global_scope -> define(factory.makeFunction("print", FunctionType(void_type.get(), {const_ref_str}), simple_traits, false)); BuiltIns::int_type = int_.get(); BuiltIns::char_type = char_.get(); BuiltIns::ASCII_string_type = str.get(); BuiltIns::void_type = void_type.get(); global_scope -> define(std::move(void_type)); global_scope -> define(std::move(int_)); global_scope -> define(std::move(str)); global_scope -> define(std::move(char_)); BuiltIns::global_scope = global_scope; }
void execCod(void *A) { int i,n, ea, Ea, *ai, InDo=0, OnErr=0, mFCTP; long L, P; char * C, *D, *F, *W, *S, *ADo_Next, *ADo_Leave; void * T, *T2; void (*f)(void); struct Fct * FR; /* printf("pid = %d ITASK=%d FctInTask=%d\n",getpid(),ITASK,FctInTask);*/ if (FctInTask) { if (ITASK==0) { if (FctInTask==-1) { FctInTask=0; return; } if (MakeTask(A)) return; } if (ITASK!=FctInTask) return; } D_Cod++; ai = (int*)A; i = *ai++; ea = *ai++; Ea = *ai; if (ea) tellOnErr(A); C = (char*)A+(3*sizeof(int)); D = C; F = C+i; n = sizeof(T); while (C <= F) { /* printf("execCod : %s %d - %x : %ld\n", codByAddr(A),(int)(C-D),*C,(long)*(C+1)); */ if (noErr() && ((C==F) || ((Code)*C != T_ONER)) ) { /* to find onerr: */ if (ea && (OnErr==0)) { C = D+ea; } else { printf("Called in %s err=%d i=%d/%d cod=<%x>\n", codByAddr(A),noErr(),(int)(C-D),i,*C); break; /* end of while */ } } if (C==F) break; /* end of code */ switch((Code)*C) { case T_ONER : if (noErr()==0) { /* jmp end: */ if (Ea) C = D+Ea; else C = F; /* to break */ } else { if (OnErr==0) { OnErr=1; majLastErr(A); razErr(); } else C = F; } break; case T_RET : C = F; /* to break */ break; case T_END : break; /* nothing */ case T_JEND : if (Ea) C = D+Ea; else C = F; /* to break */ break; case T_NUM : bcopy((void*)(C+1),(void*)&T,n); insertVal(T); break; case T_CHA : bcopy((void*)(C+1),(void*)&W,n); putString(W); break; case T_LIB : if (InstallOn) { if (InstallOn < 3) { bcopy((void*)(C+1),(void*)&T,n); _MODIF_FCT_INST_(T); _MODIF_FCT_TYP_(1); } else { _MODIF_FCT_INST_(VIDE); _MODIF_FCT_TYP_(0); } InstallOn=0; } else { bcopy((void*)(C+1),(void*)&f,n); f(); /* free context loops */ if (Do_Evts) { /* quit or cut */ /*printf("execCod T_LIB : Evts %d\n",Do_Evts);*/ if (InDo) { if (Do_Evts>0) { C=ADo_Leave; I_DO--; InDo = 0; Do_Evts--; } else { C=ADo_Next; Do_Evts=0; } } else { /* quit */ C = F; } } } break; case T_FCT : if (InstallOn) { if (InstallOn < 3) { bcopy((void*)(C+1),(void*)&T,n); T2=fctByCode(T); _MODIF_FCT_INST_(T2); _MODIF_FCT_TYP_(2); } else { _MODIF_FCT_INST_(VIDE); _MODIF_FCT_TYP_(0); } InstallOn=0; } else { bcopy((void*)(C+1),(void*)&T,n); execCod(T); /* free context loops */ if (Do_Evts) { /* quit or cut */ /*printf("execCod T_FCT : Evts %d\n",Do_Evts);*/ if (InDo) { if (Do_Evts>0) { C=ADo_Leave; I_DO--; InDo = 0; Do_Evts--; } else { C=ADo_Next; Do_Evts=0; } } else { /* quit */ C = F; } } } break; case T_FCTDS : case T_EXEKS : if ((S = getString()) != NULL) free((void*)S); /* remove the string */ break; case T_FCTD : if ((S = getString()) != NULL) free((void*)S); /* remove the string */ if (noErr()) break; case T_FCTDW : case T_FCTP : bcopy((void*)(C+1),(void*)&T,n); FR = (struct Fct *)T; execCod(FR->c); /* free context loops */ if (Do_Evts) { /* quit or cut */ /*printf("execCod T_FCTD : Evts %d\n",Do_Evts);*/ if (InDo) { if (Do_Evts>0) { C=ADo_Leave; I_DO--; InDo = 0; Do_Evts--; } else { C=ADo_Next; Do_Evts=0; } } else { /* quit */ C = F; } } if (*C == T_FCTP) { if (mFCTP) *C = T_FCTDW; else *C = T_FCTD; } break; case T_EXEK : if ((S = getString()) != NULL) { if (strlen(S)>0) { /* to do with T_FCTD */ mFCTP=0; T = makeFunction(S); if (T != VIDE) { bcopy((void*)&T, (void*)(C+1),n); *C = T_FCTP; C -= (n+1); unlinkLastFct(); /* upgrading precedent code ? not always ! */ if (C >= D) { if (*C == T_CHA) { /* case of a string */ *C = T_CHAS; mFCTP=1; } if (*C == T_VAR) { /* case of a variable string */ bcopy((void*)(C+1),(void*)&W,n); if (isVarChar(W)) { *C = T_VARS; mFCTP=1; } } } } else /* error in compilation */ *C = T_EXEKS; } free((void*)S); } break; case T_IF : if (!getBool()) { bcopy((void*)(C+1),(void*)&L,n); C += L; } break; case T_IFN : if (getBool()) { bcopy((void*)(C+1),(void*)&L,n); C += L; } break; case T_DO : I_DO++; InDo=1; /* maj do_adresses */ W = C + (2*(n+1)); bcopy((void*)(W+1),(void*)&L,n); ADo_Leave=D+L-n-1; ADo_Next=ADo_Leave-(2*(n+1)); /* printf("execCod T_DO : AL= %d AN=%d\n", (int)(ADo_Leave-D), (int)(ADo_Next-D));*/ getParLong(&P); D_DO[I_DO] = P; getParLong(&P); L_DO[I_DO] = P; if (P > D_DO[I_DO]) S_DO[I_DO]=0; else S_DO[I_DO]=1; break; case T_DO_I : IF_getIndDo(0); break; case T_DO_J : IF_getIndDo(1); break; case T_DO_K : IF_getIndDo(2); break; case T_IFD : if (S_DO[I_DO]) { if (D_DO[I_DO] > L_DO[I_DO]) { bcopy((void*)(C+1),(void*)&L,n); C += L; } else { I_DO--; InDo=0; } } else { if (D_DO[I_DO] < L_DO[I_DO]) { bcopy((void*)(C+1),(void*)&L,n); C += L; } else { I_DO--; InDo=0; } } break; case T_LOOP : if (S_DO[I_DO]) D_DO[I_DO]--; else D_DO[I_DO]++; break; case T_PLOO : getParLong(&P); D_DO[I_DO]+=P; break; case T_JMP : bcopy((void*)(C+1),(void*)&L,n); C += L; break; case T_GOTO : bcopy((void*)(C+1),(void*)&L,n); C = D + L - n-1; break; case T_VAR : if (InstallOn) { if (InstallOn == 3) { bcopy((void*)(C+1),(void*)&T,n); _MODIF_FCT_INST_(T); _MODIF_FCT_TYP_(3); } else { _MODIF_FCT_INST_(VIDE); _MODIF_FCT_TYP_(0); } InstallOn=0; } else { bcopy((void*)(C+1),(void*)&W,n); executeVar(W); /* free context loops */ if (Do_Evts) { /* quit or cut */ /*printf("execCod T_VAR : Evts %d\n",Do_Evts);*/ if (InDo) { if (Do_Evts>0) { C=ADo_Leave; I_DO--; InDo = 0; Do_Evts--; } else { C=ADo_Next; Do_Evts=0; } } else { /* quit */ C = F; } } } break; case T_BKC : bcopy((void*)(C+1),(void*)&W,n); execLib(W); break; case T_BKC1 : /* like makeFct */ bcopy((void*)(C+1),(void*)&W,n); /* try to modify the code */ if (VARS==2) { /* VARS UP */ if ((T = varByName(W)) != VIDE) { *C = T_VAR; } else { if ((T = fctByName(W)) != VIDE) { *C = T_FCT; FR = (struct Fct *)T; T = FR->c; } } } else { if ((T = fctByName(W)) != VIDE) { *C = T_FCT; FR = (struct Fct *)T; T = FR->c; } else { if ((VARS==1) && ((T = varByName(W)) != VIDE)) { *C = T_VAR; } } } if ((Code)*C != T_BKC1) { /* code is updated */ bcopy((void*)&T, (void*)(C+1),n); C-=(n+1); /* it must be executed */ } break; case T_NOP : case T_CHAS : case T_VARS : case T_FCTDWS : break; default : messErr(11); } C+= n+1; } D_Cod--; if (ea) tellOnErr(VIDE); }