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