public static Instantiate ( |
||
a | ||
interp | Interpreter | |
return | void |
public static void Instantiate(Assembly a, Interpreter interp)
{
Hashtable table = interp.VarTable;
try
{
CodeChunk chunk = (CodeChunk)a.CreateInstance("CsiChunk");
chunk.Go(table);
// we display the type and value of expressions. The variable $_ is
// always set, which is useful if you want to save the result of the last
// calculation.
if (interp.returnsValue && DumpingValue)
{
string stype;
object val = table["_"];
if (val == null)
{
stype = null;
}
else
{
Type type = val.GetType();
stype = interp.GetPublicRuntimeTypeName(type, true);
stype = "(" + (stype ?? interp.GetTypeName(type, true)) + ")";
}
if (val == null)
{
Print("null");
}
else
if (val is string)
{
Print(stype, "'" + val + "'");
}
else
if (val is IEnumerable)
{
Print(stype);
Dumpl((IEnumerable)val);
}
else
Print(stype, val);
}
}
catch (Exception ex)
{
Print(ex.GetType() + " was thrown: " + ex.Message);
}
}
void ExecuteLine(string codeStr) { // at this point we either have a line to be immediately compiled and evaluated, // or a function definition. CHash type = CHash.Expression; string className = null, assemblyName = null, funName = null; Match funMatch = funDef.Match(codeStr); if (funMatch.Success) { type = CHash.Function; } if (type == CHash.Function) { funName = funMatch.Groups[1].ToString(); macro.RemoveMacro(funName); className = "Csi" + nextAssembly++; assemblyName = className + ".dll"; codeStr = codeStr.Insert(funMatch.Groups[1].Index, "_"); } codeStr = macro.ProcessLine(codeStr); if (codeStr == "") // may have been a prepro statement! { return; } bool wasAssignment; codeStr = MassageInput(codeStr, out wasAssignment); if (wasAssignment) { type = CHash.Assignment; } CompilerResults cr = CompileLine(codeStr.TrimStart(), type, assemblyName, className); if (cr != null) { Assembly ass = cr.CompiledAssembly; if (type != CHash.Function) { CodeChunk.Instantiate(ass, this); } else { CsiFunctionContext.Instantiate(ass, varTable, className, funName); string prefix = mustDeclare ? "" : "$"; macro.AddMacro(funName, prefix + className + "._" + funName, null); AddReference(Path.GetFullPath(assemblyName)); } } }