Commit afb6c136 authored by Vinicius Jarina's avatar Vinicius Jarina
Browse files

Merge pull request #17 from Mangatome/master

Regression fix + Binary chunk DoString
parents b6b3d0a0 647058ac
...@@ -440,57 +440,68 @@ end ...@@ -440,57 +440,68 @@ end
var result = translator.getFunction (luaState, -1); var result = translator.getFunction (luaState, -1);
translator.popValues (luaState, oldTop); translator.popValues (luaState, oldTop);
return result; return result;
} }
/* /// <summary>
* Excutes a Lua chunk and returns all the chunk's return /// Executes a Lua chunk and returns all the chunk's return values in an array.
* values in an array /// </summary>
*/ /// <param name = "chunk">Chunk to execute</param>
public object[] DoString (string chunk) /// <param name = "chunkName">Name to associate with the chunk. Defaults to "chunk".</param>
{ /// <returns></returns>
int oldTop = LuaLib.lua_gettop (luaState); public object[] DoString(byte[] chunk, string chunkName = "chunk")
{
if (LuaLib.luaL_loadbuffer (luaState, chunk, "chunk") == 0) { int oldTop = LuaLib.lua_gettop(luaState);
executing = true; executing = true;
try { if (LuaLib.luaL_loadbuffer(luaState, chunk, chunkName) == 0)
if (LuaLib.lua_pcall (luaState, 0, -1, 0) == 0) {
return translator.popValues (luaState, oldTop); try
else {
ThrowExceptionFromError (oldTop); if (LuaLib.lua_pcall(luaState, 0, -1, 0) == 0)
} finally { return translator.popValues(luaState, oldTop);
executing = false; else
} ThrowExceptionFromError(oldTop);
} else }
ThrowExceptionFromError (oldTop); finally
{
return null; // Never reached - keeps compiler happy executing = false;
} }
}
/// <summary> else
/// Executes a Lua chnk and returns all the chunk's return values in an array. ThrowExceptionFromError(oldTop);
/// </summary>
/// <param name = "chunk">Chunk to execute</param> return null; // Never reached - keeps compiler happy
/// <param name = "chunkName">Name to associate with the chunk</param> }
/// <returns></returns>
public object[] DoString (string chunk, string chunkName) /// <summary>
{ /// Executes a Lua chunk and returns all the chunk's return values in an array.
int oldTop = LuaLib.lua_gettop (luaState); /// </summary>
executing = true; /// <param name = "chunk">Chunk to execute</param>
/// <param name = "chunkName">Name to associate with the chunk. Defaults to "chunk".</param>
if (LuaLib.luaL_loadbuffer (luaState, chunk, chunkName) == 0) { /// <returns></returns>
try { public object[] DoString(string chunk, string chunkName = "chunk")
if (LuaLib.lua_pcall (luaState, 0, -1, 0) == 0) {
return translator.popValues (luaState, oldTop); int oldTop = LuaLib.lua_gettop(luaState);
else executing = true;
ThrowExceptionFromError (oldTop);
} finally { if (LuaLib.luaL_loadbuffer(luaState, chunk, chunkName) == 0)
executing = false; {
} try
} else {
ThrowExceptionFromError (oldTop); if (LuaLib.lua_pcall(luaState, 0, -1, 0) == 0)
return translator.popValues(luaState, oldTop);
return null; // Never reached - keeps compiler happy else
ThrowExceptionFromError(oldTop);
}
finally
{
executing = false;
}
}
else
ThrowExceptionFromError(oldTop);
return null; // Never reached - keeps compiler happy
} }
/* /*
......
...@@ -476,8 +476,21 @@ namespace NLua ...@@ -476,8 +476,21 @@ namespace NLua
*/ */
private object checkMemberCache (Dictionary<object, object> memberCache, IReflect objType, string memberName) private object checkMemberCache (Dictionary<object, object> memberCache, IReflect objType, string memberName)
{ {
var members = (Dictionary<object, object>)memberCache [objType]; object members = null;
return !members.IsNull () ? members [memberName] : null;
if (memberCache.TryGetValue(objType, out members))
{
var membersDict = members as Dictionary<object, object>;
object memberValue = null;
if (!members.IsNull() && membersDict.TryGetValue(memberName, out memberValue))
{
return memberValue;
}
}
return null;
} }
/* /*
...@@ -485,14 +498,15 @@ namespace NLua ...@@ -485,14 +498,15 @@ namespace NLua
*/ */
private void setMemberCache (Dictionary<object, object> memberCache, IReflect objType, string memberName, object member) private void setMemberCache (Dictionary<object, object> memberCache, IReflect objType, string memberName, object member)
{ {
var members = (Dictionary<object, object>)memberCache[objType]; Dictionary<object, object> members = null;
object memberCacheValue = null;
if (members.IsNull ()) { if (memberCache.TryGetValue(objType, out memberCacheValue)) {
members = (Dictionary<object, object>)memberCacheValue;
} else {
members = new Dictionary<object, object>(); members = new Dictionary<object, object>();
memberCache [objType] = members; memberCache[objType] = members;
} }
members [memberName] = member;
} }
/* /*
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment