/* ** $Id: ldump.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ ** save precompiled Lua chunks ** See Copyright Notice in lua.h */ using System; using System.IO; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Diagnostics; using System.Runtime.Serialization; namespace KopiLua { using lua_Number = System.Double; using TValue = Lua.lua_TValue; public partial class Lua { public class DumpState { public lua_State L; public lua_Writer writer; public object data; public int strip; public int status; }; public static void DumpMem(object b, DumpState D) { #if XBOX || SILVERLIGHT // todo: implement this - mjf Debug.Assert(false); #else int size = Marshal.SizeOf(b); IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(b, ptr, false); byte[] bytes = new byte[size]; Marshal.Copy(ptr, bytes, 0, size); char[] ch = new char[bytes.Length]; for (int i = 0; i < bytes.Length; i++) ch[i] = (char)bytes[i]; CharPtr str = ch; DumpBlock(str, (uint)str.chars.Length, D); Marshal.Release(ptr); #endif } public static void DumpMem(object b, int n, DumpState D) { Array array = b as Array; Debug.Assert(array.Length == n); for (int i = 0; i < n; i++) DumpMem(array.GetValue(i), D); } public static void DumpVar(object x, DumpState D) { DumpMem(x, D); } private static void DumpBlock(CharPtr b, uint size, DumpState D) { if (D.status==0) { lua_unlock(D.L); D.status=D.writer(D.L,b,size,D.data); lua_lock(D.L); } } private static void DumpChar(int y, DumpState D) { char x=(char)y; DumpVar(x,D); } private static void DumpInt(int x, DumpState D) { DumpVar(x,D); } private static void DumpNumber(lua_Number x, DumpState D) { DumpVar(x,D); } static void DumpVector(object b, int n, DumpState D) { DumpInt(n,D); DumpMem(b, n, D); } private static void DumpString(TString s, DumpState D) { if (s==null || getstr(s)==null) { uint size=0; DumpVar(size,D); } else { uint size=s.tsv.len+1; /* include trailing '\0' */ DumpVar(size,D); DumpBlock(getstr(s),size,D); } } private static void DumpCode(Proto f,DumpState D) { DumpVector(f.code, f.sizecode, D); } private static void DumpConstants(Proto f, DumpState D) { int i,n=f.sizek; DumpInt(n,D); for (i=0; i