// call using serialised native arguments, return serialised native result internal bool NativeCall(string name, byte[] arguments, out byte[] result) { var kind = _catvars.GetKind(name); if (kind != EntryKinds.Code) { return(NativeFail("unknown or invalid name: " + name, out result)); } var expr = (_catvars.GetValue(name) as CodeValue).Value; TypedValue[] argvalues = new TypedValue[expr.NumArgs]; using (var pr = PersistReader.Create(arguments)) { for (var i = 0; i < expr.NumArgs; ++i) { try { argvalues[i] = pr.Read(expr.Lookup.Columns[i].DataType); // BUG: needs heading } catch { return(NativeFail("argument conversion error", out result)); } } } var argvalue = DataRow.CreateNonTuple(expr.Lookup, argvalues); TypedValue retvalue; try { retvalue = _evaluator.Exec(expr.Code, argvalue); } catch (ProgramException ex) { return(NativeFail(ex.ToString(), out result)); } using (var pw = PersistWriter.Create()) { pw.Write(retvalue); result = pw.ToArray(); } return(true); }
// format message for failed native call bool NativeFail(string message, out byte[] data) { using (var pw = PersistWriter.Create()) { pw.Write(message); data = pw.ToArray(); } return(false); }
public Emitter() { _mstream = new MemoryStream(); _out = new BinaryWriter(_mstream); _pw = PersistWriter.Create(_out); }