Пример #1
0
        // 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);
        }
Пример #2
0
 // 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);
 }
Пример #3
0
        private static void Serialize(object baseObject, object basePersistGroup, FastStreamWriter binWriter)
        {
            PersistWriter writer = new PersistWriter();
            bool          enableTypeRemapping = Persist.EnableTypeRemapping;

            Persist.EnableTypeRemapping = false;
            bool requireAllPersistable = Persist.RequireAllPersistable;

            Persist.RequireAllPersistable = true;
            try
            {
                writer.AddGroup(basePersistGroup);
                writer.Begin();
                writer.AddObject(baseObject);
                writer.End(binWriter);
            }
            finally
            {
                Persist.EnableTypeRemapping   = enableTypeRemapping;
                Persist.RequireAllPersistable = requireAllPersistable;
            }
        }
Пример #4
0
 public Emitter()
 {
     _mstream = new MemoryStream();
     _out     = new BinaryWriter(_mstream);
     _pw      = PersistWriter.Create(_out);
 }