2 +----------------------------------------------------------------------+
3 | LUA extension for PHP |
4 +----------------------------------------------------------------------+
5 | Copyright (c) 2007 Johannes Schlueter |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 3.01 of the PHP license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.php.net/license/3_01.txt |
11 | If you did not receive a copy of the PHP license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@php.net so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
15 | Author: Johannes Schlueter <johannes@php.net> |
16 | Marcelo Araujo <msaraujo@php.net> |
17 | Andreas Streichardt <andreas.streichardt@globalpark.com |
18 +----------------------------------------------------------------------+
27 #include "ext/standard/info.h"
34 #define EXT_LUA_VERSION PHP_LUA_VERSION
36 #ifdef LUA_STACK_DEBUG
37 #define LUA_STACK_START(L) int __lua_old_top = lua_gettop(L)
38 #define LUA_STACK_END(L) \
39 if (__lua_old_top != lua_gettop(L)) { \
40 php_error_docref(NULL TSRMLS_CC, E_WARNING, "wrong stack size (%i before operation, %i now)", __lua_old_top, lua_gettop(L)); \
43 #define LUA_STACK_START(L)
44 #define LUA_STACK_END(L)
47 #define LUA_POP_ZVAL(L, z) \
48 php_lua_get_zval_from_stack(L, -1, z); \
51 ZEND_DECLARE_MODULE_GLOBALS(lua
)
53 #define getLuaZ(var) (((php_lua_object*)zend_object_store_get_object(var TSRMLS_CC))->L)
54 #define getLuaY() ((php_lua_object*)zend_object_store_get_object(getThis() TSRMLS_CC))
55 #define getLua() getLuaZ(getThis())
57 static zend_object_handlers lua_handlers
;
58 static zend_class_entry
*lua_ce
;
60 typedef struct _php_lua_object
{
67 static const luaL_Reg php_lualibs
[] = {
68 {"base", luaopen_base
},
69 {LUA_LOADLIBNAME
, luaopen_package
},
70 {LUA_TABLIBNAME
, luaopen_table
},
71 {LUA_IOLIBNAME
, luaopen_io
},
72 {LUA_OSLIBNAME
, luaopen_os
},
73 {LUA_STRLIBNAME
, luaopen_string
},
74 {LUA_MATHLIBNAME
, luaopen_math
},
75 {LUA_DBLIBNAME
, luaopen_debug
},
79 static void php_lua_push_zval(lua_State
*L
, zval
*val_p TSRMLS_DC
);
80 static void php_lua_write_real_property(lua_State
*L
,int index
,zval
*prop
, zval
*value TSRMLS_DC
);
82 static void *php_lua_alloc (void *ud
, void *ptr
, size_t osize
, size_t nsize
) { /* {{{ */
90 return erealloc(ptr
, nsize
);
92 return emalloc(nsize
);
98 static void php_lua_push_array(lua_State
*L
, zval
*array TSRMLS_DC
) /* {{{ */
102 HashPosition pointer
;
112 arr_hash
= Z_ARRVAL_P(array
);
113 array_count
= zend_hash_num_elements(arr_hash
);
117 for(zend_hash_internal_pointer_reset_ex(arr_hash
, &pointer
); zend_hash_get_current_data_ex(arr_hash
, (void**) &data
, &pointer
) == SUCCESS
; zend_hash_move_forward_ex(arr_hash
, &pointer
))
119 hash_key
=zend_hash_get_current_key_ex(arr_hash
, &key
, &key_len
, &index
, 0, &pointer
);
121 if (hash_key
== HASH_KEY_IS_LONG
&& index
== 0) {
122 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Trying to push array index %ld to lua which is unsupported in lua. Element has been discarded",index
);
125 ALLOC_INIT_ZVAL(zkey
);
126 if (hash_key
== HASH_KEY_IS_STRING
) {
127 key_copy
=estrndup(key
,key_len
-1);
128 Z_TYPE_P(zkey
)=IS_STRING
;
129 Z_STRVAL_P(zkey
)=key_copy
;
130 Z_STRLEN_P(zkey
)=key_len
-1;
133 Z_TYPE_P(zkey
)=IS_LONG
;
134 Z_LVAL_P(zkey
)=index
;
137 php_lua_write_real_property(L
,-3,zkey
,*data TSRMLS_CC
);
138 zval_ptr_dtor(&zkey
);
146 static void php_lua_push_zval(lua_State
*L
, zval
*val_p TSRMLS_DC
) /* {{{ */
148 /* TODO: Use proper type for lua and separate only when needed */
150 /* push into lua stack properly */
151 switch (Z_TYPE_P(val_p
)) {
153 lua_pushlstring(L
, Z_STRVAL_P(val_p
), Z_STRLEN_P(val_p
));
161 lua_pushnumber(L
, Z_DVAL_P(val_p
));
165 lua_pushnumber(L
, Z_LVAL_P(val_p
));
169 lua_pushboolean(L
, Z_BVAL_P(val_p
));
173 php_lua_push_array(L
,val_p TSRMLS_CC
);
177 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "invalid type `%s' supported in lua", zend_zval_type_name(val_p
));
184 static int php_lua_push_apply_func(void *pDest
, void *argument TSRMLS_DC
) /* {{{ */
186 php_lua_push_zval((lua_State
*)argument
, *(zval
**)pDest TSRMLS_CC
);
187 return ZEND_HASH_APPLY_KEEP
;
190 static void php_lua_get_zval_from_stack(lua_State
*L
, int index
, zval
*ret TSRMLS_DC
) /* {{{ */
195 switch (lua_type(L
, index
)) {
197 ZVAL_BOOL(ret
, lua_toboolean(L
, index
));
201 ZVAL_DOUBLE(ret
, lua_tonumber(L
, index
));
205 value
= lua_tolstring(L
, index
, &value_len
);
206 ZVAL_STRINGL(ret
, (char*)value
, value_len
, 1);
211 /* notify lua to traverse the table */
216 /* table has been moved by one because of the pushnil */
217 /* this will ONLY work with negative indices! */
218 while (lua_next(L
, index
-1) != 0)
220 ALLOC_INIT_ZVAL(akey
);
221 ALLOC_INIT_ZVAL(aval
);
223 /* `key' is at index -2 and `value' at index -1 */
224 php_lua_get_zval_from_stack(L
,-2,akey
);
225 php_lua_get_zval_from_stack(L
,-1,aval
);
227 switch(Z_TYPE_P(akey
))
229 /* lua can't use (at least when i tried ;) ) floats as array keys so that should be safe */
231 add_index_zval(ret
,(long)Z_DVAL_P(akey
),aval
);
234 add_assoc_zval(ret
,Z_STRVAL_P(akey
),aval
);
237 lua_pop(L
, 1); /* removes `value'; keeps `key' for next iteration */
238 zval_ptr_dtor(&akey
);
244 /* TODO: Make this a PHP Function */
247 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "invalid type `%i' passed from lua.", lua_type(L
, index
));
257 static int php_lua_print(lua_State
*L
) /* {{{ */
260 int n
= lua_gettop(L
);
262 for (i
= 1; i
<= n
; i
++) {
263 php_printf("%s", lua_tostring(L
, i
));
269 static void php_lua_object_dtor(void *object
, zend_object_handle handle TSRMLS_DC
) /* {{{ */
271 php_lua_object
*intern
= (php_lua_object
*)object
;
272 zend_object_std_dtor(&(intern
->std
) TSRMLS_CC
);
275 for (i
=0;i
<intern
->callback_count
;i
++)
276 zval_dtor(&intern
->callbacks
[i
]);
277 efree(intern
->callbacks
);
279 lua_close(intern
->L
);
285 static zval
*php_lua_read_property(zval
*obj
, zval
*prop
, int type TSRMLS_DC
) /* {{{ */
288 lua_State
*L
= getLuaZ(obj
);
292 if (type
!= BP_VAR_R
) {
293 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "No write access using read_property.");
294 ALLOC_INIT_ZVAL(retval
);
298 if (Z_TYPE_P(prop
) == IS_STRING
) {
299 MAKE_STD_ZVAL(retval
);
300 lua_getfield(L
, LUA_GLOBALSINDEX
, Z_STRVAL_P(prop
) TSRMLS_CC
);
301 php_lua_get_zval_from_stack(L
, -1, retval TSRMLS_CC
);
304 ALLOC_INIT_ZVAL(retval
);
315 static void php_lua_write_real_property(lua_State
*L
,int index
,zval
*prop
, zval
*value TSRMLS_DC
) /* {{{ */
318 php_lua_push_zval(L
, prop TSRMLS_CC
);
319 php_lua_push_zval(L
, value TSRMLS_CC
);
321 lua_settable(L
, index
);
327 static void php_lua_write_property(zval
*obj
, zval
*prop
, zval
*value TSRMLS_DC
) /* {{{ */
329 /* TODO: Use proper type for lua and separate only when needed */
330 lua_State
*L
= getLuaZ(obj
);
332 php_lua_write_real_property(L
,LUA_GLOBALSINDEX
,prop
,value TSRMLS_CC
);
335 static int php_lua_atpanic(lua_State
*L
) { /* {{{ */
337 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "lua panic (%s)", lua_tostring(L
, 1));
343 static zend_object_value
php_lua_create_object(zend_class_entry
*ce TSRMLS_DC
) /* {{{ */
346 zend_object_value retval
;
347 php_lua_object
*intern
;
350 L
= lua_newstate(php_lua_alloc
, NULL
);
351 lua_atpanic(L
, php_lua_atpanic
);
353 intern
= ecalloc(1, sizeof(php_lua_object
));
355 intern
->callback_count
=0;
356 intern
->callbacks
=emalloc(sizeof(zval
*));
357 zend_object_std_init(&(intern
->std
), ce TSRMLS_CC
);
358 zend_hash_copy(intern
->std
.properties
,
359 &ce
->default_properties
, (copy_ctor_func_t
) zval_add_ref
,
360 (void *) &tmp
, sizeof(zval
*));
362 retval
.handle
= zend_objects_store_put(intern
, php_lua_object_dtor
, NULL
, NULL TSRMLS_CC
);
363 retval
.handlers
= &lua_handlers
;
367 static int php_lua_callback(lua_State
*L
) /* {{{ */
369 php_lua_object
*object
=(php_lua_object
*)lua_topointer(L
, lua_upvalueindex(1));
370 long selected_callback_index
=(long)lua_tonumber(L
, lua_upvalueindex(2));
373 ALLOC_INIT_ZVAL(return_value
);
375 if (!zend_is_callable(&object
->callbacks
[selected_callback_index
],0,NULL
))
379 int n
= lua_gettop(L
); /* number of arguments */
381 params
=emalloc(n
*sizeof(zval
));
384 for (i
= 1; i
<= n
; i
++) {
385 ALLOC_INIT_ZVAL(params
[i
-1]);
386 /* php_lua_get_zval_from_stack won't work with positive indices */
387 php_lua_get_zval_from_stack(L
,-n
-1+i
,params
[i
-1] TSRMLS_CC
);
390 /* XXX no check - do we need one? :S */
391 /* johannes said i should use zend_call_method but this only allows up to 2 parameters?! */
392 call_user_function(EG(function_table
),NULL
,&object
->callbacks
[selected_callback_index
],return_value
,n
,params TSRMLS_CC
);
394 /* hmm...what if the result is NULL? should php return a return value (NULL) then or just return 0? :S */
395 php_lua_push_zval(L
,return_value TSRMLS_CC
);
397 for (i
= 0; i
< n
; i
++) {
398 zval_ptr_dtor(¶ms
[i
]);
402 zval_ptr_dtor(&return_value
);
404 /* PHP doesn't support multiple return values so this will always be 1 */
408 static void php_lua_call_table_with_arguments(lua_State
*L
,int level
,int table_index
,char *function
,int propagate_self
,zval
*args
,zval
*return_value
) /* {{{ */
410 lua_getfield(L
,table_index
,function
);
411 if (lua_type(L
,lua_gettop(L
)) != LUA_TFUNCTION
) {
412 lua_pop(L
, lua_gettop(L
) - level
);
413 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "invalid lua callback. '%s' is not a defined function",function
);
417 /* push the table on the stack as the first argument */
419 lua_pushvalue(L
,table_index
+ lua_gettop(L
));
421 zend_hash_apply_with_argument(Z_ARRVAL_P(args
), php_lua_push_apply_func
, (void *)L TSRMLS_CC
);
423 if (lua_pcall(L
, zend_hash_num_elements(Z_ARRVAL_P(args
)) + propagate_self
, LUA_MULTRET
, 0) != 0) {
424 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "error running lua function `%s': %s", function
, lua_tostring(L
, -1));
425 lua_pop(L
, lua_gettop(L
) - level
);
429 /* always return an array. otherwise we couldn't distinguish between a table return or a multi return */
430 array_init(return_value
);
431 int retcount
= lua_gettop(L
) - level
;
435 for (i
= -retcount
; i
< 0; i
++)
438 php_lua_get_zval_from_stack(L
, i
, val TSRMLS_CC
);
439 add_next_index_zval(return_value
, val
);
441 lua_pop(L
, retcount
);
446 static void php_lua_call_table_function(INTERNAL_FUNCTION_PARAMETERS
,int propagate_self
) /* {{{ */
448 zval
*callback
,*args
;
449 zval
**lua_table
,**lua_function
;
450 int array_count
,level
;
456 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "za", &callback
, &args
) == FAILURE
) {
460 array_count
=zend_hash_num_elements(Z_ARRVAL_P(callback
));
461 if (array_count
!=2) {
463 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "invalid callback supplied. must contain exactly 2 elements");
466 if (zend_hash_index_find(Z_ARRVAL_P(callback
), 0, (void**)&lua_table
) == FAILURE
) {
467 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "callback index 0 is empty");
470 if (zend_hash_index_find(Z_ARRVAL_P(callback
), 1, (void**)&lua_function
) == FAILURE
) {
471 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "callback index 1 is empty");
474 lua_getglobal(L
,Z_STRVAL_PP(lua_table
));
475 if (lua_type(L
,lua_gettop(L
)) != LUA_TTABLE
) {
477 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "trying to call an invalid table '%s'",Z_STRVAL_PP(lua_table
));
482 php_lua_call_table_with_arguments(L
,level
,-1,Z_STRVAL_PP(lua_function
),propagate_self
,args
,return_value
);
484 /* remove the table which is still on top */
491 static int php_lua_binary_zval_writer(lua_State
* L
, const void* p
,size_t size
, void* u
)
493 Z_STRVAL_P((zval
*)u
)=erealloc(Z_STRVAL_P((zval
*)u
),(Z_STRLEN_P((zval
*)u
)+1+size
)*sizeof(char));
494 memcpy(&Z_STRVAL_P((zval
*)u
)[Z_STRLEN_P((zval
*)u
)],p
,size
);
495 Z_STRLEN_P((zval
*)u
)=Z_STRLEN_P((zval
*)u
)+size
;
496 Z_STRVAL_P((zval
*)u
)[Z_STRLEN_P((zval
*)u
)]='\0';
501 #define RETURN_STR "return %s"
504 /* {{{ lua::__construct()
505 Create new LUA instance */
506 PHP_METHOD(lua
, __construct
)
508 lua_State
*L
= getLua();
509 // mop: open standard libs if desired
510 if (lua_globals
.load_standard_libs
)
513 lua_register(L
, "print", php_lua_print
);
517 /* {{{ lua::__call(string method, array args [, int nresults])
518 Call a lua function from within PHP */
519 PHP_METHOD(lua
, __call
)
522 char *function
, *func
;
525 long nresults
= LUA_MULTRET
;
526 lua_State
*L
= getLua();
530 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa|l", &function
, &function_len
, &args
, &nresults
) == FAILURE
) {
534 level
= lua_gettop(L
);
536 spprintf(&func
, sizeof(RETURN_STR
)-2-1+function_len
, RETURN_STR
, function
);
537 if (luaL_dostring(L
, func
)) {
539 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "error looking up lua function `%s': %s", function
, lua_tostring(L
, -1));
540 lua_pop(L
, lua_gettop(L
) - level
);
546 zend_hash_apply_with_argument(Z_ARRVAL_P(args
), php_lua_push_apply_func
, (void *)L TSRMLS_CC
);
548 if (lua_pcall(L
, zend_hash_num_elements(Z_ARRVAL_P(args
)), nresults
, 0) != 0) {
549 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "error running lua function `%s': %s", function
, lua_tostring(L
, -1));
550 lua_pop(L
, lua_gettop(L
) - level
);
555 retcount
= lua_gettop(L
) - level
;
558 /* No vlaue returned -> return null */
560 /* multiple return values -> build an array */
564 array_init(return_value
);
565 for (i
= -retcount
; i
< 0; i
++)
568 php_lua_get_zval_from_stack(L
, i
, val TSRMLS_CC
);
569 add_next_index_zval(return_value
, val
);
571 lua_pop(L
, retcount
);
578 /* {{{ lua::call_function(string function, array args)
579 Call a lua function from within PHP */
580 PHP_METHOD(lua
, call_function
)
593 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa", &function
, &function_len
, &args
) == FAILURE
) {
597 php_lua_call_table_with_arguments(L
,level
,LUA_GLOBALSINDEX
,function
,0,args
,return_value
);
602 /* {{{ lua::call_table(array lua_callback, array args)
603 Call a lua table from within PHP (lua_table.lua_function()) */
604 PHP_METHOD(lua
, call_table
)
606 php_lua_call_table_function(INTERNAL_FUNCTION_PARAM_PASSTHRU
,0);
609 /* {{{ lua::call_table_self(array lua_callback, array args)
610 Call a lua table from within PHP and propagate self (lua_table:lua_function()) */
611 PHP_METHOD(lua
, call_table_self
)
613 php_lua_call_table_function(INTERNAL_FUNCTION_PARAM_PASSTHRU
,1);
616 /* {{{ void lua::evaluate(string code)
617 Evaluates code with lua */
618 PHP_METHOD(lua
, evaluate
)
623 lua_State
*L
= getLua();
627 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &code
, &code_len
) == FAILURE
) {
631 error
= luaL_loadbuffer(L
, code
, code_len
, "line") || lua_pcall(L
, 0, LUA_MULTRET
, 0);
633 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "lua error: %s", lua_tostring(L
, -1));
634 lua_pop(L
, 1); /* pop error message from the stack */
637 /* always return an array. otherwise we couldn't distinguish between a table return or a multi return */
638 array_init(return_value
);
639 int retcount
= lua_gettop(L
);
643 for (i
= -retcount
; i
< 0; i
++)
646 php_lua_get_zval_from_stack(L
, i
, val TSRMLS_CC
);
647 add_next_index_zval(return_value
, val
);
649 lua_pop(L
, retcount
);
655 /* {{{ void lua::evaluatefile(string file)
656 Evaluates a lua script */
657 PHP_METHOD(lua
, evaluatefile
)
662 lua_State
*L
= getLua();
666 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &file
, &file_len
) == FAILURE
) {
670 if (php_check_open_basedir(file TSRMLS_CC
) || (PG(safe_mode
) && !php_checkuid(file
, "rb+", CHECKUID_CHECK_MODE_PARAM
))) {
675 error
= luaL_dofile(L
, file
);
678 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "lua error: %s", lua_tostring(L
, -1));
682 array_init(return_value
);
683 int retcount
= lua_gettop(L
);
687 for (i
= -retcount
; i
< 0; i
++)
690 php_lua_get_zval_from_stack(L
, i
, val TSRMLS_CC
);
691 add_next_index_zval(return_value
, val
);
693 lua_pop(L
, retcount
);
699 /* {{{ string lua::getVersion()
700 Return Lua's version */
701 PHP_METHOD(lua
, getversion
)
703 RETURN_STRING(LUA_RELEASE
, 1);
708 PHP_METHOD(lua
,expose_function
)
714 php_lua_object
*object
=getLuaY();
715 lua_State
*L
= object
->L
;
717 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
,"sz",&lua_name
,&len
,&callback
) == FAILURE
)
720 if (zend_is_callable(callback
,0,NULL
)) {
721 lua_pushlightuserdata(L
,object
);
722 lua_pushnumber(L
,object
->callback_count
);
723 lua_pushcclosure(L
, php_lua_callback
,2);
724 lua_setglobal(L
, lua_name
);
726 /* hmm...out of memory check? */
727 object
->callbacks
=erealloc(object
->callbacks
,sizeof(zval
)*(object
->callback_count
+1));
728 object
->callbacks
[object
->callback_count
] = *callback
;
729 zval_copy_ctor(&object
->callbacks
[object
->callback_count
]);
730 object
->callback_count
++;
735 PHP_METHOD(lua
,compile
)
741 lua_State
*L
= lua_newstate(php_lua_alloc
, NULL
);
742 lua_atpanic(L
, php_lua_atpanic
);
746 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
,"s",&chunk
,&len
) == FAILURE
)
752 error
= luaL_loadbuffer(L
, chunk
, len
, "line");
754 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "lua error: %s", lua_tostring(L
, -1));
755 lua_pop(L
, 1); /* pop error message from the stack */
762 error
=lua_dump(L
,php_lua_binary_zval_writer
,return_value
);
763 lua_pop(L
, 1); /* clean stack */
767 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Couldn't dump code");
772 /* {{{ lua_functions[] */
773 zend_function_entry lua_functions
[] = {
780 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_call
, 0, 0, 2)
781 ZEND_ARG_INFO(0, method
)
782 ZEND_ARG_INFO(0, args
)
785 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_call_table
, 0, 0, 2)
786 ZEND_ARG_INFO(0, callback
)
787 ZEND_ARG_INFO(0, args
)
790 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_call_function
, 0, 0, 2)
791 ZEND_ARG_INFO(0, function
)
792 ZEND_ARG_INFO(0, args
)
795 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_evaluate
, 0, 0, 1)
796 ZEND_ARG_INFO(0, code
)
799 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_evaluatefile
, 0, 0, 1)
800 ZEND_ARG_INFO(0, file
)
803 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_expose_function
, 0, 0, 1)
804 ZEND_ARG_INFO(0, callback
)
807 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_compile
, 0, 0, 1)
808 ZEND_ARG_INFO(0, chunk
)
813 /* {{{ lua_class_functions[] */
814 zend_function_entry lua_class_functions
[] = {
815 PHP_ME(lua
, __construct
, NULL
, ZEND_ACC_PUBLIC
)
816 PHP_ME(lua
, __call
, arginfo_lua_call
, ZEND_ACC_PUBLIC
)
817 PHP_ME(lua
, call_function
, arginfo_lua_call_function
, ZEND_ACC_PUBLIC
)
818 PHP_ME(lua
, call_table
, arginfo_lua_call_table
, ZEND_ACC_PUBLIC
)
819 PHP_ME(lua
, call_table_self
, arginfo_lua_call_table
, ZEND_ACC_PUBLIC
)
820 PHP_ME(lua
, evaluate
, arginfo_lua_evaluate
, ZEND_ACC_PUBLIC
)
821 PHP_ME(lua
, evaluatefile
, arginfo_lua_evaluatefile
, ZEND_ACC_PUBLIC
)
822 PHP_ME(lua
, getversion
, NULL
, ZEND_ACC_PUBLIC
)
823 PHP_ME(lua
, expose_function
, arginfo_lua_expose_function
, ZEND_ACC_PUBLIC
)
824 PHP_ME(lua
, compile
, arginfo_lua_compile
, ZEND_ACC_PUBLIC
|ZEND_ACC_STATIC
)
829 #ifdef COMPILE_DL_LUA
836 STD_PHP_INI_BOOLEAN("lua.load_standard_libs","1", PHP_INI_ALL
, OnUpdateBool
, load_standard_libs
, zend_lua_globals
, lua_globals
)
840 /* {{{ php_lua_init_globals
842 static void php_lua_init_globals(zend_lua_globals
*lua_globals
)
847 /* {{{ PHP_MINIT_FUNCTION
849 PHP_MINIT_FUNCTION(lua
)
851 REGISTER_INI_ENTRIES();
854 INIT_CLASS_ENTRY(ce
, "lua", lua_class_functions
);
855 lua_ce
= zend_register_internal_class(&ce TSRMLS_CC
);
856 lua_ce
->create_object
= php_lua_create_object
;
857 memcpy(&lua_handlers
, zend_get_std_object_handlers(),
858 sizeof(zend_object_handlers
));
859 lua_handlers
.write_property
= php_lua_write_property
;
860 lua_handlers
.read_property
= php_lua_read_property
;
861 lua_ce
->ce_flags
|= ZEND_ACC_FINAL
;
863 zend_declare_class_constant_long(lua_ce
, "MULTRET", sizeof("MULTRET")-1, LUA_MULTRET TSRMLS_CC
);
865 ZEND_INIT_MODULE_GLOBALS(lua
, php_lua_init_globals
, NULL
);
871 /* {{{ PHP_MSHUTDOWN_FUNCTION
873 PHP_MSHUTDOWN_FUNCTION(lua
)
875 UNREGISTER_INI_ENTRIES();
880 /* {{{ PHP_RINIT_FUNCTION
882 PHP_RINIT_FUNCTION(lua
)
888 /* {{{ PHP_RSHUTDOWN_FUNCTION
890 PHP_RSHUTDOWN_FUNCTION(lua
)
896 /* {{{ PHP_MINFO_FUNCTION
898 PHP_MINFO_FUNCTION(lua
)
900 php_info_print_table_start();
901 php_info_print_table_row(2, "lua support", "enabled");
902 php_info_print_table_row(2, "lua extension version", EXT_LUA_VERSION
);
903 php_info_print_table_row(2, "lua release", LUA_RELEASE
);
904 php_info_print_table_row(2, "lua copyright", LUA_COPYRIGHT
);
905 php_info_print_table_row(2, "lua authors", LUA_AUTHORS
);
906 php_info_print_table_end();
908 DISPLAY_INI_ENTRIES();
912 /* {{{ lua_module_entry
914 zend_module_entry lua_module_entry
= {
915 STANDARD_MODULE_HEADER
,
924 STANDARD_MODULE_PROPERTIES
932 * vim: set noet sw=4 ts=4:
933 * vim600: noet sw=4 ts=4 fdm=marker: