AddCSLuaFile("init.lua")
/******************************************************************************\
Expression 2 for Garry's Mod
Andreas "Syranide" Svensson, me@syranide.com
\******************************************************************************/
// ADD FUNCTIONS FOR COLOR CONVERSION!
// ADD CONSOLE SUPPORT
/*
n = numeric
v = vector
s = string
t = table
e = entity
x = non-basic extensions prefix
*/
wire_expression2_delta = 0.0000001000000
delta = wire_expression2_delta
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
-- functions to type-check function return values.
local wire_expression2_debug = CreateConVar("wire_expression2_debug", 0, 0)
cvars.AddChangeCallback("wire_expression2_debug", function(CVar, PreviousValue, NewValue)
if (PreviousValue) == NewValue then return end
wire_expression2_reload()
end)
-- Removes a typecheck from a function identified by the given signature.
local function removecheck(signature)
local entry = wire_expression2_funcs[signature]
local oldfunc,signature, rets, func,cost = entry.oldfunc,unpack(entry)
if not oldfunc then return end
func = oldfunc
oldfunc = nil
entry[3] = func
entry.oldfunc = oldfunc
end
-- TODO: combine with makecheck
local function namefunc(func, name)
name = "e2_"..name:gsub("[^A-Za-z_0-9]","_")
wire_expression2_namefunc = func
RunString(([[
local %s = wire_expression2_namefunc
function wire_expression2_namefunc(...)
local ret = %s(...)
return ret
end
]]):format(name, name))
local ret = wire_expression2_namefunc
wire_expression2_namefunc = nil
return ret
end
-- Installs a typecheck in a function identified by the given signature.
local function makecheck(signature)
local name = signature:match("^([^(]*)")
local entry = wire_expression2_funcs[signature]
local oldfunc,signature, rets, func,cost = entry.oldfunc,unpack(entry)
if oldfunc then return end
oldfunc = namefunc(func, name)
function func(...)
local retval = oldfunc(...)
local checker = wire_expression_types2[rets][5]
if not checker then return retval end
local ok, msg = pcall(checker, retval)
if ok then return retval end
debug.Trace()
local full_signature = E2Lib.generate_signature(signature, rets)
error(string.format("Type check for function %q failed: %s\n", full_signature, msg),0)
return retval
end
entry[3] = func
entry.oldfunc = oldfunc
end
/******************************************************************************/
function wire_expression2_reset_extensions()
wire_expression_callbacks = {
construct = {},
destruct = {},
preexecute = {},
postexecute = {},
}
wire_expression_types = {}
wire_expression_types2 = {
[""] = {
[5] = function(retval) if retval ~= nil then error("Return value of void function is not nil.",0) end end
}
}
wire_expression2_funcs = {}
wire_expression2_funclist = {}
if CLIENT then wire_expression2_funclist_lowercase = {} end
wire_expression2_constants = {}
end
-- additional args: ,