Listing 5
void Execute(String* f)
{
String* sCode = CodeBuilder::TheCode(f);
AppDomain* oAppDomain = AppDomain::CreateDomain("CodeCompilerDomain");
Byte oAsm[] = LoadFile("..\\debug\\CodeCompiler.dll");
Assembly* oAssembly = oAppDomain->Load(oAsm);
DynamicCompilation::CodeCompiler* oJIT =
static_cast <DynamicCompilation::CodeCompiler*>
(oAssembly->CreateInstance("DynamicCompilation.CodeCompiler"));
oJIT->SourceCode = sCode;
CompilerErrorCollection* oErrors = oJIT->CompileCode();
if (oErrors->Count > 0)
{
System::Text::StringBuilder* sb = new System::Text::StringBuilder();
for (int i=0;i<oErrors->Count;i++)
{
sb->Append("Line number: ");
sb->Append(oErrors->Item[i]->Line.ToString());
sb->Append(", Error Number: ");
sb->Append(oErrors->Item[i]->ErrorNumber->ToString());
sb->Append(", Error Text: ");
sb->Append(oErrors->Item[i]->ErrorText);
sb->Append("\r\n");
Console::WriteLine(sb->ToString());
}
}
else
{
Object* oArguments[] = __gc new Object*[1];
for(double x=0; x<6.3; x=x+0.5)
{
oArguments[0] = __box(x);
try
{
Console::WriteLine(" f({0}) = {1}", x.ToString(),
oJIT->Invoke("MyFunctoid.MyFunc", "f", oArguments)->ToString());
}
catch (Exception* Ex)
{
Console::WriteLine(Ex->ToString());
break;
}
}
}
AppDomain::Unload(oAppDomain);
}