--- /dev/null
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+--*-lua-*-----------------------------------------------------------------------
+-- Override Lua's default compilation functions, so that they support Metalua
+-- rather than only plain Lua
+--------------------------------------------------------------------------------
+
+local mlc = require 'metalua.compiler'
+
+local M = { }
+
+-- Original versions
+local original_lua_versions = {
+ load = load,
+ loadfile = loadfile,
+ loadstring = loadstring,
+ dofile = dofile }
+
+local lua_loadstring = loadstring
+local lua_loadfile = loadfile
+
+function M.loadstring(str, name)
+ if type(str) ~= 'string' then error 'string expected' end
+ if str:match '^\027LuaQ' then return lua_loadstring(str) end
+ local n = str:match '^#![^\n]*\n()'
+ if n then str=str:sub(n, -1) end
+ -- FIXME: handle erroneous returns (return nil + error msg)
+ return mlc.new():src_to_function(str, name)
+end
+
+function M.loadfile(filename)
+ local f, err_msg = io.open(filename, 'rb')
+ if not f then return nil, err_msg end
+ local success, src = pcall( f.read, f, '*a')
+ pcall(f.close, f)
+ if success then return M.loadstring (src, '@'..filename)
+ else return nil, src end
+end
+
+function M.load(f, name)
+ local acc = { }
+ while true do
+ local x = f()
+ if not x then break end
+ assert(type(x)=='string', "function passed to load() must return strings")
+ table.insert(acc, x)
+ end
+ return M.loadstring(table.concat(acc))
+end
+
+function M.dostring(src)
+ local f, msg = M.loadstring(src)
+ if not f then error(msg) end
+ return f()
+end
+
+function M.dofile(name)
+ local f, msg = M.loadfile(name)
+ if not f then error(msg) end
+ return f()
+end
+
+-- Export replacement functions as globals
+for name, f in pairs(M) do _G[name] = f end
+
+-- To be done *after* exportation
+M.lua = original_lua_versions
+
+return M
\ No newline at end of file