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
) /* {{{ */
196 switch (lua_type(L
, index
)) {
198 ZVAL_BOOL(ret
, lua_toboolean(L
, index
));
202 ZVAL_DOUBLE(ret
, lua_tonumber(L
, index
));
206 value
= lua_tolstring(L
, index
, &value_len
);
207 ZVAL_STRINGL(ret
, (char*)value
, value_len
, 1);
212 /* notify lua to traverse the table */
215 /* table has been moved by one because of the pushnil */
216 /* this will ONLY work with negative indices! */
217 while (lua_next(L
, index
-1) != 0)
219 ALLOC_INIT_ZVAL(akey
);
220 ALLOC_INIT_ZVAL(aval
);
222 /* `key' is at index -2 and `value' at index -1 */
223 php_lua_get_zval_from_stack(L
,-2,akey TSRMLS_CC
);
224 php_lua_get_zval_from_stack(L
,-1,aval TSRMLS_CC
);
226 switch(Z_TYPE_P(akey
))
228 /* lua can't use (at least when i tried ;) ) floats as array keys so that should be safe */
230 add_index_zval(ret
,(long)Z_DVAL_P(akey
),aval
);
233 add_assoc_zval(ret
,Z_STRVAL_P(akey
),aval
);
236 lua_pop(L
, 1); /* removes `value'; keeps `key' for next iteration */
237 zval_ptr_dtor(&akey
);
243 /* TODO: Make this a PHP Function */
246 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "invalid type `%i' passed from lua.", lua_type(L
, index
));
256 static int php_lua_print(lua_State
*L
) /* {{{ */
259 int n
= lua_gettop(L
);
261 for (i
= 1; i
<= n
; i
++) {
262 php_printf("%s", lua_tostring(L
, i
));
268 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
);
274 for (i
=0;i
<intern
->callback_count
;i
++)
275 zval_dtor(&intern
->callbacks
[i
]);
276 efree(intern
->callbacks
);
278 lua_close(intern
->L
);
284 static zval
*php_lua_read_property(zval
*obj
, zval
*prop
, int type TSRMLS_DC
) /* {{{ */
287 lua_State
*L
= getLuaZ(obj
);
291 if (type
!= BP_VAR_R
) {
292 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "No write access using read_property.");
293 ALLOC_INIT_ZVAL(retval
);
297 if (Z_TYPE_P(prop
) == IS_STRING
) {
298 MAKE_STD_ZVAL(retval
);
299 lua_getfield(L
, LUA_GLOBALSINDEX
, Z_STRVAL_P(prop
));
300 php_lua_get_zval_from_stack(L
, -1, retval TSRMLS_CC
);
301 #if PHP_VERSION_ID>=50300
307 ALLOC_INIT_ZVAL(retval
);
318 static void php_lua_write_real_property(lua_State
*L
,int index
,zval
*prop
, zval
*value TSRMLS_DC
) /* {{{ */
321 php_lua_push_zval(L
, prop TSRMLS_CC
);
322 php_lua_push_zval(L
, value TSRMLS_CC
);
324 lua_settable(L
, index
);
330 static void php_lua_write_property(zval
*obj
, zval
*prop
, zval
*value TSRMLS_DC
) /* {{{ */
332 /* TODO: Use proper type for lua and separate only when needed */
333 lua_State
*L
= getLuaZ(obj
);
335 php_lua_write_real_property(L
,LUA_GLOBALSINDEX
,prop
,value TSRMLS_CC
);
338 static int php_lua_atpanic(lua_State
*L
) { /* {{{ */
340 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "lua panic (%s)", lua_tostring(L
, 1));
346 static zend_object_value
php_lua_create_object(zend_class_entry
*ce TSRMLS_DC
) /* {{{ */
349 zend_object_value retval
;
350 php_lua_object
*intern
;
353 L
= lua_newstate(php_lua_alloc
, NULL
);
354 lua_atpanic(L
, php_lua_atpanic
);
356 intern
= ecalloc(1, sizeof(php_lua_object
));
358 intern
->callback_count
=0;
359 intern
->callbacks
=emalloc(sizeof(zval
*));
360 zend_object_std_init(&(intern
->std
), ce TSRMLS_CC
);
361 #if PHP_VERSION_ID < 50399
362 zend_hash_copy(intern
->std
.properties
,
363 &ce
->default_properties
, (copy_ctor_func_t
) zval_add_ref
,
364 (void *) &tmp
, sizeof(zval
*));
366 object_properties_init(&(intern
->std
), ce
);
369 retval
.handle
= zend_objects_store_put(intern
, php_lua_object_dtor
, NULL
, NULL TSRMLS_CC
);
370 retval
.handlers
= &lua_handlers
;
374 static int php_lua_callback(lua_State
*L
) /* {{{ */
377 php_lua_object
*object
=(php_lua_object
*)lua_topointer(L
, lua_upvalueindex(1));
378 long selected_callback_index
=(long)lua_tonumber(L
, lua_upvalueindex(2));
380 TSRMLS_D
=(void ***)lua_topointer(L
,lua_upvalueindex(3));
385 ALLOC_INIT_ZVAL(return_value
);
387 #if PHP_VERSION_ID>=50300
388 if (!zend_is_callable(&object
->callbacks
[selected_callback_index
],0,NULL TSRMLS_CC
))
390 if (!zend_is_callable(&object
->callbacks
[selected_callback_index
],0,NULL
))
394 n
= lua_gettop(L
); /* number of arguments */
396 params
=emalloc(n
*sizeof(zval
));
398 for (i
= 1; i
<= n
; i
++) {
399 ALLOC_INIT_ZVAL(params
[i
-1]);
400 /* php_lua_get_zval_from_stack won't work with positive indices */
401 php_lua_get_zval_from_stack(L
,-n
-1+i
,params
[i
-1] TSRMLS_CC
);
404 /* XXX no check - do we need one? :S */
405 /* johannes said i should use zend_call_method but this only allows up to 2 parameters?! */
406 call_user_function(EG(function_table
),NULL
,&object
->callbacks
[selected_callback_index
],return_value
,n
,params TSRMLS_CC
);
408 /* hmm...what if the result is NULL? should php return a return value (NULL) then or just return 0? :S */
409 php_lua_push_zval(L
,return_value TSRMLS_CC
);
411 for (i
= 0; i
< n
; i
++) {
412 zval_ptr_dtor(¶ms
[i
]);
416 zval_ptr_dtor(&return_value
);
418 /* PHP doesn't support multiple return values so this will always be 1 */
422 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 TSRMLS_DC
) /* {{{ */
427 lua_getfield(L
,table_index
,function
);
428 if (lua_type(L
,lua_gettop(L
)) != LUA_TFUNCTION
) {
429 lua_pop(L
, lua_gettop(L
) - level
);
430 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "invalid lua callback. '%s' is not a defined function",function
);
434 /* push the table on the stack as the first argument */
436 lua_pushvalue(L
,table_index
+ lua_gettop(L
));
438 zend_hash_apply_with_argument(Z_ARRVAL_P(args
), php_lua_push_apply_func
, (void *)L TSRMLS_CC
);
440 if (lua_pcall(L
, zend_hash_num_elements(Z_ARRVAL_P(args
)) + propagate_self
, LUA_MULTRET
, 0) != 0) {
441 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "error running lua function `%s': %s", function
, lua_tostring(L
, -1));
442 lua_pop(L
, lua_gettop(L
) - level
);
446 /* always return an array. otherwise we couldn't distinguish between a table return or a multi return */
447 array_init(return_value
);
448 retcount
= lua_gettop(L
) - level
;
450 for (i
= -retcount
; i
< 0; i
++)
453 php_lua_get_zval_from_stack(L
, i
, val TSRMLS_CC
);
454 add_next_index_zval(return_value
, val
);
456 lua_pop(L
, retcount
);
461 static void php_lua_call_table_function(INTERNAL_FUNCTION_PARAMETERS
,int propagate_self
) /* {{{ */
463 zval
*callback
,*args
;
464 zval
**lua_table
,**lua_function
;
465 int array_count
,level
;
471 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "za", &callback
, &args
) == FAILURE
) {
475 array_count
=zend_hash_num_elements(Z_ARRVAL_P(callback
));
476 if (array_count
!=2) {
478 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "invalid callback supplied. must contain exactly 2 elements");
481 if (zend_hash_index_find(Z_ARRVAL_P(callback
), 0, (void**)&lua_table
) == FAILURE
) {
482 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "callback index 0 is empty");
485 if (zend_hash_index_find(Z_ARRVAL_P(callback
), 1, (void**)&lua_function
) == FAILURE
) {
486 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "callback index 1 is empty");
489 lua_getglobal(L
,Z_STRVAL_PP(lua_table
));
490 if (lua_type(L
,lua_gettop(L
)) != LUA_TTABLE
) {
492 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "trying to call an invalid table '%s'",Z_STRVAL_PP(lua_table
));
497 php_lua_call_table_with_arguments(L
,level
,-1,Z_STRVAL_PP(lua_function
),propagate_self
,args
,return_value TSRMLS_CC
);
499 /* remove the table which is still on top */
506 static int php_lua_binary_zval_writer(lua_State
* L
, const void* p
,size_t size
, void* u
)
508 Z_STRVAL_P((zval
*)u
)=erealloc(Z_STRVAL_P((zval
*)u
),(Z_STRLEN_P((zval
*)u
)+1+size
)*sizeof(char));
509 memcpy(&Z_STRVAL_P((zval
*)u
)[Z_STRLEN_P((zval
*)u
)],p
,size
);
510 Z_STRLEN_P((zval
*)u
)=Z_STRLEN_P((zval
*)u
)+size
;
511 Z_STRVAL_P((zval
*)u
)[Z_STRLEN_P((zval
*)u
)]='\0';
516 #define RETURN_STR "return %s"
519 /* {{{ lua::__construct()
520 Create new LUA instance */
521 PHP_METHOD(lua
, __construct
)
523 lua_State
*L
= getLua();
524 // mop: open standard libs if desired
525 if (INI_BOOL("lua.load_standard_libs")) {
528 lua_register(L
, "print", php_lua_print
);
532 /* {{{ lua::__call(string method, array args [, int nresults])
533 Call a lua function from within PHP */
534 PHP_METHOD(lua
, __call
)
537 char *function
, *func
;
540 long nresults
= LUA_MULTRET
;
541 lua_State
*L
= getLua();
545 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa|l", &function
, &function_len
, &args
, &nresults
) == FAILURE
) {
549 level
= lua_gettop(L
);
551 spprintf(&func
, sizeof(RETURN_STR
)-2-1+function_len
, RETURN_STR
, function
);
552 if (luaL_dostring(L
, func
)) {
554 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "error looking up lua function `%s': %s", function
, lua_tostring(L
, -1));
555 lua_pop(L
, lua_gettop(L
) - level
);
561 zend_hash_apply_with_argument(Z_ARRVAL_P(args
), php_lua_push_apply_func
, (void *)L TSRMLS_CC
);
563 if (lua_pcall(L
, zend_hash_num_elements(Z_ARRVAL_P(args
)), nresults
, 0) != 0) {
564 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "error running lua function `%s': %s", function
, lua_tostring(L
, -1));
565 lua_pop(L
, lua_gettop(L
) - level
);
570 retcount
= lua_gettop(L
) - level
;
573 /* No vlaue returned -> return null */
575 /* multiple return values -> build an array */
579 array_init(return_value
);
580 for (i
= -retcount
; i
< 0; i
++)
583 php_lua_get_zval_from_stack(L
, i
, val TSRMLS_CC
);
584 add_next_index_zval(return_value
, val
);
586 lua_pop(L
, retcount
);
593 /* {{{ lua::call_function(string function, array args)
594 Call a lua function from within PHP */
595 PHP_METHOD(lua
, call_function
)
608 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "sa", &function
, &function_len
, &args
) == FAILURE
) {
612 php_lua_call_table_with_arguments(L
,level
,LUA_GLOBALSINDEX
,function
,0,args
,return_value TSRMLS_CC
);
617 /* {{{ lua::call_table(array lua_callback, array args)
618 Call a lua table from within PHP (lua_table.lua_function()) */
619 PHP_METHOD(lua
, call_table
)
621 php_lua_call_table_function(INTERNAL_FUNCTION_PARAM_PASSTHRU
,0);
624 /* {{{ lua::call_table_self(array lua_callback, array args)
625 Call a lua table from within PHP and propagate self (lua_table:lua_function()) */
626 PHP_METHOD(lua
, call_table_self
)
628 php_lua_call_table_function(INTERNAL_FUNCTION_PARAM_PASSTHRU
,1);
631 /* {{{ void lua::evaluate(string code)
632 Evaluates code with lua */
633 PHP_METHOD(lua
, evaluate
)
641 lua_State
*L
= getLua();
645 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &code
, &code_len
) == FAILURE
) {
649 error
= luaL_loadbuffer(L
, code
, code_len
, "line") || lua_pcall(L
, 0, LUA_MULTRET
, 0);
651 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "lua error: %s", lua_tostring(L
, -1));
652 lua_pop(L
, 1); /* pop error message from the stack */
655 /* always return an array. otherwise we couldn't distinguish between a table return or a multi return */
656 array_init(return_value
);
657 retcount
= lua_gettop(L
);
659 for (i
= -retcount
; i
< 0; i
++)
662 php_lua_get_zval_from_stack(L
, i
, val TSRMLS_CC
);
663 add_next_index_zval(return_value
, val
);
665 lua_pop(L
, retcount
);
671 /* {{{ void lua::evaluatefile(string file)
672 Evaluates a lua script */
673 PHP_METHOD(lua
, evaluatefile
)
678 lua_State
*L
= getLua();
685 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
, "s", &file
, &file_len
) == FAILURE
) {
689 #if PHP_VERSION_ID < 50399
690 if (php_check_open_basedir(file TSRMLS_CC
) || (PG(safe_mode
) && !php_checkuid(file
, "rb+", CHECKUID_CHECK_MODE_PARAM
))) {
696 error
= luaL_dofile(L
, file
);
699 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "lua error: %s", lua_tostring(L
, -1));
702 retcount
=lua_gettop(L
);
703 array_init(return_value
);
705 for (i
= -retcount
; i
< 0; i
++)
708 php_lua_get_zval_from_stack(L
, i
, val TSRMLS_CC
);
709 add_next_index_zval(return_value
, val
);
711 lua_pop(L
, retcount
);
717 /* {{{ string lua::getVersion()
718 Return Lua's version */
719 PHP_METHOD(lua
, getversion
)
721 RETURN_STRING(LUA_RELEASE
, 1);
726 PHP_METHOD(lua
,expose_function
)
733 php_lua_object
*object
=getLuaY();
734 lua_State
*L
= object
->L
;
736 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
,"sz",&lua_name
,&len
,&callback
) == FAILURE
)
739 #if PHP_VERSION_ID>=50300
740 if (zend_is_callable(callback
,0,NULL TSRMLS_CC
)) {
742 if (zend_is_callable(callback
,0,NULL
)) {
744 lua_pushlightuserdata(L
,object
);
745 lua_pushnumber(L
,object
->callback_count
);
747 lua_pushlightuserdata(L
,TSRMLS_C
);
752 lua_pushcclosure(L
, php_lua_callback
,param_count
);
753 lua_setglobal(L
, lua_name
);
755 /* hmm...out of memory check? */
756 object
->callbacks
=erealloc(object
->callbacks
,sizeof(zval
)*(object
->callback_count
+1));
757 object
->callbacks
[object
->callback_count
] = *callback
;
758 zval_copy_ctor(&object
->callbacks
[object
->callback_count
]);
759 object
->callback_count
++;
764 PHP_METHOD(lua
,compile
)
770 lua_State
*L
= lua_newstate(php_lua_alloc
, NULL
);
771 lua_atpanic(L
, php_lua_atpanic
);
775 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC
,"s",&chunk
,&len
) == FAILURE
)
781 error
= luaL_loadbuffer(L
, chunk
, len
, "line");
783 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "lua error: %s", lua_tostring(L
, -1));
784 lua_pop(L
, 1); /* pop error message from the stack */
791 error
=lua_dump(L
,php_lua_binary_zval_writer
,return_value
);
792 lua_pop(L
, 1); /* clean stack */
796 php_error_docref(NULL TSRMLS_CC
, E_WARNING
, "Couldn't dump code");
804 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_call
, 0, 0, 2)
805 ZEND_ARG_INFO(0, method
)
806 ZEND_ARG_INFO(0, args
)
809 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_call_table
, 0, 0, 2)
810 ZEND_ARG_INFO(0, callback
)
811 ZEND_ARG_INFO(0, args
)
814 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_call_function
, 0, 0, 2)
815 ZEND_ARG_INFO(0, function
)
816 ZEND_ARG_INFO(0, args
)
819 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_evaluate
, 0, 0, 1)
820 ZEND_ARG_INFO(0, code
)
823 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_evaluatefile
, 0, 0, 1)
824 ZEND_ARG_INFO(0, file
)
827 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_expose_function
, 0, 0, 2)
828 ZEND_ARG_INFO(0, lua_name
)
829 ZEND_ARG_INFO(0, callback
)
832 ZEND_BEGIN_ARG_INFO_EX(arginfo_lua_compile
, 0, 0, 1)
833 ZEND_ARG_INFO(0, chunk
)
838 /* {{{ lua_class_functions[] */
839 zend_function_entry lua_class_functions
[] = {
840 PHP_ME(lua
, __construct
, NULL
, ZEND_ACC_PUBLIC
)
841 PHP_ME(lua
, __call
, arginfo_lua_call
, ZEND_ACC_PUBLIC
)
842 PHP_ME(lua
, call_function
, arginfo_lua_call_function
, ZEND_ACC_PUBLIC
)
843 PHP_ME(lua
, call_table
, arginfo_lua_call_table
, ZEND_ACC_PUBLIC
)
844 PHP_ME(lua
, call_table_self
, arginfo_lua_call_table
, ZEND_ACC_PUBLIC
)
845 PHP_ME(lua
, evaluate
, arginfo_lua_evaluate
, ZEND_ACC_PUBLIC
)
846 PHP_ME(lua
, evaluatefile
, arginfo_lua_evaluatefile
, ZEND_ACC_PUBLIC
)
847 PHP_ME(lua
, getversion
, NULL
, ZEND_ACC_PUBLIC
)
848 PHP_ME(lua
, expose_function
, arginfo_lua_expose_function
, ZEND_ACC_PUBLIC
)
849 PHP_ME(lua
, compile
, arginfo_lua_compile
, ZEND_ACC_PUBLIC
|ZEND_ACC_STATIC
)
854 #ifdef COMPILE_DL_LUA
861 STD_PHP_INI_BOOLEAN("lua.load_standard_libs","1", PHP_INI_ALL
, OnUpdateBool
, load_standard_libs
, zend_lua_globals
, lua_globals
)
865 /* {{{ php_lua_init_globals
867 static void php_lua_init_globals(zend_lua_globals
*lua_globals
)
872 /* {{{ PHP_MINIT_FUNCTION
874 PHP_MINIT_FUNCTION(lua
)
877 ZEND_INIT_MODULE_GLOBALS(lua
, php_lua_init_globals
, NULL
);
879 REGISTER_INI_ENTRIES();
880 INIT_CLASS_ENTRY(ce
, "lua", lua_class_functions
);
881 lua_ce
= zend_register_internal_class(&ce TSRMLS_CC
);
882 lua_ce
->create_object
= php_lua_create_object
;
883 memcpy(&lua_handlers
, zend_get_std_object_handlers(),
884 sizeof(zend_object_handlers
));
885 lua_handlers
.write_property
= php_lua_write_property
;
886 lua_handlers
.read_property
= php_lua_read_property
;
887 lua_ce
->ce_flags
|= ZEND_ACC_FINAL
;
889 zend_declare_class_constant_long(lua_ce
, "MULTRET", sizeof("MULTRET")-1, LUA_MULTRET TSRMLS_CC
);
895 /* {{{ PHP_MSHUTDOWN_FUNCTION
897 PHP_MSHUTDOWN_FUNCTION(lua
)
899 UNREGISTER_INI_ENTRIES();
904 /* {{{ PHP_RINIT_FUNCTION
906 PHP_RINIT_FUNCTION(lua
)
912 /* {{{ PHP_RSHUTDOWN_FUNCTION
914 PHP_RSHUTDOWN_FUNCTION(lua
)
920 /* {{{ PHP_MINFO_FUNCTION
922 PHP_MINFO_FUNCTION(lua
)
924 php_info_print_table_start();
925 php_info_print_table_row(2, "lua support", "enabled");
926 php_info_print_table_row(2, "lua extension version", EXT_LUA_VERSION
);
927 php_info_print_table_row(2, "lua release", LUA_RELEASE
);
928 php_info_print_table_row(2, "lua copyright", LUA_COPYRIGHT
);
929 php_info_print_table_row(2, "lua authors", LUA_AUTHORS
);
930 php_info_print_table_end();
932 DISPLAY_INI_ENTRIES();
936 /* {{{ lua_module_entry
938 zend_module_entry lua_module_entry
= {
939 STANDARD_MODULE_HEADER
,
948 STANDARD_MODULE_PROPERTIES
956 * vim: set noet sw=4 ts=4:
957 * vim600: noet sw=4 ts=4 fdm=marker: