File: Interpreter.h

package info (click to toggle)
freespace2 24.2.0%2Brepack-3
  • links: PTS, VCS
  • area: non-free
  • in suites: forky, sid
  • size: 43,740 kB
  • sloc: cpp: 595,005; ansic: 21,741; python: 1,174; sh: 457; makefile: 243; xml: 181
file content (138 lines) | stat: -rw-r--r-- 7,045 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
 * This source file is part of libRocket, the HTML/CSS Interface Middleware
 *
 * For the latest information, see http://www.librocket.com
 *
 * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 */
 
#ifndef ROCKETCORELUAINTERPRETER_H
#define ROCKETCORELUAINTERPRETER_H 

#include "Header.h"
#include <Rocket/Core/Lua/lua.hpp>
#include <Rocket/Core/Lua/LuaSystemInterface.h>
#include <Rocket/Core/Plugin.h>

#include <memory>

namespace Rocket {
namespace Core {
namespace Lua {

/**
    This initializes the Lua interpreter, and has functions to load the scripts or
    call functions that exist in Lua.

    @author Nathan Starkey
*/
class ROCKETLUA_API Interpreter : public Plugin
{
public:
    /** This function calls luaL_loadfile and then lua_pcall, reporting the errors (if any)
    @param[in] file Fully qualified file name to execute.
    @remark Somewhat misleading name if you are used to the Lua meaning of "load file". It behaves
    exactly as luaL_dofile does.            */
    static void LoadFile(const Rocket::Core::String& file, Rocket::Core::Element* context);
    /** Calls lua_dostring and reports the errors.
    @param[in] code String to execute
    @param[in] name Name for the code that will show up in the Log  */
    static void DoString(const Rocket::Core::String& code, Rocket::Core::Element* context, const Rocket::Core::String& name = "");
    /** Same as DoString, except does NOT call pcall on it. It will leave the compiled (but not executed) string
    on top of the stack. It behaves exactly like luaL_loadstring, but you get to specify the name
    @param[in] code String to compile
    @param[in] name Name for the code that will show up in the Log    */
    static void LoadString(const Rocket::Core::String& code, Rocket::Core::Element* context, const Rocket::Core::String& name = "");

    /** Clears all of the items on the stack, and pushes the function from funRef on top of the stack. Only use
    this if you used lua_ref instead of luaL_ref
    @param[in] funRef Lua reference that you would recieve from calling lua_ref   */
    static void BeginCall(int funRef);
    /** Uses lua_pcall on a function, which executes the function with params number of parameters and pushes
    res number of return values on to the stack.
    @pre Before you call this, your stack should look like:
    [1] function to call; 
    [2...top] parameters to pass to the function (if any).
    Or, in words, make sure to push the function on the stack before the parameters.
    @post After this function, the params and function will be popped off, and 'res' 
    number of items will be pushed.     */
    static bool ExecuteCall(int params = 0, int res = 0);
    /** removes 'res' number of items from the stack
    @param[in] res Number of results to remove from the stack.   */
    static void EndCall(int res = 0);

    /** This will populate the global Lua table with all of the Lua core types by calling LuaType<T>::Register
    @param[in] L The lua_State to use to register the types
    @remark This is called automatically inside of Interpreter::Startup(), so you do not have to 
    call this function upon initialization of the Interpreter. If you are using RocketControlsLua, then you
    \em will need to call Rocket::Controls::Lua::RegisterTypes(lua_State*)     */
    static void RegisterCoreTypes(lua_State* L);

    static int ErrorHandler(lua_State* L);

    /** 
    @return The lua_State that the Interpreter created in Interpreter::Startup()
    @remark This class lacks a SetLuaState for a reason. If you have to use a seperate Lua binding and want to keep the types
    from libRocket, then use this lua_State; it will already have all of the libraries loaded, and all of the types defined.
    Alternatively, you can call RegisterCoreTypes(lua_State*) with your own Lua state if you need them defined in it. */
    static lua_State* GetLuaState();

	static LuaSystemInterface* GetLuaSystemInterface();

    /** Creates the plugin. 
	@remark This is equivilent to calling Initialise(NULL).
      */
    static void Initialise(std::unique_ptr<LuaSystemInterface> interface);
    /** Creates the plugin and adds Rocket to an existing Lua context if one is provided.
	 @remark Call this function only once, and special care must be taken when destroying the lua_State passed to this method.
	 Interpreter::Shutdown() calles lua_close on the lua_State pointer provided here, do not call Interpreter::Shutdown if you
	 must call lua_close yourself or if you need to continue to use the lua_State pointer provided here.  Internally, it calls
	 Interpreter::Startup() and registers the "body" tag to generate a LuaDocument rather than a Rocket::Core::ElementDocument.
	 If the argument provided is NULL, a Lua context is created automatically instead. */
    static void Initialise(lua_State *_Lua, std::unique_ptr<LuaSystemInterface> interface);

    /** Stops the plugin by calling lua_close
	 @remark Shutdown calls lua_Close on the lua_State associated with the Interpreter.  If a lua_State was provided in the
	 original call to Initialise, Shutdown should not be called OR you must not call lua_Close from within your code. */
	static void Shutdown(bool free_state);
    
    /** @sa Rocket::Core::Plugin::GetEventClasses */
    virtual int GetEventClasses();
    /** @sa Rocket::Core::Plugin::OnInitialise */
    virtual void OnInitialise();
    /** Currently does nothing. You must call Interpreter::Shutdown yourself at the appropriate time.
    @sa Rocket::Core::Plugin::OnShutdown    */
    virtual void OnShutdown();
private:
    /** Creates a lua_State for @var _Lua and calls luaL_openlibs, then calls Interpreter::RegisterCoreTypes(lua_State*)
    @remark called by Interpreter::Initialise()    */
    void Startup();

    /** Lua state that Interpreter::Initialise() creates.    */
    static lua_State* _Lua;
	static std::unique_ptr<LuaSystemInterface> _SystemInterface;
};
}
}
}
#endif