1 /*
2  * $Id: LuaState.java,v 1.9 2006/12/22 14:06:40 thiago Exp $
3  * Copyright (C) 2003-2007 Kepler Project.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining
6  * a copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sublicense, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
25 package org.keplerproject.luajava;
26 
27 /**
28  * LuaState if the main class of LuaJava for the Java developer.
29  * LuaState is a mapping of most of Lua's C API functions.
30  * LuaState also provides many other functions that will be used to manipulate
31  * objects between Lua and Java.
32  * @author Thiago Ponte
33  */
34 public class LuaState
35 {
36   private final static String LUAJAVA_LIB = "luajava-1.1";
37 
38   final public static Integer LUA_GLOBALSINDEX  = new Integer(-10002);
39   final public static Integer LUA_REGISTRYINDEX = new Integer(-10000);
40 
41   final public static Integer LUA_TNONE     = new Integer(-1);
42   final public static Integer LUA_TNIL      = new Integer(0);
43   final public static Integer LUA_TBOOLEAN  = new Integer(1);
44   final public static Integer LUA_TLIGHTUSERDATA = new Integer(2);
45   final public static Integer LUA_TNUMBER   = new Integer(3);
46   final public static Integer LUA_TSTRING   = new Integer(4);
47   final public static Integer LUA_TTABLE    = new Integer(5);
48   final public static Integer LUA_TFUNCTION = new Integer(6);
49   final public static Integer LUA_TUSERDATA = new Integer(7);
50   final public static Integer LUA_TTHREAD   = new Integer(8);
51 
52   /**
53    * Specifies that an unspecified (multiple) number of return arguments
54    * will be returned by a call.
55    */
56   final public static Integer LUA_MULTRET   = new Integer(-1);
57 
58   /*
59    * error codes for `lua_load' and `lua_pcall'
60    */
61   /**
62    * a runtime error.
63    */
64   final public static Integer LUA_ERRRUN    = new Integer(1);
65 
66   /**
67    *
68    */
69   final public static Integer LUA_YIELD     = new Integer(2);
70 
71   /**
72    * syntax error during pre-compilation.
73    */
74   final public static Integer LUA_ERRSYNTAX = new Integer(3);
75 
76   /**
77    * memory allocation error. For such errors, Lua does not call
78    * the error handler function.
79    */
80   final public static Integer LUA_ERRMEM    = new Integer(4);
81 
82   /**
83    * error while running the error handler function.
84    */
85   final public static Integer LUA_ERRERR    = new Integer(5);
86 
87   /**
88    * Opens the library containing the luajava API
89    */
90   static
91   {
92     System.loadLibrary(LUAJAVA_LIB);
93   }
94 
95   private CPtr luaState;
96 
97   private int stateId;
98 
99   /**
100    * Constructor to instance a new LuaState and initialize it with LuaJava's functions
101    * @param stateId
102    */
LuaState(int stateId)103   protected LuaState(int stateId)
104   {
105     luaState = _open();
106     luajava_open(luaState, stateId);
107     this.stateId = stateId;
108   }
109 
110   /**
111    * Receives a existing state and initializes it
112    * @param luaState
113    */
LuaState(CPtr luaState)114   protected LuaState(CPtr luaState)
115   {
116     this.luaState = luaState;
117     this.stateId = LuaStateFactory.insertLuaState(this);
118     luajava_open(luaState, stateId);
119   }
120 
121   /**
122    * Closes state and removes the object from the LuaStateFactory
123    */
close()124   public synchronized void close()
125   {
126     LuaStateFactory.removeLuaState(stateId);
127     _close(luaState);
128     this.luaState = null;
129   }
130 
131   /**
132    * Returns <code>true</code> if state is closed.
133    */
isClosed()134   public synchronized boolean isClosed()
135   {
136     return luaState == null;
137   }
138 
139   /**
140    * Return the long representing the LuaState pointer
141    * @return long
142    */
getCPtrPeer()143   public long getCPtrPeer()
144   {
145     return (luaState != null)? luaState.getPeer() : 0;
146   }
147 
148 
149   /********************* Lua Native Interface *************************/
150 
_open()151   private synchronized native CPtr _open();
_close(CPtr ptr)152   private synchronized native void _close(CPtr ptr);
_newthread(CPtr ptr)153   private synchronized native CPtr _newthread(CPtr ptr);
154 
155   // Stack manipulation
_getTop(CPtr ptr)156   private synchronized native int  _getTop(CPtr ptr);
_setTop(CPtr ptr, int idx)157   private synchronized native void _setTop(CPtr ptr, int idx);
_pushValue(CPtr ptr, int idx)158   private synchronized native void _pushValue(CPtr ptr, int idx);
_remove(CPtr ptr, int idx)159   private synchronized native void _remove(CPtr ptr, int idx);
_insert(CPtr ptr, int idx)160   private synchronized native void _insert(CPtr ptr, int idx);
_replace(CPtr ptr, int idx)161   private synchronized native void _replace(CPtr ptr, int idx);
_checkStack(CPtr ptr, int sz)162   private synchronized native int  _checkStack(CPtr ptr, int sz);
163 
_xmove(CPtr from, CPtr to, int n)164   private synchronized native void _xmove(CPtr from, CPtr to, int n);
165 
166   // Access functions
_isNumber(CPtr ptr, int idx)167   private synchronized native int    _isNumber(CPtr ptr, int idx);
_isString(CPtr ptr, int idx)168   private synchronized native int    _isString(CPtr ptr, int idx);
_isCFunction(CPtr ptr, int idx)169   private synchronized native int    _isCFunction(CPtr ptr, int idx);
_isUserdata(CPtr ptr, int idx)170   private synchronized native int    _isUserdata(CPtr ptr, int idx);
_type(CPtr ptr, int idx)171   private synchronized native int    _type(CPtr ptr, int idx);
_typeName(CPtr ptr, int tp)172   private synchronized native String _typeName(CPtr ptr, int tp);
173 
_equal(CPtr ptr, int idx1, int idx2)174   private synchronized native int _equal(CPtr ptr, int idx1, int idx2);
_rawequal(CPtr ptr, int idx1, int idx2)175   private synchronized native int _rawequal(CPtr ptr, int idx1, int idx2);
_lessthan(CPtr ptr, int idx1, int idx2)176   private synchronized native int _lessthan(CPtr ptr, int idx1, int idx2);
177 
_toNumber(CPtr ptr, int idx)178   private synchronized native double _toNumber(CPtr ptr, int idx);
_toInteger(CPtr ptr, int idx)179   private synchronized native int    _toInteger(CPtr ptr, int idx);
_toBoolean(CPtr ptr, int idx)180   private synchronized native int    _toBoolean(CPtr ptr, int idx);
_toString(CPtr ptr, int idx)181   private synchronized native String _toString(CPtr ptr, int idx);
_objlen(CPtr ptr, int idx)182   private synchronized native int    _objlen(CPtr ptr, int idx);
_toThread(CPtr ptr, int idx)183   private synchronized native CPtr   _toThread(CPtr ptr, int idx);
184 
185   // Push functions
_pushNil(CPtr ptr)186   private synchronized native void _pushNil(CPtr ptr);
_pushNumber(CPtr ptr, double number)187   private synchronized native void _pushNumber(CPtr ptr, double number);
_pushInteger(CPtr ptr, int integer)188   private synchronized native void _pushInteger(CPtr ptr, int integer);
_pushString(CPtr ptr, String str)189   private synchronized native void _pushString(CPtr ptr, String str);
_pushString(CPtr ptr, byte[] bytes, int n)190   private synchronized native void _pushString(CPtr ptr, byte[] bytes, int n);
_pushBoolean(CPtr ptr, int bool)191   private synchronized native void _pushBoolean(CPtr ptr, int bool);
192 
193   // Get functions
_getTable(CPtr ptr, int idx)194   private synchronized native void _getTable(CPtr ptr, int idx);
_getField(CPtr ptr, int idx, String k)195   private synchronized native void _getField(CPtr ptr, int idx, String k);
_rawGet(CPtr ptr, int idx)196   private synchronized native void _rawGet(CPtr ptr, int idx);
_rawGetI(CPtr ptr, int idx, int n)197   private synchronized native void _rawGetI(CPtr ptr, int idx, int n);
_createTable(CPtr ptr, int narr, int nrec)198   private synchronized native void _createTable(CPtr ptr, int narr, int nrec);
_getMetaTable(CPtr ptr, int idx)199   private synchronized native int  _getMetaTable(CPtr ptr, int idx);
_getFEnv(CPtr ptr, int idx)200   private synchronized native void _getFEnv(CPtr ptr, int idx);
201 
202   // Set functions
_setTable(CPtr ptr, int idx)203   private synchronized native void _setTable(CPtr ptr, int idx);
_setField(CPtr ptr, int idx, String k)204   private synchronized native void _setField(CPtr ptr, int idx, String k);
_rawSet(CPtr ptr, int idx)205   private synchronized native void _rawSet(CPtr ptr, int idx);
_rawSetI(CPtr ptr, int idx, int n)206   private synchronized native void _rawSetI(CPtr ptr, int idx, int n);
_setMetaTable(CPtr ptr, int idx)207   private synchronized native int  _setMetaTable(CPtr ptr, int idx);
_setFEnv(CPtr ptr, int idx)208   private synchronized native int  _setFEnv(CPtr ptr, int idx);
209 
_call(CPtr ptr, int nArgs, int nResults)210   private synchronized native void _call(CPtr ptr, int nArgs, int nResults);
_pcall(CPtr ptr, int nArgs, int Results, int errFunc)211   private synchronized native int  _pcall(CPtr ptr, int nArgs, int Results, int errFunc);
212 
213   // Coroutine Functions
_yield(CPtr ptr, int nResults)214   private synchronized native int _yield(CPtr ptr, int nResults);
_resume(CPtr ptr, int nargs)215   private synchronized native int _resume(CPtr ptr, int nargs);
_status(CPtr ptr)216   private synchronized native int _status(CPtr ptr);
217 
218   // Gargabe Collection Functions
219   final public static Integer LUA_GCSTOP       = new Integer(0);
220   final public static Integer LUA_GCRESTART    = new Integer(1);
221   final public static Integer LUA_GCCOLLECT    = new Integer(2);
222   final public static Integer LUA_GCCOUNT      = new Integer(3);
223   final public static Integer LUA_GCCOUNTB     = new Integer(4);
224   final public static Integer LUA_GCSTEP       = new Integer(5);
225   final public static Integer LUA_GCSETPAUSE   = new Integer(6);
226   final public static Integer LUA_GCSETSTEPMUL = new Integer(7);
_gc(CPtr ptr, int what, int data)227   private synchronized native int  _gc(CPtr ptr, int what, int data);
228 
229   // Miscellaneous Functions
_error(CPtr ptr)230   private synchronized native int    _error(CPtr ptr);
_next(CPtr ptr, int idx)231   private synchronized native int    _next(CPtr ptr, int idx);
_concat(CPtr ptr, int n)232   private synchronized native void   _concat(CPtr ptr, int n);
233 
234   // Some macros
_pop(CPtr ptr, int n)235   private synchronized native void _pop(CPtr ptr, int n);
_newTable(CPtr ptr)236   private synchronized native void _newTable(CPtr ptr);
_strlen(CPtr ptr, int idx)237   private synchronized native int  _strlen(CPtr ptr, int idx);
_isFunction(CPtr ptr, int idx)238   private synchronized native int  _isFunction(CPtr ptr, int idx);
_isTable(CPtr ptr, int idx)239   private synchronized native int  _isTable(CPtr ptr, int idx);
_isNil(CPtr ptr, int idx)240   private synchronized native int  _isNil(CPtr ptr, int idx);
_isBoolean(CPtr ptr, int idx)241   private synchronized native int  _isBoolean(CPtr ptr, int idx);
_isThread(CPtr ptr, int idx)242   private synchronized native int  _isThread(CPtr ptr, int idx);
_isNone(CPtr ptr, int idx)243   private synchronized native int  _isNone(CPtr ptr, int idx);
_isNoneOrNil(CPtr ptr, int idx)244   private synchronized native int  _isNoneOrNil(CPtr ptr, int idx);
245 
_setGlobal(CPtr ptr, String name)246   private synchronized native void _setGlobal(CPtr ptr, String name);
_getGlobal(CPtr ptr, String name)247   private synchronized native void _getGlobal(CPtr ptr, String name);
248 
_getGcCount(CPtr ptr)249   private synchronized native int  _getGcCount(CPtr ptr);
250 
251 
252   // LuaLibAux
_LdoFile(CPtr ptr, String fileName)253   private synchronized native int _LdoFile(CPtr ptr, String fileName);
_LdoString(CPtr ptr, String string)254   private synchronized native int _LdoString(CPtr ptr, String string);
255   //private synchronized native int _doBuffer(CPtr ptr, byte[] buff, long sz, String n);
256 
_LgetMetaField(CPtr ptr, int obj, String e)257   private synchronized native int    _LgetMetaField(CPtr ptr, int obj, String e);
_LcallMeta(CPtr ptr, int obj, String e)258   private synchronized native int    _LcallMeta(CPtr ptr, int obj, String e);
_Ltyperror(CPtr ptr, int nArg, String tName)259   private synchronized native int    _Ltyperror(CPtr ptr, int nArg, String tName);
_LargError(CPtr ptr, int numArg, String extraMsg)260   private synchronized native int    _LargError(CPtr ptr, int numArg, String extraMsg);
_LcheckString(CPtr ptr, int numArg)261   private synchronized native String _LcheckString(CPtr ptr, int numArg);
_LoptString(CPtr ptr, int numArg, String def)262   private synchronized native String _LoptString(CPtr ptr, int numArg, String def);
_LcheckNumber(CPtr ptr, int numArg)263   private synchronized native double _LcheckNumber(CPtr ptr, int numArg);
_LoptNumber(CPtr ptr, int numArg, double def)264   private synchronized native double _LoptNumber(CPtr ptr, int numArg, double def);
265 
_LcheckInteger(CPtr ptr, int numArg)266   private synchronized native int    _LcheckInteger(CPtr ptr, int numArg);
_LoptInteger(CPtr ptr, int numArg, int def)267   private synchronized native int    _LoptInteger(CPtr ptr, int numArg, int def);
268 
_LcheckStack(CPtr ptr, int sz, String msg)269   private synchronized native void _LcheckStack(CPtr ptr, int sz, String msg);
_LcheckType(CPtr ptr, int nArg, int t)270   private synchronized native void _LcheckType(CPtr ptr, int nArg, int t);
_LcheckAny(CPtr ptr, int nArg)271   private synchronized native void _LcheckAny(CPtr ptr, int nArg);
272 
_LnewMetatable(CPtr ptr, String tName)273   private synchronized native int  _LnewMetatable(CPtr ptr, String tName);
_LgetMetatable(CPtr ptr, String tName)274   private synchronized native void _LgetMetatable(CPtr ptr, String tName);
275 
_Lwhere(CPtr ptr, int lvl)276   private synchronized native void _Lwhere(CPtr ptr, int lvl);
277 
_Lref(CPtr ptr, int t)278   private synchronized native int  _Lref(CPtr ptr, int t);
_LunRef(CPtr ptr, int t, int ref)279   private synchronized native void _LunRef(CPtr ptr, int t, int ref);
280 
_LgetN(CPtr ptr, int t)281   private synchronized native int  _LgetN(CPtr ptr, int t);
_LsetN(CPtr ptr, int t, int n)282   private synchronized native void _LsetN(CPtr ptr, int t, int n);
283 
_LloadFile(CPtr ptr, String fileName)284   private synchronized native int _LloadFile(CPtr ptr, String fileName);
_LloadBuffer(CPtr ptr, byte[] buff, long sz, String name)285   private synchronized native int _LloadBuffer(CPtr ptr, byte[] buff, long sz, String name);
_LloadString(CPtr ptr, String s)286   private synchronized native int _LloadString(CPtr ptr, String s);
287 
_Lgsub(CPtr ptr, String s, String p, String r)288   private synchronized native String _Lgsub(CPtr ptr, String s, String p, String r);
_LfindTable(CPtr ptr, int idx, String fname, int szhint)289   private synchronized native String _LfindTable(CPtr ptr, int idx, String fname, int szhint);
290 
291 
_openBase(CPtr ptr)292   private synchronized native void _openBase(CPtr ptr);
_openTable(CPtr ptr)293   private synchronized native void _openTable(CPtr ptr);
_openIo(CPtr ptr)294   private synchronized native void _openIo(CPtr ptr);
_openOs(CPtr ptr)295   private synchronized native void _openOs(CPtr ptr);
_openString(CPtr ptr)296   private synchronized native void _openString(CPtr ptr);
_openMath(CPtr ptr)297   private synchronized native void _openMath(CPtr ptr);
_openDebug(CPtr ptr)298   private synchronized native void _openDebug(CPtr ptr);
_openPackage(CPtr ptr)299   private synchronized native void _openPackage(CPtr ptr);
_openLibs(CPtr ptr)300   private synchronized native void _openLibs(CPtr ptr);
301 
302   // Java Interface -----------------------------------------------------
303 
newThread()304   public LuaState newThread()
305   {
306   	LuaState l = new LuaState(_newthread(luaState));
307   	LuaStateFactory.insertLuaState(l);
308     return l;
309   }
310 
311   // STACK MANIPULATION
312 
getTop()313   public int getTop()
314   {
315     return _getTop(luaState);
316   }
317 
setTop(int idx)318   public void setTop(int idx)
319   {
320     _setTop(luaState, idx);
321   }
322 
pushValue(int idx)323   public void pushValue(int idx)
324   {
325     _pushValue(luaState, idx);
326   }
327 
remove(int idx)328   public void remove(int idx)
329   {
330     _remove(luaState, idx);
331   }
332 
insert(int idx)333   public void insert(int idx)
334   {
335     _insert(luaState, idx);
336   }
337 
replace(int idx)338   public void replace(int idx)
339   {
340     _replace(luaState, idx);
341   }
342 
checkStack(int sz)343   public int checkStack(int sz)
344   {
345     return _checkStack(luaState, sz);
346   }
347 
xmove(LuaState to, int n)348   public void xmove(LuaState to, int n)
349   {
350     _xmove(luaState, to.luaState, n);
351   }
352 
353   // ACCESS FUNCTION
354 
isNumber(int idx)355   public boolean isNumber(int idx)
356   {
357     return (_isNumber(luaState, idx)!=0);
358   }
359 
isString(int idx)360   public boolean isString(int idx)
361   {
362     return (_isString(luaState, idx)!=0);
363   }
364 
isFunction(int idx)365   public boolean isFunction(int idx)
366   {
367     return (_isFunction(luaState, idx)!=0);
368   }
369 
isCFunction(int idx)370   public boolean isCFunction(int idx)
371   {
372     return (_isCFunction(luaState, idx)!=0);
373   }
374 
isUserdata(int idx)375   public boolean isUserdata(int idx)
376   {
377     return (_isUserdata(luaState, idx)!=0);
378   }
379 
isTable(int idx)380   public boolean isTable(int idx)
381   {
382     return (_isTable(luaState, idx)!=0);
383   }
384 
isBoolean(int idx)385   public boolean isBoolean(int idx)
386   {
387     return (_isBoolean(luaState, idx)!=0);
388   }
389 
isNil(int idx)390   public boolean isNil(int idx)
391   {
392 	  return (_isNil(luaState, idx)!=0);
393   }
394 
isThread(int idx)395   public boolean isThread(int idx)
396   {
397 	  return (_isThread(luaState, idx)!=0);
398   }
399 
isNone(int idx)400   public boolean isNone(int idx)
401   {
402 	  return (_isNone(luaState, idx)!=0);
403   }
404 
isNoneOrNil(int idx)405   public boolean isNoneOrNil(int idx)
406   {
407 	  return (_isNoneOrNil(luaState, idx)!=0);
408   }
409 
type(int idx)410   public int type(int idx)
411   {
412     return _type(luaState, idx);
413   }
414 
typeName(int tp)415   public String typeName(int tp)
416   {
417   	return _typeName(luaState, tp);
418   }
419 
equal(int idx1, int idx2)420   public int equal(int idx1, int idx2)
421   {
422     return _equal(luaState, idx1, idx2);
423   }
424 
rawequal(int idx1, int idx2)425   public int rawequal(int idx1, int idx2)
426   {
427     return _rawequal(luaState, idx1, idx2);
428   }
429 
lessthan(int idx1, int idx2)430   public int lessthan(int idx1, int idx2)
431   {
432     return _lessthan(luaState, idx1, idx2);
433   }
434 
toNumber(int idx)435   public double toNumber(int idx)
436   {
437     return _toNumber(luaState, idx);
438   }
439 
toInteger(int idx)440   public int toInteger(int idx)
441   {
442 	  return _toInteger(luaState, idx);
443   }
444 
toBoolean(int idx)445   public boolean toBoolean(int idx)
446   {
447     return (_toBoolean(luaState, idx)!=0);
448   }
449 
toString(int idx)450   public String toString(int idx)
451   {
452     return _toString(luaState, idx);
453   }
454 
strLen(int idx)455   public int strLen(int idx)
456   {
457     return _strlen(luaState, idx);
458   }
459 
objLen(int idx)460   public int objLen(int idx)
461   {
462 	  return _objlen(luaState, idx);
463   }
464 
toThread(int idx)465   public LuaState toThread(int idx)
466   {
467     return new LuaState(_toThread(luaState, idx));
468   }
469 
470   //PUSH FUNCTIONS
471 
pushNil()472   public void pushNil()
473   {
474     _pushNil(luaState);
475   }
476 
pushNumber(double db)477   public void pushNumber(double db)
478   {
479     _pushNumber(luaState, db);
480   }
481 
pushInteger(int integer)482   public void pushInteger(int integer)
483   {
484 	  _pushInteger(luaState, integer);
485   }
486 
pushString(String str)487   public void pushString(String str)
488   {
489     if (str == null)
490       _pushNil(luaState);
491     else
492       _pushString(luaState, str);
493   }
494 
pushString(byte[] bytes)495   public void pushString(byte[] bytes)
496   {
497     if (bytes == null)
498       _pushNil(luaState);
499     else
500       _pushString(luaState, bytes, bytes.length);
501   }
502 
pushBoolean(boolean bool)503   public void pushBoolean(boolean bool)
504   {
505     _pushBoolean(luaState, bool ? 1 : 0);
506   }
507 
508   // GET FUNCTIONS
509 
getTable(int idx)510   public void getTable(int idx)
511   {
512     _getTable(luaState, idx);
513   }
514 
getField(int idx, String k)515   public void getField(int idx, String k)
516   {
517 	  _getField(luaState, idx, k);
518   }
519 
rawGet(int idx)520   public void rawGet(int idx)
521   {
522     _rawGet(luaState, idx);
523   }
524 
rawGetI(int idx, int n)525   public void rawGetI(int idx, int n)
526   {
527     _rawGetI(luaState, idx, n);
528   }
529 
createTable(int narr, int nrec)530   public void createTable(int narr, int nrec)
531   {
532 	  _createTable(luaState, narr, nrec);
533   }
534 
newTable()535   public void newTable()
536   {
537     _newTable(luaState);
538   }
539 
540   // if returns 0, there is no metatable
getMetaTable(int idx)541   public int getMetaTable(int idx)
542   {
543     return _getMetaTable(luaState, idx);
544   }
545 
getFEnv(int idx)546   public void getFEnv(int idx)
547   {
548     _getFEnv(luaState, idx);
549   }
550 
551   // SET FUNCTIONS
552 
setTable(int idx)553   public void setTable(int idx)
554   {
555     _setTable(luaState, idx);
556   }
557 
setField(int idx, String k)558   public void setField(int idx, String k)
559   {
560 	  _setField(luaState, idx, k);
561   }
562 
rawSet(int idx)563   public void rawSet(int idx)
564   {
565     _rawSet(luaState, idx);
566   }
567 
rawSetI(int idx, int n)568   public void rawSetI(int idx, int n)
569   {
570     _rawSetI(luaState, idx, n);
571   }
572 
573   // if returns 0, cannot set the metatable to the given object
setMetaTable(int idx)574   public int setMetaTable(int idx)
575   {
576     return _setMetaTable(luaState, idx);
577   }
578 
579   // if object is not a function returns 0
setFEnv(int idx)580   public int setFEnv(int idx)
581   {
582     return _setFEnv(luaState, idx);
583   }
584 
call(int nArgs, int nResults)585   public void call(int nArgs, int nResults)
586   {
587     _call(luaState, nArgs, nResults);
588   }
589 
590   // returns 0 if ok of one of the error codes defined
pcall(int nArgs, int nResults, int errFunc)591   public int pcall(int nArgs, int nResults, int errFunc)
592   {
593     return _pcall(luaState, nArgs, nResults, errFunc);
594   }
595 
yield(int nResults)596   public int yield(int nResults)
597   {
598   	return _yield(luaState, nResults);
599   }
600 
resume(int nArgs)601   public int resume(int nArgs)
602   {
603   	return _resume(luaState, nArgs);
604   }
605 
status()606   public int status()
607   {
608 	  return _status(luaState);
609   }
610 
gc(int what, int data)611   public int gc(int what, int data)
612   {
613     return _gc(luaState, what, data);
614   }
615 
getGcCount()616   public int getGcCount()
617   {
618     return _getGcCount(luaState);
619   }
620 
next(int idx)621   public int next(int idx)
622   {
623   	return _next(luaState, idx);
624   }
625 
error()626   public int error()
627   {
628   	return _error(luaState);
629   }
630 
concat(int n)631   public void concat(int n)
632   {
633   	_concat(luaState, n);
634   }
635 
636 
637   // FUNCTION FROM lauxlib
638   // returns 0 if ok
LdoFile(String fileName)639   public int LdoFile(String fileName)
640   {
641     return _LdoFile(luaState, fileName);
642   }
643 
644   // returns 0 if ok
LdoString(String str)645   public int LdoString(String str)
646   {
647     return _LdoString(luaState, str);
648   }
649 
LgetMetaField(int obj, String e)650   public int LgetMetaField(int obj, String e)
651   {
652     return _LgetMetaField(luaState, obj, e);
653   }
654 
LcallMeta(int obj, String e)655   public int LcallMeta(int obj, String e)
656   {
657     return _LcallMeta(luaState, obj, e);
658   }
659 
Ltyperror(int nArg, String tName)660   public int Ltyperror(int nArg, String tName)
661   {
662     return _Ltyperror(luaState, nArg, tName);
663   }
664 
LargError(int numArg, String extraMsg)665   public int LargError(int numArg, String extraMsg)
666   {
667     return _LargError(luaState, numArg, extraMsg);
668   }
669 
LcheckString(int numArg)670   public String LcheckString(int numArg)
671   {
672     return _LcheckString(luaState, numArg);
673   }
674 
LoptString(int numArg, String def)675   public String LoptString(int numArg, String def)
676   {
677     return _LoptString(luaState, numArg, def);
678   }
679 
LcheckNumber(int numArg)680   public double LcheckNumber(int numArg)
681   {
682     return _LcheckNumber(luaState, numArg);
683   }
684 
LoptNumber(int numArg, double def)685   public double LoptNumber(int numArg, double def)
686   {
687     return _LoptNumber(luaState, numArg, def);
688   }
689 
LcheckInteger(int numArg)690   public int LcheckInteger(int numArg)
691   {
692 	  return _LcheckInteger(luaState, numArg);
693   }
694 
LoptInteger(int numArg, int def)695   public int LoptInteger(int numArg, int def)
696   {
697 	  return _LoptInteger(luaState, numArg, def);
698   }
699 
LcheckStack(int sz, String msg)700   public void LcheckStack(int sz, String msg)
701   {
702     _LcheckStack(luaState, sz, msg);
703   }
704 
LcheckType(int nArg, int t)705   public void LcheckType(int nArg, int t)
706   {
707     _LcheckType(luaState, nArg, t);
708   }
709 
LcheckAny(int nArg)710   public void LcheckAny(int nArg)
711   {
712     _LcheckAny(luaState, nArg);
713   }
714 
LnewMetatable(String tName)715   public int LnewMetatable(String tName)
716   {
717     return _LnewMetatable(luaState, tName);
718   }
719 
LgetMetatable(String tName)720   public void LgetMetatable(String tName)
721   {
722     _LgetMetatable(luaState, tName);
723   }
724 
Lwhere(int lvl)725   public void Lwhere(int lvl)
726   {
727     _Lwhere(luaState, lvl);
728   }
729 
Lref(int t)730   public int Lref(int t)
731   {
732     return _Lref(luaState, t);
733   }
734 
LunRef(int t, int ref)735   public void LunRef(int t, int ref)
736   {
737     _LunRef(luaState, t, ref);
738   }
739 
LgetN(int t)740   public int LgetN(int t)
741   {
742     return _LgetN(luaState, t);
743   }
744 
LsetN(int t, int n)745   public void LsetN(int t, int n)
746   {
747     _LsetN(luaState, t, n);
748   }
749 
LloadFile(String fileName)750   public int LloadFile(String fileName)
751   {
752     return _LloadFile(luaState, fileName);
753   }
754 
LloadString(String s)755   public int LloadString(String s)
756   {
757     return _LloadString(luaState, s);
758   }
759 
LloadBuffer(byte[] buff, String name)760   public int LloadBuffer(byte[] buff, String name)
761   {
762     return _LloadBuffer(luaState, buff, buff.length, name);
763   }
764 
Lgsub(String s, String p, String r)765   public String Lgsub(String s, String p, String r)
766   {
767 	  return _Lgsub(luaState, s, p, r);
768   }
769 
LfindTable(int idx, String fname, int szhint)770   public String LfindTable(int idx, String fname, int szhint)
771   {
772 	  return _LfindTable(luaState, idx, fname, szhint);
773   }
774 
775   //IMPLEMENTED C MACROS
776 
pop(int n)777   public void pop(int n)
778   {
779     //setTop(- (n) - 1);
780 	_pop(luaState, n);
781   }
782 
getGlobal(String global)783   public synchronized void getGlobal(String global)
784   {
785 //    pushString(global);
786 //    getTable(LUA_GLOBALSINDEX.intValue());
787     _getGlobal(luaState, global);
788   }
789 
setGlobal(String name)790   public synchronized void setGlobal(String name)
791   {
792     //pushString(name);
793     //insert(-2);
794     //setTable(LUA_GLOBALSINDEX.intValue());
795 	_setGlobal(luaState, name);
796   }
797 
798   // Functions to open lua libraries
openBase()799   public void openBase()
800   {
801     _openBase(luaState);
802   }
openTable()803   public void openTable()
804   {
805     _openTable(luaState);
806   }
openIo()807   public void openIo()
808   {
809     _openIo(luaState);
810   }
openOs()811   public void openOs()
812   {
813 	  _openOs(luaState);
814   }
openString()815   public void openString()
816   {
817     _openString(luaState);
818   }
openMath()819   public void openMath()
820   {
821     _openMath(luaState);
822   }
openDebug()823   public void openDebug()
824   {
825     _openDebug(luaState);
826   }
openPackage()827   public void openPackage()
828   {
829 	  _openPackage(luaState);
830   }
openLibs()831   public void openLibs()
832   {
833     _openLibs(luaState);
834   }
835 
836 
837   /********************** Luajava API Library **********************/
838 
839   /**
840    * Initializes lua State to be used by luajava
841    * @param cptr
842    * @param stateId
843    */
luajava_open(CPtr cptr, int stateId)844   private synchronized native void luajava_open(CPtr cptr, int stateId);
845   /**
846    * Gets a Object from a userdata
847    * @param L
848    * @param idx index of the lua stack
849    * @return Object
850    */
_getObjectFromUserdata(CPtr L, int idx)851   private synchronized native Object _getObjectFromUserdata(CPtr L, int idx) throws LuaException;
852 
853   /**
854    * Returns whether a userdata contains a Java Object
855    * @param L
856    * @param idx index of the lua stack
857    * @return boolean
858    */
_isObject(CPtr L, int idx)859   private synchronized native boolean _isObject(CPtr L, int idx);
860 
861   /**
862    * Pushes a Java Object into the state stack
863    * @param L
864    * @param obj
865    */
_pushJavaObject(CPtr L, Object obj)866   private synchronized native void _pushJavaObject(CPtr L, Object obj);
867 
868   /**
869    * Pushes a JavaFunction into the state stack
870    * @param L
871    * @param func
872    */
_pushJavaFunction(CPtr L, JavaFunction func)873   private synchronized native void _pushJavaFunction(CPtr L, JavaFunction func) throws LuaException;
874 
875   /**
876    * Returns whether a userdata contains a Java Function
877    * @param L
878    * @param idx index of the lua stack
879    * @return boolean
880    */
_isJavaFunction(CPtr L, int idx)881   private synchronized native boolean _isJavaFunction(CPtr L, int idx);
882 
883   /**
884    * Gets a Object from Lua
885    * @param idx index of the lua stack
886    * @return Object
887    * @throws LuaException if the lua object does not represent a java object.
888    */
getObjectFromUserdata(int idx)889   public Object getObjectFromUserdata(int idx) throws LuaException
890   {
891     return _getObjectFromUserdata(luaState, idx);
892   }
893 
894   /**
895    * Tells whether a lua index contains a java Object
896    * @param idx index of the lua stack
897    * @return boolean
898    */
isObject(int idx)899   public boolean isObject(int idx)
900   {
901     return _isObject(luaState, idx);
902   }
903 
904   /**
905    * Pushes a Java Object into the lua stack.<br>
906    * This function does not check if the object is from a class that could
907    * be represented by a lua type. Eg: java.lang.String could be a lua string.
908    * @param obj Object to be pushed into lua
909    */
pushJavaObject(Object obj)910   public void pushJavaObject(Object obj)
911   {
912     _pushJavaObject(luaState, obj);
913   }
914 
915   /**
916    * Pushes a JavaFunction into the state stack
917    * @param func
918    */
pushJavaFunction(JavaFunction func)919   public void pushJavaFunction(JavaFunction func) throws LuaException
920   {
921     _pushJavaFunction(luaState, func);
922   }
923 
924   /**
925    * Returns whether a userdata contains a Java Function
926    * @param idx index of the lua stack
927    * @return boolean
928    */
isJavaFunction(int idx)929   public boolean isJavaFunction(int idx)
930   {
931     return _isJavaFunction(luaState, idx);
932   }
933 
934   /**
935    * Pushes into the stack any object value.<br>
936    * This function checks if the object could be pushed as a lua type, if not
937    * pushes the java object.
938    * @param obj
939    */
pushObjectValue(Object obj)940   public void pushObjectValue(Object obj) throws LuaException
941   {
942     if (obj == null)
943     {
944       pushNil();
945     }
946     else if (obj instanceof Boolean)
947     {
948       Boolean bool = (Boolean) obj;
949       pushBoolean(bool.booleanValue());
950     }
951     else if (obj instanceof Number)
952     {
953       pushNumber(((Number) obj).doubleValue());
954     }
955     else if (obj instanceof String)
956     {
957       pushString((String) obj);
958     }
959     else if (obj instanceof JavaFunction)
960     {
961       JavaFunction func = (JavaFunction) obj;
962       pushJavaFunction(func);
963     }
964     else if (obj instanceof LuaObject)
965     {
966       LuaObject ref = (LuaObject) obj;
967       ref.push();
968     }
969     else if (obj instanceof byte[])
970     {
971       pushString((byte[]) obj);
972     }
973     else
974     {
975       pushJavaObject(obj);
976     }
977   }
978 
979   /**
980    * Function that returns a Java Object equivalent to the one in the given
981    * position of the Lua Stack.
982    * @param idx Index in the Lua Stack
983    * @return Java object equivalent to the Lua one
984    */
toJavaObject( int idx )985 	public synchronized Object toJavaObject( int idx ) throws LuaException
986 	{
987 		Object obj = null;
988 
989 		if (isBoolean(idx))
990 		{
991 			obj = new Boolean(toBoolean(idx));
992 		}
993 		else if (type(idx) == LuaState.LUA_TSTRING.intValue())
994 		{
995 			obj = toString(idx);
996 		}
997 		else if (isFunction(idx))
998 		{
999 			obj = getLuaObject(idx);
1000 		}
1001 		else if (isTable(idx))
1002 		{
1003 			obj = getLuaObject(idx);
1004 		}
1005 		else if (type(idx) == LuaState.LUA_TNUMBER.intValue())
1006 		{
1007 				obj = new Double(toNumber(idx));
1008 		}
1009 		else if (isUserdata(idx))
1010 		{
1011 			if (isObject(idx))
1012 			{
1013 				obj = getObjectFromUserdata(idx);
1014 			}
1015 			else
1016 			{
1017 				obj = getLuaObject(idx);
1018 			}
1019 		}
1020 		else if (isNil(idx))
1021 		{
1022 			obj = null;
1023 		}
1024 
1025 		return obj;
1026 	}
1027 
1028 	/**
1029 	 * Creates a reference to an object in the variable globalName
1030 	 * @param globalName
1031 	 * @return LuaObject
1032 	 */
getLuaObject(String globalName)1033 	public LuaObject getLuaObject(String globalName)
1034 	{
1035 		return new LuaObject(this, globalName);
1036 	}
1037 
1038 	/**
1039 	 * Creates a reference to an object inside another object
1040      * @param parent The Lua Table or Userdata that contains the Field.
1041      * @param name The name that index the field
1042 	 * @return LuaObject
1043 	 * @throws LuaException if parent is not a table or userdata
1044 	 */
getLuaObject(LuaObject parent, String name)1045 	public LuaObject getLuaObject(LuaObject parent, String name)
1046 		throws LuaException
1047 	{
1048 		if (parent.L.getCPtrPeer() != luaState.getPeer())
1049 			throw new LuaException("Object must have the same LuaState as the parent!");
1050 
1051 		return new LuaObject(parent, name);
1052 	}
1053 
1054 	/**
1055 	 * This constructor creates a LuaObject from a table that is indexed by a number.
1056 	 * @param parent The Lua Table or Userdata that contains the Field.
1057 	 * @param name The name (number) that index the field
1058 	 * @return LuaObject
1059 	 * @throws LuaException When the parent object isn't a Table or Userdata
1060 	 */
getLuaObject(LuaObject parent, Number name)1061 	public LuaObject getLuaObject(LuaObject parent, Number name)
1062 		throws LuaException
1063 	{
1064 		if (parent.L.getCPtrPeer() != luaState.getPeer())
1065 			throw new LuaException("Object must have the same LuaState as the parent!");
1066 
1067 		return new LuaObject(parent, name);
1068 	}
1069 
1070 	/**
1071 	 * This constructor creates a LuaObject from a table that is indexed by any LuaObject.
1072 	 * @param parent The Lua Table or Userdata that contains the Field.
1073 	 * @param name The name (LuaObject) that index the field
1074 	 * @return LuaObject
1075 	 * @throws LuaException When the parent object isn't a Table or Userdata
1076 	 */
getLuaObject(LuaObject parent, LuaObject name)1077 	public LuaObject getLuaObject(LuaObject parent, LuaObject name)
1078 		throws LuaException
1079 	{
1080 	  if (parent.getLuaState().getCPtrPeer() != luaState.getPeer() ||
1081 	      parent.getLuaState().getCPtrPeer() != name.getLuaState().getCPtrPeer())
1082 	    throw new LuaException("Object must have the same LuaState as the parent!");
1083 
1084 	  return new LuaObject(parent, name);
1085 	}
1086 
1087 	/**
1088 	 * Creates a reference to an object in the <code>index</code> position
1089 	 * of the stack
1090 	 * @param index position on the stack
1091 	 * @return LuaObject
1092 	 */
getLuaObject(int index)1093 	public LuaObject getLuaObject(int index)
1094 	{
1095 		return new LuaObject(this, index);
1096 	}
1097 
1098 	/**
1099 	 * When you call a function in lua, it may return a number, and the
1100 	 * number will be interpreted as a <code>Double</code>.<br>
1101 	 * This function converts the number into a type specified by
1102 	 * <code>retType</code>
1103 	 * @param db lua number to be converted
1104 	 * @param retType type to convert to
1105 	 * @return The converted number
1106 	 */
convertLuaNumber(Double db, Class retType)1107 	public static Number convertLuaNumber(Double db, Class retType)
1108 	{
1109 	  // checks if retType is a primitive type
1110     if (retType.isPrimitive())
1111     {
1112       if (retType == Integer.TYPE)
1113       {
1114         return new Integer(db.intValue());
1115       }
1116       else if (retType == Long.TYPE)
1117       {
1118         return new Long(db.longValue());
1119       }
1120       else if (retType == Float.TYPE)
1121       {
1122         return new Float(db.floatValue());
1123       }
1124       else if (retType == Double.TYPE)
1125       {
1126         return db;
1127       }
1128       else if (retType == Byte.TYPE)
1129       {
1130         return new Byte(db.byteValue());
1131       }
1132       else if (retType == Short.TYPE)
1133       {
1134         return new Short(db.shortValue());
1135       }
1136     }
1137     else if (retType.isAssignableFrom(Number.class))
1138     {
1139       // Checks all possibilities of number types
1140       if (retType.isAssignableFrom(Integer.class))
1141       {
1142         return new Integer(db.intValue());
1143       }
1144       else if (retType.isAssignableFrom(Long.class))
1145       {
1146         return new Long(db.longValue());
1147       }
1148       else if (retType.isAssignableFrom(Float.class))
1149       {
1150         return new Float(db.floatValue());
1151       }
1152       else if (retType.isAssignableFrom(Double.class))
1153       {
1154         return db;
1155       }
1156       else if (retType.isAssignableFrom(Byte.class))
1157       {
1158         return new Byte(db.byteValue());
1159       }
1160       else if (retType.isAssignableFrom(Short.class))
1161       {
1162         return new Short(db.shortValue());
1163       }
1164     }
1165 
1166     // if all checks fail, return null
1167     return null;
1168 	}
1169 }
1170