From b8892dabfc998390722b1c347d4b25cf76b654ac Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Sun, 5 Aug 2012 11:45:46 +0100 Subject: HOST: Ensure we simplify return values to local types so we can clean down if the function returns tables etc --- lib/supple/host.lua | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/supple/host.lua b/lib/supple/host.lua index bac95ae..fe8ccc1 100644 --- a/lib/supple/host.lua +++ b/lib/supple/host.lua @@ -14,11 +14,35 @@ local subprocess = require 'luxio.subprocess' local comms = require 'supple.comms' local objects = require 'supple.objects' +local capi = require 'supple.capi' local hostname = "host" local counter = 0 local limits +local function simplify(t, memo) + if not memo then memo = {} end + if memo[t] then return memo[t] end + local ret = {} + memo[t] = ret + local kk, vv + for k, v in capi.pairs(t) do + kk, vv = k, v + if capi.type(k) == "table" then + kk = simplify(k, memo) + end + if capi.type(v) == "table" then + vv = simplify(v, memo) + end + if capi.rawtype(kk) ~= "userdata" and + capi.rawtype(vv) ~= "userdata" then + -- We've not got a proxy left over anywhere, so copy it + ret[kk] = vv + end + end + return ret +end + local function run_wrapper() local wrapperpath = "@@WRAPPER_BIN@@" -- START_TEST_SUPPLE @@ -80,6 +104,10 @@ local function run_sandbox(codestr, codename, ...) else ok, err = limitsok, limitserr end + -- Convert any complex objects returned to us, so we can clean up... + if ok then + ret = simplify(ret) + end -- We need to clean up, so dump all the objects func = nil -- And ask the supple API to clear down too -- cgit v1.2.1