From a52c97189c0d8754b4755458d134cd64d4d73d14 Mon Sep 17 00:00:00 2001 From: chenze <598799959@qq.com> Date: Mon, 17 Oct 2016 15:42:46 +0800 Subject: [PATCH 1/7] rm kcp --- 3rd/kcp/LICENSE | 340 ------------ 3rd/kcp/README.md | 187 ------- 3rd/kcp/donation.png | Bin 5362 -> 0 bytes 3rd/kcp/ikcp.c | 1193 ------------------------------------------ 3rd/kcp/ikcp.h | 399 -------------- 3rd/kcp/test.cpp | 177 ------- 3rd/kcp/test.h | 242 --------- 7 files changed, 2538 deletions(-) delete mode 100644 3rd/kcp/LICENSE delete mode 100644 3rd/kcp/README.md delete mode 100644 3rd/kcp/donation.png delete mode 100644 3rd/kcp/ikcp.c delete mode 100644 3rd/kcp/ikcp.h delete mode 100644 3rd/kcp/test.cpp delete mode 100644 3rd/kcp/test.h diff --git a/3rd/kcp/LICENSE b/3rd/kcp/LICENSE deleted file mode 100644 index d6a9326..0000000 --- a/3rd/kcp/LICENSE +++ /dev/null @@ -1,340 +0,0 @@ -GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {description} - Copyright (C) {year} {fullname} - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - {signature of Ty Coon}, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. - diff --git a/3rd/kcp/README.md b/3rd/kcp/README.md deleted file mode 100644 index 9a4ce84..0000000 --- a/3rd/kcp/README.md +++ /dev/null @@ -1,187 +0,0 @@ -KCP - A Fast and Reliable ARQ Protocol -====================================== - -# 简介 - -KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 -30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP) -的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 -连时钟都需要外部传递进来,内部不会有任何一次系统调用。 - -整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。 -也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的ARQ可靠协议实现, -那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。 - - -# 技术特性 - -TCP是为流量设计的(每秒内可以传输多少KB的数据),讲究的是充分利用带宽。而KCP -是为流速设计的(单个数据包从一端发送到一端需要多少时间),以10%-20%带宽浪费 -的代价换取了比 TCP快30%-40%的传输速度。TCP信道是一条流速很慢,但每秒流量很大 -的大运河,而KCP是水流湍急的小激流。KCP有正常模式和快速模式两种,通过以下策略 -达到提高流速的结果: - -#### RTO翻倍vs不翻倍: - - TCP超时计算是RTOx2,这样连续丢三次包就变成RTOx8了,十分恐怖,而KCP启动快速 - 模式后不x2,只是x1.5(实验证明1.5这个值相对比较好),提高了传输速度。 - -#### 选择性重传 vs 全部重传: - - TCP丢包时会全部重传从丢的那个包开始以后的数据,KCP是选择性重传,只重传真正 - 丢失的数据包。 - -#### 快速重传: - - 发送端发送了1,2,3,4,5几个包,然后收到远端的ACK: 1, 3, 4, 5,当收到ACK3时, - KCP知道2被跳过1次,收到ACK4时,知道2被跳过了2次,此时可以认为2号丢失,不用 - 等超时,直接重传2号包,大大改善了丢包时的传输速度。 - -#### 延迟ACK vs 非延迟ACK: - - TCP为了充分利用带宽,延迟发送ACK(NODELAY都没用),这样超时计算会算出较大 - RTT时间,延长了丢包时的判断过程。KCP的ACK是否延迟发送可以调节。 - -#### UNA vs ACK+UNA: - - ARQ模型响应有两种,UNA(此编号前所有包已收到,如TCP)和ACK(该编号包已收到 - ),光用UNA将导致全部重传,光用ACK则丢失成本太高,以往协议都是二选其一,而 - KCP协议中,除去单独的 ACK包外,所有包都有UNA信息。 - -#### 非退让流控: - - KCP正常模式同TCP一样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收 - 端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小 - 数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平 - 性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。 - - -# 基本使用 - -1. 创建 KCP对象: - - ```cpp - // 初始化 kcp对象,conv为一个表示会话编号的整数,和tcp的 conv一样,通信双 - // 方需保证 conv相同,相互的数据包才能够被认可,user是一个给回调函数的指针 - ikcpcb *kcp = ikcp_create(conv, user); - ``` - -2. 设置回调函数: - - ```cpp - // KCP的下层协议输出函数,KCP需要发送数据时会调用它 - // buf/len 表示缓存和长度 - // user指针为 kcp对象创建时传入的值,用于区别多个 KCP对象 - int udp_output(const char *buf, int len, ikcpcb *kcp, void *user) - { - .... - } - // 设置回调函数 - kcp->output = udp_output; - ``` - -3. 循环调用 update: - - ```cpp - // 以一定频率调用 ikcp_update来更新 kcp状态,并且传入当前时钟(毫秒单位) - // 如 10ms调用一次,或用 ikcp_check确定下次调用 update的时间不必每次调用 - ikcp_update(kcp, millisec); - ``` - -4. 输入一个下层数据包: - - ```cpp - // 收到一个下层数据包(比如UDP包)时需要调用: - ikcp_input(kcp, received_udp_packet, received_udp_size); - ``` - 处理了下层协议的输出/输入后 KCP协议就可以正常工作了,使用 ikcp_send 来向 - 远端发送数据。而另一端使用 ikcp_recv(kcp, ptr, size)来接收数据。 - - -# 协议配置 - -协议默认模式是一个标准的 ARQ,需要通过配置打开各项加速开关: - -1. 工作模式: - ```cpp - int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, int resend, int nc) - ``` - - > nodelay :是否启用 nodelay模式,0不启用;1启用。 - > interval :协议内部工作的 interval,单位毫秒,比如 10ms或者 20ms - > resend :快速重传模式,默认0关闭,可以设置2(2次ACK跨越将会直接重传) - > nc :是否关闭流控,默认是0代表不关闭,1代表关闭。 - > 普通模式:`ikcp_nodelay(kcp, 0, 40, 0, 0); - > 极速模式: ikcp_nodelay(kcp, 1, 10, 2, 1); - -2. 最大窗口: - ```cpp - int ikcp_wndsize(ikcpcb *kcp, int sndwnd, int rcvwnd); - ``` - 该调用将会设置协议的最大发送窗口和最大接收窗口大小,默认为32. - -3. 最大传输单元: - - 纯算法协议并不负责探测 MTU,默认 mtu是1400字节,可以使用ikcp_setmtu来设置 - 该值。该值将会影响数据包归并及分片时候的最大传输单元。 - -4. 最小RTO: - - 不管是 TCP还是 KCP计算 RTO时都有最小 RTO的限制,即便计算出来RTO为40ms,由 - 于默认的 RTO是100ms,协议只有在100ms后才能检测到丢包,快速模式下为30ms,可 - 以手动更改该值: - ```cpp - kcp->rx_minrto = 10; - ``` - -# 最佳实践 -#### 内存分配器 - - 默认KCP协议使用 malloc/free进行内存分配释放,如果应用层接管了内存分配,可以 - 用ikcp_allocator来设置新的内存分配器,注意要在一开始设置: - - > ikcp_allocator(my_new_malloc, my_new_free); - - -#### 前向纠错注意 - -为了进一步提高传输速度,下层协议也许会使用前向纠错技术。需要注意,前向纠错会根 -据冗余信息解出原始数据包。相同的原始数据包不要两次input到KCP,否则将会导致kcp -以为对方重发了,这样会产生更多的ack占用额外带宽。 - -比如下层协议使用最简单的冗余包:单个数据包除了自己外,还会重复存储一次上一个数 -据包,以及上上一个数据包的内容: - -```cpp -Fn = (Pn, Pn-1, Pn-2) - -P0 = (0, X, X) -P1 = (1, 0, X) -P2 = (2, 1, 0) -P3 = (3, 2, 1) -``` - -这样几个包发送出去,接收方对于单个原始包都可能被解出3次来(后面两个包任然会重 -复该包内容),那么这里需要记录一下,一个下层数据包只会input给kcp一次,避免过 -多重复ack带来的浪费。 - -#### 管理大规模连接 - -如果需要同时管理大规模的 KCP连接(比如大于3000个),比如你正在实现一套类 epoll -的机制,那么为了避免每秒钟对每个连接调用大量的调用 ikcp_update,我们可以使用 -ikcp_check来大大减少 ikcp_update调用的次数。 ikcp_check返回值会告诉你需要 -在什么时间点再次调用 ikcp_update(如果中途没有 ikcp_send, ikcp_input的话, -否则中途调用了 ikcp_send, ikcp_input的话,需要在下一次interval时调用 update) - -标准顺序是每次调用了 ikcp_update后,使用 ikcp_check决定下次什么时间点再次调用 -ikcp_update,而如果中途发生了 ikcp_send, ikcp_input的话,在下一轮 interval -立马调用 ikcp_update和 ikcp_check。 使用该方法,原来在处理2000个 kcp连接且每 -个连接每10ms调用一次update,改为 check机制后,cpu从 60%降低到 15%。 - - -# 欢迎捐赠 - -![欢迎使用支付宝对该项目进行捐赠](https://raw.githubusercontent.com/skywind3000/kcp/master/donation.png) - -欢迎使用支付宝手扫描上面的二维码,对该项目进行捐赠。捐赠款项将用于改进 KCP性能以及 -后续持续优化。 diff --git a/3rd/kcp/donation.png b/3rd/kcp/donation.png deleted file mode 100644 index 2324ca26883ad11560509667303ea68c234fe94a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5362 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 diff --git a/3rd/kcp/ikcp.c b/3rd/kcp/ikcp.c deleted file mode 100644 index 4ec38b0..0000000 --- a/3rd/kcp/ikcp.c +++ /dev/null @@ -1,1193 +0,0 @@ -//===================================================================== -// -// KCP - A Better ARQ Protocol Implementation -// skywind3000 (at) gmail.com, 2010-2011 -// -// Features: -// + Average RTT reduce 30% - 40% vs traditional ARQ like tcp. -// + Maximum RTT reduce three times vs tcp. -// + Lightweight, distributed as a single source file. -// -//===================================================================== -#include "ikcp.h" - -#include -#include -#include -#include - - - -//===================================================================== -// KCP BASIC -//===================================================================== -const IUINT32 IKCP_RTO_NDL = 30; // no delay min rto -const IUINT32 IKCP_RTO_MIN = 100; // normal min rto -const IUINT32 IKCP_RTO_DEF = 200; -const IUINT32 IKCP_RTO_MAX = 60000; -const IUINT32 IKCP_CMD_PUSH = 81; // cmd: push data -const IUINT32 IKCP_CMD_ACK = 82; // cmd: ack -const IUINT32 IKCP_CMD_WASK = 83; // cmd: window probe (ask) -const IUINT32 IKCP_CMD_WINS = 84; // cmd: window size (tell) -const IUINT32 IKCP_ASK_SEND = 1; // need to send IKCP_CMD_WASK -const IUINT32 IKCP_ASK_TELL = 2; // need to send IKCP_CMD_WINS -const IUINT32 IKCP_WND_SND = 32; -const IUINT32 IKCP_WND_RCV = 32; -const IUINT32 IKCP_MTU_DEF = 1400; -const IUINT32 IKCP_ACK_FAST = 3; -const IUINT32 IKCP_INTERVAL = 100; -const IUINT32 IKCP_OVERHEAD = 24; -const IUINT32 IKCP_DEADLINK = 10; -const IUINT32 IKCP_THRESH_INIT = 2; -const IUINT32 IKCP_THRESH_MIN = 2; -const IUINT32 IKCP_PROBE_INIT = 7000; // 7 secs to probe window size -const IUINT32 IKCP_PROBE_LIMIT = 120000; // up to 120 secs to probe window - - -//--------------------------------------------------------------------- -// encode / decode -//--------------------------------------------------------------------- - -/* encode 8 bits unsigned int */ -static inline char *ikcp_encode8u(char *p, unsigned char c) -{ - *(unsigned char*)p++ = c; - return p; -} - -/* decode 8 bits unsigned int */ -static inline const char *ikcp_decode8u(const char *p, unsigned char *c) -{ - *c = *(unsigned char*)p++; - return p; -} - -/* encode 16 bits unsigned int (lsb) */ -static inline char *ikcp_encode16u(char *p, unsigned short w) -{ -#if IWORDS_BIG_ENDIAN - *(unsigned char*)(p + 0) = (w & 255); - *(unsigned char*)(p + 1) = (w >> 8); -#else - *(unsigned short*)(p) = w; -#endif - p += 2; - return p; -} - -/* decode 16 bits unsigned int (lsb) */ -static inline const char *ikcp_decode16u(const char *p, unsigned short *w) -{ -#if IWORDS_BIG_ENDIAN - *w = *(const unsigned char*)(p + 1); - *w = *(const unsigned char*)(p + 0) + (*w << 8); -#else - *w = *(const unsigned short*)p; -#endif - p += 2; - return p; -} - -/* encode 32 bits unsigned int (lsb) */ -static inline char *ikcp_encode32u(char *p, IUINT32 l) -{ -#if IWORDS_BIG_ENDIAN - *(unsigned char*)(p + 0) = (unsigned char)((l >> 0) & 0xff); - *(unsigned char*)(p + 1) = (unsigned char)((l >> 8) & 0xff); - *(unsigned char*)(p + 2) = (unsigned char)((l >> 16) & 0xff); - *(unsigned char*)(p + 3) = (unsigned char)((l >> 24) & 0xff); -#else - *(IUINT32*)p = l; -#endif - p += 4; - return p; -} - -/* decode 32 bits unsigned int (lsb) */ -static inline const char *ikcp_decode32u(const char *p, IUINT32 *l) -{ -#if IWORDS_BIG_ENDIAN - *l = *(const unsigned char*)(p + 3); - *l = *(const unsigned char*)(p + 2) + (*l << 8); - *l = *(const unsigned char*)(p + 1) + (*l << 8); - *l = *(const unsigned char*)(p + 0) + (*l << 8); -#else - *l = *(const IUINT32*)p; -#endif - p += 4; - return p; -} - -static inline IUINT32 _imin_(IUINT32 a, IUINT32 b) { - return a <= b ? a : b; -} - -static inline IUINT32 _imax_(IUINT32 a, IUINT32 b) { - return a >= b ? a : b; -} - -static inline IUINT32 _ibound_(IUINT32 lower, IUINT32 middle, IUINT32 upper) -{ - return _imin_(_imax_(lower, middle), upper); -} - -static inline long _itimediff(IUINT32 later, IUINT32 earlier) -{ - return ((IINT32)(later - earlier)); -} - -//--------------------------------------------------------------------- -// manage segment -//--------------------------------------------------------------------- -typedef struct IKCPSEG IKCPSEG; - -static void* (*ikcp_malloc_hook)(size_t) = NULL; -static void (*ikcp_free_hook)(void *) = NULL; - -// internal malloc -static void* ikcp_malloc(size_t size) { - if (ikcp_malloc_hook) - return ikcp_malloc_hook(size); - return malloc(size); -} - -// internal free -static void ikcp_free(void *ptr) { - if (ikcp_free_hook) { - ikcp_free_hook(ptr); - } else { - free(ptr); - } -} - -// redefine allocator -void ikcp_allocator(void* (*new_malloc)(size_t), void (*new_free)(void*)) -{ - ikcp_malloc_hook = new_malloc; - ikcp_free_hook = new_free; -} - -// allocate a new kcp segment -static IKCPSEG* ikcp_segment_new(ikcpcb *kcp, int size) -{ - return (IKCPSEG*)ikcp_malloc(sizeof(IKCPSEG) + size); -} - -// delete a segment -static void ikcp_segment_delete(ikcpcb *kcp, IKCPSEG *seg) -{ - ikcp_free(seg); -} - -// write log -void ikcp_log(ikcpcb *kcp, int mask, const char *fmt, ...) -{ - char buffer[1024]; - va_list argptr; - if ((mask & kcp->logmask) == 0 || kcp->writelog == 0) return; - va_start(argptr, fmt); - vsprintf(buffer, fmt, argptr); - va_end(argptr); - kcp->writelog(buffer, kcp, kcp->user); -} - -// check log mask -static int ikcp_canlog(const ikcpcb *kcp, int mask) -{ - if ((mask & kcp->logmask) == 0 || kcp->writelog == NULL) return 0; - return 1; -} - -// output segment -static int ikcp_output(ikcpcb *kcp, const void *data, int size) -{ - assert(kcp); - assert(kcp->output); - if (ikcp_canlog(kcp, IKCP_LOG_OUTPUT)) { - ikcp_log(kcp, IKCP_LOG_OUTPUT, "[RO] %ld bytes", (long)size); - } - if (size == 0) return 0; - return kcp->output((const char*)data, size, kcp, kcp->user); -} - -// output queue -void ikcp_qprint(const char *name, const struct IQUEUEHEAD *head) -{ -#if 0 - const struct IQUEUEHEAD *p; - printf("<%s>: [", name); - for (p = head->next; p != head; p = p->next) { - const IKCPSEG *seg = iqueue_entry(p, const IKCPSEG, node); - printf("(%lu %d)", (unsigned long)seg->sn, (int)(seg->ts % 10000)); - if (p->next != head) printf(","); - } - printf("]\n"); -#endif -} - - -//--------------------------------------------------------------------- -// create a new kcpcb -//--------------------------------------------------------------------- -ikcpcb* ikcp_create(IUINT32 conv, void *user) -{ - ikcpcb *kcp = (ikcpcb*)ikcp_malloc(sizeof(struct IKCPCB)); - if (kcp == NULL) return NULL; - kcp->conv = conv; - kcp->user = user; - kcp->snd_una = 0; - kcp->snd_nxt = 0; - kcp->rcv_nxt = 0; - kcp->ts_recent = 0; - kcp->ts_lastack = 0; - kcp->ts_probe = 0; - kcp->probe_wait = 0; - kcp->snd_wnd = IKCP_WND_SND; - kcp->rcv_wnd = IKCP_WND_RCV; - kcp->rmt_wnd = IKCP_WND_RCV; - kcp->cwnd = 0; - kcp->incr = 0; - kcp->probe = 0; - kcp->mtu = IKCP_MTU_DEF; - kcp->mss = kcp->mtu - IKCP_OVERHEAD; - - kcp->buffer = (char*)ikcp_malloc((kcp->mtu + IKCP_OVERHEAD) * 3); - if (kcp->buffer == NULL) { - ikcp_free(kcp); - return NULL; - } - - iqueue_init(&kcp->snd_queue); - iqueue_init(&kcp->rcv_queue); - iqueue_init(&kcp->snd_buf); - iqueue_init(&kcp->rcv_buf); - kcp->nrcv_buf = 0; - kcp->nsnd_buf = 0; - kcp->nrcv_que = 0; - kcp->nsnd_que = 0; - kcp->state = 0; - kcp->acklist = NULL; - kcp->ackblock = 0; - kcp->ackcount = 0; - kcp->rx_srtt = 0; - kcp->rx_rttval = 0; - kcp->rx_rto = IKCP_RTO_DEF; - kcp->rx_minrto = IKCP_RTO_MIN; - kcp->current = 0; - kcp->interval = IKCP_INTERVAL; - kcp->ts_flush = IKCP_INTERVAL; - kcp->nodelay = 0; - kcp->updated = 0; - kcp->logmask = 0; - kcp->ssthresh = IKCP_THRESH_INIT; - kcp->fastresend = 0; - kcp->nocwnd = 0; - kcp->xmit = 0; - kcp->dead_link = IKCP_DEADLINK; - kcp->output = NULL; - kcp->writelog = NULL; - - return kcp; -} - - -//--------------------------------------------------------------------- -// release a new kcpcb -//--------------------------------------------------------------------- -void ikcp_release(ikcpcb *kcp) -{ - assert(kcp); - if (kcp) { - IKCPSEG *seg; - while (!iqueue_is_empty(&kcp->snd_buf)) { - seg = iqueue_entry(kcp->snd_buf.next, IKCPSEG, node); - iqueue_del(&seg->node); - ikcp_segment_delete(kcp, seg); - } - while (!iqueue_is_empty(&kcp->rcv_buf)) { - seg = iqueue_entry(kcp->rcv_buf.next, IKCPSEG, node); - iqueue_del(&seg->node); - ikcp_segment_delete(kcp, seg); - } - while (!iqueue_is_empty(&kcp->snd_queue)) { - seg = iqueue_entry(kcp->snd_queue.next, IKCPSEG, node); - iqueue_del(&seg->node); - ikcp_segment_delete(kcp, seg); - } - while (!iqueue_is_empty(&kcp->rcv_queue)) { - seg = iqueue_entry(kcp->rcv_queue.next, IKCPSEG, node); - iqueue_del(&seg->node); - ikcp_segment_delete(kcp, seg); - } - if (kcp->buffer) { - ikcp_free(kcp->buffer); - } - if (kcp->acklist) { - ikcp_free(kcp->acklist); - } - - kcp->nrcv_buf = 0; - kcp->nsnd_buf = 0; - kcp->nrcv_que = 0; - kcp->nsnd_que = 0; - kcp->ackcount = 0; - kcp->buffer = NULL; - kcp->acklist = NULL; - ikcp_free(kcp); - } -} - - - -//--------------------------------------------------------------------- -// user/upper level recv: returns size, returns below zero for EAGAIN -//--------------------------------------------------------------------- -int ikcp_recv(ikcpcb *kcp, char *buffer, int len) -{ - struct IQUEUEHEAD *p; - int ispeek = (len < 0)? 1 : 0; - int peeksize; - int recover = 0; - IKCPSEG *seg; - assert(kcp); - - if (iqueue_is_empty(&kcp->rcv_queue)) - return -1; - - if (len < 0) len = -len; - - peeksize = ikcp_peeksize(kcp); - - if (peeksize < 0) - return -2; - - if (peeksize > len) - return -3; - - if (kcp->nrcv_que >= kcp->rcv_wnd) - recover = 1; - - // merge fragment - for (len = 0, p = kcp->rcv_queue.next; p != &kcp->rcv_queue; ) { - int fragment; - seg = iqueue_entry(p, IKCPSEG, node); - p = p->next; - - if (buffer) { - memcpy(buffer, seg->data, seg->len); - buffer += seg->len; - } - - len += seg->len; - fragment = seg->frg; - - if (ikcp_canlog(kcp, IKCP_LOG_RECV)) { - ikcp_log(kcp, IKCP_LOG_RECV, "recv sn=%lu", seg->sn); - } - - if (ispeek == 0) { - iqueue_del(&seg->node); - ikcp_segment_delete(kcp, seg); - kcp->nrcv_que--; - } - - if (fragment == 0) - break; - } - - assert(len == peeksize); - - // move available data from rcv_buf -> rcv_queue - while (! iqueue_is_empty(&kcp->rcv_buf)) { - IKCPSEG *seg = iqueue_entry(kcp->rcv_buf.next, IKCPSEG, node); - if (seg->sn == kcp->rcv_nxt && kcp->nrcv_que < kcp->rcv_wnd) { - iqueue_del(&seg->node); - kcp->nrcv_buf--; - iqueue_add_tail(&seg->node, &kcp->rcv_queue); - kcp->nrcv_que++; - kcp->rcv_nxt++; - } else { - break; - } - } - - // fast recover - if (kcp->nrcv_que < kcp->rcv_wnd && recover) { - // ready to send back IKCP_CMD_WINS in ikcp_flush - // tell remote my window size - kcp->probe |= IKCP_ASK_TELL; - } - - return len; -} - - -//--------------------------------------------------------------------- -// peek data size -//--------------------------------------------------------------------- -int ikcp_peeksize(const ikcpcb *kcp) -{ - struct IQUEUEHEAD *p; - IKCPSEG *seg; - int length = 0; - - assert(kcp); - - if (iqueue_is_empty(&kcp->rcv_queue)) return -1; - - seg = iqueue_entry(kcp->rcv_queue.next, IKCPSEG, node); - if (seg->frg == 0) return seg->len; - - if (kcp->nrcv_que < seg->frg + 1) return -1; - - for (p = kcp->rcv_queue.next; p != &kcp->rcv_queue; p = p->next) { - seg = iqueue_entry(p, IKCPSEG, node); - length += seg->len; - if (seg->frg == 0) break; - } - - return length; -} - - -//--------------------------------------------------------------------- -// user/upper level send, returns below zero for error -//--------------------------------------------------------------------- -int ikcp_send(ikcpcb *kcp, const char *buffer, int len) -{ - IKCPSEG *seg; - int count, i; - - assert(kcp->mss > 0); - if (len < 0) return -1; - - if (len <= (int)kcp->mss) count = 1; - else count = (len + kcp->mss - 1) / kcp->mss; - - if (count > 255) return -2; - - if (count == 0) count = 1; - - // fragment - for (i = 0; i < count; i++) { - int size = len > (int)kcp->mss ? (int)kcp->mss : len; - seg = ikcp_segment_new(kcp, size); - assert(seg); - if (seg == NULL) { - return -2; - } - if (buffer && len > 0) { - memcpy(seg->data, buffer, size); - } - seg->len = size; - seg->frg = count - i - 1; - iqueue_init(&seg->node); - iqueue_add_tail(&seg->node, &kcp->snd_queue); - kcp->nsnd_que++; - if (buffer) { - buffer += size; - } - len -= size; - } - - return 0; -} - - -//--------------------------------------------------------------------- -// parse ack -//--------------------------------------------------------------------- -static void ikcp_update_ack(ikcpcb *kcp, IINT32 rtt) -{ - IINT32 rto = 0; - if (kcp->rx_srtt == 0) { - kcp->rx_srtt = rtt; - kcp->rx_rttval = rtt / 2; - } else { - long delta = rtt - kcp->rx_srtt; - if (delta < 0) delta = -delta; - kcp->rx_rttval = (3 * kcp->rx_rttval + delta) / 4; - kcp->rx_srtt = (7 * kcp->rx_srtt + rtt) / 8; - if (kcp->rx_srtt < 1) kcp->rx_srtt = 1; - } - rto = kcp->rx_srtt + _imax_(1, 4 * kcp->rx_rttval); - kcp->rx_rto = _ibound_(kcp->rx_minrto, rto, IKCP_RTO_MAX); -} - -static void ikcp_shrink_buf(ikcpcb *kcp) -{ - struct IQUEUEHEAD *p = kcp->snd_buf.next; - if (p != &kcp->snd_buf) { - IKCPSEG *seg = iqueue_entry(p, IKCPSEG, node); - kcp->snd_una = seg->sn; - } else { - kcp->snd_una = kcp->snd_nxt; - } -} - -static void ikcp_parse_ack(ikcpcb *kcp, IUINT32 sn) -{ - struct IQUEUEHEAD *p, *next; - - if (_itimediff(sn, kcp->snd_una) < 0 || _itimediff(sn, kcp->snd_nxt) >= 0) - return; - - for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = next) { - IKCPSEG *seg = iqueue_entry(p, IKCPSEG, node); - next = p->next; - if (sn == seg->sn) { - iqueue_del(p); - ikcp_segment_delete(kcp, seg); - kcp->nsnd_buf--; - break; - } - else { - seg->fastack++; - } - } -} - -static void ikcp_parse_una(ikcpcb *kcp, IUINT32 una) -{ -#if 1 - struct IQUEUEHEAD *p, *next; - for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = next) { - IKCPSEG *seg = iqueue_entry(p, IKCPSEG, node); - next = p->next; - if (_itimediff(una, seg->sn) > 0) { - iqueue_del(p); - ikcp_segment_delete(kcp, seg); - kcp->nsnd_buf--; - } else { - break; - } - } -#endif -} - - -//--------------------------------------------------------------------- -// ack append -//--------------------------------------------------------------------- -static void ikcp_ack_push(ikcpcb *kcp, IUINT32 sn, IUINT32 ts) -{ - size_t newsize = kcp->ackcount + 1; - IUINT32 *ptr; - - if (newsize > kcp->ackblock) { - IUINT32 *acklist; - size_t newblock; - - for (newblock = 8; newblock < newsize; newblock <<= 1); - acklist = (IUINT32*)ikcp_malloc(newblock * sizeof(IUINT32) * 2); - - if (acklist == NULL) { - assert(acklist != NULL); - abort(); - } - - if (kcp->acklist != NULL) { - size_t x; - for (x = 0; x < kcp->ackcount; x++) { - acklist[x * 2 + 0] = kcp->acklist[x * 2 + 0]; - acklist[x * 2 + 1] = kcp->acklist[x * 2 + 1]; - } - ikcp_free(kcp->acklist); - } - - kcp->acklist = acklist; - kcp->ackblock = newblock; - } - - ptr = &kcp->acklist[kcp->ackcount * 2]; - ptr[0] = sn; - ptr[1] = ts; - kcp->ackcount++; -} - -static void ikcp_ack_get(const ikcpcb *kcp, int p, IUINT32 *sn, IUINT32 *ts) -{ - if (sn) sn[0] = kcp->acklist[p * 2 + 0]; - if (ts) ts[0] = kcp->acklist[p * 2 + 1]; -} - - -//--------------------------------------------------------------------- -// parse data -//--------------------------------------------------------------------- -void ikcp_parse_data(ikcpcb *kcp, IKCPSEG *newseg) -{ - struct IQUEUEHEAD *p, *prev; - IUINT32 sn = newseg->sn; - int repeat = 0; - - if (_itimediff(sn, kcp->rcv_nxt + kcp->rcv_wnd) >= 0 || - _itimediff(sn, kcp->rcv_nxt) < 0) { - ikcp_segment_delete(kcp, newseg); - return; - } - - for (p = kcp->rcv_buf.prev; p != &kcp->rcv_buf; p = prev) { - IKCPSEG *seg = iqueue_entry(p, IKCPSEG, node); - prev = p->prev; - if (seg->sn == sn) { - repeat = 1; - break; - } - if (_itimediff(sn, seg->sn) > 0) { - break; - } - } - - if (repeat == 0) { - iqueue_init(&newseg->node); - iqueue_add(&newseg->node, p); - kcp->nrcv_buf++; - } else { - ikcp_segment_delete(kcp, newseg); - } - -#if 0 - ikcp_qprint("rcvbuf", &kcp->rcv_buf); - printf("rcv_nxt=%lu\n", kcp->rcv_nxt); -#endif - - // move available data from rcv_buf -> rcv_queue - while (! iqueue_is_empty(&kcp->rcv_buf)) { - IKCPSEG *seg = iqueue_entry(kcp->rcv_buf.next, IKCPSEG, node); - if (seg->sn == kcp->rcv_nxt && kcp->nrcv_que < kcp->rcv_wnd) { - iqueue_del(&seg->node); - kcp->nrcv_buf--; - iqueue_add_tail(&seg->node, &kcp->rcv_queue); - kcp->nrcv_que++; - kcp->rcv_nxt++; - } else { - break; - } - } - -#if 0 - ikcp_qprint("queue", &kcp->rcv_queue); - printf("rcv_nxt=%lu\n", kcp->rcv_nxt); -#endif - -#if 1 -// printf("snd(buf=%d, queue=%d)\n", kcp->nsnd_buf, kcp->nsnd_que); -// printf("rcv(buf=%d, queue=%d)\n", kcp->nrcv_buf, kcp->nrcv_que); -#endif -} - - -//--------------------------------------------------------------------- -// input data -//--------------------------------------------------------------------- -int ikcp_input(ikcpcb *kcp, const char *data, long size) -{ - IUINT32 una = kcp->snd_una; - - if (ikcp_canlog(kcp, IKCP_LOG_INPUT)) { - ikcp_log(kcp, IKCP_LOG_INPUT, "[RI] %d bytes", size); - } - - if (data == NULL || size < 24) return 0; - - while (1) { - IUINT32 ts, sn, len, una, conv; - IUINT16 wnd; - IUINT8 cmd, frg; - IKCPSEG *seg; - - if (size < (int)IKCP_OVERHEAD) break; - - data = ikcp_decode32u(data, &conv); - if (conv != kcp->conv) return -1; - - data = ikcp_decode8u(data, &cmd); - data = ikcp_decode8u(data, &frg); - data = ikcp_decode16u(data, &wnd); - data = ikcp_decode32u(data, &ts); - data = ikcp_decode32u(data, &sn); - data = ikcp_decode32u(data, &una); - data = ikcp_decode32u(data, &len); - - size -= IKCP_OVERHEAD; - - if ((long)size < (long)len) return -2; - - if (cmd != IKCP_CMD_PUSH && cmd != IKCP_CMD_ACK && - cmd != IKCP_CMD_WASK && cmd != IKCP_CMD_WINS) - return -3; - - kcp->rmt_wnd = wnd; - ikcp_parse_una(kcp, una); - ikcp_shrink_buf(kcp); - - if (cmd == IKCP_CMD_ACK) { - if (_itimediff(kcp->current, ts) >= 0) { - ikcp_update_ack(kcp, _itimediff(kcp->current, ts)); - } - ikcp_parse_ack(kcp, sn); - ikcp_shrink_buf(kcp); - if (ikcp_canlog(kcp, IKCP_LOG_IN_ACK)) { - ikcp_log(kcp, IKCP_LOG_IN_DATA, - "input ack: sn=%lu rtt=%ld rto=%ld", sn, - (long)_itimediff(kcp->current, ts), - (long)kcp->rx_rto); - } - } - else if (cmd == IKCP_CMD_PUSH) { - if (ikcp_canlog(kcp, IKCP_LOG_IN_DATA)) { - ikcp_log(kcp, IKCP_LOG_IN_DATA, - "input psh: sn=%lu ts=%lu", sn, ts); - } - if (_itimediff(sn, kcp->rcv_nxt + kcp->rcv_wnd) < 0) { - ikcp_ack_push(kcp, sn, ts); - if (_itimediff(sn, kcp->rcv_nxt) >= 0) { - seg = ikcp_segment_new(kcp, len); - seg->conv = conv; - seg->cmd = cmd; - seg->frg = frg; - seg->wnd = wnd; - seg->ts = ts; - seg->sn = sn; - seg->una = una; - seg->len = len; - - if (len > 0) { - memcpy(seg->data, data, len); - } - - ikcp_parse_data(kcp, seg); - } - } - } - else if (cmd == IKCP_CMD_WASK) { - // ready to send back IKCP_CMD_WINS in ikcp_flush - // tell remote my window size - kcp->probe |= IKCP_ASK_TELL; - if (ikcp_canlog(kcp, IKCP_LOG_IN_PROBE)) { - ikcp_log(kcp, IKCP_LOG_IN_PROBE, "input probe"); - } - } - else if (cmd == IKCP_CMD_WINS) { - // do nothing - if (ikcp_canlog(kcp, IKCP_LOG_IN_WINS)) { - ikcp_log(kcp, IKCP_LOG_IN_WINS, - "input wins: %lu", (IUINT32)(wnd)); - } - } - else { - return -3; - } - - data += len; - size -= len; - } - - if (_itimediff(kcp->snd_una, una) > 0) { - if (kcp->cwnd < kcp->rmt_wnd) { - IUINT32 mss = kcp->mss; - if (kcp->cwnd < kcp->ssthresh) { - kcp->cwnd++; - kcp->incr += mss; - } else { - if (kcp->incr < mss) kcp->incr = mss; - kcp->incr += (mss * mss) / kcp->incr + (mss / 16); - if ((kcp->cwnd + 1) * mss >= kcp->incr) { - kcp->cwnd++; - } - } - if (kcp->cwnd > kcp->rmt_wnd) { - kcp->cwnd = kcp->rmt_wnd; - kcp->incr = kcp->rmt_wnd * mss; - } - } - } - - return 0; -} - - -//--------------------------------------------------------------------- -// ikcp_encode_seg -//--------------------------------------------------------------------- -static char *ikcp_encode_seg(char *ptr, const IKCPSEG *seg) -{ - ptr = ikcp_encode32u(ptr, seg->conv); - ptr = ikcp_encode8u(ptr, (IUINT8)seg->cmd); - ptr = ikcp_encode8u(ptr, (IUINT8)seg->frg); - ptr = ikcp_encode16u(ptr, (IUINT16)seg->wnd); - ptr = ikcp_encode32u(ptr, seg->ts); - ptr = ikcp_encode32u(ptr, seg->sn); - ptr = ikcp_encode32u(ptr, seg->una); - ptr = ikcp_encode32u(ptr, seg->len); - return ptr; -} - -static int ikcp_wnd_unused(const ikcpcb *kcp) -{ - if (kcp->nrcv_que < kcp->rcv_wnd) { - return kcp->rcv_wnd - kcp->nrcv_que; - } - return 0; -} - - -//--------------------------------------------------------------------- -// ikcp_flush -//--------------------------------------------------------------------- -void ikcp_flush(ikcpcb *kcp) -{ - IUINT32 current = kcp->current; - char *buffer = kcp->buffer; - char *ptr = buffer; - int count, size, i; - IUINT32 resent, cwnd; - IUINT32 rtomin; - struct IQUEUEHEAD *p; - int change = 0; - int lost = 0; - IKCPSEG seg; - - // 'ikcp_update' haven't been called. - if (kcp->updated == 0) return; - - seg.conv = kcp->conv; - seg.cmd = IKCP_CMD_ACK; - seg.frg = 0; - seg.wnd = ikcp_wnd_unused(kcp); - seg.una = kcp->rcv_nxt; - seg.len = 0; - seg.sn = 0; - seg.ts = 0; - - // flush acknowledges - count = kcp->ackcount; - for (i = 0; i < count; i++) { - size = (int)(ptr - buffer); - if (size + IKCP_OVERHEAD > (int)kcp->mtu) { - ikcp_output(kcp, buffer, size); - ptr = buffer; - } - ikcp_ack_get(kcp, i, &seg.sn, &seg.ts); - ptr = ikcp_encode_seg(ptr, &seg); - } - - kcp->ackcount = 0; - - // probe window size (if remote window size equals zero) - if (kcp->rmt_wnd == 0) { - if (kcp->probe_wait == 0) { - kcp->probe_wait = IKCP_PROBE_INIT; - kcp->ts_probe = kcp->current + kcp->probe_wait; - } - else { - if (_itimediff(kcp->current, kcp->ts_probe) >= 0) { - if (kcp->probe_wait < IKCP_PROBE_INIT) - kcp->probe_wait = IKCP_PROBE_INIT; - kcp->probe_wait += kcp->probe_wait / 2; - if (kcp->probe_wait > IKCP_PROBE_LIMIT) - kcp->probe_wait = IKCP_PROBE_LIMIT; - kcp->ts_probe = kcp->current + kcp->probe_wait; - kcp->probe |= IKCP_ASK_SEND; - } - } - } else { - kcp->ts_probe = 0; - kcp->probe_wait = 0; - } - - // flush window probing commands - if (kcp->probe & IKCP_ASK_SEND) { - seg.cmd = IKCP_CMD_WASK; - size = (int)(ptr - buffer); - if (size + IKCP_OVERHEAD > (int)kcp->mtu) { - ikcp_output(kcp, buffer, size); - ptr = buffer; - } - ptr = ikcp_encode_seg(ptr, &seg); - } - - // flush window probing commands - if (kcp->probe & IKCP_ASK_TELL) { - seg.cmd = IKCP_CMD_WINS; - size = (int)(ptr - buffer); - if (size + IKCP_OVERHEAD > (int)kcp->mtu) { - ikcp_output(kcp, buffer, size); - ptr = buffer; - } - ptr = ikcp_encode_seg(ptr, &seg); - } - - kcp->probe = 0; - - // calculate window size - cwnd = _imin_(kcp->snd_wnd, kcp->rmt_wnd); - if (kcp->nocwnd == 0) cwnd = _imin_(kcp->cwnd, cwnd); - - // move data from snd_queue to snd_buf - while (_itimediff(kcp->snd_nxt, kcp->snd_una + cwnd) < 0) { - IKCPSEG *newseg; - if (iqueue_is_empty(&kcp->snd_queue)) break; - - newseg = iqueue_entry(kcp->snd_queue.next, IKCPSEG, node); - - iqueue_del(&newseg->node); - iqueue_add_tail(&newseg->node, &kcp->snd_buf); - kcp->nsnd_que--; - kcp->nsnd_buf++; - - newseg->conv = kcp->conv; - newseg->cmd = IKCP_CMD_PUSH; - newseg->wnd = seg.wnd; - newseg->ts = current; - newseg->sn = kcp->snd_nxt++; - newseg->una = kcp->rcv_nxt; - newseg->resendts = current; - newseg->rto = kcp->rx_rto; - newseg->fastack = 0; - newseg->xmit = 0; - } - - // calculate resent - resent = (kcp->fastresend > 0)? (IUINT32)kcp->fastresend : 0xffffffff; - rtomin = (kcp->nodelay == 0)? (kcp->rx_rto >> 3) : 0; - - // flush data segments - for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = p->next) { - IKCPSEG *segment = iqueue_entry(p, IKCPSEG, node); - int needsend = 0; - if (segment->xmit == 0) { - needsend = 1; - segment->xmit++; - segment->rto = kcp->rx_rto; - segment->resendts = current + segment->rto + rtomin; - } - else if (_itimediff(current, segment->resendts) >= 0) { - needsend = 1; - segment->xmit++; - kcp->xmit++; - if (kcp->nodelay == 0) { - segment->rto += kcp->rx_rto; - } else { - segment->rto += kcp->rx_rto / 2; - } - segment->resendts = current + segment->rto; - lost = 1; - } - else if (segment->fastack >= resent) { - needsend = 1; - segment->xmit++; - segment->fastack = 0; - segment->resendts = current + segment->rto; - change++; - } - - if (needsend) { - int size, need; - segment->ts = current; - segment->wnd = seg.wnd; - segment->una = kcp->rcv_nxt; - - size = (int)(ptr - buffer); - need = IKCP_OVERHEAD + segment->len; - - if (size + need > (int)kcp->mtu) { - ikcp_output(kcp, buffer, size); - ptr = buffer; - } - - ptr = ikcp_encode_seg(ptr, segment); - - if (segment->len > 0) { - memcpy(ptr, segment->data, segment->len); - ptr += segment->len; - } - - if (segment->xmit >= kcp->dead_link) { - kcp->state = -1; - } - } - } - - // flash remain segments - size = (int)(ptr - buffer); - if (size > 0) { - ikcp_output(kcp, buffer, size); - } - - // update ssthresh - if (change) { - IUINT32 inflight = kcp->snd_nxt - kcp->snd_una; - kcp->ssthresh = inflight / 2; - if (kcp->ssthresh < IKCP_THRESH_MIN) - kcp->ssthresh = IKCP_THRESH_MIN; - kcp->cwnd = kcp->ssthresh + resent; - kcp->incr = kcp->cwnd * kcp->mss; - } - - if (lost) { - kcp->ssthresh = cwnd / 2; - if (kcp->ssthresh < IKCP_THRESH_MIN) - kcp->ssthresh = IKCP_THRESH_MIN; - kcp->cwnd = 1; - kcp->incr = kcp->mss; - } - - if (kcp->cwnd < 1) { - kcp->cwnd = 1; - kcp->incr = kcp->mss; - } -} - - -//--------------------------------------------------------------------- -// update state (call it repeatedly, every 10ms-100ms), or you can ask -// ikcp_check when to call it again (without ikcp_input/_send calling). -// 'current' - current timestamp in millisec. -//--------------------------------------------------------------------- -void ikcp_update(ikcpcb *kcp, IUINT32 current) -{ - IINT32 slap; - - kcp->current = current; - - if (kcp->updated == 0) { - kcp->updated = 1; - kcp->ts_flush = kcp->current; - } - - slap = _itimediff(kcp->current, kcp->ts_flush); - - if (slap >= 10000 || slap < -10000) { - kcp->ts_flush = kcp->current; - slap = 0; - } - - if (slap >= 0) { - kcp->ts_flush += kcp->interval; - if (_itimediff(kcp->current, kcp->ts_flush) >= 0) { - kcp->ts_flush = kcp->current + kcp->interval; - } - ikcp_flush(kcp); - } -} - - -//--------------------------------------------------------------------- -// Determine when should you invoke ikcp_update: -// returns when you should invoke ikcp_update in millisec, if there -// is no ikcp_input/_send calling. you can call ikcp_update in that -// time, instead of call update repeatly. -// Important to reduce unnacessary ikcp_update invoking. use it to -// schedule ikcp_update (eg. implementing an epoll-like mechanism, -// or optimize ikcp_update when handling massive kcp connections) -//--------------------------------------------------------------------- -IUINT32 ikcp_check(const ikcpcb *kcp, IUINT32 current) -{ - IUINT32 ts_flush = kcp->ts_flush; - IINT32 tm_flush = 0x7fffffff; - IINT32 tm_packet = 0x7fffffff; - IUINT32 minimal = 0; - struct IQUEUEHEAD *p; - - if (kcp->updated == 0) { - return current; - } - - if (_itimediff(current, ts_flush) >= 10000 || - _itimediff(current, ts_flush) < -10000) { - ts_flush = current; - } - - if (_itimediff(current, ts_flush) >= 0) { - return current; - } - - tm_flush = _itimediff(ts_flush, current); - - for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = p->next) { - const IKCPSEG *seg = iqueue_entry(p, const IKCPSEG, node); - IINT32 diff = _itimediff(seg->resendts, current); - if (diff <= 0) { - return current; - } - if (diff < tm_packet) tm_packet = diff; - } - - minimal = (IUINT32)(tm_packet < tm_flush ? tm_packet : tm_flush); - if (minimal >= kcp->interval) minimal = kcp->interval; - - return current + minimal; -} - - - -int ikcp_setmtu(ikcpcb *kcp, int mtu) -{ - char *buffer; - if (mtu < 50 || mtu < (int)IKCP_OVERHEAD) - return -1; - buffer = (char*)ikcp_malloc((mtu + IKCP_OVERHEAD) * 3); - if (buffer == NULL) - return -2; - kcp->mtu = mtu; - kcp->mss = kcp->mtu - IKCP_OVERHEAD; - ikcp_free(kcp->buffer); - kcp->buffer = buffer; - return 0; -} - -int ikcp_interval(ikcpcb *kcp, int interval) -{ - if (interval > 5000) interval = 5000; - else if (interval < 10) interval = 10; - kcp->interval = interval; - return 0; -} - -int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, int resend, int nc) -{ - if (nodelay >= 0) { - kcp->nodelay = nodelay; - if (nodelay) { - kcp->rx_minrto = IKCP_RTO_NDL; - } - else { - kcp->rx_minrto = IKCP_RTO_MIN; - } - } - if (interval >= 0) { - if (interval > 5000) interval = 5000; - else if (interval < 10) interval = 10; - kcp->interval = interval; - } - if (resend >= 0) { - kcp->fastresend = resend; - } - if (nc >= 0) { - kcp->nocwnd = nc; - } - return 0; -} - - -int ikcp_wndsize(ikcpcb *kcp, int sndwnd, int rcvwnd) -{ - if (kcp) { - if (sndwnd > 0) { - kcp->snd_wnd = sndwnd; - } - if (rcvwnd > 0) { - kcp->rcv_wnd = rcvwnd; - } - } - return 0; -} - -int ikcp_waitsnd(const ikcpcb *kcp) -{ - return kcp->nsnd_buf + kcp->nsnd_que; -} - - diff --git a/3rd/kcp/ikcp.h b/3rd/kcp/ikcp.h deleted file mode 100644 index 5626693..0000000 --- a/3rd/kcp/ikcp.h +++ /dev/null @@ -1,399 +0,0 @@ -//===================================================================== -// -// KCP - A Better ARQ Protocol Implementation -// skywind3000 (at) gmail.com, 2010-2011 -// -// Features: -// + Average RTT reduce 30% - 40% vs traditional ARQ like tcp. -// + Maximum RTT reduce three times vs tcp. -// + Lightweight, distributed as a single source file. -// -//===================================================================== -#ifndef __IKCP_H__ -#define __IKCP_H__ - -#include -#include -#include - - -//===================================================================== -// 32BIT INTEGER DEFINITION -//===================================================================== -#ifndef __INTEGER_32_BITS__ -#define __INTEGER_32_BITS__ -#if defined(_WIN64) || defined(WIN64) || defined(__amd64__) || \ - defined(__x86_64) || defined(__x86_64__) || defined(_M_IA64) || \ - defined(_M_AMD64) - typedef unsigned int ISTDUINT32; - typedef int ISTDINT32; -#elif defined(_WIN32) || defined(WIN32) || defined(__i386__) || \ - defined(__i386) || defined(_M_X86) - typedef unsigned long ISTDUINT32; - typedef long ISTDINT32; -#elif defined(__MACOS__) - typedef UInt32 ISTDUINT32; - typedef SInt32 ISTDINT32; -#elif defined(__APPLE__) && defined(__MACH__) - #include - typedef u_int32_t ISTDUINT32; - typedef int32_t ISTDINT32; -#elif defined(__BEOS__) - #include - typedef u_int32_t ISTDUINT32; - typedef int32_t ISTDINT32; -#elif (defined(_MSC_VER) || defined(__BORLANDC__)) && (!defined(__MSDOS__)) - typedef unsigned __int32 ISTDUINT32; - typedef __int32 ISTDINT32; -#elif defined(__GNUC__) - #include - typedef uint32_t ISTDUINT32; - typedef int32_t ISTDINT32; -#else - typedef unsigned long ISTDUINT32; - typedef long ISTDINT32; -#endif -#endif - - -//===================================================================== -// Integer Definition -//===================================================================== -#ifndef __IINT8_DEFINED -#define __IINT8_DEFINED -typedef char IINT8; -#endif - -#ifndef __IUINT8_DEFINED -#define __IUINT8_DEFINED -typedef unsigned char IUINT8; -#endif - -#ifndef __IUINT16_DEFINED -#define __IUINT16_DEFINED -typedef unsigned short IUINT16; -#endif - -#ifndef __IINT16_DEFINED -#define __IINT16_DEFINED -typedef short IINT16; -#endif - -#ifndef __IINT32_DEFINED -#define __IINT32_DEFINED -typedef ISTDINT32 IINT32; -#endif - -#ifndef __IUINT32_DEFINED -#define __IUINT32_DEFINED -typedef ISTDUINT32 IUINT32; -#endif - -#ifndef __IINT64_DEFINED -#define __IINT64_DEFINED -#if defined(_MSC_VER) || defined(__BORLANDC__) -typedef __int64 IINT64; -#else -typedef long long IINT64; -#endif -#endif - -#ifndef __IUINT64_DEFINED -#define __IUINT64_DEFINED -#if defined(_MSC_VER) || defined(__BORLANDC__) -typedef unsigned __int64 IUINT64; -#else -typedef unsigned long long IUINT64; -#endif -#endif - -#ifndef INLINE -#if defined(__GNUC__) - -#if (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) -#define INLINE __inline__ __attribute__((always_inline)) -#else -#define INLINE __inline__ -#endif - -#elif (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__)) -#define INLINE __inline -#else -#define INLINE -#endif -#endif - -#ifndef inline -#define inline INLINE -#endif - - -//===================================================================== -// QUEUE DEFINITION -//===================================================================== -#ifndef __IQUEUE_DEF__ -#define __IQUEUE_DEF__ - -struct IQUEUEHEAD { - struct IQUEUEHEAD *next, *prev; -}; - -typedef struct IQUEUEHEAD iqueue_head; - - -//--------------------------------------------------------------------- -// queue init -//--------------------------------------------------------------------- -#define IQUEUE_HEAD_INIT(name) { &(name), &(name) } -#define IQUEUE_HEAD(name) \ - struct IQUEUEHEAD name = IQUEUE_HEAD_INIT(name) - -#define IQUEUE_INIT(ptr) ( \ - (ptr)->next = (ptr), (ptr)->prev = (ptr)) - -#define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) - -#define ICONTAINEROF(ptr, type, member) ( \ - (type*)( ((char*)((type*)ptr)) - IOFFSETOF(type, member)) ) - -#define IQUEUE_ENTRY(ptr, type, member) ICONTAINEROF(ptr, type, member) - - -//--------------------------------------------------------------------- -// queue operation -//--------------------------------------------------------------------- -#define IQUEUE_ADD(node, head) ( \ - (node)->prev = (head), (node)->next = (head)->next, \ - (head)->next->prev = (node), (head)->next = (node)) - -#define IQUEUE_ADD_TAIL(node, head) ( \ - (node)->prev = (head)->prev, (node)->next = (head), \ - (head)->prev->next = (node), (head)->prev = (node)) - -#define IQUEUE_DEL_BETWEEN(p, n) ((n)->prev = (p), (p)->next = (n)) - -#define IQUEUE_DEL(entry) (\ - (entry)->next->prev = (entry)->prev, \ - (entry)->prev->next = (entry)->next, \ - (entry)->next = 0, (entry)->prev = 0) - -#define IQUEUE_DEL_INIT(entry) do { \ - IQUEUE_DEL(entry); IQUEUE_INIT(entry); } while (0) - -#define IQUEUE_IS_EMPTY(entry) ((entry) == (entry)->next) - -#define iqueue_init IQUEUE_INIT -#define iqueue_entry IQUEUE_ENTRY -#define iqueue_add IQUEUE_ADD -#define iqueue_add_tail IQUEUE_ADD_TAIL -#define iqueue_del IQUEUE_DEL -#define iqueue_del_init IQUEUE_DEL_INIT -#define iqueue_is_empty IQUEUE_IS_EMPTY - -#define IQUEUE_FOREACH(iterator, head, TYPE, MEMBER) \ - for ((iterator) = iqueue_entry((head)->next, TYPE, MEMBER); \ - &((iterator)->MEMBER) != (head); \ - (iterator) = iqueue_entry((iterator)->MEMBER.next, TYPE, MEMBER)) - -#define iqueue_foreach(iterator, head, TYPE, MEMBER) \ - IQUEUE_FOREACH(iterator, head, TYPE, MEMBER) - -#define iqueue_foreach_entry(pos, head) \ - for( (pos) = (head)->next; (pos) != (head) ; (pos) = (pos)->next ) - - -#define __iqueue_splice(list, head) do { \ - iqueue_head *first = (list)->next, *last = (list)->prev; \ - iqueue_head *at = (head)->next; \ - (first)->prev = (head), (head)->next = (first); \ - (last)->next = (at), (at)->prev = (last); } while (0) - -#define iqueue_splice(list, head) do { \ - if (!iqueue_is_empty(list)) __iqueue_splice(list, head); } while (0) - -#define iqueue_splice_init(list, head) do { \ - iqueue_splice(list, head); iqueue_init(list); } while (0) - - -#ifdef _MSC_VER -#pragma warning(disable:4311) -#pragma warning(disable:4312) -#pragma warning(disable:4996) -#endif - -#endif - - -//--------------------------------------------------------------------- -// WORD ORDER -//--------------------------------------------------------------------- -#ifndef IWORDS_BIG_ENDIAN - #ifdef _BIG_ENDIAN_ - #if _BIG_ENDIAN_ - #define IWORDS_BIG_ENDIAN 1 - #endif - #endif - #ifndef IWORDS_BIG_ENDIAN - #if defined(__hppa__) || \ - defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ - (defined(__MIPS__) && defined(__MISPEB__)) || \ - defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \ - defined(__sparc__) || defined(__powerpc__) || \ - defined(__mc68000__) || defined(__s390x__) || defined(__s390__) - #define IWORDS_BIG_ENDIAN 1 - #endif - #endif - #ifndef IWORDS_BIG_ENDIAN - #define IWORDS_BIG_ENDIAN 0 - #endif -#endif - - - -//===================================================================== -// SEGMENT -//===================================================================== -struct IKCPSEG -{ - struct IQUEUEHEAD node; - IUINT32 conv; - IUINT32 cmd; - IUINT32 frg; - IUINT32 wnd; - IUINT32 ts; - IUINT32 sn; - IUINT32 una; - IUINT32 len; - IUINT32 resendts; - IUINT32 rto; - IUINT32 fastack; - IUINT32 xmit; - char data[1]; -}; - - -//--------------------------------------------------------------------- -// IKCPCB -//--------------------------------------------------------------------- -struct IKCPCB -{ - IUINT32 conv, mtu, mss, state; - IUINT32 snd_una, snd_nxt, rcv_nxt; - IUINT32 ts_recent, ts_lastack, ssthresh; - IINT32 rx_rttval, rx_srtt, rx_rto, rx_minrto; - IUINT32 snd_wnd, rcv_wnd, rmt_wnd, cwnd, probe; - IUINT32 current, interval, ts_flush, xmit; - IUINT32 nrcv_buf, nsnd_buf; - IUINT32 nrcv_que, nsnd_que; - IUINT32 nodelay, updated; - IUINT32 ts_probe, probe_wait; - IUINT32 dead_link, incr; - struct IQUEUEHEAD snd_queue; - struct IQUEUEHEAD rcv_queue; - struct IQUEUEHEAD snd_buf; - struct IQUEUEHEAD rcv_buf; - IUINT32 *acklist; - IUINT32 ackcount; - IUINT32 ackblock; - void *user; - char *buffer; - int fastresend; - int nocwnd; - int logmask; - int (*output)(const char *buf, int len, struct IKCPCB *kcp, void *user); - void (*writelog)(const char *log, struct IKCPCB *kcp, void *user); -}; - - -typedef struct IKCPCB ikcpcb; - -#define IKCP_LOG_OUTPUT 1 -#define IKCP_LOG_INPUT 2 -#define IKCP_LOG_SEND 4 -#define IKCP_LOG_RECV 8 -#define IKCP_LOG_IN_DATA 16 -#define IKCP_LOG_IN_ACK 32 -#define IKCP_LOG_IN_PROBE 64 -#define IKCP_LOG_IN_WINS 128 -#define IKCP_LOG_OUT_DATA 256 -#define IKCP_LOG_OUT_ACK 512 -#define IKCP_LOG_OUT_PROBE 1024 -#define IKCP_LOG_OUT_WINS 2048 - -#ifdef __cplusplus -extern "C" { -#endif - -//--------------------------------------------------------------------- -// interface -//--------------------------------------------------------------------- - -// create a new kcp control object, 'conv' must equal in two endpoint -// from the same connection. 'user' will be passed to the output callback -// output callback can be setup like this: 'kcp->output = my_udp_output' -ikcpcb* ikcp_create(IUINT32 conv, void *user); - -// release kcp control object -void ikcp_release(ikcpcb *kcp); - -// user/upper level recv: returns size, returns below zero for EAGAIN -int ikcp_recv(ikcpcb *kcp, char *buffer, int len); - -// user/upper level send, returns below zero for error -int ikcp_send(ikcpcb *kcp, const char *buffer, int len); - -// update state (call it repeatedly, every 10ms-100ms), or you can ask -// ikcp_check when to call it again (without ikcp_input/_send calling). -// 'current' - current timestamp in millisec. -void ikcp_update(ikcpcb *kcp, IUINT32 current); - -// Determine when should you invoke ikcp_update: -// returns when you should invoke ikcp_update in millisec, if there -// is no ikcp_input/_send calling. you can call ikcp_update in that -// time, instead of call update repeatly. -// Important to reduce unnacessary ikcp_update invoking. use it to -// schedule ikcp_update (eg. implementing an epoll-like mechanism, -// or optimize ikcp_update when handling massive kcp connections) -IUINT32 ikcp_check(const ikcpcb *kcp, IUINT32 current); - -// when you received a low level packet (eg. UDP packet), call it -int ikcp_input(ikcpcb *kcp, const char *data, long size); - -// flush pending data -void ikcp_flush(ikcpcb *kcp); - -// check the size of next message in the recv queue -int ikcp_peeksize(const ikcpcb *kcp); - -// change MTU size, default is 1400 -int ikcp_setmtu(ikcpcb *kcp, int mtu); - -// set maximum window size: sndwnd=32, rcvwnd=32 by default -int ikcp_wndsize(ikcpcb *kcp, int sndwnd, int rcvwnd); - -// get how many packet is waiting to be sent -int ikcp_waitsnd(const ikcpcb *kcp); - -// fastest: ikcp_nodelay(kcp, 1, 20, 2, 1) -// nodelay: 0:disable(default), 1:enable -// interval: internal update timer interval in millisec, default is 100ms -// resend: 0:disable fast resend(default), 1:enable fast resend -// nc: 0:normal congestion control(default), 1:disable congestion control -int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, int resend, int nc); - -int ikcp_rcvbuf_count(const ikcpcb *kcp); -int ikcp_sndbuf_count(const ikcpcb *kcp); - -void ikcp_log(ikcpcb *kcp, int mask, const char *fmt, ...); - -// setup allocator -void ikcp_allocator(void* (*new_malloc)(size_t), void (*new_free)(void*)); - - -#ifdef __cplusplus -} -#endif - -#endif - - diff --git a/3rd/kcp/test.cpp b/3rd/kcp/test.cpp deleted file mode 100644 index 260ad84..0000000 --- a/3rd/kcp/test.cpp +++ /dev/null @@ -1,177 +0,0 @@ -//===================================================================== -// -// test.cpp - kcp 测试用例 -// -// 说明: -// gcc test.cpp -o test -lstdc++ -// -//===================================================================== - -#include -#include - -#include "test.h" -#include "ikcp.c" - - -// 模拟网络 -LatencySimulator *vnet; - -// 模拟网络:模拟发送一个 udp包 -int udp_output(const char *buf, int len, ikcpcb *kcp, void *user) -{ - int id = (int)user; - vnet->send(id, buf, len); - return 0; -} - -// 测试用例 -void test(int mode) -{ - // 创建模拟网络:丢包率10%,Rtt 60ms~125ms - vnet = new LatencySimulator(10, 60, 125); - - // 创建两个端点的 kcp对象,第一个参数 conv是会话编号,同一个会话需要相同 - // 最后一个是 user参数,用来传递标识 - ikcpcb *kcp1 = ikcp_create(0x11223344, (void*)0); - ikcpcb *kcp2 = ikcp_create(0x11223344, (void*)1); - - // 设置kcp的下层输出,这里为 udp_output,模拟udp网络输出函数 - kcp1->output = udp_output; - kcp2->output = udp_output; - - IUINT32 current = iclock(); - IUINT32 slap = current + 20; - IUINT32 index = 0; - IUINT32 next = 0; - IINT64 sumrtt = 0; - int count = 0; - int maxrtt = 0; - - // 配置窗口大小:平均延迟200ms,每20ms发送一个包, - // 而考虑到丢包重发,设置最大收发窗口为128 - ikcp_wndsize(kcp1, 128, 128); - ikcp_wndsize(kcp2, 128, 128); - - // 判断测试用例的模式 - if (mode == 0) { - // 默认模式 - ikcp_nodelay(kcp1, 0, 10, 0, 0); - ikcp_nodelay(kcp2, 0, 10, 0, 0); - } - else if (mode == 1) { - // 普通模式,关闭流控等 - ikcp_nodelay(kcp1, 0, 10, 0, 1); - ikcp_nodelay(kcp2, 0, 10, 0, 1); - } else { - // 启动快速模式 - // 第二个参数 nodelay-启用以后若干常规加速将启动 - // 第三个参数 interval为内部处理时钟,默认设置为 10ms - // 第四个参数 resend为快速重传指标,设置为2 - // 第五个参数 为是否禁用常规流控,这里禁止 - ikcp_nodelay(kcp1, 1, 10, 2, 1); - ikcp_nodelay(kcp2, 1, 10, 2, 1); - } - - - char buffer[2000]; - int hr; - - IUINT32 ts1 = iclock(); - - while (1) { - isleep(1); - current = iclock(); - ikcp_update(kcp1, iclock()); - ikcp_update(kcp2, iclock()); - - // 每隔 20ms,kcp1发送数据 - for (; current >= slap; slap += 20) { - *(IUINT32*)(buffer + 0) = index++; - *(IUINT32*)(buffer + 4) = current; - - // 发送上层协议包 - ikcp_send(kcp1, buffer, 8); - } - - // 处理虚拟网络:检测是否有udp包从p1->p2 - while (1) { - hr = vnet->recv(1, buffer, 2000); - if (hr < 0) break; - // 如果 p2收到udp,则作为下层协议输入到kcp2 - ikcp_input(kcp2, buffer, hr); - } - - // 处理虚拟网络:检测是否有udp包从p2->p1 - while (1) { - hr = vnet->recv(0, buffer, 2000); - if (hr < 0) break; - // 如果 p1收到udp,则作为下层协议输入到kcp1 - ikcp_input(kcp1, buffer, hr); - } - - // kcp2接收到任何包都返回回去 - while (1) { - hr = ikcp_recv(kcp2, buffer, 10); - // 没有收到包就退出 - if (hr < 0) break; - // 如果收到包就回射 - ikcp_send(kcp2, buffer, hr); - } - - // kcp1收到kcp2的回射数据 - while (1) { - hr = ikcp_recv(kcp1, buffer, 10); - // 没有收到包就退出 - if (hr < 0) break; - IUINT32 sn = *(IUINT32*)(buffer + 0); - IUINT32 ts = *(IUINT32*)(buffer + 4); - IUINT32 rtt = current - ts; - - if (sn != next) { - // 如果收到的包不连续 - printf("ERROR sn %d<->%d\n", (int)count, (int)next); - return; - } - - next++; - sumrtt += rtt; - count++; - if (rtt > (IUINT32)maxrtt) maxrtt = rtt; - - printf("[RECV] mode=%d sn=%d rtt=%d\n", mode, (int)sn, (int)rtt); - } - if (next > 1000) break; - } - - ts1 = iclock() - ts1; - - ikcp_release(kcp1); - ikcp_release(kcp2); - - const char *names[3] = { "default", "normal", "fast" }; - printf("%s mode result (%dms):\n", names[mode], (int)ts1); - printf("avgrtt=%d maxrtt=%d\n", (int)(sumrtt / count), maxrtt); - printf("press enter to next ...\n"); - char ch; scanf("%c", &ch); -} - -int main() -{ - test(0); // 默认模式,类似 TCP:正常模式,无快速重传,常规流控 - test(1); // 普通模式,关闭流控等 - test(2); // 快速模式,所有开关都打开,且关闭流控 - return 0; -} - -/* -default mode result (20917ms): -avgrtt=740 maxrtt=1507 - -normal mode result (20131ms): -avgrtt=156 maxrtt=571 - -fast mode result (20207ms): -avgrtt=138 maxrtt=392 -*/ - diff --git a/3rd/kcp/test.h b/3rd/kcp/test.h deleted file mode 100644 index f60a8a4..0000000 --- a/3rd/kcp/test.h +++ /dev/null @@ -1,242 +0,0 @@ -#ifndef __TEST_H__ -#define __TEST_H__ - -#include -#include -#include -#include -#include - -#include "ikcp.h" - -#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) -#include -#elif !defined(__unix) -#define __unix -#endif - -#ifdef __unix -#include -#include -#include -#include -#endif - -/* get system time */ -static inline void itimeofday(long *sec, long *usec) -{ - #if defined(__unix) - struct timeval time; - gettimeofday(&time, NULL); - if (sec) *sec = time.tv_sec; - if (usec) *usec = time.tv_usec; - #else - static long mode = 0, addsec = 0; - BOOL retval; - static IINT64 freq = 1; - IINT64 qpc; - if (mode == 0) { - retval = QueryPerformanceFrequency((LARGE_INTEGER*)&freq); - freq = (freq == 0)? 1 : freq; - retval = QueryPerformanceCounter((LARGE_INTEGER*)&qpc); - addsec = (long)time(NULL); - addsec = addsec - (long)((qpc / freq) & 0x7fffffff); - mode = 1; - } - retval = QueryPerformanceCounter((LARGE_INTEGER*)&qpc); - retval = retval * 2; - if (sec) *sec = (long)(qpc / freq) + addsec; - if (usec) *usec = (long)((qpc % freq) * 1000000 / freq); - #endif -} - -/* get clock in millisecond 64 */ -static inline IINT64 iclock64(void) -{ - long s, u; - IINT64 value; - itimeofday(&s, &u); - value = ((IINT64)s) * 1000 + (u / 1000); - return value; -} - -static inline IUINT32 iclock() -{ - return (IUINT32)(iclock64() & 0xfffffffful); -} - -/* sleep in millisecond */ -static inline void isleep(unsigned long millisecond) -{ - #ifdef __unix /* usleep( time * 1000 ); */ - struct timespec ts; - ts.tv_sec = (time_t)(millisecond / 1000); - ts.tv_nsec = (long)((millisecond % 1000) * 1000000); - /*nanosleep(&ts, NULL);*/ - usleep((millisecond << 10) - (millisecond << 4) - (millisecond << 3)); - #elif defined(_WIN32) - Sleep(millisecond); - #endif -} - -#ifdef __cplusplus -#include -#include - -// 带延迟的数据包 -class DelayPacket -{ -public: - virtual ~DelayPacket() { - if (_ptr) delete _ptr; - _ptr = NULL; - } - - DelayPacket(int size, const void *src = NULL) { - _ptr = new unsigned char[size]; - _size = size; - if (src) { - memcpy(_ptr, src, size); - } - } - - unsigned char* ptr() { return _ptr; } - const unsigned char* ptr() const { return _ptr; } - - int size() const { return _size; } - IUINT32 ts() const { return _ts; } - void setts(IUINT32 ts) { _ts = ts; } - -protected: - unsigned char *_ptr; - int _size; - IUINT32 _ts; -}; - -// 均匀分布的随机数 -class Random -{ -public: - Random(int size) { - this->size = 0; - seeds.resize(size); - } - - int random() { - int x, i; - if (seeds.size() == 0) return 0; - if (size == 0) { - for (i = 0; i < (int)seeds.size(); i++) { - seeds[i] = i; - } - size = (int)seeds.size(); - } - i = rand() % size; - x = seeds[i]; - seeds[i] = seeds[--size]; - return x; - } - -protected: - int size; - std::vector seeds; -}; - -// 网络延迟模拟器 -class LatencySimulator -{ -public: - virtual ~LatencySimulator() { - clear(); - } - - // lostrate: 往返一周丢包率的百分比,默认 10% - // rttmin:rtt最小值,默认 60 - // rttmax:rtt最大值,默认 125 - LatencySimulator(int lostrate = 10, int rttmin = 60, int rttmax = 125, int nmax = 1000): - r12(100), r21(100) { - current = iclock(); - this->lostrate = lostrate / 2; // 上面数据是往返丢包率,单程除以2 - this->rttmin = rttmin / 2; - this->rttmax = rttmax / 2; - this->nmax = nmax; - } - - // 清除数据 - void clear() { - DelayTunnel::iterator it; - for (it = p12.begin(); it != p12.end(); it++) { - delete *it; - } - for (it = p21.begin(); it != p21.end(); it++) { - delete *it; - } - p12.clear(); - p21.clear(); - } - - // 发送数据 - // peer - 端点0/1,从0发送,从1接收;从1发送从0接收 - void send(int peer, const void *data, int size) { - if (peer == 0) { - if (r12.random() < lostrate) return; - if ((int)p12.size() >= nmax) return; - } else { - if (r21.random() < lostrate) return; - if ((int)p21.size() >= nmax) return; - } - DelayPacket *pkt = new DelayPacket(size, data); - current = iclock(); - IUINT32 delay = rttmin; - if (rttmax > rttmin) delay += rand() % (rttmax - rttmin); - pkt->setts(current + delay); - if (peer == 0) { - p12.push_back(pkt); - } else { - p21.push_back(pkt); - } - } - - // 接收数据 - int recv(int peer, void *data, int maxsize) { - DelayTunnel::iterator it; - if (peer == 0) { - it = p21.begin(); - if (p21.size() == 0) return -1; - } else { - it = p12.begin(); - if (p12.size() == 0) return -1; - } - DelayPacket *pkt = *it; - current = iclock(); - if (current < pkt->ts()) return -2; - if (maxsize < pkt->size()) return -3; - if (peer == 0) { - p21.erase(it); - } else { - p12.erase(it); - } - maxsize = pkt->size(); - memcpy(data, pkt->ptr(), maxsize); - delete pkt; - return maxsize; - } - -protected: - IUINT32 current; - int lostrate; - int rttmin; - int rttmax; - int nmax; - typedef std::list DelayTunnel; - DelayTunnel p12; - DelayTunnel p21; - Random r12; - Random r21; -}; - -#endif - -#endif - - From 76c60fc3245a5d9fc070eaca5bb10cbcb812afdb Mon Sep 17 00:00:00 2001 From: chenze <598799959@qq.com> Date: Mon, 17 Oct 2016 15:43:29 +0800 Subject: [PATCH 2/7] change 3rd/kcp to submodule --- .gitmodules | 3 +++ 3rd/kcp | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 3rd/kcp diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..5294912 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "3rd/kcp"] + path = 3rd/kcp + url = https://github.com/skywind3000/kcp diff --git a/3rd/kcp b/3rd/kcp new file mode 160000 index 0000000..3befca7 --- /dev/null +++ b/3rd/kcp @@ -0,0 +1 @@ +Subproject commit 3befca7f98f0e60f6ccbf34cc52a387d76cda822 From ec33b4ec15ca834f77e63e44de6f9eeebe669e59 Mon Sep 17 00:00:00 2001 From: chenze <598799959@qq.com> Date: Mon, 17 Oct 2016 15:54:32 +0800 Subject: [PATCH 3/7] add some interface in lkcp.c --- src/lkcp.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/src/lkcp.c b/src/lkcp.c index 844f5de..834c32f 100644 --- a/src/lkcp.c +++ b/src/lkcp.c @@ -1,17 +1,17 @@ /** * * Copyright (C) 2015 by David Lin - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -130,7 +130,7 @@ static int lkcp_send(lua_State* L){ size_t size; const char *data = luaL_checklstring(L, 2, &size); int32_t hr = ikcp_send(kcp, data, size); - + lua_pushinteger(L, hr); return 1; } @@ -170,7 +170,7 @@ static int lkcp_input(lua_State* L){ size_t size; const char *data = luaL_checklstring(L, 2, &size); int32_t hr = ikcp_input(kcp, data, size); - + lua_pushinteger(L, hr); return 1; } @@ -215,6 +215,46 @@ static int lkcp_nodelay(lua_State* L){ return 1; } +//@author ChenZe +static int lkcp_setmtu(lua_State* L){ + ikcpcb* kcp = check_kcp(L, 1); + if (kcp == NULL) { + lua_pushnil(L); + lua_pushstring(L, "error: kcp not args"); + return 2; + } + int32_t mtu = luaL_checkinteger(L, 2); + ikcp_setmtu(kcp, mtu); + return 0; +} + +//@author ChenZe +static int lkcp_setstream(lua_State* L){ + ikcpcb* kcp = check_kcp(L, 1); + if (kcp == NULL) { + lua_pushnil(L); + lua_pushstring(L, "error: kcp not args"); + return 2; + } + int32_t stream = luaL_checkinteger(L, 2); + kcp->stream=stream; + return 0; +} + +//@author ChenZe +static int lkcp_setminrto(lua_State* L){ + ikcpcb* kcp = check_kcp(L, 1); + if (kcp == NULL) { + lua_pushnil(L); + lua_pushstring(L, "error: kcp not args"); + return 2; + } + int32_t minrto = luaL_checkinteger(L, 2); + kcp->rx_minrto=minrto; + return 0; +} + + static const struct luaL_Reg lkcp_methods [] = { { "lkcp_recv" , lkcp_recv }, @@ -225,6 +265,9 @@ static const struct luaL_Reg lkcp_methods [] = { { "lkcp_flush" , lkcp_flush }, { "lkcp_wndsize" , lkcp_wndsize }, { "lkcp_nodelay" , lkcp_nodelay }, + { "lkcp_setmtu" , lkcp_setmtu }, + { "lkcp_setstream" , lkcp_setstream }, + { "lkcp_setminrto" , lkcp_setminrto }, {NULL, NULL}, }; From bfe74dacde1e70060e4f1a4c90a9a5b0a623e02f Mon Sep 17 00:00:00 2001 From: sundream Date: Wed, 17 Oct 2018 11:45:05 +0800 Subject: [PATCH 4/7] add lua#api:lkcp_getconv/lckp_setmtu/lkcp_peeksize/lkcp_waitsnd --- src/lkcp.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/lkcp.c b/src/lkcp.c index 844f5de..8c196eb 100644 --- a/src/lkcp.c +++ b/src/lkcp.c @@ -88,7 +88,6 @@ static int lkcp_create(lua_State* L){ lua_pushstring(L, "error: fail to create kcp"); return 2; } - kcp->output = kcp_output_callback; *(ikcpcb**)lua_newuserdata(L, sizeof(void*)) = kcp; @@ -215,6 +214,51 @@ static int lkcp_nodelay(lua_State* L){ return 1; } +static int lkcp_peeksize(lua_State* L) { + ikcpcb* kcp = check_kcp(L, 1); + if (kcp == NULL) { + lua_pushnil(L); + lua_pushstring(L, "error: kcp not args"); + return 2; + } + lua_pushinteger(L,ikcp_peeksize(kcp)); + return 1; +} + +static int lkcp_setmtu(lua_State* L) { + ikcpcb* kcp = check_kcp(L, 1); + if (kcp == NULL) { + lua_pushnil(L); + lua_pushstring(L, "error: kcp not args"); + return 2; + } + int32_t mtu = luaL_checkinteger(L,2); + int32_t ret = ikcp_setmtu(kcp,mtu); + lua_pushinteger(L,ret); + return 1; +} + +static int lkcp_waitsnd(lua_State* L) { + ikcpcb* kcp = check_kcp(L, 1); + if (kcp == NULL) { + lua_pushnil(L); + lua_pushstring(L, "error: kcp not args"); + return 2; + } + lua_pushinteger(L,ikcp_waitsnd(kcp)); + return 1; +} + +static int lkcp_getconv(lua_State* L) { + if (lua_isnoneornil(L,1)) { + return 0; + } + size_t size; + const char *buffer = luaL_checklstring(L, 1, &size); + lua_pushinteger(L,ikcp_getconv(buffer)); + return 1; +} + static const struct luaL_Reg lkcp_methods [] = { { "lkcp_recv" , lkcp_recv }, @@ -225,11 +269,15 @@ static const struct luaL_Reg lkcp_methods [] = { { "lkcp_flush" , lkcp_flush }, { "lkcp_wndsize" , lkcp_wndsize }, { "lkcp_nodelay" , lkcp_nodelay }, + { "lkcp_peeksize",lkcp_peeksize }, + { "lkcp_setmtu",lkcp_setmtu }, + { "lkcp_waitsnd",lkcp_waitsnd }, {NULL, NULL}, }; static const struct luaL_Reg l_methods[] = { { "lkcp_create" , lkcp_create }, + { "lkcp_getconv",lkcp_getconv }, {NULL, NULL}, }; From c0af141ee33e4d575aab5c98e81492e3b1fa248b Mon Sep 17 00:00:00 2001 From: Dirk Chang Date: Tue, 30 Oct 2018 16:40:25 +0800 Subject: [PATCH 5/7] check callback --- src/lkcp.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/lkcp.c b/src/lkcp.c index abd5a5e..f57e529 100644 --- a/src/lkcp.c +++ b/src/lkcp.c @@ -44,11 +44,23 @@ struct Callback { lua_State* L; }; +static void check_kcp_output_callback(lua_State* L, struct Callback* c, int index) { + luaL_checktype(L, index, LUA_TFUNCTION); + luaL_unref(L, LUA_REGISTRYINDEX, c -> handle); + lua_pushvalue(L, index); + c -> handle = luaL_ref(L, LUA_REGISTRYINDEX); +} + static int kcp_output_callback(const char *buf, int len, ikcpcb *kcp, void *arg) { struct Callback* c = (struct Callback*)arg; lua_State* L = c -> L; uint64_t handle = c -> handle; + if (handle == LUA_NOREF) { + lua_pop(L, 1); + return 0; + } + lua_rawgeti(L, LUA_REGISTRYINDEX, handle); lua_pushlstring(L, buf, len); lua_call(L, 1, 0); @@ -65,6 +77,7 @@ static int kcp_gc(lua_State* L) { struct Callback* c = (struct Callback*)kcp -> user; uint64_t handle = c -> handle; luaL_unref(L, LUA_REGISTRYINDEX, handle); + lua_pop(L, 1); free(c); kcp->user = NULL; } @@ -79,8 +92,9 @@ static int lkcp_create(lua_State* L){ struct Callback* c = malloc(sizeof(struct Callback)); memset(c, 0, sizeof(struct Callback)); - c -> handle = handle; c -> L = L; + c -> handle = LUA_NOREF; + check_kcp_output_callback(L, c, 2); ikcpcb* kcp = ikcp_create(conv, (void*)c); if (kcp == NULL) { From be28331c069e1369e91313b202b47b6d84b1c04d Mon Sep 17 00:00:00 2001 From: Dirk Chang Date: Tue, 30 Oct 2018 17:02:06 +0800 Subject: [PATCH 6/7] remove lua source code and improve Makefile --- 3rd/kcp | 2 +- 3rd/lua/Makefile | 114 - 3rd/lua/README | 6 - 3rd/lua/doc/contents.html | 619 -- 3rd/lua/doc/logo.gif | Bin 4232 -> 0 bytes 3rd/lua/doc/lua.1 | 111 - 3rd/lua/doc/lua.css | 105 - 3rd/lua/doc/luac.1 | 118 - 3rd/lua/doc/manual.css | 27 - 3rd/lua/doc/manual.html | 10789 -------------------------- 3rd/lua/doc/osi-certified-72x60.png | Bin 3774 -> 0 bytes 3rd/lua/doc/readme.html | 371 - 3rd/lua/src/Makefile | 197 - 3rd/lua/src/lapi.c | 1270 --- 3rd/lua/src/lapi.h | 24 - 3rd/lua/src/lauxlib.c | 972 --- 3rd/lua/src/lauxlib.h | 256 - 3rd/lua/src/lbaselib.c | 520 -- 3rd/lua/src/lbitlib.c | 230 - 3rd/lua/src/lcode.c | 954 --- 3rd/lua/src/lcode.h | 87 - 3rd/lua/src/lcorolib.c | 168 - 3rd/lua/src/lctype.c | 55 - 3rd/lua/src/lctype.h | 95 - 3rd/lua/src/ldblib.c | 437 -- 3rd/lua/src/ldebug.c | 643 -- 3rd/lua/src/ldebug.h | 40 - 3rd/lua/src/ldo.c | 717 -- 3rd/lua/src/ldo.h | 46 - 3rd/lua/src/ldump.c | 214 - 3rd/lua/src/lfunc.c | 151 - 3rd/lua/src/lfunc.h | 54 - 3rd/lua/src/lgc.c | 1159 --- 3rd/lua/src/lgc.h | 138 - 3rd/lua/src/linit.c | 68 - 3rd/lua/src/liolib.c | 757 -- 3rd/lua/src/llex.c | 602 -- 3rd/lua/src/llex.h | 86 - 3rd/lua/src/llimits.h | 242 - 3rd/lua/src/lmathlib.c | 404 - 3rd/lua/src/lmem.c | 99 - 3rd/lua/src/lmem.h | 69 - 3rd/lua/src/loadlib.c | 786 -- 3rd/lua/src/lobject.c | 470 -- 3rd/lua/src/lobject.h | 540 -- 3rd/lua/src/lopcodes.c | 124 - 3rd/lua/src/lopcodes.h | 295 - 3rd/lua/src/loslib.c | 356 - 3rd/lua/src/lparser.c | 1647 ---- 3rd/lua/src/lparser.h | 120 - 3rd/lua/src/lprefix.h | 45 - 3rd/lua/src/lstate.c | 346 - 3rd/lua/src/lstate.h | 223 - 3rd/lua/src/lstring.c | 182 - 3rd/lua/src/lstring.h | 46 - 3rd/lua/src/lstrlib.c | 1430 ---- 3rd/lua/src/ltable.c | 650 -- 3rd/lua/src/ltable.h | 53 - 3rd/lua/src/ltablib.c | 357 - 3rd/lua/src/ltm.c | 143 - 3rd/lua/src/ltm.h | 75 - 3rd/lua/src/lua | Bin 913268 -> 0 bytes 3rd/lua/src/lua.c | 611 -- 3rd/lua/src/lua.h | 485 -- 3rd/lua/src/lua.hpp | 9 - 3rd/lua/src/luac | Bin 651478 -> 0 bytes 3rd/lua/src/luac.c | 449 -- 3rd/lua/src/luaconf.h | 735 -- 3rd/lua/src/lualib.h | 58 - 3rd/lua/src/lundump.c | 277 - 3rd/lua/src/lundump.h | 33 - 3rd/lua/src/lutf8lib.c | 255 - 3rd/lua/src/lvm.c | 1182 --- 3rd/lua/src/lvm.h | 58 - 3rd/lua/src/lzio.c | 78 - 3rd/lua/src/lzio.h | 67 - Makefile | 39 +- src/lkcp.c | 1 - 78 files changed, 10 insertions(+), 35231 deletions(-) delete mode 100644 3rd/lua/Makefile delete mode 100644 3rd/lua/README delete mode 100644 3rd/lua/doc/contents.html delete mode 100644 3rd/lua/doc/logo.gif delete mode 100644 3rd/lua/doc/lua.1 delete mode 100644 3rd/lua/doc/lua.css delete mode 100644 3rd/lua/doc/luac.1 delete mode 100644 3rd/lua/doc/manual.css delete mode 100644 3rd/lua/doc/manual.html delete mode 100644 3rd/lua/doc/osi-certified-72x60.png delete mode 100644 3rd/lua/doc/readme.html delete mode 100644 3rd/lua/src/Makefile delete mode 100644 3rd/lua/src/lapi.c delete mode 100644 3rd/lua/src/lapi.h delete mode 100644 3rd/lua/src/lauxlib.c delete mode 100644 3rd/lua/src/lauxlib.h delete mode 100644 3rd/lua/src/lbaselib.c delete mode 100644 3rd/lua/src/lbitlib.c delete mode 100644 3rd/lua/src/lcode.c delete mode 100644 3rd/lua/src/lcode.h delete mode 100644 3rd/lua/src/lcorolib.c delete mode 100644 3rd/lua/src/lctype.c delete mode 100644 3rd/lua/src/lctype.h delete mode 100644 3rd/lua/src/ldblib.c delete mode 100644 3rd/lua/src/ldebug.c delete mode 100644 3rd/lua/src/ldebug.h delete mode 100644 3rd/lua/src/ldo.c delete mode 100644 3rd/lua/src/ldo.h delete mode 100644 3rd/lua/src/ldump.c delete mode 100644 3rd/lua/src/lfunc.c delete mode 100644 3rd/lua/src/lfunc.h delete mode 100644 3rd/lua/src/lgc.c delete mode 100644 3rd/lua/src/lgc.h delete mode 100644 3rd/lua/src/linit.c delete mode 100644 3rd/lua/src/liolib.c delete mode 100644 3rd/lua/src/llex.c delete mode 100644 3rd/lua/src/llex.h delete mode 100644 3rd/lua/src/llimits.h delete mode 100644 3rd/lua/src/lmathlib.c delete mode 100644 3rd/lua/src/lmem.c delete mode 100644 3rd/lua/src/lmem.h delete mode 100644 3rd/lua/src/loadlib.c delete mode 100644 3rd/lua/src/lobject.c delete mode 100644 3rd/lua/src/lobject.h delete mode 100644 3rd/lua/src/lopcodes.c delete mode 100644 3rd/lua/src/lopcodes.h delete mode 100644 3rd/lua/src/loslib.c delete mode 100644 3rd/lua/src/lparser.c delete mode 100644 3rd/lua/src/lparser.h delete mode 100644 3rd/lua/src/lprefix.h delete mode 100644 3rd/lua/src/lstate.c delete mode 100644 3rd/lua/src/lstate.h delete mode 100644 3rd/lua/src/lstring.c delete mode 100644 3rd/lua/src/lstring.h delete mode 100644 3rd/lua/src/lstrlib.c delete mode 100644 3rd/lua/src/ltable.c delete mode 100644 3rd/lua/src/ltable.h delete mode 100644 3rd/lua/src/ltablib.c delete mode 100644 3rd/lua/src/ltm.c delete mode 100644 3rd/lua/src/ltm.h delete mode 100755 3rd/lua/src/lua delete mode 100644 3rd/lua/src/lua.c delete mode 100644 3rd/lua/src/lua.h delete mode 100644 3rd/lua/src/lua.hpp delete mode 100755 3rd/lua/src/luac delete mode 100644 3rd/lua/src/luac.c delete mode 100644 3rd/lua/src/luaconf.h delete mode 100644 3rd/lua/src/lualib.h delete mode 100644 3rd/lua/src/lundump.c delete mode 100644 3rd/lua/src/lundump.h delete mode 100644 3rd/lua/src/lutf8lib.c delete mode 100644 3rd/lua/src/lvm.c delete mode 100644 3rd/lua/src/lvm.h delete mode 100644 3rd/lua/src/lzio.c delete mode 100644 3rd/lua/src/lzio.h diff --git a/3rd/kcp b/3rd/kcp index 3befca7..b8100f9 160000 --- a/3rd/kcp +++ b/3rd/kcp @@ -1 +1 @@ -Subproject commit 3befca7f98f0e60f6ccbf34cc52a387d76cda822 +Subproject commit b8100f9de986a94d5eef8ec90d1d039f09538b87 diff --git a/3rd/lua/Makefile b/3rd/lua/Makefile deleted file mode 100644 index 7fa91c8..0000000 --- a/3rd/lua/Makefile +++ /dev/null @@ -1,114 +0,0 @@ -# Makefile for installing Lua -# See doc/readme.html for installation and customization instructions. - -# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= - -# Your platform. See PLATS for possible values. -PLAT= none - -# Where to install. The installation starts in the src and doc directories, -# so take care if INSTALL_TOP is not an absolute path. See the local target. -# You may want to make INSTALL_LMOD and INSTALL_CMOD consistent with -# LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h. -INSTALL_TOP= /usr/local -INSTALL_BIN= $(INSTALL_TOP)/bin -INSTALL_INC= $(INSTALL_TOP)/include -INSTALL_LIB= $(INSTALL_TOP)/lib -INSTALL_MAN= $(INSTALL_TOP)/man/man1 -INSTALL_LMOD= $(INSTALL_TOP)/share/lua/$V -INSTALL_CMOD= $(INSTALL_TOP)/lib/lua/$V - -# How to install. If your install program does not support "-p", then -# you may have to run ranlib on the installed liblua.a. -INSTALL= install -p -INSTALL_EXEC= $(INSTALL) -m 0755 -INSTALL_DATA= $(INSTALL) -m 0644 -# -# If you don't have "install" you can use "cp" instead. -# INSTALL= cp -p -# INSTALL_EXEC= $(INSTALL) -# INSTALL_DATA= $(INSTALL) - -# Other utilities. -MKDIR= mkdir -p -RM= rm -f - -# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE ======= - -# Convenience platforms targets. -PLATS= aix bsd c89 freebsd generic linux macosx mingw posix solaris - -# What to install. -TO_BIN= lua luac -TO_INC= lua.h luaconf.h lualib.h lauxlib.h lua.hpp -TO_LIB= liblua.a -TO_MAN= lua.1 luac.1 - -# Lua version and release. -V= 5.3 -R= $V.0 - -# Targets start here. -all: $(PLAT) - -$(PLATS) clean: - cd src && $(MAKE) $@ - -test: dummy - src/lua -v - -install: dummy - cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_LMOD) $(INSTALL_CMOD) - cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN) - cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC) - cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB) - cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN) - -uninstall: - cd src && cd $(INSTALL_BIN) && $(RM) $(TO_BIN) - cd src && cd $(INSTALL_INC) && $(RM) $(TO_INC) - cd src && cd $(INSTALL_LIB) && $(RM) $(TO_LIB) - cd doc && cd $(INSTALL_MAN) && $(RM) $(TO_MAN) - -local: - $(MAKE) install INSTALL_TOP=../install - -none: - @echo "Please do 'make PLATFORM' where PLATFORM is one of these:" - @echo " $(PLATS)" - @echo "See doc/readme.html for complete instructions." - -# make may get confused with test/ and install/ -dummy: - -# echo config parameters -echo: - @cd src && $(MAKE) -s echo - @echo "PLAT= $(PLAT)" - @echo "V= $V" - @echo "R= $R" - @echo "TO_BIN= $(TO_BIN)" - @echo "TO_INC= $(TO_INC)" - @echo "TO_LIB= $(TO_LIB)" - @echo "TO_MAN= $(TO_MAN)" - @echo "INSTALL_TOP= $(INSTALL_TOP)" - @echo "INSTALL_BIN= $(INSTALL_BIN)" - @echo "INSTALL_INC= $(INSTALL_INC)" - @echo "INSTALL_LIB= $(INSTALL_LIB)" - @echo "INSTALL_MAN= $(INSTALL_MAN)" - @echo "INSTALL_LMOD= $(INSTALL_LMOD)" - @echo "INSTALL_CMOD= $(INSTALL_CMOD)" - @echo "INSTALL_EXEC= $(INSTALL_EXEC)" - @echo "INSTALL_DATA= $(INSTALL_DATA)" - -# echo pkg-config data -pc: - @echo "version=$R" - @echo "prefix=$(INSTALL_TOP)" - @echo "libdir=$(INSTALL_LIB)" - @echo "includedir=$(INSTALL_INC)" - -# list targets that do not create files (but not all makes understand .PHONY) -.PHONY: all $(PLATS) clean test install local none dummy echo pecho lecho - -# (end of Makefile) diff --git a/3rd/lua/README b/3rd/lua/README deleted file mode 100644 index 32fb68e..0000000 --- a/3rd/lua/README +++ /dev/null @@ -1,6 +0,0 @@ - -This is Lua 5.3.0, released on 06 Jan 2015. - -For installation instructions, license details, and -further information about Lua, see doc/readme.html. - diff --git a/3rd/lua/doc/contents.html b/3rd/lua/doc/contents.html deleted file mode 100644 index e59e421..0000000 --- a/3rd/lua/doc/contents.html +++ /dev/null @@ -1,619 +0,0 @@ - - - -Lua 5.3 Reference Manual - contents - - - - - - - -
-

- -Lua 5.3 Reference Manual -

- -

-The reference manual is the official definition of the Lua language. -For a complete introduction to Lua programming, see the book -Programming in Lua. - -

-start -· -contents -· -index -


- -Copyright © 2015 Lua.org, PUC-Rio. -Freely available under the terms of the -Lua license. - - -

Contents

- - -

Index

- - - - - - - -
-

Lua functions

-

-basic
-_G
-_VERSION
- -assert
-collectgarbage
-dofile
-error
-getmetatable
-ipairs
-load
-loadfile
-next
-pairs
-pcall
-print
-rawequal
-rawget
-rawlen
-rawset
-require
-select
-setmetatable
-tonumber
-tostring
-type
-xpcall
- -

-coroutine
-coroutine.create
-coroutine.isyieldable
-coroutine.resume
-coroutine.running
-coroutine.status
-coroutine.wrap
-coroutine.yield
- -

-debug
-debug.debug
-debug.gethook
-debug.getinfo
-debug.getlocal
-debug.getmetatable
-debug.getregistry
-debug.getupvalue
-debug.getuservalue
-debug.sethook
-debug.setlocal
-debug.setmetatable
-debug.setupvalue
-debug.setuservalue
-debug.traceback
-debug.upvalueid
-debug.upvaluejoin
- -

-io
-io.close
-io.flush
-io.input
-io.lines
-io.open
-io.output
-io.popen
-io.read
-io.stderr
-io.stdin
-io.stdout
-io.tmpfile
-io.type
-io.write
- -file:close
-file:flush
-file:lines
-file:read
-file:seek
-file:setvbuf
-file:write
- -

-

 

-

-math
-math.abs
-math.acos
-math.asin
-math.atan
-math.ceil
-math.cos
-math.deg
-math.exp
-math.floor
-math.fmod
-math.huge
-math.log
-math.max
-math.maxinteger
-math.min
-math.mininteger
-math.modf
-math.pi
-math.rad
-math.random
-math.randomseed
-math.sin
-math.sqrt
-math.tan
-math.tointeger
-math.type
-math.ult
- -

-os
-os.clock
-os.date
-os.difftime
-os.execute
-os.exit
-os.getenv
-os.remove
-os.rename
-os.setlocale
-os.time
-os.tmpname
- -

-package
-package.config
-package.cpath
-package.loaded
-package.loadlib
-package.path
-package.preload
-package.searchers
-package.searchpath
- -

-string
-string.byte
-string.char
-string.dump
-string.find
-string.format
-string.gmatch
-string.gsub
-string.len
-string.lower
-string.match
-string.pack
-string.packsize
-string.rep
-string.reverse
-string.sub
-string.unpack
-string.upper
- -

-table
-table.concat
-table.insert
-table.move
-table.pack
-table.remove
-table.sort
-table.unpack
- -

-utf8
-utf8.char
-utf8.charpattern
-utf8.codepoint
-utf8.codes
-utf8.len
-utf8.offset
- -

environment
variables

-LUA_CPATH
-LUA_CPATH_5_3
-LUA_INIT
-LUA_INIT_5_3
-LUA_PATH
-LUA_PATH_5_3
- -
-

C API

-

-lua_Alloc
-lua_CFunction
-lua_Debug
-lua_Hook
-lua_Integer
-lua_KContext
-lua_KFunction
-lua_Number
-lua_Reader
-lua_State
-lua_Unsigned
-lua_Writer
- -

-lua_absindex
-lua_arith
-lua_atpanic
-lua_call
-lua_callk
-lua_checkstack
-lua_close
-lua_compare
-lua_concat
-lua_copy
-lua_createtable
-lua_dump
-lua_error
-lua_gc
-lua_getallocf
-lua_getextraspace
-lua_getfield
-lua_getglobal
-lua_gethook
-lua_gethookcount
-lua_gethookmask
-lua_geti
-lua_getinfo
-lua_getlocal
-lua_getmetatable
-lua_getstack
-lua_gettable
-lua_gettop
-lua_getupvalue
-lua_getuservalue
-lua_insert
-lua_isboolean
-lua_iscfunction
-lua_isfunction
-lua_isinteger
-lua_islightuserdata
-lua_isnil
-lua_isnone
-lua_isnoneornil
-lua_isnumber
-lua_isstring
-lua_istable
-lua_isthread
-lua_isuserdata
-lua_isyieldable
-lua_len
-lua_load
-lua_newstate
-lua_newtable
-lua_newthread
-lua_newuserdata
-lua_next
-lua_numbertointeger
-lua_pcall
-lua_pcallk
-lua_pop
-lua_pushboolean
-lua_pushcclosure
-lua_pushcfunction
-lua_pushfstring
-lua_pushglobaltable
-lua_pushinteger
-lua_pushlightuserdata
-lua_pushliteral
-lua_pushlstring
-lua_pushnil
-lua_pushnumber
-lua_pushstring
-lua_pushthread
-lua_pushvalue
-lua_pushvfstring
-lua_rawequal
-lua_rawget
-lua_rawgeti
-lua_rawgetp
-lua_rawlen
-lua_rawset
-lua_rawseti
-lua_rawsetp
-lua_register
-lua_remove
-lua_replace
-lua_resume
-lua_rotate
-lua_setallocf
-lua_setfield
-lua_setglobal
-lua_sethook
-lua_seti
-lua_setlocal
-lua_setmetatable
-lua_settable
-lua_settop
-lua_setupvalue
-lua_setuservalue
-lua_status
-lua_stringtonumber
-lua_toboolean
-lua_tocfunction
-lua_tointeger
-lua_tointegerx
-lua_tolstring
-lua_tonumber
-lua_tonumberx
-lua_topointer
-lua_tostring
-lua_tothread
-lua_touserdata
-lua_type
-lua_typename
-lua_upvalueid
-lua_upvalueindex
-lua_upvaluejoin
-lua_version
-lua_xmove
-lua_yield
-lua_yieldk
- -

-

auxiliary library

-

-luaL_Buffer
-luaL_Reg
-luaL_Stream
- -

-luaL_addchar
-luaL_addlstring
-luaL_addsize
-luaL_addstring
-luaL_addvalue
-luaL_argcheck
-luaL_argerror
-luaL_buffinit
-luaL_buffinitsize
-luaL_callmeta
-luaL_checkany
-luaL_checkinteger
-luaL_checklstring
-luaL_checknumber
-luaL_checkoption
-luaL_checkstack
-luaL_checkstring
-luaL_checktype
-luaL_checkudata
-luaL_checkversion
-luaL_dofile
-luaL_dostring
-luaL_error
-luaL_execresult
-luaL_fileresult
-luaL_getmetafield
-luaL_getmetatable
-luaL_getsubtable
-luaL_gsub
-luaL_len
-luaL_loadbuffer
-luaL_loadbufferx
-luaL_loadfile
-luaL_loadfilex
-luaL_loadstring
-luaL_newlib
-luaL_newlibtable
-luaL_newmetatable
-luaL_newstate
-luaL_openlibs
-luaL_optinteger
-luaL_optlstring
-luaL_optnumber
-luaL_optstring
-luaL_prepbuffer
-luaL_prepbuffsize
-luaL_pushresult
-luaL_pushresultsize
-luaL_ref
-luaL_requiref
-luaL_setfuncs
-luaL_setmetatable
-luaL_testudata
-luaL_tolstring
-luaL_traceback
-luaL_typename
-luaL_unref
-luaL_where
- -

standard library

-

-luaopen_base
-luaopen_coroutine
-luaopen_debug
-luaopen_io
-luaopen_math
-luaopen_os
-luaopen_package
-luaopen_string
-luaopen_table
-luaopen_utf8
- -

constants

-LUA_ERRERR
-LUA_ERRFILE
-LUA_ERRGCMM
-LUA_ERRMEM
-LUA_ERRRUN
-LUA_ERRSYNTAX
-LUA_HOOKCALL
-LUA_HOOKCOUNT
-LUA_HOOKLINE
-LUA_HOOKRET
-LUA_HOOKTAILCALL
-LUA_MASKCALL
-LUA_MASKCOUNT
-LUA_MASKLINE
-LUA_MASKRET
-LUA_MAXINTEGER
-LUA_MININTEGER
-LUA_MINSTACK
-LUA_MULTRET
-LUA_NOREF
-LUA_OK
-LUA_OPADD
-LUA_OPBAND
-LUA_OPBNOT
-LUA_OPBOR
-LUA_OPBXOR
-LUA_OPDIV
-LUA_OPEQ
-LUA_OPIDIV
-LUA_OPLE
-LUA_OPLT
-LUA_OPMOD
-LUA_OPMUL
-LUA_OPPOW
-LUA_OPSHL
-LUA_OPSHR
-LUA_OPSUB
-LUA_OPUNM
-LUA_REFNIL
-LUA_REGISTRYINDEX
-LUA_RIDX_GLOBALS
-LUA_RIDX_MAINTHREAD
-LUA_TBOOLEAN
-LUA_TFUNCTION
-LUA_TLIGHTUSERDATA
-LUA_TNIL
-LUA_TNONE
-LUA_TNUMBER
-LUA_TSTRING
-LUA_TTABLE
-LUA_TTHREAD
-LUA_TUSERDATA
-LUA_USE_APICHECK
-LUA_YIELD
-LUAL_BUFFERSIZE
- -
- -
- -Last update: -Tue Dec 9 21:26:07 BRST 2014 - - - - - diff --git a/3rd/lua/doc/logo.gif b/3rd/lua/doc/logo.gif deleted file mode 100644 index 2f5e4ac2e742fbb7675e739879211553758aea9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4232 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 PWz_J}_#7St0k8iB@FZjZ diff --git a/3rd/lua/doc/lua.1 b/3rd/lua/doc/lua.1 deleted file mode 100644 index 411531b..0000000 --- a/3rd/lua/doc/lua.1 +++ /dev/null @@ -1,111 +0,0 @@ -.TH LUA 1 "$Date: 2014/12/10 15:55:45 $" -.SH NAME -lua \- Lua interpreter -.SH SYNOPSIS -.B lua -[ -.I options -] -[ -.I script -[ -.I args -] -] -.SH DESCRIPTION -.B lua -is the standalone Lua interpreter. -It loads and executes Lua programs, -either in textual source form or -in precompiled binary form. -(Precompiled binaries are output by -.BR luac , -the Lua compiler.) -.B lua -can be used as a batch interpreter and also interactively. -.LP -The given -.I options -are handled in order and then -the Lua program in file -.I script -is loaded and executed. -The given -.I args -are available to -.I script -as strings in a global table named -.BR arg . -If no options or arguments are given, -then -.B "\-v \-i" -is assumed when the standard input is a terminal; -otherwise, -.B "\-" -is assumed. -.LP -In interactive mode, -.B lua -prompts the user, -reads lines from the standard input, -and executes them as they are read. -If the line contains an expression or list of expressions, -then the line is evaluated and the results are printed. -If a line does not contain a complete statement, -then a secondary prompt is displayed and -lines are read until a complete statement is formed or -a syntax error is found. -.LP -At the very start, -before even handling the command line, -.B lua -checks the contents of the environment variables -.B LUA_INIT_5_3 -or -.BR LUA_INIT , -in that order. -If the contents is of the form -.RI '@ filename ', -then -.I filename -is executed. -Otherwise, the string is assumed to be a Lua statement and is executed. -.SH OPTIONS -.TP -.BI \-e " stat" -execute statement -.IR stat . -.TP -.B \-i -enter interactive mode after executing -.IR script . -.TP -.BI \-l " name" -execute the equivalent of -.IB name =require(' name ') -before executing -.IR script . -.TP -.B \-v -show version information. -.TP -.B \-E -ignore environment variables. -.TP -.B \-\- -stop handling options. -.TP -.B \- -stop handling options and execute the standard input as a file. -.SH "SEE ALSO" -.BR luac (1) -.br -The documentation at lua.org, -especially section 7 of the reference manual. -.SH DIAGNOSTICS -Error messages should be self explanatory. -.SH AUTHORS -R. Ierusalimschy, -L. H. de Figueiredo, -W. Celes -.\" EOF diff --git a/3rd/lua/doc/lua.css b/3rd/lua/doc/lua.css deleted file mode 100644 index 3199a2b..0000000 --- a/3rd/lua/doc/lua.css +++ /dev/null @@ -1,105 +0,0 @@ -html { - background-color: #F8F8F8 ; -} - -body { - border: solid #a0a0a0 1px ; - border-radius: 20px ; - padding: 26px ; - margin: 16px ; - color: #000000 ; - background-color: #FFFFFF ; - font-family: Helvetica, Arial, sans-serif ; - text-align: justify ; -} - -h1, h2, h3, h4 { - font-family: Verdana, Geneva, sans-serif ; - font-weight: normal ; - font-style: normal ; -} - -h2 { - padding-top: 0.4em ; - padding-bottom: 0.4em ; - padding-left: 0.8em ; - padding-right: 0.8em ; - background-color: #D0D0FF ; - border-radius: 8px ; - border: solid #a0a0a0 1px ; -} - -h3 { - padding-left: 0.5em ; - border-left: solid #D0D0FF 1em ; -} - -table h3 { - padding-left: 0px ; - border-left: none ; -} - -a:link { - color: #000080 ; - background-color: inherit ; - text-decoration: none ; -} - -a:visited { - background-color: inherit ; - text-decoration: none ; -} - -a:link:hover, a:visited:hover { - color: #000080 ; - background-color: #D0D0FF ; - border-radius: 4px; -} - -a:link:active, a:visited:active { - color: #FF0000 ; -} - -h1 a img { - vertical-align: text-bottom ; -} - -hr { - border: 0 ; - height: 1px ; - color: #a0a0a0 ; - background-color: #a0a0a0 ; - display: none ; -} - -table hr { - display: block ; -} - -:target { - background-color: #F8F8F8 ; - padding: 8px ; - border: solid #a0a0a0 2px ; - border-radius: 8px ; -} - -.footer { - color: gray ; - font-size: x-small ; -} - -input[type=text] { - border: solid #a0a0a0 2px ; - border-radius: 2em ; - background-image: url('images/search.png') ; - background-repeat: no-repeat ; - background-position: 4px center ; - padding-left: 20px ; - height: 2em ; -} - -pre.session { - background-color: #F8F8F8 ; - padding: 1em ; - border-radius: 8px ; -} diff --git a/3rd/lua/doc/luac.1 b/3rd/lua/doc/luac.1 deleted file mode 100644 index 33a4ed0..0000000 --- a/3rd/lua/doc/luac.1 +++ /dev/null @@ -1,118 +0,0 @@ -.\" $Id: luac.man,v 1.29 2011/11/16 13:53:40 lhf Exp $ -.TH LUAC 1 "$Date: 2011/11/16 13:53:40 $" -.SH NAME -luac \- Lua compiler -.SH SYNOPSIS -.B luac -[ -.I options -] [ -.I filenames -] -.SH DESCRIPTION -.B luac -is the Lua compiler. -It translates programs written in the Lua programming language -into binary files containing precompiled chunks -that can be later loaded and executed. -.LP -The main advantages of precompiling chunks are: -faster loading, -protecting source code from accidental user changes, -and -off-line syntax checking. -Precompiling does not imply faster execution -because in Lua chunks are always compiled into bytecodes before being executed. -.B luac -simply allows those bytecodes to be saved in a file for later execution. -Precompiled chunks are not necessarily smaller than the corresponding source. -The main goal in precompiling is faster loading. -.LP -In the command line, -you can mix -text files containing Lua source and -binary files containing precompiled chunks. -.B luac -produces a single output file containing the combined bytecodes -for all files given. -Executing the combined file is equivalent to executing the given files. -By default, -the output file is named -.BR luac.out , -but you can change this with the -.B \-o -option. -.LP -Precompiled chunks are -.I not -portable across different architectures. -Moreover, -the internal format of precompiled chunks -is likely to change when a new version of Lua is released. -Make sure you save the source files of all Lua programs that you precompile. -.LP -.SH OPTIONS -.TP -.B \-l -produce a listing of the compiled bytecode for Lua's virtual machine. -Listing bytecodes is useful to learn about Lua's virtual machine. -If no files are given, then -.B luac -loads -.B luac.out -and lists its contents. -Use -.B \-l \-l -for a full listing. -.TP -.BI \-o " file" -output to -.IR file , -instead of the default -.BR luac.out . -(You can use -.B "'\-'" -for standard output, -but not on platforms that open standard output in text mode.) -The output file may be one of the given files because -all files are loaded before the output file is written. -Be careful not to overwrite precious files. -.TP -.B \-p -load files but do not generate any output file. -Used mainly for syntax checking and for testing precompiled chunks: -corrupted files will probably generate errors when loaded. -If no files are given, then -.B luac -loads -.B luac.out -and tests its contents. -No messages are displayed if the file loads without errors. -.TP -.B \-s -strip debug information before writing the output file. -This saves some space in very large chunks, -but if errors occur when running a stripped chunk, -then the error messages may not contain the full information they usually do. -In particular, -line numbers and names of local variables are lost. -.TP -.B \-v -show version information. -.TP -.B \-\- -stop handling options. -.TP -.B \- -stop handling options and process standard input. -.SH "SEE ALSO" -.BR lua (1) -.br -The documentation at lua.org. -.SH DIAGNOSTICS -Error messages should be self explanatory. -.SH AUTHORS -R. Ierusalimschy, -L. H. de Figueiredo, -W. Celes -.\" EOF diff --git a/3rd/lua/doc/manual.css b/3rd/lua/doc/manual.css deleted file mode 100644 index ca613cd..0000000 --- a/3rd/lua/doc/manual.css +++ /dev/null @@ -1,27 +0,0 @@ -h3 code { - font-family: inherit ; - font-size: inherit ; -} - -pre, code { - font-size: 12pt ; -} - -span.apii { - float: right ; - font-family: inherit ; - font-style: normal ; - font-size: small ; - color: gray ; -} - -p+h1, ul+h1 { - font-style: normal ; - padding-top: 0.4em ; - padding-bottom: 0.4em ; - padding-left: 16px ; - margin-left: -16px ; - background-color: #D0D0FF ; - border-radius: 8px ; - border: solid #000080 1px ; -} diff --git a/3rd/lua/doc/manual.html b/3rd/lua/doc/manual.html deleted file mode 100644 index 5ed8f06..0000000 --- a/3rd/lua/doc/manual.html +++ /dev/null @@ -1,10789 +0,0 @@ - - - - -Lua 5.3 Reference Manual - - - - - - - -
-

- -Lua 5.3 Reference Manual -

- -by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes -

- -Copyright © 2015 Lua.org, PUC-Rio. -Freely available under the terms of the -Lua license. - -


-

- -contents -· -index - - -

- - - - - - -

1 – Introduction

- -

-Lua is an extension programming language designed to support -general procedural programming with data description -facilities. -Lua also offers good support for object-oriented programming, -functional programming, and data-driven programming. -Lua is intended to be used as a powerful, lightweight, -embeddable scripting language for any program that needs one. -Lua is implemented as a library, written in clean C, -the common subset of Standard C and C++. - - -

-As an extension language, Lua has no notion of a "main" program: -it only works embedded in a host client, -called the embedding program or simply the host. -The host program can invoke functions to execute a piece of Lua code, -can write and read Lua variables, -and can register C functions to be called by Lua code. -Through the use of C functions, Lua can be augmented to cope with -a wide range of different domains, -thus creating customized programming languages sharing a syntactical framework. -The Lua distribution includes a sample host program called lua, -which uses the Lua library to offer a complete, standalone Lua interpreter, -for interactive or batch use. - - -

-Lua is free software, -and is provided as usual with no guarantees, -as stated in its license. -The implementation described in this manual is available -at Lua's official web site, www.lua.org. - - -

-Like any other reference manual, -this document is dry in places. -For a discussion of the decisions behind the design of Lua, -see the technical papers available at Lua's web site. -For a detailed introduction to programming in Lua, -see Roberto's book, Programming in Lua. - - - -

2 – Basic Concepts

- -

-This section describes the basic concepts of the language. - - - -

2.1 – Values and Types

- -

-Lua is a dynamically typed language. -This means that -variables do not have types; only values do. -There are no type definitions in the language. -All values carry their own type. - - -

-All values in Lua are first-class values. -This means that all values can be stored in variables, -passed as arguments to other functions, and returned as results. - - -

-There are eight basic types in Lua: -nil, boolean, number, -string, function, userdata, -thread, and table. -Nil is the type of the value nil, -whose main property is to be different from any other value; -it usually represents the absence of a useful value. -Boolean is the type of the values false and true. -Both nil and false make a condition false; -any other value makes it true. -Number represents both -integer numbers and real (floating-point) numbers. -String represents immutable sequences of bytes. - -Lua is 8-bit clean: -strings can contain any 8-bit value, -including embedded zeros ('\0'). -Lua is also encoding-agnostic; -it makes no assumptions about the contents of a string. - - -

-The type number uses two internal representations, -one called integer and the other called float. -Lua has explicit rules about when each representation is used, -but it also converts between them automatically as needed (see §3.4.3). -Therefore, -the programmer may choose to mostly ignore the difference -between integers and floats -or to assume complete control over the representation of each number. -Standard Lua uses 64-bit integers and double-precision (64-bit) floats, -but you can also compile Lua so that it -uses 32-bit integers and/or single-precision (32-bit) floats. -The option with 32 bits for both integers and floats -is particularly attractive -for small machines and embedded systems. -(See macro LUA_32BITS in file luaconf.h.) - - -

-Lua can call (and manipulate) functions written in Lua and -functions written in C (see §3.4.10). -Both are represented by the type function. - - -

-The type userdata is provided to allow arbitrary C data to -be stored in Lua variables. -A userdata value represents a block of raw memory. -There are two kinds of userdata: -full userdata, -which is an object with a block of memory managed by Lua, -and light userdata, -which is simply a C pointer value. -Userdata has no predefined operations in Lua, -except assignment and identity test. -By using metatables, -the programmer can define operations for full userdata values -(see §2.4). -Userdata values cannot be created or modified in Lua, -only through the C API. -This guarantees the integrity of data owned by the host program. - - -

-The type thread represents independent threads of execution -and it is used to implement coroutines (see §2.6). -Lua threads are not related to operating-system threads. -Lua supports coroutines on all systems, -even those that do not support threads natively. - - -

-The type table implements associative arrays, -that is, arrays that can be indexed not only with numbers, -but with any Lua value except nil and NaN. -(Not a Number is a special numeric value used to represent -undefined or unrepresentable results, such as 0/0.) -Tables can be heterogeneous; -that is, they can contain values of all types (except nil). -Any key with value nil is not considered part of the table. -Conversely, any key that is not part of a table has -an associated value nil. - - -

-Tables are the sole data-structuring mechanism in Lua; -they can be used to represent ordinary arrays, sequences, -symbol tables, sets, records, graphs, trees, etc. -To represent records, Lua uses the field name as an index. -The language supports this representation by -providing a.name as syntactic sugar for a["name"]. -There are several convenient ways to create tables in Lua -(see §3.4.9). - - -

-We use the term sequence to denote a table where -the set of all positive numeric keys is equal to {1..n} -for some non-negative integer n, -which is called the length of the sequence (see §3.4.7). - - -

-Like indices, -the values of table fields can be of any type. -In particular, -because functions are first-class values, -table fields can contain functions. -Thus tables can also carry methods (see §3.4.11). - - -

-The indexing of tables follows -the definition of raw equality in the language. -The expressions a[i] and a[j] -denote the same table element -if and only if i and j are raw equal -(that is, equal without metamethods). -In particular, floats with integral values -are equal to their respective integers -(e.g., 1.0 == 1). -To avoid ambiguities, -any float with integral value used as a key -is converted to its respective integer. -For instance, if you write a[2.0] = true, -the actual key inserted into the table will be the -integer 2. -(On the other hand, -2 and "2" are different Lua values and therefore -denote different table entries.) - - -

-Tables, functions, threads, and (full) userdata values are objects: -variables do not actually contain these values, -only references to them. -Assignment, parameter passing, and function returns -always manipulate references to such values; -these operations do not imply any kind of copy. - - -

-The library function type returns a string describing the type -of a given value (see §6.1). - - - - - -

2.2 – Environments and the Global Environment

- -

-As will be discussed in §3.2 and §3.3.3, -any reference to a free name -(that is, a name not bound to any declaration) var -is syntactically translated to _ENV.var. -Moreover, every chunk is compiled in the scope of -an external local variable named _ENV (see §3.3.2), -so _ENV itself is never a free name in a chunk. - - -

-Despite the existence of this external _ENV variable and -the translation of free names, -_ENV is a completely regular name. -In particular, -you can define new variables and parameters with that name. -Each reference to a free name uses the _ENV that is -visible at that point in the program, -following the usual visibility rules of Lua (see §3.5). - - -

-Any table used as the value of _ENV is called an environment. - - -

-Lua keeps a distinguished environment called the global environment. -This value is kept at a special index in the C registry (see §4.5). -In Lua, the global variable _G is initialized with this same value. -(_G is never used internally.) - - -

-When Lua loads a chunk, -the default value for its _ENV upvalue -is the global environment (see load). -Therefore, by default, -free names in Lua code refer to entries in the global environment -(and, therefore, they are also called global variables). -Moreover, all standard libraries are loaded in the global environment -and some functions there operate on that environment. -You can use load (or loadfile) -to load a chunk with a different environment. -(In C, you have to load the chunk and then change the value -of its first upvalue.) - - - - - -

2.3 – Error Handling

- -

-Because Lua is an embedded extension language, -all Lua actions start from C code in the host program -calling a function from the Lua library. -(When you use Lua standalone, -the lua application is the host program.) -Whenever an error occurs during -the compilation or execution of a Lua chunk, -control returns to the host, -which can take appropriate measures -(such as printing an error message). - - -

-Lua code can explicitly generate an error by calling the -error function. -If you need to catch errors in Lua, -you can use pcall or xpcall -to call a given function in protected mode. - - -

-Whenever there is an error, -an error object (also called an error message) -is propagated with information about the error. -Lua itself only generates errors whose error object is a string, -but programs may generate errors with -any value as the error object. -It is up to the Lua program or its host to handle such error objects. - - -

-When you use xpcall or lua_pcall, -you may give a message handler -to be called in case of errors. -This function is called with the original error message -and returns a new error message. -It is called before the error unwinds the stack, -so that it can gather more information about the error, -for instance by inspecting the stack and creating a stack traceback. -This message handler is still protected by the protected call; -so, an error inside the message handler -will call the message handler again. -If this loop goes on for too long, -Lua breaks it and returns an appropriate message. - - - - - -

2.4 – Metatables and Metamethods

- -

-Every value in Lua can have a metatable. -This metatable is an ordinary Lua table -that defines the behavior of the original value -under certain special operations. -You can change several aspects of the behavior -of operations over a value by setting specific fields in its metatable. -For instance, when a non-numeric value is the operand of an addition, -Lua checks for a function in the field "__add" of the value's metatable. -If it finds one, -Lua calls this function to perform the addition. - - -

-The keys in a metatable are derived from the event names; -the corresponding values are called metamethods. -In the previous example, the event is "add" -and the metamethod is the function that performs the addition. - - -

-You can query the metatable of any value -using the getmetatable function. - - -

-You can replace the metatable of tables -using the setmetatable function. -You cannot change the metatable of other types from Lua -(except by using the debug library (§6.10)); -you must use the C API for that. - - -

-Tables and full userdata have individual metatables -(although multiple tables and userdata can share their metatables). -Values of all other types share one single metatable per type; -that is, there is one single metatable for all numbers, -one for all strings, etc. -By default, a value has no metatable, -but the string library sets a metatable for the string type (see §6.4). - - -

-A metatable controls how an object behaves in -arithmetic operations, bitwise operations, -order comparisons, concatenation, length operation, calls, and indexing. -A metatable also can define a function to be called -when a userdata or a table is garbage collected (§2.5). - - -

-A detailed list of events controlled by metatables is given next. -Each operation is identified by its corresponding event name. -The key for each event is a string with its name prefixed by -two underscores, '__'; -for instance, the key for operation "add" is the -string "__add". -Note that queries for metamethods are always raw; -the access to a metamethod does not invoke other metamethods. -You can emulate how Lua queries a metamethod for an object obj -with the following code: - -

-     rawget(getmetatable(obj) or {}, "__" .. event_name)
-
- -

-For the unary operators (negation, length, and bitwise not), -the metamethod is computed and called with a dummy second operand, -equal to the first one. -This extra operand is only to simplify Lua's internals -(by making these operators behave like a binary operation) -and may be removed in future versions. -(For most uses this extra operand is irrelevant.) - - - -

    - -
  • "add": -the + operation. - -If any operand for an addition is not a number -(nor a string coercible to a number), -Lua will try to call a metamethod. -First, Lua will check the first operand (even if it is valid). -If that operand does not define a metamethod for the "__add" event, -then Lua will check the second operand. -If Lua can find a metamethod, -it calls the metamethod with the two operands as arguments, -and the result of the call -(adjusted to one value) -is the result of the operation. -Otherwise, -it raises an error. -
  • - -
  • "sub": -the - operation. - -Behavior similar to the "add" operation. -
  • - -
  • "mul": -the * operation. - -Behavior similar to the "add" operation. -
  • - -
  • "div": -the / operation. - -Behavior similar to the "add" operation. -
  • - -
  • "mod": -the % operation. - -Behavior similar to the "add" operation. -
  • - -
  • "pow": -the ^ (exponentiation) operation. - -Behavior similar to the "add" operation. -
  • - -
  • "unm": -the - (unary minus) operation. - -Behavior similar to the "add" operation. -
  • - -
  • "idiv": -the // (floor division) operation. - -Behavior similar to the "add" operation. -
  • - -
  • "band": -the & (bitwise and) operation. - -Behavior similar to the "add" operation, -except that Lua will try a metamethod -if any operator is neither an integer -nor a value coercible to an integer (see §3.4.3). -
  • - -
  • "bor": -the | (bitwise or) operation. - -Behavior similar to the "band" operation. -
  • - -
  • "bxor": -the ~ (bitwise exclusive or) operation. - -Behavior similar to the "band" operation. -
  • - -
  • "bnot": -the ~ (bitwise unary not) operation. - -Behavior similar to the "band" operation. -
  • - -
  • "shl": -the << (bitwise left shift) operation. - -Behavior similar to the "band" operation. -
  • - -
  • "shr": -the >> (bitwise right shift) operation. - -Behavior similar to the "band" operation. -
  • - -
  • "concat": -the .. (concatenation) operation. - -Behavior similar to the "add" operation, -except that Lua will try a metamethod -if any operator is neither a string nor a number -(which is always coercible to a string). -
  • - -
  • "len": -the # (length) operation. - -If the object is not a string, -Lua will try its metamethod. -If there is a metamethod, -Lua calls it with the object as argument, -and the result of the call -(always adjusted to one value) -is the result of the operation. -If there is no metamethod but the object is a table, -then Lua uses the table length operation (see §3.4.7). -Otherwise, Lua raises an error. -
  • - -
  • "eq": -the == (equal) operation. - -Behavior similar to the "add" operation, -except that Lua will try a metamethod only when the values -being compared are either both tables or both full userdata -and they are not primitively equal. -The result of the call is always converted to a boolean. -
  • - -
  • "lt": -the < (less than) operation. - -Behavior similar to the "add" operation, -except that Lua will try a metamethod only when the values -being compared are neither both numbers nor both strings. -The result of the call is always converted to a boolean. -
  • - -
  • "le": -the <= (less equal) operation. - -Unlike other operations, -The less-equal operation can use two different events. -First, Lua looks for the "__le" metamethod in both operands, -like in the "lt" operation. -If it cannot find such a metamethod, -then it will try the "__lt" event, -assuming that a <= b is equivalent to not (b < a). -As with the other comparison operators, -the result is always a boolean. -
  • - -
  • "index": -The indexing access table[key]. - -This event happens when table is not a table or -when key is not present in table. -The metamethod is looked up in table. - - -

    -Despite the name, -the metamethod for this event can be either a function or a table. -If it is a function, -it is called with table and key as arguments. -If it is a table, -the final result is the result of indexing this table with key. -(This indexing is regular, not raw, -and therefore can trigger another metamethod.) -

  • - -
  • "newindex": -The indexing assignment table[key] = value. - -Like the index event, -this event happens when table is not a table or -when key is not present in table. -The metamethod is looked up in table. - - -

    -Like with indexing, -the metamethod for this event can be either a function or a table. -If it is a function, -it is called with table, key, and value as arguments. -If it is a table, -Lua does an indexing assignment to this table with the same key and value. -(This assignment is regular, not raw, -and therefore can trigger another metamethod.) - - -

    -Whenever there is a "newindex" metamethod, -Lua does not perform the primitive assignment. -(If necessary, -the metamethod itself can call rawset -to do the assignment.) -

  • - -
  • "call": -The call operation func(args). - -This event happens when Lua tries to call a non-function value -(that is, func is not a function). -The metamethod is looked up in func. -If present, -the metamethod is called with func as its first argument, -followed by the arguments of the original call (args). -
  • - -
- - - - -

2.5 – Garbage Collection

- -

-Lua performs automatic memory management. -This means that -you do not have to worry about allocating memory for new objects -or freeing it when the objects are no longer needed. -Lua manages memory automatically by running -a garbage collector to collect all dead objects -(that is, objects that are no longer accessible from Lua). -All memory used by Lua is subject to automatic management: -strings, tables, userdata, functions, threads, internal structures, etc. - - -

-Lua implements an incremental mark-and-sweep collector. -It uses two numbers to control its garbage-collection cycles: -the garbage-collector pause and -the garbage-collector step multiplier. -Both use percentage points as units -(e.g., a value of 100 means an internal value of 1). - - -

-The garbage-collector pause -controls how long the collector waits before starting a new cycle. -Larger values make the collector less aggressive. -Values smaller than 100 mean the collector will not wait to -start a new cycle. -A value of 200 means that the collector waits for the total memory in use -to double before starting a new cycle. - - -

-The garbage-collector step multiplier -controls the relative speed of the collector relative to -memory allocation. -Larger values make the collector more aggressive but also increase -the size of each incremental step. -You should not use values smaller than 100, -because they make the collector too slow and -can result in the collector never finishing a cycle. -The default is 200, -which means that the collector runs at "twice" -the speed of memory allocation. - - -

-If you set the step multiplier to a very large number -(larger than 10% of the maximum number of -bytes that the program may use), -the collector behaves like a stop-the-world collector. -If you then set the pause to 200, -the collector behaves as in old Lua versions, -doing a complete collection every time Lua doubles its -memory usage. - - -

-You can change these numbers by calling lua_gc in C -or collectgarbage in Lua. -You can also use these functions to control -the collector directly (e.g., stop and restart it). - - - -

2.5.1 – Garbage-Collection Metamethods

- -

-You can set garbage-collector metamethods for tables -and, using the C API, -for full userdata (see §2.4). -These metamethods are also called finalizers. -Finalizers allow you to coordinate Lua's garbage collection -with external resource management -(such as closing files, network or database connections, -or freeing your own memory). - - -

-For an object (table or userdata) to be finalized when collected, -you must mark it for finalization. - -You mark an object for finalization when you set its metatable -and the metatable has a field indexed by the string "__gc". -Note that if you set a metatable without a __gc field -and later create that field in the metatable, -the object will not be marked for finalization. -However, after an object has been marked, -you can freely change the __gc field of its metatable. - - -

-When a marked object becomes garbage, -it is not collected immediately by the garbage collector. -Instead, Lua puts it in a list. -After the collection, -Lua goes through that list. -For each object in the list, -it checks the object's __gc metamethod: -If it is a function, -Lua calls it with the object as its single argument; -if the metamethod is not a function, -Lua simply ignores it. - - -

-At the end of each garbage-collection cycle, -the finalizers for objects are called in -the reverse order that the objects were marked for finalization, -among those collected in that cycle; -that is, the first finalizer to be called is the one associated -with the object marked last in the program. -The execution of each finalizer may occur at any point during -the execution of the regular code. - - -

-Because the object being collected must still be used by the finalizer, -that object (and other objects accessible only through it) -must be resurrected by Lua. -Usually, this resurrection is transient, -and the object memory is freed in the next garbage-collection cycle. -However, if the finalizer stores the object in some global place -(e.g., a global variable), -then the resurrection is permanent. -Moreover, if the finalizer marks a finalizing object for finalization again, -its finalizer will be called again in the next cycle where the -object is unreachable. -In any case, -the object memory is freed only in the GC cycle where -the object is unreachable and not marked for finalization. - - -

-When you close a state (see lua_close), -Lua calls the finalizers of all objects marked for finalization, -following the reverse order that they were marked. -If any finalizer marks objects for collection during that phase, -these marks have no effect. - - - - - -

2.5.2 – Weak Tables

- -

-A weak table is a table whose elements are -weak references. -A weak reference is ignored by the garbage collector. -In other words, -if the only references to an object are weak references, -then the garbage collector will collect that object. - - -

-A weak table can have weak keys, weak values, or both. -A table with weak keys allows the collection of its keys, -but prevents the collection of its values. -A table with both weak keys and weak values allows the collection of -both keys and values. -In any case, if either the key or the value is collected, -the whole pair is removed from the table. -The weakness of a table is controlled by the -__mode field of its metatable. -If the __mode field is a string containing the character 'k', -the keys in the table are weak. -If __mode contains 'v', -the values in the table are weak. - - -

-A table with weak keys and strong values -is also called an ephemeron table. -In an ephemeron table, -a value is considered reachable only if its key is reachable. -In particular, -if the only reference to a key comes through its value, -the pair is removed. - - -

-Any change in the weakness of a table may take effect only -at the next collect cycle. -In particular, if you change the weakness to a stronger mode, -Lua may still collect some items from that table -before the change takes effect. - - -

-Only objects that have an explicit construction -are removed from weak tables. -Values, such as numbers and light C functions, -are not subject to garbage collection, -and therefore are not removed from weak tables -(unless their associated values are collected). -Although strings are subject to garbage collection, -they do not have an explicit construction, -and therefore are not removed from weak tables. - - -

-Resurrected objects -(that is, objects being finalized -and objects accessible only through objects being finalized) -have a special behavior in weak tables. -They are removed from weak values before running their finalizers, -but are removed from weak keys only in the next collection -after running their finalizers, when such objects are actually freed. -This behavior allows the finalizer to access properties -associated with the object through weak tables. - - -

-If a weak table is among the resurrected objects in a collection cycle, -it may not be properly cleared until the next cycle. - - - - - - - -

2.6 – Coroutines

- -

-Lua supports coroutines, -also called collaborative multithreading. -A coroutine in Lua represents an independent thread of execution. -Unlike threads in multithread systems, however, -a coroutine only suspends its execution by explicitly calling -a yield function. - - -

-You create a coroutine by calling coroutine.create. -Its sole argument is a function -that is the main function of the coroutine. -The create function only creates a new coroutine and -returns a handle to it (an object of type thread); -it does not start the coroutine. - - -

-You execute a coroutine by calling coroutine.resume. -When you first call coroutine.resume, -passing as its first argument -a thread returned by coroutine.create, -the coroutine starts its execution, -at the first line of its main function. -Extra arguments passed to coroutine.resume are passed -as arguments to the coroutine's main function. -After the coroutine starts running, -it runs until it terminates or yields. - - -

-A coroutine can terminate its execution in two ways: -normally, when its main function returns -(explicitly or implicitly, after the last instruction); -and abnormally, if there is an unprotected error. -In case of normal termination, -coroutine.resume returns true, -plus any values returned by the coroutine main function. -In case of errors, coroutine.resume returns false -plus an error message. - - -

-A coroutine yields by calling coroutine.yield. -When a coroutine yields, -the corresponding coroutine.resume returns immediately, -even if the yield happens inside nested function calls -(that is, not in the main function, -but in a function directly or indirectly called by the main function). -In the case of a yield, coroutine.resume also returns true, -plus any values passed to coroutine.yield. -The next time you resume the same coroutine, -it continues its execution from the point where it yielded, -with the call to coroutine.yield returning any extra -arguments passed to coroutine.resume. - - -

-Like coroutine.create, -the coroutine.wrap function also creates a coroutine, -but instead of returning the coroutine itself, -it returns a function that, when called, resumes the coroutine. -Any arguments passed to this function -go as extra arguments to coroutine.resume. -coroutine.wrap returns all the values returned by coroutine.resume, -except the first one (the boolean error code). -Unlike coroutine.resume, -coroutine.wrap does not catch errors; -any error is propagated to the caller. - - -

-As an example of how coroutines work, -consider the following code: - -

-     function foo (a)
-       print("foo", a)
-       return coroutine.yield(2*a)
-     end
-     
-     co = coroutine.create(function (a,b)
-           print("co-body", a, b)
-           local r = foo(a+1)
-           print("co-body", r)
-           local r, s = coroutine.yield(a+b, a-b)
-           print("co-body", r, s)
-           return b, "end"
-     end)
-     
-     print("main", coroutine.resume(co, 1, 10))
-     print("main", coroutine.resume(co, "r"))
-     print("main", coroutine.resume(co, "x", "y"))
-     print("main", coroutine.resume(co, "x", "y"))
-

-When you run it, it produces the following output: - -

-     co-body 1       10
-     foo     2
-     main    true    4
-     co-body r
-     main    true    11      -9
-     co-body x       y
-     main    true    10      end
-     main    false   cannot resume dead coroutine
-
- -

-You can also create and manipulate coroutines through the C API: -see functions lua_newthread, lua_resume, -and lua_yield. - - - - - -

3 – The Language

- -

-This section describes the lexis, the syntax, and the semantics of Lua. -In other words, -this section describes -which tokens are valid, -how they can be combined, -and what their combinations mean. - - -

-Language constructs will be explained using the usual extended BNF notation, -in which -{a} means 0 or more a's, and -[a] means an optional a. -Non-terminals are shown like non-terminal, -keywords are shown like kword, -and other terminal symbols are shown like ‘=’. -The complete syntax of Lua can be found in §9 -at the end of this manual. - - - -

3.1 – Lexical Conventions

- -

-Lua is a free-form language. -It ignores spaces (including new lines) and comments -between lexical elements (tokens), -except as delimiters between names and keywords. - - -

-Names -(also called identifiers) -in Lua can be any string of letters, -digits, and underscores, -not beginning with a digit. -Identifiers are used to name variables, table fields, and labels. - - -

-The following keywords are reserved -and cannot be used as names: - - -

-     and       break     do        else      elseif    end
-     false     for       function  goto      if        in
-     local     nil       not       or        repeat    return
-     then      true      until     while
-
- -

-Lua is a case-sensitive language: -and is a reserved word, but And and AND -are two different, valid names. -As a convention, -programs should avoid creating -names that start with an underscore followed by -one or more uppercase letters (such as _VERSION). - - -

-The following strings denote other tokens: - -

-     +     -     *     /     %     ^     #
-     &     ~     |     <<    >>    //
-     ==    ~=    <=    >=    <     >     =
-     (     )     {     }     [     ]     ::
-     ;     :     ,     .     ..    ...
-
- -

-Literal strings -can be delimited by matching single or double quotes, -and can contain the following C-like escape sequences: -'\a' (bell), -'\b' (backspace), -'\f' (form feed), -'\n' (newline), -'\r' (carriage return), -'\t' (horizontal tab), -'\v' (vertical tab), -'\\' (backslash), -'\"' (quotation mark [double quote]), -and '\'' (apostrophe [single quote]). -A backslash followed by a real newline -results in a newline in the string. -The escape sequence '\z' skips the following span -of white-space characters, -including line breaks; -it is particularly useful to break and indent a long literal string -into multiple lines without adding the newlines and spaces -into the string contents. - - -

-Strings in Lua can contain any 8-bit value, including embedded zeros, -which can be specified as '\0'. -More generally, -we can specify any byte in a literal string by its numerical value. -This can be done -with the escape sequence \xXX, -where XX is a sequence of exactly two hexadecimal digits, -or with the escape sequence \ddd, -where ddd is a sequence of up to three decimal digits. -(Note that if a decimal escape sequence is to be followed by a digit, -it must be expressed using exactly three digits.) - - -

-The UTF-8 encoding of a Unicode character -can be inserted in a literal string with -the escape sequence \u{XXX} -(note the mandatory enclosing brackets), -where XXX is a sequence of one or more hexadecimal digits -representing the character code point. - - -

-Literal strings can also be defined using a long format -enclosed by long brackets. -We define an opening long bracket of level n as an opening -square bracket followed by n equal signs followed by another -opening square bracket. -So, an opening long bracket of level 0 is written as [[, -an opening long bracket of level 1 is written as [=[, -and so on. -A closing long bracket is defined similarly; -for instance, -a closing long bracket of level 4 is written as ]====]. -A long literal starts with an opening long bracket of any level and -ends at the first closing long bracket of the same level. -It can contain any text except a closing bracket of the same level. -Literals in this bracketed form can run for several lines, -do not interpret any escape sequences, -and ignore long brackets of any other level. -Any kind of end-of-line sequence -(carriage return, newline, carriage return followed by newline, -or newline followed by carriage return) -is converted to a simple newline. - - -

-Any byte in a literal string not -explicitly affected by the previous rules represents itself. -However, Lua opens files for parsing in text mode, -and the system file functions may have problems with -some control characters. -So, it is safer to represent -non-text data as a quoted literal with -explicit escape sequences for non-text characters. - - -

-For convenience, -when the opening long bracket is immediately followed by a newline, -the newline is not included in the string. -As an example, in a system using ASCII -(in which 'a' is coded as 97, -newline is coded as 10, and '1' is coded as 49), -the five literal strings below denote the same string: - -

-     a = 'alo\n123"'
-     a = "alo\n123\""
-     a = '\97lo\10\04923"'
-     a = [[alo
-     123"]]
-     a = [==[
-     alo
-     123"]==]
-
- -

-A numerical constant (or numeral) -can be written with an optional fractional part -and an optional decimal exponent, -marked by a letter 'e' or 'E'. -Lua also accepts hexadecimal constants, -which start with 0x or 0X. -Hexadecimal constants also accept an optional fractional part -plus an optional binary exponent, -marked by a letter 'p' or 'P'. -A numeric constant with a fractional dot or an exponent -denotes a float; -otherwise it denotes an integer. -Examples of valid integer constants are - -

-     3   345   0xff   0xBEBADA
-

-Examples of valid float constants are - -

-     3.0     3.1416     314.16e-2     0.31416E1     34e1
-     0x0.1E  0xA23p-4   0X1.921FB54442D18P+1
-
- -

-A comment starts with a double hyphen (--) -anywhere outside a string. -If the text immediately after -- is not an opening long bracket, -the comment is a short comment, -which runs until the end of the line. -Otherwise, it is a long comment, -which runs until the corresponding closing long bracket. -Long comments are frequently used to disable code temporarily. - - - - - -

3.2 – Variables

- -

-Variables are places that store values. -There are three kinds of variables in Lua: -global variables, local variables, and table fields. - - -

-A single name can denote a global variable or a local variable -(or a function's formal parameter, -which is a particular kind of local variable): - -

-	var ::= Name
-

-Name denotes identifiers, as defined in §3.1. - - -

-Any variable name is assumed to be global unless explicitly declared -as a local (see §3.3.7). -Local variables are lexically scoped: -local variables can be freely accessed by functions -defined inside their scope (see §3.5). - - -

-Before the first assignment to a variable, its value is nil. - - -

-Square brackets are used to index a table: - -

-	var ::= prefixexp ‘[’ exp ‘]’
-

-The meaning of accesses to table fields can be changed via metatables. -An access to an indexed variable t[i] is equivalent to -a call gettable_event(t,i). -(See §2.4 for a complete description of the -gettable_event function. -This function is not defined or callable in Lua. -We use it here only for explanatory purposes.) - - -

-The syntax var.Name is just syntactic sugar for -var["Name"]: - -

-	var ::= prefixexp ‘.’ Name
-
- -

-An access to a global variable x -is equivalent to _ENV.x. -Due to the way that chunks are compiled, -_ENV is never a global name (see §2.2). - - - - - -

3.3 – Statements

- -

-Lua supports an almost conventional set of statements, -similar to those in Pascal or C. -This set includes -assignments, control structures, function calls, -and variable declarations. - - - -

3.3.1 – Blocks

- -

-A block is a list of statements, -which are executed sequentially: - -

-	block ::= {stat}
-

-Lua has empty statements -that allow you to separate statements with semicolons, -start a block with a semicolon -or write two semicolons in sequence: - -

-	stat ::= ‘;’
-
- -

-Function calls and assignments -can start with an open parenthesis. -This possibility leads to an ambiguity in Lua's grammar. -Consider the following fragment: - -

-     a = b + c
-     (print or io.write)('done')
-

-The grammar could see it in two ways: - -

-     a = b + c(print or io.write)('done')
-     
-     a = b + c; (print or io.write)('done')
-

-The current parser always sees such constructions -in the first way, -interpreting the open parenthesis -as the start of the arguments to a call. -To avoid this ambiguity, -it is a good practice to always precede with a semicolon -statements that start with a parenthesis: - -

-     ;(print or io.write)('done')
-
- -

-A block can be explicitly delimited to produce a single statement: - -

-	stat ::= do block end
-

-Explicit blocks are useful -to control the scope of variable declarations. -Explicit blocks are also sometimes used to -add a return statement in the middle -of another block (see §3.3.4). - - - - - -

3.3.2 – Chunks

- -

-The unit of compilation of Lua is called a chunk. -Syntactically, -a chunk is simply a block: - -

-	chunk ::= block
-
- -

-Lua handles a chunk as the body of an anonymous function -with a variable number of arguments -(see §3.4.11). -As such, chunks can define local variables, -receive arguments, and return values. -Moreover, such anonymous function is compiled as in the -scope of an external local variable called _ENV (see §2.2). -The resulting function always has _ENV as its only upvalue, -even if it does not use that variable. - - -

-A chunk can be stored in a file or in a string inside the host program. -To execute a chunk, -Lua first loads it, -precompiling the chunk's code into instructions for a virtual machine, -and then Lua executes the compiled code -with an interpreter for the virtual machine. - - -

-Chunks can also be precompiled into binary form; -see program luac and function string.dump for details. -Programs in source and compiled forms are interchangeable; -Lua automatically detects the file type and acts accordingly (see load). - - - - - -

3.3.3 – Assignment

- -

-Lua allows multiple assignments. -Therefore, the syntax for assignment -defines a list of variables on the left side -and a list of expressions on the right side. -The elements in both lists are separated by commas: - -

-	stat ::= varlist ‘=’ explist
-	varlist ::= var {‘,’ var}
-	explist ::= exp {‘,’ exp}
-

-Expressions are discussed in §3.4. - - -

-Before the assignment, -the list of values is adjusted to the length of -the list of variables. -If there are more values than needed, -the excess values are thrown away. -If there are fewer values than needed, -the list is extended with as many nil's as needed. -If the list of expressions ends with a function call, -then all values returned by that call enter the list of values, -before the adjustment -(except when the call is enclosed in parentheses; see §3.4). - - -

-The assignment statement first evaluates all its expressions -and only then the assignments are performed. -Thus the code - -

-     i = 3
-     i, a[i] = i+1, 20
-

-sets a[3] to 20, without affecting a[4] -because the i in a[i] is evaluated (to 3) -before it is assigned 4. -Similarly, the line - -

-     x, y = y, x
-

-exchanges the values of x and y, -and - -

-     x, y, z = y, z, x
-

-cyclically permutes the values of x, y, and z. - - -

-The meaning of assignments to global variables -and table fields can be changed via metatables. -An assignment to an indexed variable t[i] = val is equivalent to -settable_event(t,i,val). -(See §2.4 for a complete description of the -settable_event function. -This function is not defined or callable in Lua. -We use it here only for explanatory purposes.) - - -

-An assignment to a global name x = val -is equivalent to the assignment -_ENV.x = val (see §2.2). - - - - - -

3.3.4 – Control Structures

-The control structures -if, while, and repeat have the usual meaning and -familiar syntax: - - - - -

-	stat ::= while exp do block end
-	stat ::= repeat block until exp
-	stat ::= if exp then block {elseif exp then block} [else block] end
-

-Lua also has a for statement, in two flavors (see §3.3.5). - - -

-The condition expression of a -control structure can return any value. -Both false and nil are considered false. -All values different from nil and false are considered true -(in particular, the number 0 and the empty string are also true). - - -

-In the repeatuntil loop, -the inner block does not end at the until keyword, -but only after the condition. -So, the condition can refer to local variables -declared inside the loop block. - - -

-The goto statement transfers the program control to a label. -For syntactical reasons, -labels in Lua are considered statements too: - - - -

-	stat ::= goto Name
-	stat ::= label
-	label ::= ‘::’ Name ‘::’
-
- -

-A label is visible in the entire block where it is defined, -except -inside nested blocks where a label with the same name is defined and -inside nested functions. -A goto may jump to any visible label as long as it does not -enter into the scope of a local variable. - - -

-Labels and empty statements are called void statements, -as they perform no actions. - - -

-The break statement terminates the execution of a -while, repeat, or for loop, -skipping to the next statement after the loop: - - -

-	stat ::= break
-

-A break ends the innermost enclosing loop. - - -

-The return statement is used to return values -from a function or a chunk -(which is an anonymous function). - -Functions can return more than one value, -so the syntax for the return statement is - -

-	stat ::= return [explist] [‘;’]
-
- -

-The return statement can only be written -as the last statement of a block. -If it is really necessary to return in the middle of a block, -then an explicit inner block can be used, -as in the idiom do return end, -because now return is the last statement in its (inner) block. - - - - - -

3.3.5 – For Statement

- -

- -The for statement has two forms: -one numeric and one generic. - - -

-The numeric for loop repeats a block of code while a -control variable runs through an arithmetic progression. -It has the following syntax: - -

-	stat ::= for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end
-

-The block is repeated for name starting at the value of -the first exp, until it passes the second exp by steps of the -third exp. -More precisely, a for statement like - -

-     for v = e1, e2, e3 do block end
-

-is equivalent to the code: - -

-     do
-       local var, limit, step = tonumber(e1), tonumber(e2), tonumber(e3)
-       if not (var and limit and step) then error() end
-       var = var - step
-       while true do
-         var = var + step
-         if (step >= 0 and var > limit) or (step < 0 and var < limit) then
-           break
-         end
-         local v = var
-         block
-       end
-     end
-
- -

-Note the following: - -

    - -
  • -All three control expressions are evaluated only once, -before the loop starts. -They must all result in numbers. -
  • - -
  • -var, limit, and step are invisible variables. -The names shown here are for explanatory purposes only. -
  • - -
  • -If the third expression (the step) is absent, -then a step of 1 is used. -
  • - -
  • -You can use break and goto to exit a for loop. -
  • - -
  • -The loop variable v is local to the loop body. -If you need its value after the loop, -assign it to another variable before exiting the loop. -
  • - -
- -

-The generic for statement works over functions, -called iterators. -On each iteration, the iterator function is called to produce a new value, -stopping when this new value is nil. -The generic for loop has the following syntax: - -

-	stat ::= for namelist in explist do block end
-	namelist ::= Name {‘,’ Name}
-

-A for statement like - -

-     for var_1, ···, var_n in explist do block end
-

-is equivalent to the code: - -

-     do
-       local f, s, var = explist
-       while true do
-         local var_1, ···, var_n = f(s, var)
-         if var_1 == nil then break end
-         var = var_1
-         block
-       end
-     end
-

-Note the following: - -

    - -
  • -explist is evaluated only once. -Its results are an iterator function, -a state, -and an initial value for the first iterator variable. -
  • - -
  • -f, s, and var are invisible variables. -The names are here for explanatory purposes only. -
  • - -
  • -You can use break to exit a for loop. -
  • - -
  • -The loop variables var_i are local to the loop; -you cannot use their values after the for ends. -If you need these values, -then assign them to other variables before breaking or exiting the loop. -
  • - -
- - - - -

3.3.6 – Function Calls as Statements

-To allow possible side-effects, -function calls can be executed as statements: - -

-	stat ::= functioncall
-

-In this case, all returned values are thrown away. -Function calls are explained in §3.4.10. - - - - - -

3.3.7 – Local Declarations

-Local variables can be declared anywhere inside a block. -The declaration can include an initial assignment: - -

-	stat ::= local namelist [‘=’ explist]
-

-If present, an initial assignment has the same semantics -of a multiple assignment (see §3.3.3). -Otherwise, all variables are initialized with nil. - - -

-A chunk is also a block (see §3.3.2), -and so local variables can be declared in a chunk outside any explicit block. - - -

-The visibility rules for local variables are explained in §3.5. - - - - - - - -

3.4 – Expressions

- -

-The basic expressions in Lua are the following: - -

-	exp ::= prefixexp
-	exp ::= nil | false | true
-	exp ::= Numeral
-	exp ::= LiteralString
-	exp ::= functiondef
-	exp ::= tableconstructor
-	exp ::= ‘...’
-	exp ::= exp binop exp
-	exp ::= unop exp
-	prefixexp ::= var | functioncall | ‘(’ exp ‘)’
-
- -

-Numerals and literal strings are explained in §3.1; -variables are explained in §3.2; -function definitions are explained in §3.4.11; -function calls are explained in §3.4.10; -table constructors are explained in §3.4.9. -Vararg expressions, -denoted by three dots ('...'), can only be used when -directly inside a vararg function; -they are explained in §3.4.11. - - -

-Binary operators comprise arithmetic operators (see §3.4.1), -bitwise operators (see §3.4.2), -relational operators (see §3.4.4), logical operators (see §3.4.5), -and the concatenation operator (see §3.4.6). -Unary operators comprise the unary minus (see §3.4.1), -the unary bitwise not (see §3.4.2), -the unary logical not (see §3.4.5), -and the unary length operator (see §3.4.7). - - -

-Both function calls and vararg expressions can result in multiple values. -If a function call is used as a statement (see §3.3.6), -then its return list is adjusted to zero elements, -thus discarding all returned values. -If an expression is used as the last (or the only) element -of a list of expressions, -then no adjustment is made -(unless the expression is enclosed in parentheses). -In all other contexts, -Lua adjusts the result list to one element, -either discarding all values except the first one -or adding a single nil if there are no values. - - -

-Here are some examples: - -

-     f()                -- adjusted to 0 results
-     g(f(), x)          -- f() is adjusted to 1 result
-     g(x, f())          -- g gets x plus all results from f()
-     a,b,c = f(), x     -- f() is adjusted to 1 result (c gets nil)
-     a,b = ...          -- a gets the first vararg parameter, b gets
-                        -- the second (both a and b can get nil if there
-                        -- is no corresponding vararg parameter)
-     
-     a,b,c = x, f()     -- f() is adjusted to 2 results
-     a,b,c = f()        -- f() is adjusted to 3 results
-     return f()         -- returns all results from f()
-     return ...         -- returns all received vararg parameters
-     return x,y,f()     -- returns x, y, and all results from f()
-     {f()}              -- creates a list with all results from f()
-     {...}              -- creates a list with all vararg parameters
-     {f(), nil}         -- f() is adjusted to 1 result
-
- -

-Any expression enclosed in parentheses always results in only one value. -Thus, -(f(x,y,z)) is always a single value, -even if f returns several values. -(The value of (f(x,y,z)) is the first value returned by f -or nil if f does not return any values.) - - - -

3.4.1 – Arithmetic Operators

-Lua supports the following arithmetic operators: - -

    -
  • +: addition
  • -
  • -: subtraction
  • -
  • *: multiplication
  • -
  • /: float division
  • -
  • //: floor division
  • -
  • %: modulo
  • -
  • ^: exponentiation
  • -
  • -: unary minus
  • -
- -

-With the exception of exponentiation and float division, -the arithmetic operators work as follows: -If both operands are integers, -the operation is performed over integers and the result is an integer. -Otherwise, if both operands are numbers -or strings that can be converted to -numbers (see §3.4.3), -then they are converted to floats, -the operation is performed following the usual rules -for floating-point arithmetic -(usually the IEEE 754 standard), -and the result is a float. - - -

-Exponentiation and float division (/) -always convert their operands to floats -and the result is always a float. -Exponentiation uses the ISO C function pow, -so that it works for non-integer exponents too. - - -

-Floor division (//) is a division -that rounds the quotient towards minus infinite, -that is, the floor of the division of its operands. - - -

-Modulo is defined as the remainder of a division -that rounds the quotient towards minus infinite (floor division). - - -

-In case of overflows in integer arithmetic, -all operations wrap around, -according to the usual rules of two-complement arithmetic. -(In other words, -they return the unique representable integer -that is equal modulo 264 to the mathematical result.) - - - -

3.4.2 – Bitwise Operators

-Lua supports the following bitwise operators: - -

    -
  • &: bitwise and
  • -
  • |: bitwise or
  • -
  • ~: bitwise exclusive or
  • -
  • >>: right shift
  • -
  • <<: left shift
  • -
  • ~: unary bitwise not
  • -
- -

-All bitwise operations convert its operands to integers -(see §3.4.3), -operate on all bits of those integers, -and result in an integer. - - -

-Both right and left shifts fill the vacant bits with zeros. -Negative displacements shift to the other direction; -displacements with absolute values equal to or higher than -the number of bits in an integer -result in zero (as all bits are shifted out). - - - - - -

3.4.3 – Coercions and Conversions

-Lua provides some automatic conversions between some -types and representations at run time. -Bitwise operators always convert float operands to integers. -Exponentiation and float division -always convert integer operands to floats. -All other arithmetic operations applied to mixed numbers -(integers and floats) convert the integer operand to a float; -this is called the usual rule. -The C API also converts both integers to floats and -floats to integers, as needed. -Moreover, string concatenation accepts numbers as arguments, -besides strings. - - -

-Lua also converts strings to numbers, -whenever a number is expected. - - -

-In a conversion from integer to float, -if the integer value has an exact representation as a float, -that is the result. -Otherwise, -the conversion gets the nearest higher or -the nearest lower representable value. -This kind of conversion never fails. - - -

-The conversion from float to integer -checks whether the float has an exact representation as an integer -(that is, the float has an integral value and -it is in the range of integer representation). -If it does, that representation is the result. -Otherwise, the conversion fails. - - -

-The conversion from strings to numbers goes as follows: -First, the string is converted to an integer or a float, -following its syntax and the rules of the Lua lexer. -(The string may have also leading and trailing spaces and a sign.) -Then, the resulting number is converted to the required type -(float or integer) according to the previous rules. - - -

-The conversion from numbers to strings uses a -non-specified human-readable format. -For complete control over how numbers are converted to strings, -use the format function from the string library -(see string.format). - - - - - -

3.4.4 – Relational Operators

-Lua supports the following relational operators: - -

    -
  • ==: equality
  • -
  • ~=: inequality
  • -
  • <: less than
  • -
  • >: greater than
  • -
  • <=: less or equal
  • -
  • >=: greater or equal
  • -

-These operators always result in false or true. - - -

-Equality (==) first compares the type of its operands. -If the types are different, then the result is false. -Otherwise, the values of the operands are compared. -Strings are compared in the obvious way. -Numbers follow the usual rule for binary operations: -if both operands are integers, -they are compared as integers; -otherwise, they are converted to floats -and compared as such. - - -

-Tables, userdata, and threads -are compared by reference: -two objects are considered equal only if they are the same object. -Every time you create a new object -(a table, userdata, or thread), -this new object is different from any previously existing object. -Closures with the same reference are always equal. -Closures with any detectable difference -(different behavior, different definition) are always different. - - -

-You can change the way that Lua compares tables and userdata -by using the "eq" metamethod (see §2.4). - - -

-Equality comparisons do not convert strings to numbers -or vice versa. -Thus, "0"==0 evaluates to false, -and t[0] and t["0"] denote different -entries in a table. - - -

-The operator ~= is exactly the negation of equality (==). - - -

-The order operators work as follows. -If both arguments are numbers, -then they are compared following -the usual rule for binary operations. -Otherwise, if both arguments are strings, -then their values are compared according to the current locale. -Otherwise, Lua tries to call the "lt" or the "le" -metamethod (see §2.4). -A comparison a > b is translated to b < a -and a >= b is translated to b <= a. - - - - - -

3.4.5 – Logical Operators

-The logical operators in Lua are -and, or, and not. -Like the control structures (see §3.3.4), -all logical operators consider both false and nil as false -and anything else as true. - - -

-The negation operator not always returns false or true. -The conjunction operator and returns its first argument -if this value is false or nil; -otherwise, and returns its second argument. -The disjunction operator or returns its first argument -if this value is different from nil and false; -otherwise, or returns its second argument. -Both and and or use short-circuit evaluation; -that is, -the second operand is evaluated only if necessary. -Here are some examples: - -

-     10 or 20            --> 10
-     10 or error()       --> 10
-     nil or "a"          --> "a"
-     nil and 10          --> nil
-     false and error()   --> false
-     false and nil       --> false
-     false or nil        --> nil
-     10 and 20           --> 20
-

-(In this manual, ---> indicates the result of the preceding expression.) - - - - - -

3.4.6 – Concatenation

-The string concatenation operator in Lua is -denoted by two dots ('..'). -If both operands are strings or numbers, then they are converted to -strings according to the rules described in §3.4.3. -Otherwise, the __concat metamethod is called (see §2.4). - - - - - -

3.4.7 – The Length Operator

- -

-The length operator is denoted by the unary prefix operator #. -The length of a string is its number of bytes -(that is, the usual meaning of string length when each -character is one byte). - - -

-A program can modify the behavior of the length operator for -any value but strings through the __len metamethod (see §2.4). - - -

-Unless a __len metamethod is given, -the length of a table t is only defined if the -table is a sequence, -that is, -the set of its positive numeric keys is equal to {1..n} -for some non-negative integer n. -In that case, n is its length. -Note that a table like - -

-     {10, 20, nil, 40}
-

-is not a sequence, because it has the key 4 -but does not have the key 3. -(So, there is no n such that the set {1..n} is equal -to the set of positive numeric keys of that table.) -Note, however, that non-numeric keys do not interfere -with whether a table is a sequence. - - - - - -

3.4.8 – Precedence

-Operator precedence in Lua follows the table below, -from lower to higher priority: - -

-     or
-     and
-     <     >     <=    >=    ~=    ==
-     |
-     ~
-     &
-     <<    >>
-     ..
-     +     -
-     *     /     //    %
-     unary operators (not   #     -     ~)
-     ^
-

-As usual, -you can use parentheses to change the precedences of an expression. -The concatenation ('..') and exponentiation ('^') -operators are right associative. -All other binary operators are left associative. - - - - - -

3.4.9 – Table Constructors

-Table constructors are expressions that create tables. -Every time a constructor is evaluated, a new table is created. -A constructor can be used to create an empty table -or to create a table and initialize some of its fields. -The general syntax for constructors is - -

-	tableconstructor ::= ‘{’ [fieldlist] ‘}’
-	fieldlist ::= field {fieldsep field} [fieldsep]
-	field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp
-	fieldsep ::= ‘,’ | ‘;’
-
- -

-Each field of the form [exp1] = exp2 adds to the new table an entry -with key exp1 and value exp2. -A field of the form name = exp is equivalent to -["name"] = exp. -Finally, fields of the form exp are equivalent to -[i] = exp, where i are consecutive integers -starting with 1. -Fields in the other formats do not affect this counting. -For example, - -

-     a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }
-

-is equivalent to - -

-     do
-       local t = {}
-       t[f(1)] = g
-       t[1] = "x"         -- 1st exp
-       t[2] = "y"         -- 2nd exp
-       t.x = 1            -- t["x"] = 1
-       t[3] = f(x)        -- 3rd exp
-       t[30] = 23
-       t[4] = 45          -- 4th exp
-       a = t
-     end
-
- -

-The order of the assignments in a constructor is undefined. -(This order would be relevant only when there are repeated keys.) - - -

-If the last field in the list has the form exp -and the expression is a function call or a vararg expression, -then all values returned by this expression enter the list consecutively -(see §3.4.10). - - -

-The field list can have an optional trailing separator, -as a convenience for machine-generated code. - - - - - -

3.4.10 – Function Calls

-A function call in Lua has the following syntax: - -

-	functioncall ::= prefixexp args
-

-In a function call, -first prefixexp and args are evaluated. -If the value of prefixexp has type function, -then this function is called -with the given arguments. -Otherwise, the prefixexp "call" metamethod is called, -having as first parameter the value of prefixexp, -followed by the original call arguments -(see §2.4). - - -

-The form - -

-	functioncall ::= prefixexp ‘:’ Name args
-

-can be used to call "methods". -A call v:name(args) -is syntactic sugar for v.name(v,args), -except that v is evaluated only once. - - -

-Arguments have the following syntax: - -

-	args ::= ‘(’ [explist] ‘)’
-	args ::= tableconstructor
-	args ::= LiteralString
-

-All argument expressions are evaluated before the call. -A call of the form f{fields} is -syntactic sugar for f({fields}); -that is, the argument list is a single new table. -A call of the form f'string' -(or f"string" or f[[string]]) -is syntactic sugar for f('string'); -that is, the argument list is a single literal string. - - -

-A call of the form return functioncall is called -a tail call. -Lua implements proper tail calls -(or proper tail recursion): -in a tail call, -the called function reuses the stack entry of the calling function. -Therefore, there is no limit on the number of nested tail calls that -a program can execute. -However, a tail call erases any debug information about the -calling function. -Note that a tail call only happens with a particular syntax, -where the return has one single function call as argument; -this syntax makes the calling function return exactly -the returns of the called function. -So, none of the following examples are tail calls: - -

-     return (f(x))        -- results adjusted to 1
-     return 2 * f(x)
-     return x, f(x)       -- additional results
-     f(x); return         -- results discarded
-     return x or f(x)     -- results adjusted to 1
-
- - - - -

3.4.11 – Function Definitions

- -

-The syntax for function definition is - -

-	functiondef ::= function funcbody
-	funcbody ::= ‘(’ [parlist] ‘)’ block end
-
- -

-The following syntactic sugar simplifies function definitions: - -

-	stat ::= function funcname funcbody
-	stat ::= local function Name funcbody
-	funcname ::= Name {‘.’ Name} [‘:’ Name]
-

-The statement - -

-     function f () body end
-

-translates to - -

-     f = function () body end
-

-The statement - -

-     function t.a.b.c.f () body end
-

-translates to - -

-     t.a.b.c.f = function () body end
-

-The statement - -

-     local function f () body end
-

-translates to - -

-     local f; f = function () body end
-

-not to - -

-     local f = function () body end
-

-(This only makes a difference when the body of the function -contains references to f.) - - -

-A function definition is an executable expression, -whose value has type function. -When Lua precompiles a chunk, -all its function bodies are precompiled too. -Then, whenever Lua executes the function definition, -the function is instantiated (or closed). -This function instance (or closure) -is the final value of the expression. - - -

-Parameters act as local variables that are -initialized with the argument values: - -

-	parlist ::= namelist [‘,’ ‘...’] | ‘...’
-

-When a function is called, -the list of arguments is adjusted to -the length of the list of parameters, -unless the function is a vararg function, -which is indicated by three dots ('...') -at the end of its parameter list. -A vararg function does not adjust its argument list; -instead, it collects all extra arguments and supplies them -to the function through a vararg expression, -which is also written as three dots. -The value of this expression is a list of all actual extra arguments, -similar to a function with multiple results. -If a vararg expression is used inside another expression -or in the middle of a list of expressions, -then its return list is adjusted to one element. -If the expression is used as the last element of a list of expressions, -then no adjustment is made -(unless that last expression is enclosed in parentheses). - - -

-As an example, consider the following definitions: - -

-     function f(a, b) end
-     function g(a, b, ...) end
-     function r() return 1,2,3 end
-

-Then, we have the following mapping from arguments to parameters and -to the vararg expression: - -

-     CALL            PARAMETERS
-     
-     f(3)             a=3, b=nil
-     f(3, 4)          a=3, b=4
-     f(3, 4, 5)       a=3, b=4
-     f(r(), 10)       a=1, b=10
-     f(r())           a=1, b=2
-     
-     g(3)             a=3, b=nil, ... -->  (nothing)
-     g(3, 4)          a=3, b=4,   ... -->  (nothing)
-     g(3, 4, 5, 8)    a=3, b=4,   ... -->  5  8
-     g(5, r())        a=5, b=1,   ... -->  2  3
-
- -

-Results are returned using the return statement (see §3.3.4). -If control reaches the end of a function -without encountering a return statement, -then the function returns with no results. - - -

- -There is a system-dependent limit on the number of values -that a function may return. -This limit is guaranteed to be larger than 1000. - - -

-The colon syntax -is used for defining methods, -that is, functions that have an implicit extra parameter self. -Thus, the statement - -

-     function t.a.b.c:f (params) body end
-

-is syntactic sugar for - -

-     t.a.b.c.f = function (self, params) body end
-
- - - - - - -

3.5 – Visibility Rules

- -

- -Lua is a lexically scoped language. -The scope of a local variable begins at the first statement after -its declaration and lasts until the last non-void statement -of the innermost block that includes the declaration. -Consider the following example: - -

-     x = 10                -- global variable
-     do                    -- new block
-       local x = x         -- new 'x', with value 10
-       print(x)            --> 10
-       x = x+1
-       do                  -- another block
-         local x = x+1     -- another 'x'
-         print(x)          --> 12
-       end
-       print(x)            --> 11
-     end
-     print(x)              --> 10  (the global one)
-
- -

-Notice that, in a declaration like local x = x, -the new x being declared is not in scope yet, -and so the second x refers to the outside variable. - - -

-Because of the lexical scoping rules, -local variables can be freely accessed by functions -defined inside their scope. -A local variable used by an inner function is called -an upvalue, or external local variable, -inside the inner function. - - -

-Notice that each execution of a local statement -defines new local variables. -Consider the following example: - -

-     a = {}
-     local x = 20
-     for i=1,10 do
-       local y = 0
-       a[i] = function () y=y+1; return x+y end
-     end
-

-The loop creates ten closures -(that is, ten instances of the anonymous function). -Each of these closures uses a different y variable, -while all of them share the same x. - - - - - -

4 – The Application Program Interface

- -

- -This section describes the C API for Lua, that is, -the set of C functions available to the host program to communicate -with Lua. -All API functions and related types and constants -are declared in the header file lua.h. - - -

-Even when we use the term "function", -any facility in the API may be provided as a macro instead. -Except where stated otherwise, -all such macros use each of their arguments exactly once -(except for the first argument, which is always a Lua state), -and so do not generate any hidden side-effects. - - -

-As in most C libraries, -the Lua API functions do not check their arguments for validity or consistency. -However, you can change this behavior by compiling Lua -with the macro LUA_USE_APICHECK defined. - - - -

4.1 – The Stack

- -

-Lua uses a virtual stack to pass values to and from C. -Each element in this stack represents a Lua value -(nil, number, string, etc.). - - -

-Whenever Lua calls C, the called function gets a new stack, -which is independent of previous stacks and of stacks of -C functions that are still active. -This stack initially contains any arguments to the C function -and it is where the C function pushes its results -to be returned to the caller (see lua_CFunction). - - -

-For convenience, -most query operations in the API do not follow a strict stack discipline. -Instead, they can refer to any element in the stack -by using an index: -A positive index represents an absolute stack position -(starting at 1); -a negative index represents an offset relative to the top of the stack. -More specifically, if the stack has n elements, -then index 1 represents the first element -(that is, the element that was pushed onto the stack first) -and -index n represents the last element; -index -1 also represents the last element -(that is, the element at the top) -and index -n represents the first element. - - - - - -

4.2 – Stack Size

- -

-When you interact with the Lua API, -you are responsible for ensuring consistency. -In particular, -you are responsible for controlling stack overflow. -You can use the function lua_checkstack -to ensure that the stack has enough space for pushing new elements. - - -

-Whenever Lua calls C, -it ensures that the stack has space for -at least LUA_MINSTACK extra slots. -LUA_MINSTACK is defined as 20, -so that usually you do not have to worry about stack space -unless your code has loops pushing elements onto the stack. - - -

-When you call a Lua function -without a fixed number of results (see lua_call), -Lua ensures that the stack has enough space for all results, -but it does not ensure any extra space. -So, before pushing anything in the stack after such a call -you should use lua_checkstack. - - - - - -

4.3 – Valid and Acceptable Indices

- -

-Any function in the API that receives stack indices -works only with valid indices or acceptable indices. - - -

-A valid index is an index that refers to a -real position within the stack, that is, -its position lies between 1 and the stack top -(1 ≤ abs(index) ≤ top). - -Usually, functions that can modify the value at an index -require valid indices. - - -

-Unless otherwise noted, -any function that accepts valid indices also accepts pseudo-indices, -which represent some Lua values that are accessible to C code -but which are not in the stack. -Pseudo-indices are used to access the registry -and the upvalues of a C function (see §4.4). - - -

-Functions that do not need a specific stack position, -but only a value in the stack (e.g., query functions), -can be called with acceptable indices. -An acceptable index can be any valid index, -including the pseudo-indices, -but it also can be any positive index after the stack top -within the space allocated for the stack, -that is, indices up to the stack size. -(Note that 0 is never an acceptable index.) -Except when noted otherwise, -functions in the API work with acceptable indices. - - -

-Acceptable indices serve to avoid extra tests -against the stack top when querying the stack. -For instance, a C function can query its third argument -without the need to first check whether there is a third argument, -that is, without the need to check whether 3 is a valid index. - - -

-For functions that can be called with acceptable indices, -any non-valid index is treated as if it -contains a value of a virtual type LUA_TNONE, -which behaves like a nil value. - - - - - -

4.4 – C Closures

- -

-When a C function is created, -it is possible to associate some values with it, -thus creating a C closure -(see lua_pushcclosure); -these values are called upvalues and are -accessible to the function whenever it is called. - - -

-Whenever a C function is called, -its upvalues are located at specific pseudo-indices. -These pseudo-indices are produced by the macro -lua_upvalueindex. -The first value associated with a function is at position -lua_upvalueindex(1), and so on. -Any access to lua_upvalueindex(n), -where n is greater than the number of upvalues of the -current function (but not greater than 256), -produces an acceptable but invalid index. - - - - - -

4.5 – Registry

- -

-Lua provides a registry, -a predefined table that can be used by any C code to -store whatever Lua values it needs to store. -The registry table is always located at pseudo-index -LUA_REGISTRYINDEX, -which is a valid index. -Any C library can store data into this table, -but it must take care to choose keys -that are different from those used -by other libraries, to avoid collisions. -Typically, you should use as key a string containing your library name, -or a light userdata with the address of a C object in your code, -or any Lua object created by your code. -As with variable names, -string keys starting with an underscore followed by -uppercase letters are reserved for Lua. - - -

-The integer keys in the registry are used -by the reference mechanism (see luaL_ref) -and by some predefined values. -Therefore, integer keys must not be used for other purposes. - - -

-When you create a new Lua state, -its registry comes with some predefined values. -These predefined values are indexed with integer keys -defined as constants in lua.h. -The following constants are defined: - -

    -
  • LUA_RIDX_MAINTHREAD: At this index the registry has -the main thread of the state. -(The main thread is the one created together with the state.) -
  • - -
  • LUA_RIDX_GLOBALS: At this index the registry has -the global environment. -
  • -
- - - - -

4.6 – Error Handling in C

- -

-Internally, Lua uses the C longjmp facility to handle errors. -(Lua will use exceptions if you compile it as C++; -search for LUAI_THROW in the source code for details.) -When Lua faces any error -(such as a memory allocation error, type errors, syntax errors, -and runtime errors) -it raises an error; -that is, it does a long jump. -A protected environment uses setjmp -to set a recovery point; -any error jumps to the most recent active recovery point. - - -

-If an error happens outside any protected environment, -Lua calls a panic function (see lua_atpanic) -and then calls abort, -thus exiting the host application. -Your panic function can avoid this exit by -never returning -(e.g., doing a long jump to your own recovery point outside Lua). - - -

-The panic function runs as if it were a message handler (see §2.3); -in particular, the error message is at the top of the stack. -However, there is no guarantee about stack space. -To push anything on the stack, -the panic function must first check the available space (see §4.2). - - -

-Most functions in the API can raise an error, -for instance due to a memory allocation error. -The documentation for each function indicates whether -it can raise errors. - - -

-Inside a C function you can raise an error by calling lua_error. - - - - - -

4.7 – Handling Yields in C

- -

-Internally, Lua uses the C longjmp facility to yield a coroutine. -Therefore, if a C function foo calls an API function -and this API function yields -(directly or indirectly by calling another function that yields), -Lua cannot return to foo any more, -because the longjmp removes its frame from the C stack. - - -

-To avoid this kind of problem, -Lua raises an error whenever it tries to yield across an API call, -except for three functions: -lua_yieldk, lua_callk, and lua_pcallk. -All those functions receive a continuation function -(as a parameter named k) to continue execution after a yield. - - -

-We need to set some terminology to explain continuations. -We have a C function called from Lua which we will call -the original function. -This original function then calls one of those three functions in the C API, -which we will call the callee function, -that then yields the current thread. -(This can happen when the callee function is lua_yieldk, -or when the callee function is either lua_callk or lua_pcallk -and the function called by them yields.) - - -

-Suppose the running thread yields while executing the callee function. -After the thread resumes, -it eventually will finish running the callee function. -However, -the callee function cannot return to the original function, -because its frame in the C stack was destroyed by the yield. -Instead, Lua calls a continuation function, -which was given as an argument to the callee function. -As the name implies, -the continuation function should continue the task -of the original function. - - -

-As an illustration, consider the following function: - -

-     int original_function (lua_State *L) {
-       ...     /* code 1 */
-       status = lua_pcall(L, n, m, h);  /* calls Lua */
-       ...     /* code 2 */
-     }
-

-Now we want to allow -the Lua code being run by lua_pcall to yield. -First, we can rewrite our function like here: - -

-     int k (lua_State *L, int status, lua_KContext ctx) {
-       ...  /* code 2 */
-     }
-     
-     int original_function (lua_State *L) {
-       ...     /* code 1 */
-       return k(L, lua_pcall(L, n, m, h), ctx);
-     }
-

-In the above code, -the new function k is a -continuation function (with type lua_KFunction), -which should do all the work that the original function -was doing after calling lua_pcall. -Now, we must inform Lua that it must call k if the Lua code -being executed by lua_pcall gets interrupted in some way -(errors or yielding), -so we rewrite the code as here, -replacing lua_pcall by lua_pcallk: - -

-     int original_function (lua_State *L) {
-       ...     /* code 1 */
-       return k(L, lua_pcallk(L, n, m, h, ctx2, k), ctx1);
-     }
-

-Note the external, explicit call to the continuation: -Lua will call the continuation only if needed, that is, -in case of errors or resuming after a yield. -If the called function returns normally without ever yielding, -lua_pcallk (and lua_callk) will also return normally. -(Of course, instead of calling the continuation in that case, -you can do the equivalent work directly inside the original function.) - - -

-Besides the Lua state, -the continuation function has two other parameters: -the final status of the call plus the context value (ctx) that -was passed originally to lua_pcallk. -(Lua does not use this context value; -it only passes this value from the original function to the -continuation function.) -For lua_pcallk, -the status is the same value that would be returned by lua_pcallk, -except that it is LUA_YIELD when being executed after a yield -(instead of LUA_OK). -For lua_yieldk and lua_callk, -the status is always LUA_YIELD when Lua calls the continuation. -(For these two functions, -Lua will not call the continuation in case of errors, -because they do not handle errors.) -Similarly, when using lua_callk, -you should call the continuation function -with LUA_OK as the status. -(For lua_yieldk, there is not much point in calling -directly the continuation function, -because lua_yieldk usually does not return.) - - -

-Lua treats the continuation function as if it were the original function. -The continuation function receives the same Lua stack -from the original function, -in the same state it would be if the callee function had returned. -(For instance, -after a lua_callk the function and its arguments are -removed from the stack and replaced by the results from the call.) -It also has the same upvalues. -Whatever it returns is handled by Lua as if it were the return -of the original function. - - - - - -

4.8 – Functions and Types

- -

-Here we list all functions and types from the C API in -alphabetical order. -Each function has an indicator like this: -[-o, +p, x] - - -

-The first field, o, -is how many elements the function pops from the stack. -The second field, p, -is how many elements the function pushes onto the stack. -(Any function always pushes its results after popping its arguments.) -A field in the form x|y means the function can push (or pop) -x or y elements, -depending on the situation; -an interrogation mark '?' means that -we cannot know how many elements the function pops/pushes -by looking only at its arguments -(e.g., they may depend on what is on the stack). -The third field, x, -tells whether the function may raise errors: -'-' means the function never raises any error; -'e' means the function may raise errors; -'v' means the function may raise an error on purpose. - - - -


lua_absindex

-[-0, +0, –] -

int lua_absindex (lua_State *L, int idx);
- -

-Converts the acceptable index idx into an absolute index -(that is, one that does not depend on the stack top). - - - - - -


lua_Alloc

-
typedef void * (*lua_Alloc) (void *ud,
-                             void *ptr,
-                             size_t osize,
-                             size_t nsize);
- -

-The type of the memory-allocation function used by Lua states. -The allocator function must provide a -functionality similar to realloc, -but not exactly the same. -Its arguments are -ud, an opaque pointer passed to lua_newstate; -ptr, a pointer to the block being allocated/reallocated/freed; -osize, the original size of the block or some code about what -is being allocated; -and nsize, the new size of the block. - - -

-When ptr is not NULL, -osize is the size of the block pointed by ptr, -that is, the size given when it was allocated or reallocated. - - -

-When ptr is NULL, -osize encodes the kind of object that Lua is allocating. -osize is any of -LUA_TSTRING, LUA_TTABLE, LUA_TFUNCTION, -LUA_TUSERDATA, or LUA_TTHREAD when (and only when) -Lua is creating a new object of that type. -When osize is some other value, -Lua is allocating memory for something else. - - -

-Lua assumes the following behavior from the allocator function: - - -

-When nsize is zero, -the allocator must behave like free -and return NULL. - - -

-When nsize is not zero, -the allocator must behave like realloc. -The allocator returns NULL -if and only if it cannot fulfill the request. -Lua assumes that the allocator never fails when -osize >= nsize. - - -

-Here is a simple implementation for the allocator function. -It is used in the auxiliary library by luaL_newstate. - -

-     static void *l_alloc (void *ud, void *ptr, size_t osize,
-                                                size_t nsize) {
-       (void)ud;  (void)osize;  /* not used */
-       if (nsize == 0) {
-         free(ptr);
-         return NULL;
-       }
-       else
-         return realloc(ptr, nsize);
-     }
-

-Note that Standard C ensures -that free(NULL) has no effect and that -realloc(NULL,size) is equivalent to malloc(size). -This code assumes that realloc does not fail when shrinking a block. -(Although Standard C does not ensure this behavior, -it seems to be a safe assumption.) - - - - - -


lua_arith

-[-(2|1), +1, e] -

void lua_arith (lua_State *L, int op);
- -

-Performs an arithmetic or bitwise operation over the two values -(or one, in the case of negations) -at the top of the stack, -with the value at the top being the second operand, -pops these values, and pushes the result of the operation. -The function follows the semantics of the corresponding Lua operator -(that is, it may call metamethods). - - -

-The value of op must be one of the following constants: - -

- - - - -

lua_atpanic

-[-0, +0, –] -

lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf);
- -

-Sets a new panic function and returns the old one (see §4.6). - - - - - -


lua_call

-[-(nargs+1), +nresults, e] -

void lua_call (lua_State *L, int nargs, int nresults);
- -

-Calls a function. - - -

-To call a function you must use the following protocol: -first, the function to be called is pushed onto the stack; -then, the arguments to the function are pushed -in direct order; -that is, the first argument is pushed first. -Finally you call lua_call; -nargs is the number of arguments that you pushed onto the stack. -All arguments and the function value are popped from the stack -when the function is called. -The function results are pushed onto the stack when the function returns. -The number of results is adjusted to nresults, -unless nresults is LUA_MULTRET. -In this case, all results from the function are pushed. -Lua takes care that the returned values fit into the stack space. -The function results are pushed onto the stack in direct order -(the first result is pushed first), -so that after the call the last result is on the top of the stack. - - -

-Any error inside the called function is propagated upwards -(with a longjmp). - - -

-The following example shows how the host program can do the -equivalent to this Lua code: - -

-     a = f("how", t.x, 14)
-

-Here it is in C: - -

-     lua_getglobal(L, "f");                  /* function to be called */
-     lua_pushliteral(L, "how");                       /* 1st argument */
-     lua_getglobal(L, "t");                    /* table to be indexed */
-     lua_getfield(L, -1, "x");        /* push result of t.x (2nd arg) */
-     lua_remove(L, -2);                  /* remove 't' from the stack */
-     lua_pushinteger(L, 14);                          /* 3rd argument */
-     lua_call(L, 3, 1);     /* call 'f' with 3 arguments and 1 result */
-     lua_setglobal(L, "a");                         /* set global 'a' */
-

-Note that the code above is balanced: -at its end, the stack is back to its original configuration. -This is considered good programming practice. - - - - - -


lua_callk

-[-(nargs + 1), +nresults, e] -

void lua_callk (lua_State *L,
-                int nargs,
-                int nresults,
-                lua_KContext ctx,
-                lua_KFunction k);
- -

-This function behaves exactly like lua_call, -but allows the called function to yield (see §4.7). - - - - - -


lua_CFunction

-
typedef int (*lua_CFunction) (lua_State *L);
- -

-Type for C functions. - - -

-In order to communicate properly with Lua, -a C function must use the following protocol, -which defines the way parameters and results are passed: -a C function receives its arguments from Lua in its stack -in direct order (the first argument is pushed first). -So, when the function starts, -lua_gettop(L) returns the number of arguments received by the function. -The first argument (if any) is at index 1 -and its last argument is at index lua_gettop(L). -To return values to Lua, a C function just pushes them onto the stack, -in direct order (the first result is pushed first), -and returns the number of results. -Any other value in the stack below the results will be properly -discarded by Lua. -Like a Lua function, a C function called by Lua can also return -many results. - - -

-As an example, the following function receives a variable number -of numerical arguments and returns their average and their sum: - -

-     static int foo (lua_State *L) {
-       int n = lua_gettop(L);    /* number of arguments */
-       lua_Number sum = 0.0;
-       int i;
-       for (i = 1; i <= n; i++) {
-         if (!lua_isnumber(L, i)) {
-           lua_pushliteral(L, "incorrect argument");
-           lua_error(L);
-         }
-         sum += lua_tonumber(L, i);
-       }
-       lua_pushnumber(L, sum/n);        /* first result */
-       lua_pushnumber(L, sum);         /* second result */
-       return 2;                   /* number of results */
-     }
-
- - - - -

lua_checkstack

-[-0, +0, –] -

int lua_checkstack (lua_State *L, int n);
- -

-Ensures that the stack has space for at least n extra slots. -It returns false if it cannot fulfill the request, -either because it would cause the stack -to be larger than a fixed maximum size -(typically at least several thousand elements) or -because it cannot allocate memory for the extra space. -This function never shrinks the stack; -if the stack is already larger than the new size, -it is left unchanged. - - - - - -


lua_close

-[-0, +0, –] -

void lua_close (lua_State *L);
- -

-Destroys all objects in the given Lua state -(calling the corresponding garbage-collection metamethods, if any) -and frees all dynamic memory used by this state. -On several platforms, you may not need to call this function, -because all resources are naturally released when the host program ends. -On the other hand, long-running programs that create multiple states, -such as daemons or web servers, -will probably need to close states as soon as they are not needed. - - - - - -


lua_compare

-[-0, +0, e] -

int lua_compare (lua_State *L, int index1, int index2, int op);
- -

-Compares two Lua values. -Returns 1 if the value at index index1 satisfies op -when compared with the value at index index2, -following the semantics of the corresponding Lua operator -(that is, it may call metamethods). -Otherwise returns 0. -Also returns 0 if any of the indices is not valid. - - -

-The value of op must be one of the following constants: - -

    - -
  • LUA_OPEQ: compares for equality (==)
  • -
  • LUA_OPLT: compares for less than (<)
  • -
  • LUA_OPLE: compares for less or equal (<=)
  • - -
- - - - -

lua_concat

-[-n, +1, e] -

void lua_concat (lua_State *L, int n);
- -

-Concatenates the n values at the top of the stack, -pops them, and leaves the result at the top. -If n is 1, the result is the single value on the stack -(that is, the function does nothing); -if n is 0, the result is the empty string. -Concatenation is performed following the usual semantics of Lua -(see §3.4.6). - - - - - -


lua_copy

-[-0, +0, –] -

void lua_copy (lua_State *L, int fromidx, int toidx);
- -

-Copies the element at index fromidx -into the valid index toidx, -replacing the value at that position. -Values at other positions are not affected. - - - - - -


lua_createtable

-[-0, +1, e] -

void lua_createtable (lua_State *L, int narr, int nrec);
- -

-Creates a new empty table and pushes it onto the stack. -Parameter narr is a hint for how many elements the table -will have as a sequence; -parameter nrec is a hint for how many other elements -the table will have. -Lua may use these hints to preallocate memory for the new table. -This pre-allocation is useful for performance when you know in advance -how many elements the table will have. -Otherwise you can use the function lua_newtable. - - - - - -


lua_dump

-[-0, +0, e] -

int lua_dump (lua_State *L,
-                        lua_Writer writer,
-                        void *data,
-                        int strip);
- -

-Dumps a function as a binary chunk. -Receives a Lua function on the top of the stack -and produces a binary chunk that, -if loaded again, -results in a function equivalent to the one dumped. -As it produces parts of the chunk, -lua_dump calls function writer (see lua_Writer) -with the given data -to write them. - - -

-If strip is true, -the binary representation is created without debug information -about the function. - - -

-The value returned is the error code returned by the last -call to the writer; -0 means no errors. - - -

-This function does not pop the Lua function from the stack. - - - - - -


lua_error

-[-1, +0, v] -

int lua_error (lua_State *L);
- -

-Generates a Lua error, -using the value at the top of the stack as the error object. -This function does a long jump, -and therefore never returns -(see luaL_error). - - - - - -


lua_gc

-[-0, +0, e] -

int lua_gc (lua_State *L, int what, int data);
- -

-Controls the garbage collector. - - -

-This function performs several tasks, -according to the value of the parameter what: - -

    - -
  • LUA_GCSTOP: -stops the garbage collector. -
  • - -
  • LUA_GCRESTART: -restarts the garbage collector. -
  • - -
  • LUA_GCCOLLECT: -performs a full garbage-collection cycle. -
  • - -
  • LUA_GCCOUNT: -returns the current amount of memory (in Kbytes) in use by Lua. -
  • - -
  • LUA_GCCOUNTB: -returns the remainder of dividing the current amount of bytes of -memory in use by Lua by 1024. -
  • - -
  • LUA_GCSTEP: -performs an incremental step of garbage collection. -
  • - -
  • LUA_GCSETPAUSE: -sets data as the new value -for the pause of the collector (see §2.5) -and returns the previous value of the pause. -
  • - -
  • LUA_GCSETSTEPMUL: -sets data as the new value for the step multiplier of -the collector (see §2.5) -and returns the previous value of the step multiplier. -
  • - -
  • LUA_GCISRUNNING: -returns a boolean that tells whether the collector is running -(i.e., not stopped). -
  • - -
- -

-For more details about these options, -see collectgarbage. - - - - - -


lua_getallocf

-[-0, +0, –] -

lua_Alloc lua_getallocf (lua_State *L, void **ud);
- -

-Returns the memory-allocation function of a given state. -If ud is not NULL, Lua stores in *ud the -opaque pointer given when the memory-allocator function was set. - - - - - -


lua_getfield

-[-0, +1, e] -

int lua_getfield (lua_State *L, int index, const char *k);
- -

-Pushes onto the stack the value t[k], -where t is the value at the given index. -As in Lua, this function may trigger a metamethod -for the "index" event (see §2.4). - - -

-Returns the type of the pushed value. - - - - - -


lua_getextraspace

-[-0, +0, –] -

void *lua_getextraspace (lua_State *L);
- -

-Returns a pointer to a raw memory area associated with the -given Lua state. -The application can use this area for any purpose; -Lua does not use it for anything. - - -

-Each new thread has this area initialized with a copy -of the area of the main thread. - - -

-By default, this area has the size of a pointer to void, -but you can recompile Lua with a different size for this area. -(See LUA_EXTRASPACE in luaconf.h.) - - - - - -


lua_getglobal

-[-0, +1, e] -

int lua_getglobal (lua_State *L, const char *name);
- -

-Pushes onto the stack the value of the global name. -Returns the type of that value. - - - - - -


lua_geti

-[-0, +1, e] -

int lua_geti (lua_State *L, int index, lua_Integer i);
- -

-Pushes onto the stack the value t[i], -where t is the value at the given index. -As in Lua, this function may trigger a metamethod -for the "index" event (see §2.4). - - -

-Returns the type of the pushed value. - - - - - -


lua_getmetatable

-[-0, +(0|1), –] -

int lua_getmetatable (lua_State *L, int index);
- -

-If the value at the given index has a metatable, -the function pushes that metatable onto the stack and returns 1. -Otherwise, -the function returns 0 and pushes nothing on the stack. - - - - - -


lua_gettable

-[-1, +1, e] -

int lua_gettable (lua_State *L, int index);
- -

-Pushes onto the stack the value t[k], -where t is the value at the given index -and k is the value at the top of the stack. - - -

-This function pops the key from the stack, -pushing the resulting value in its place. -As in Lua, this function may trigger a metamethod -for the "index" event (see §2.4). - - -

-Returns the type of the pushed value. - - - - - -


lua_gettop

-[-0, +0, –] -

int lua_gettop (lua_State *L);
- -

-Returns the index of the top element in the stack. -Because indices start at 1, -this result is equal to the number of elements in the stack; -in particular, 0 means an empty stack. - - - - - -


lua_getuservalue

-[-0, +1, –] -

int lua_getuservalue (lua_State *L, int index);
- -

-Pushes onto the stack the Lua value associated with the userdata -at the given index. - - -

-Returns the type of the pushed value. - - - - - -


lua_insert

-[-1, +1, –] -

void lua_insert (lua_State *L, int index);
- -

-Moves the top element into the given valid index, -shifting up the elements above this index to open space. -This function cannot be called with a pseudo-index, -because a pseudo-index is not an actual stack position. - - - - - -


lua_Integer

-
typedef ... lua_Integer;
- -

-The type of integers in Lua. - - -

-By default this type is long long, -(usually a 64-bit two-complement integer), -but that can be changed to long or int -(usually a 32-bit two-complement integer). -(See LUA_INT in luaconf.h.) - - -

-Lua also defines the constants -LUA_MININTEGER and LUA_MAXINTEGER, -with the minimum and the maximum values that fit in this type. - - - - - -


lua_isboolean

-[-0, +0, –] -

int lua_isboolean (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a boolean, -and 0 otherwise. - - - - - -


lua_iscfunction

-[-0, +0, –] -

int lua_iscfunction (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a C function, -and 0 otherwise. - - - - - -


lua_isfunction

-[-0, +0, –] -

int lua_isfunction (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a function -(either C or Lua), and 0 otherwise. - - - - - -


lua_isinteger

-[-0, +0, –] -

int lua_isinteger (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is an integer -(that is, the value is a number and is represented as an integer), -and 0 otherwise. - - - - - -


lua_islightuserdata

-[-0, +0, –] -

int lua_islightuserdata (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a light userdata, -and 0 otherwise. - - - - - -


lua_isnil

-[-0, +0, –] -

int lua_isnil (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is nil, -and 0 otherwise. - - - - - -


lua_isnone

-[-0, +0, –] -

int lua_isnone (lua_State *L, int index);
- -

-Returns 1 if the given index is not valid, -and 0 otherwise. - - - - - -


lua_isnoneornil

-[-0, +0, –] -

int lua_isnoneornil (lua_State *L, int index);
- -

-Returns 1 if the given index is not valid -or if the value at this index is nil, -and 0 otherwise. - - - - - -


lua_isnumber

-[-0, +0, –] -

int lua_isnumber (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a number -or a string convertible to a number, -and 0 otherwise. - - - - - -


lua_isstring

-[-0, +0, –] -

int lua_isstring (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a string -or a number (which is always convertible to a string), -and 0 otherwise. - - - - - -


lua_istable

-[-0, +0, –] -

int lua_istable (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a table, -and 0 otherwise. - - - - - -


lua_isthread

-[-0, +0, –] -

int lua_isthread (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a thread, -and 0 otherwise. - - - - - -


lua_isuserdata

-[-0, +0, –] -

int lua_isuserdata (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a userdata -(either full or light), and 0 otherwise. - - - - - -


lua_isyieldable

-[-0, +0, –] -

int lua_isyieldable (lua_State *L);
- -

-Returns 1 if the given coroutine can yield, -and 0 otherwise. - - - - - -


lua_KContext

-
typedef ... lua_KContext;
- -

-The type for continuation-function contexts. -It must be a numerical type. -This type is defined as intptr_t -when intptr_t is available, -so that it can store pointers too. -Otherwise, it is defined as ptrdiff_t. - - - - - -


lua_KFunction

-
typedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx);
- -

-Type for continuation functions (see §4.7). - - - - - -


lua_len

-[-0, +1, e] -

void lua_len (lua_State *L, int index);
- -

-Returns the length of the value at the given index. -It is equivalent to the '#' operator in Lua (see §3.4.7) and -may trigger a metamethod for the "length" event (see §2.4). -The result is pushed on the stack. - - - - - -


lua_load

-[-0, +1, –] -

int lua_load (lua_State *L,
-              lua_Reader reader,
-              void *data,
-              const char *chunkname,
-              const char *mode);
- -

-Loads a Lua chunk without running it. -If there are no errors, -lua_load pushes the compiled chunk as a Lua -function on top of the stack. -Otherwise, it pushes an error message. - - -

-The return values of lua_load are: - -

    - -
  • LUA_OK: no errors;
  • - -
  • LUA_ERRSYNTAX: -syntax error during precompilation;
  • - -
  • LUA_ERRMEM: -memory allocation error;
  • - -
  • LUA_ERRGCMM: -error while running a __gc metamethod. -(This error has no relation with the chunk being loaded. -It is generated by the garbage collector.) -
  • - -
- -

-The lua_load function uses a user-supplied reader function -to read the chunk (see lua_Reader). -The data argument is an opaque value passed to the reader function. - - -

-The chunkname argument gives a name to the chunk, -which is used for error messages and in debug information (see §4.9). - - -

-lua_load automatically detects whether the chunk is text or binary -and loads it accordingly (see program luac). -The string mode works as in function load, -with the addition that -a NULL value is equivalent to the string "bt". - - -

-lua_load uses the stack internally, -so the reader function must always leave the stack -unmodified when returning. - - -

-If the resulting function has upvalues, -its first upvalue is set to the value of the global environment -stored at index LUA_RIDX_GLOBALS in the registry (see §4.5). -When loading main chunks, -this upvalue will be the _ENV variable (see §2.2). -Other upvalues are initialized with nil. - - - - - -


lua_newstate

-[-0, +0, –] -

lua_State *lua_newstate (lua_Alloc f, void *ud);
- -

-Creates a new thread running in a new, independent state. -Returns NULL if it cannot create the thread or the state -(due to lack of memory). -The argument f is the allocator function; -Lua does all memory allocation for this state through this function. -The second argument, ud, is an opaque pointer that Lua -passes to the allocator in every call. - - - - - -


lua_newtable

-[-0, +1, e] -

void lua_newtable (lua_State *L);
- -

-Creates a new empty table and pushes it onto the stack. -It is equivalent to lua_createtable(L, 0, 0). - - - - - -


lua_newthread

-[-0, +1, e] -

lua_State *lua_newthread (lua_State *L);
- -

-Creates a new thread, pushes it on the stack, -and returns a pointer to a lua_State that represents this new thread. -The new thread returned by this function shares with the original thread -its global environment, -but has an independent execution stack. - - -

-There is no explicit function to close or to destroy a thread. -Threads are subject to garbage collection, -like any Lua object. - - - - - -


lua_newuserdata

-[-0, +1, e] -

void *lua_newuserdata (lua_State *L, size_t size);
- -

-This function allocates a new block of memory with the given size, -pushes onto the stack a new full userdata with the block address, -and returns this address. -The host program can freely use this memory. - - - - - -


lua_next

-[-1, +(2|0), e] -

int lua_next (lua_State *L, int index);
- -

-Pops a key from the stack, -and pushes a key–value pair from the table at the given index -(the "next" pair after the given key). -If there are no more elements in the table, -then lua_next returns 0 (and pushes nothing). - - -

-A typical traversal looks like this: - -

-     /* table is in the stack at index 't' */
-     lua_pushnil(L);  /* first key */
-     while (lua_next(L, t) != 0) {
-       /* uses 'key' (at index -2) and 'value' (at index -1) */
-       printf("%s - %s\n",
-              lua_typename(L, lua_type(L, -2)),
-              lua_typename(L, lua_type(L, -1)));
-       /* removes 'value'; keeps 'key' for next iteration */
-       lua_pop(L, 1);
-     }
-
- -

-While traversing a table, -do not call lua_tolstring directly on a key, -unless you know that the key is actually a string. -Recall that lua_tolstring may change -the value at the given index; -this confuses the next call to lua_next. - - -

-See function next for the caveats of modifying -the table during its traversal. - - - - - -


lua_Number

-
typedef double lua_Number;
- -

-The type of floats in Lua. - - -

-By default this type is double, -but that can be changed to a single float. -(See LUA_REAL in luaconf.h.) - - - - - -


lua_numbertointeger

-
int lua_numbertointeger (lua_Number n, lua_Integer *p);
- -

-Converts a Lua float to a Lua integer. -This macro assumes that n has an integral value. -If that value is within the range of Lua integers, -it is converted to an integer and assigned to *p. -The macro results in a boolean indicating whether the -conversion was successful. -(Note that this range test can be tricky to do -correctly without this macro, -due to roundings.) - - -

-This macro may evaluate its arguments more than once. - - - - - -


lua_pcall

-[-(nargs + 1), +(nresults|1), –] -

int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);
- -

-Calls a function in protected mode. - - -

-Both nargs and nresults have the same meaning as -in lua_call. -If there are no errors during the call, -lua_pcall behaves exactly like lua_call. -However, if there is any error, -lua_pcall catches it, -pushes a single value on the stack (the error message), -and returns an error code. -Like lua_call, -lua_pcall always removes the function -and its arguments from the stack. - - -

-If msgh is 0, -then the error message returned on the stack -is exactly the original error message. -Otherwise, msgh is the stack index of a -message handler. -(In the current implementation, this index cannot be a pseudo-index.) -In case of runtime errors, -this function will be called with the error message -and its return value will be the message -returned on the stack by lua_pcall. - - -

-Typically, the message handler is used to add more debug -information to the error message, such as a stack traceback. -Such information cannot be gathered after the return of lua_pcall, -since by then the stack has unwound. - - -

-The lua_pcall function returns one of the following constants -(defined in lua.h): - -

    - -
  • LUA_OK (0): -success.
  • - -
  • LUA_ERRRUN: -a runtime error. -
  • - -
  • LUA_ERRMEM: -memory allocation error. -For such errors, Lua does not call the message handler. -
  • - -
  • LUA_ERRERR: -error while running the message handler. -
  • - -
  • LUA_ERRGCMM: -error while running a __gc metamethod. -(This error typically has no relation with the function being called.) -
  • - -
- - - - -

lua_pcallk

-[-(nargs + 1), +(nresults|1), –] -

int lua_pcallk (lua_State *L,
-                int nargs,
-                int nresults,
-                int msgh,
-                lua_KContext ctx,
-                lua_KFunction k);
- -

-This function behaves exactly like lua_pcall, -but allows the called function to yield (see §4.7). - - - - - -


lua_pop

-[-n, +0, –] -

void lua_pop (lua_State *L, int n);
- -

-Pops n elements from the stack. - - - - - -


lua_pushboolean

-[-0, +1, –] -

void lua_pushboolean (lua_State *L, int b);
- -

-Pushes a boolean value with value b onto the stack. - - - - - -


lua_pushcclosure

-[-n, +1, e] -

void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
- -

-Pushes a new C closure onto the stack. - - -

-When a C function is created, -it is possible to associate some values with it, -thus creating a C closure (see §4.4); -these values are then accessible to the function whenever it is called. -To associate values with a C function, -first these values must be pushed onto the stack -(when there are multiple values, the first value is pushed first). -Then lua_pushcclosure -is called to create and push the C function onto the stack, -with the argument n telling how many values will be -associated with the function. -lua_pushcclosure also pops these values from the stack. - - -

-The maximum value for n is 255. - - -

-When n is zero, -this function creates a light C function, -which is just a pointer to the C function. -In that case, it never raises a memory error. - - - - - -


lua_pushcfunction

-[-0, +1, –] -

void lua_pushcfunction (lua_State *L, lua_CFunction f);
- -

-Pushes a C function onto the stack. -This function receives a pointer to a C function -and pushes onto the stack a Lua value of type function that, -when called, invokes the corresponding C function. - - -

-Any function to be registered in Lua must -follow the correct protocol to receive its parameters -and return its results (see lua_CFunction). - - -

-lua_pushcfunction is defined as a macro: - -

-     #define lua_pushcfunction(L,f)  lua_pushcclosure(L,f,0)
-

-Note that f is used twice. - - - - - -


lua_pushfstring

-[-0, +1, e] -

const char *lua_pushfstring (lua_State *L, const char *fmt, ...);
- -

-Pushes onto the stack a formatted string -and returns a pointer to this string. -It is similar to the ISO C function sprintf, -but has some important differences: - -

    - -
  • -You do not have to allocate space for the result: -the result is a Lua string and Lua takes care of memory allocation -(and deallocation, through garbage collection). -
  • - -
  • -The conversion specifiers are quite restricted. -There are no flags, widths, or precisions. -The conversion specifiers can only be -'%%' (inserts the character '%'), -'%s' (inserts a zero-terminated string, with no size restrictions), -'%f' (inserts a lua_Number), -'%L' (inserts a lua_Integer), -'%p' (inserts a pointer as a hexadecimal numeral), -'%d' (inserts an int), -'%c' (inserts an int as a one-byte character), and -'%U' (inserts a long int as a UTF-8 byte sequence). -
  • - -
- - - - -

lua_pushglobaltable

-[-0, +1, –] -

void lua_pushglobaltable (lua_State *L);
- -

-Pushes the global environment onto the stack. - - - - - -


lua_pushinteger

-[-0, +1, –] -

void lua_pushinteger (lua_State *L, lua_Integer n);
- -

-Pushes an integer with value n onto the stack. - - - - - -


lua_pushlightuserdata

-[-0, +1, –] -

void lua_pushlightuserdata (lua_State *L, void *p);
- -

-Pushes a light userdata onto the stack. - - -

-Userdata represent C values in Lua. -A light userdata represents a pointer, a void*. -It is a value (like a number): -you do not create it, it has no individual metatable, -and it is not collected (as it was never created). -A light userdata is equal to "any" -light userdata with the same C address. - - - - - -


lua_pushliteral

-[-0, +1, e] -

const char *lua_pushliteral (lua_State *L, const char *s);
- -

-This macro is equivalent to lua_pushlstring, -but can be used only when s is a literal string. -It automatically provides the string length. - - - - - -


lua_pushlstring

-[-0, +1, e] -

const char *lua_pushlstring (lua_State *L, const char *s, size_t len);
- -

-Pushes the string pointed to by s with size len -onto the stack. -Lua makes (or reuses) an internal copy of the given string, -so the memory at s can be freed or reused immediately after -the function returns. -The string can contain any binary data, -including embedded zeros. - - -

-Returns a pointer to the internal copy of the string. - - - - - -


lua_pushnil

-[-0, +1, –] -

void lua_pushnil (lua_State *L);
- -

-Pushes a nil value onto the stack. - - - - - -


lua_pushnumber

-[-0, +1, –] -

void lua_pushnumber (lua_State *L, lua_Number n);
- -

-Pushes a float with value n onto the stack. - - - - - -


lua_pushstring

-[-0, +1, e] -

const char *lua_pushstring (lua_State *L, const char *s);
- -

-Pushes the zero-terminated string pointed to by s -onto the stack. -Lua makes (or reuses) an internal copy of the given string, -so the memory at s can be freed or reused immediately after -the function returns. - - -

-Returns a pointer to the internal copy of the string. - - -

-If s is NULL, pushes nil and returns NULL. - - - - - -


lua_pushthread

-[-0, +1, –] -

int lua_pushthread (lua_State *L);
- -

-Pushes the thread represented by L onto the stack. -Returns 1 if this thread is the main thread of its state. - - - - - -


lua_pushvalue

-[-0, +1, –] -

void lua_pushvalue (lua_State *L, int index);
- -

-Pushes a copy of the element at the given index -onto the stack. - - - - - -


lua_pushvfstring

-[-0, +1, e] -

const char *lua_pushvfstring (lua_State *L,
-                              const char *fmt,
-                              va_list argp);
- -

-Equivalent to lua_pushfstring, except that it receives a va_list -instead of a variable number of arguments. - - - - - -


lua_rawequal

-[-0, +0, –] -

int lua_rawequal (lua_State *L, int index1, int index2);
- -

-Returns 1 if the two values in indices index1 and -index2 are primitively equal -(that is, without calling metamethods). -Otherwise returns 0. -Also returns 0 if any of the indices are not valid. - - - - - -


lua_rawget

-[-1, +1, –] -

int lua_rawget (lua_State *L, int index);
- -

-Similar to lua_gettable, but does a raw access -(i.e., without metamethods). - - - - - -


lua_rawgeti

-[-0, +1, –] -

int lua_rawgeti (lua_State *L, int index, lua_Integer n);
- -

-Pushes onto the stack the value t[n], -where t is the table at the given index. -The access is raw; -that is, it does not invoke metamethods. - - -

-Returns the type of the pushed value. - - - - - -


lua_rawgetp

-[-0, +1, –] -

int lua_rawgetp (lua_State *L, int index, const void *p);
- -

-Pushes onto the stack the value t[k], -where t is the table at the given index and -k is the pointer p represented as a light userdata. -The access is raw; -that is, it does not invoke metamethods. - - -

-Returns the type of the pushed value. - - - - - -


lua_rawlen

-[-0, +0, –] -

size_t lua_rawlen (lua_State *L, int index);
- -

-Returns the raw "length" of the value at the given index: -for strings, this is the string length; -for tables, this is the result of the length operator ('#') -with no metamethods; -for userdata, this is the size of the block of memory allocated -for the userdata; -for other values, it is 0. - - - - - -


lua_rawset

-[-2, +0, e] -

void lua_rawset (lua_State *L, int index);
- -

-Similar to lua_settable, but does a raw assignment -(i.e., without metamethods). - - - - - -


lua_rawseti

-[-1, +0, e] -

void lua_rawseti (lua_State *L, int index, lua_Integer i);
- -

-Does the equivalent of t[i] = v, -where t is the table at the given index -and v is the value at the top of the stack. - - -

-This function pops the value from the stack. -The assignment is raw; -that is, it does not invoke metamethods. - - - - - -


lua_rawsetp

-[-1, +0, e] -

void lua_rawsetp (lua_State *L, int index, const void *p);
- -

-Does the equivalent of t[k] = v, -where t is the table at the given index, -k is the pointer p represented as a light userdata, -and v is the value at the top of the stack. - - -

-This function pops the value from the stack. -The assignment is raw; -that is, it does not invoke metamethods. - - - - - -


lua_Reader

-
typedef const char * (*lua_Reader) (lua_State *L,
-                                    void *data,
-                                    size_t *size);
- -

-The reader function used by lua_load. -Every time it needs another piece of the chunk, -lua_load calls the reader, -passing along its data parameter. -The reader must return a pointer to a block of memory -with a new piece of the chunk -and set size to the block size. -The block must exist until the reader function is called again. -To signal the end of the chunk, -the reader must return NULL or set size to zero. -The reader function may return pieces of any size greater than zero. - - - - - -


lua_register

-[-0, +0, e] -

void lua_register (lua_State *L, const char *name, lua_CFunction f);
- -

-Sets the C function f as the new value of global name. -It is defined as a macro: - -

-     #define lua_register(L,n,f) \
-            (lua_pushcfunction(L, f), lua_setglobal(L, n))
-
- - - - -

lua_remove

-[-1, +0, –] -

void lua_remove (lua_State *L, int index);
- -

-Removes the element at the given valid index, -shifting down the elements above this index to fill the gap. -This function cannot be called with a pseudo-index, -because a pseudo-index is not an actual stack position. - - - - - -


lua_replace

-[-1, +0, –] -

void lua_replace (lua_State *L, int index);
- -

-Moves the top element into the given valid index -without shifting any element -(therefore replacing the value at the given index), -and then pops the top element. - - - - - -


lua_resume

-[-?, +?, –] -

int lua_resume (lua_State *L, lua_State *from, int nargs);
- -

-Starts and resumes a coroutine in a given thread. - - -

-To start a coroutine, -you push onto the thread stack the main function plus any arguments; -then you call lua_resume, -with nargs being the number of arguments. -This call returns when the coroutine suspends or finishes its execution. -When it returns, the stack contains all values passed to lua_yield, -or all values returned by the body function. -lua_resume returns -LUA_YIELD if the coroutine yields, -LUA_OK if the coroutine finishes its execution -without errors, -or an error code in case of errors (see lua_pcall). - - -

-In case of errors, -the stack is not unwound, -so you can use the debug API over it. -The error message is on the top of the stack. - - -

-To resume a coroutine, -you remove any results from the last lua_yield, -put on its stack only the values to -be passed as results from yield, -and then call lua_resume. - - -

-The parameter from represents the coroutine that is resuming L. -If there is no such coroutine, -this parameter can be NULL. - - - - - -


lua_rotate

-[-0, +0, –] -

void lua_rotate (lua_State *L, int idx, int n);
- -

-Rotates the stack elements from idx to the top n positions -in the direction of the top, for a positive n, -or -n positions in the direction of the bottom, -for a negative n. -The absolute value of n must not be greater than the size -of the slice being rotated. - - - - - -


lua_setallocf

-[-0, +0, –] -

void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);
- -

-Changes the allocator function of a given state to f -with user data ud. - - - - - -


lua_setfield

-[-1, +0, e] -

void lua_setfield (lua_State *L, int index, const char *k);
- -

-Does the equivalent to t[k] = v, -where t is the value at the given index -and v is the value at the top of the stack. - - -

-This function pops the value from the stack. -As in Lua, this function may trigger a metamethod -for the "newindex" event (see §2.4). - - - - - -


lua_setglobal

-[-1, +0, e] -

void lua_setglobal (lua_State *L, const char *name);
- -

-Pops a value from the stack and -sets it as the new value of global name. - - - - - -


lua_seti

-[-1, +0, e] -

void lua_seti (lua_State *L, int index, lua_Integer n);
- -

-Does the equivalent to t[n] = v, -where t is the value at the given index -and v is the value at the top of the stack. - - -

-This function pops the value from the stack. -As in Lua, this function may trigger a metamethod -for the "newindex" event (see §2.4). - - - - - -


lua_setmetatable

-[-1, +0, –] -

void lua_setmetatable (lua_State *L, int index);
- -

-Pops a table from the stack and -sets it as the new metatable for the value at the given index. - - - - - -


lua_settable

-[-2, +0, e] -

void lua_settable (lua_State *L, int index);
- -

-Does the equivalent to t[k] = v, -where t is the value at the given index, -v is the value at the top of the stack, -and k is the value just below the top. - - -

-This function pops both the key and the value from the stack. -As in Lua, this function may trigger a metamethod -for the "newindex" event (see §2.4). - - - - - -


lua_settop

-[-?, +?, –] -

void lua_settop (lua_State *L, int index);
- -

-Accepts any index, or 0, -and sets the stack top to this index. -If the new top is larger than the old one, -then the new elements are filled with nil. -If index is 0, then all stack elements are removed. - - - - - -


lua_setuservalue

-[-1, +0, –] -

void lua_setuservalue (lua_State *L, int index);
- -

-Pops a value from the stack and sets it as -the new value associated to the userdata at the given index. - - - - - -


lua_State

-
typedef struct lua_State lua_State;
- -

-An opaque structure that points to a thread and indirectly -(through the thread) to the whole state of a Lua interpreter. -The Lua library is fully reentrant: -it has no global variables. -All information about a state is accessible through this structure. - - -

-A pointer to this structure must be passed as the first argument to -every function in the library, except to lua_newstate, -which creates a Lua state from scratch. - - - - - -


lua_status

-[-0, +0, –] -

int lua_status (lua_State *L);
- -

-Returns the status of the thread L. - - -

-The status can be 0 (LUA_OK) for a normal thread, -an error code if the thread finished the execution -of a lua_resume with an error, -or LUA_YIELD if the thread is suspended. - - -

-You can only call functions in threads with status LUA_OK. -You can resume threads with status LUA_OK -(to start a new coroutine) or LUA_YIELD -(to resume a coroutine). - - - - - -


lua_stringtonumber

-[-0, +1, –] -

size_t lua_stringtonumber (lua_State *L, const char *s);
- -

-Converts the zero-terminated string s to a number, -pushes that number into the stack, -and returns the total size of the string, -that is, its length plus one. -The conversion can result in an integer or a float, -according to the lexical conventions of Lua (see §3.1). -The string may have leading and trailing spaces and a sign. -If the string is not a valid numeral, -returns 0 and pushes nothing. -(Note that the result can be used as a boolean, -true if the conversion succeeds.) - - - - - -


lua_toboolean

-[-0, +0, –] -

int lua_toboolean (lua_State *L, int index);
- -

-Converts the Lua value at the given index to a C boolean -value (0 or 1). -Like all tests in Lua, -lua_toboolean returns true for any Lua value -different from false and nil; -otherwise it returns false. -(If you want to accept only actual boolean values, -use lua_isboolean to test the value's type.) - - - - - -


lua_tocfunction

-[-0, +0, –] -

lua_CFunction lua_tocfunction (lua_State *L, int index);
- -

-Converts a value at the given index to a C function. -That value must be a C function; -otherwise, returns NULL. - - - - - -


lua_tointeger

-[-0, +0, –] -

lua_Integer lua_tointeger (lua_State *L, int index);
- -

-Equivalent to lua_tointegerx with isnum equal to NULL. - - - - - -


lua_tointegerx

-[-0, +0, –] -

lua_Integer lua_tointegerx (lua_State *L, int index, int *isnum);
- -

-Converts the Lua value at the given index -to the signed integral type lua_Integer. -The Lua value must be an integer, -or a number or string convertible to an integer (see §3.4.3); -otherwise, lua_tointegerx returns 0. - - -

-If isnum is not NULL, -its referent is assigned a boolean value that -indicates whether the operation succeeded. - - - - - -


lua_tolstring

-[-0, +0, e] -

const char *lua_tolstring (lua_State *L, int index, size_t *len);
- -

-Converts the Lua value at the given index to a C string. -If len is not NULL, -it also sets *len with the string length. -The Lua value must be a string or a number; -otherwise, the function returns NULL. -If the value is a number, -then lua_tolstring also -changes the actual value in the stack to a string. -(This change confuses lua_next -when lua_tolstring is applied to keys during a table traversal.) - - -

-lua_tolstring returns a fully aligned pointer -to a string inside the Lua state. -This string always has a zero ('\0') -after its last character (as in C), -but can contain other zeros in its body. - - -

-Because Lua has garbage collection, -there is no guarantee that the pointer returned by lua_tolstring -will be valid after the corresponding Lua value is removed from the stack. - - - - - -


lua_tonumber

-[-0, +0, –] -

lua_Number lua_tonumber (lua_State *L, int index);
- -

-Equivalent to lua_tonumberx with isnum equal to NULL. - - - - - -


lua_tonumberx

-[-0, +0, –] -

lua_Number lua_tonumberx (lua_State *L, int index, int *isnum);
- -

-Converts the Lua value at the given index -to the C type lua_Number (see lua_Number). -The Lua value must be a number or a string convertible to a number -(see §3.4.3); -otherwise, lua_tonumberx returns 0. - - -

-If isnum is not NULL, -its referent is assigned a boolean value that -indicates whether the operation succeeded. - - - - - -


lua_topointer

-[-0, +0, –] -

const void *lua_topointer (lua_State *L, int index);
- -

-Converts the value at the given index to a generic -C pointer (void*). -The value can be a userdata, a table, a thread, or a function; -otherwise, lua_topointer returns NULL. -Different objects will give different pointers. -There is no way to convert the pointer back to its original value. - - -

-Typically this function is used only for debug information. - - - - - -


lua_tostring

-[-0, +0, e] -

const char *lua_tostring (lua_State *L, int index);
- -

-Equivalent to lua_tolstring with len equal to NULL. - - - - - -


lua_tothread

-[-0, +0, –] -

lua_State *lua_tothread (lua_State *L, int index);
- -

-Converts the value at the given index to a Lua thread -(represented as lua_State*). -This value must be a thread; -otherwise, the function returns NULL. - - - - - -


lua_touserdata

-[-0, +0, –] -

void *lua_touserdata (lua_State *L, int index);
- -

-If the value at the given index is a full userdata, -returns its block address. -If the value is a light userdata, -returns its pointer. -Otherwise, returns NULL. - - - - - -


lua_type

-[-0, +0, –] -

int lua_type (lua_State *L, int index);
- -

-Returns the type of the value in the given valid index, -or LUA_TNONE for a non-valid (but acceptable) index. -The types returned by lua_type are coded by the following constants -defined in lua.h: -LUA_TNIL, -LUA_TNUMBER, -LUA_TBOOLEAN, -LUA_TSTRING, -LUA_TTABLE, -LUA_TFUNCTION, -LUA_TUSERDATA, -LUA_TTHREAD, -and -LUA_TLIGHTUSERDATA. - - - - - -


lua_typename

-[-0, +0, –] -

const char *lua_typename (lua_State *L, int tp);
- -

-Returns the name of the type encoded by the value tp, -which must be one the values returned by lua_type. - - - - - -


lua_Unsigned

-
typedef ... lua_Unsigned;
- -

-The unsigned version of lua_Integer. - - - - - -


lua_upvalueindex

-[-0, +0, –] -

int lua_upvalueindex (int i);
- -

-Returns the pseudo-index that represents the i-th upvalue of -the running function (see §4.4). - - - - - -


lua_version

-[-0, +0, v] -

const lua_Number *lua_version (lua_State *L);
- -

-Returns the address of the version number stored in the Lua core. -When called with a valid lua_State, -returns the address of the version used to create that state. -When called with NULL, -returns the address of the version running the call. - - - - - -


lua_Writer

-
typedef int (*lua_Writer) (lua_State *L,
-                           const void* p,
-                           size_t sz,
-                           void* ud);
- -

-The type of the writer function used by lua_dump. -Every time it produces another piece of chunk, -lua_dump calls the writer, -passing along the buffer to be written (p), -its size (sz), -and the data parameter supplied to lua_dump. - - -

-The writer returns an error code: -0 means no errors; -any other value means an error and stops lua_dump from -calling the writer again. - - - - - -


lua_xmove

-[-?, +?, –] -

void lua_xmove (lua_State *from, lua_State *to, int n);
- -

-Exchange values between different threads of the same state. - - -

-This function pops n values from the stack from, -and pushes them onto the stack to. - - - - - -


lua_yield

-[-?, +?, e] -

int lua_yield (lua_State *L, int nresults);
- -

-This function is equivalent to lua_yieldk, -but it has no continuation (see §4.7). -Therefore, when the thread resumes, -it continues the function that called -the function calling lua_yield. - - - - - -


lua_yieldk

-[-?, +?, e] -

int lua_yieldk (lua_State *L,
-                int nresults,
-                lua_KContext ctx,
-                lua_KFunction k);
- -

-Yields a coroutine (thread). - - -

-When a C function calls lua_yieldk, -the running coroutine suspends its execution, -and the call to lua_resume that started this coroutine returns. -The parameter nresults is the number of values from the stack -that will be passed as results to lua_resume. - - -

-When the coroutine is resumed again, -Lua calls the given continuation function k to continue -the execution of the C function that yielded (see §4.7). -This continuation function receives the same stack -from the previous function, -with the n results removed and -replaced by the arguments passed to lua_resume. -Moreover, -the continuation function receives the value ctx -that was passed to lua_yieldk. - - -

-Usually, this function does not return; -when the coroutine eventually resumes, -it continues executing the continuation function. -However, there is one special case, -which is when this function is called -from inside a line hook (see §4.9). -In that case, lua_yieldk should be called with no continuation -(probably in the form of lua_yield), -and the hook should return immediately after the call. -Lua will yield and, -when the coroutine resumes again, -it will continue the normal execution -of the (Lua) function that triggered the hook. - - -

-This function can raise an error if it is called from a thread -with a pending C call with no continuation function, -or it is called from a thread that is not running inside a resume -(e.g., the main thread). - - - - - - - -

4.9 – The Debug Interface

- -

-Lua has no built-in debugging facilities. -Instead, it offers a special interface -by means of functions and hooks. -This interface allows the construction of different -kinds of debuggers, profilers, and other tools -that need "inside information" from the interpreter. - - - -


lua_Debug

-
typedef struct lua_Debug {
-  int event;
-  const char *name;           /* (n) */
-  const char *namewhat;       /* (n) */
-  const char *what;           /* (S) */
-  const char *source;         /* (S) */
-  int currentline;            /* (l) */
-  int linedefined;            /* (S) */
-  int lastlinedefined;        /* (S) */
-  unsigned char nups;         /* (u) number of upvalues */
-  unsigned char nparams;      /* (u) number of parameters */
-  char isvararg;              /* (u) */
-  char istailcall;            /* (t) */
-  char short_src[LUA_IDSIZE]; /* (S) */
-  /* private part */
-  other fields
-} lua_Debug;
- -

-A structure used to carry different pieces of -information about a function or an activation record. -lua_getstack fills only the private part -of this structure, for later use. -To fill the other fields of lua_Debug with useful information, -call lua_getinfo. - - -

-The fields of lua_Debug have the following meaning: - -

    - -
  • source: -the name of the chunk that created the function. -If source starts with a '@', -it means that the function was defined in a file where -the file name follows the '@'. -If source starts with a '=', -the remainder of its contents describe the source in a user-dependent manner. -Otherwise, -the function was defined in a string where -source is that string. -
  • - -
  • short_src: -a "printable" version of source, to be used in error messages. -
  • - -
  • linedefined: -the line number where the definition of the function starts. -
  • - -
  • lastlinedefined: -the line number where the definition of the function ends. -
  • - -
  • what: -the string "Lua" if the function is a Lua function, -"C" if it is a C function, -"main" if it is the main part of a chunk. -
  • - -
  • currentline: -the current line where the given function is executing. -When no line information is available, -currentline is set to -1. -
  • - -
  • name: -a reasonable name for the given function. -Because functions in Lua are first-class values, -they do not have a fixed name: -some functions can be the value of multiple global variables, -while others can be stored only in a table field. -The lua_getinfo function checks how the function was -called to find a suitable name. -If it cannot find a name, -then name is set to NULL. -
  • - -
  • namewhat: -explains the name field. -The value of namewhat can be -"global", "local", "method", -"field", "upvalue", or "" (the empty string), -according to how the function was called. -(Lua uses the empty string when no other option seems to apply.) -
  • - -
  • istailcall: -true if this function invocation was called by a tail call. -In this case, the caller of this level is not in the stack. -
  • - -
  • nups: -the number of upvalues of the function. -
  • - -
  • nparams: -the number of fixed parameters of the function -(always 0 for C functions). -
  • - -
  • isvararg: -true if the function is a vararg function -(always true for C functions). -
  • - -
- - - - -

lua_gethook

-[-0, +0, –] -

lua_Hook lua_gethook (lua_State *L);
- -

-Returns the current hook function. - - - - - -


lua_gethookcount

-[-0, +0, –] -

int lua_gethookcount (lua_State *L);
- -

-Returns the current hook count. - - - - - -


lua_gethookmask

-[-0, +0, –] -

int lua_gethookmask (lua_State *L);
- -

-Returns the current hook mask. - - - - - -


lua_getinfo

-[-(0|1), +(0|1|2), e] -

int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);
- -

-Gets information about a specific function or function invocation. - - -

-To get information about a function invocation, -the parameter ar must be a valid activation record that was -filled by a previous call to lua_getstack or -given as argument to a hook (see lua_Hook). - - -

-To get information about a function you push it onto the stack -and start the what string with the character '>'. -(In that case, -lua_getinfo pops the function from the top of the stack.) -For instance, to know in which line a function f was defined, -you can write the following code: - -

-     lua_Debug ar;
-     lua_getglobal(L, "f");  /* get global 'f' */
-     lua_getinfo(L, ">S", &ar);
-     printf("%d\n", ar.linedefined);
-
- -

-Each character in the string what -selects some fields of the structure ar to be filled or -a value to be pushed on the stack: - -

    - -
  • 'n': fills in the field name and namewhat; -
  • - -
  • 'S': -fills in the fields source, short_src, -linedefined, lastlinedefined, and what; -
  • - -
  • 'l': fills in the field currentline; -
  • - -
  • 't': fills in the field istailcall; -
  • - -
  • 'u': fills in the fields -nups, nparams, and isvararg; -
  • - -
  • 'f': -pushes onto the stack the function that is -running at the given level; -
  • - -
  • 'L': -pushes onto the stack a table whose indices are the -numbers of the lines that are valid on the function. -(A valid line is a line with some associated code, -that is, a line where you can put a break point. -Non-valid lines include empty lines and comments.) - - -

    -If this option is given together with option 'f', -its table is pushed after the function. -

  • - -
- -

-This function returns 0 on error -(for instance, an invalid option in what). - - - - - -


lua_getlocal

-[-0, +(0|1), –] -

const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);
- -

-Gets information about a local variable of -a given activation record or a given function. - - -

-In the first case, -the parameter ar must be a valid activation record that was -filled by a previous call to lua_getstack or -given as argument to a hook (see lua_Hook). -The index n selects which local variable to inspect; -see debug.getlocal for details about variable indices -and names. - - -

-lua_getlocal pushes the variable's value onto the stack -and returns its name. - - -

-In the second case, ar must be NULL and the function -to be inspected must be at the top of the stack. -In this case, only parameters of Lua functions are visible -(as there is no information about what variables are active) -and no values are pushed onto the stack. - - -

-Returns NULL (and pushes nothing) -when the index is greater than -the number of active local variables. - - - - - -


lua_getstack

-[-0, +0, –] -

int lua_getstack (lua_State *L, int level, lua_Debug *ar);
- -

-Gets information about the interpreter runtime stack. - - -

-This function fills parts of a lua_Debug structure with -an identification of the activation record -of the function executing at a given level. -Level 0 is the current running function, -whereas level n+1 is the function that has called level n -(except for tail calls, which do not count on the stack). -When there are no errors, lua_getstack returns 1; -when called with a level greater than the stack depth, -it returns 0. - - - - - -


lua_getupvalue

-[-0, +(0|1), –] -

const char *lua_getupvalue (lua_State *L, int funcindex, int n);
- -

-Gets information about a closure's upvalue. -(For Lua functions, -upvalues are the external local variables that the function uses, -and that are consequently included in its closure.) -lua_getupvalue gets the index n of an upvalue, -pushes the upvalue's value onto the stack, -and returns its name. -funcindex points to the closure in the stack. -(Upvalues have no particular order, -as they are active through the whole function. -So, they are numbered in an arbitrary order.) - - -

-Returns NULL (and pushes nothing) -when the index is greater than the number of upvalues. -For C functions, this function uses the empty string "" -as a name for all upvalues. - - - - - -


lua_Hook

-
typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
- -

-Type for debugging hook functions. - - -

-Whenever a hook is called, its ar argument has its field -event set to the specific event that triggered the hook. -Lua identifies these events with the following constants: -LUA_HOOKCALL, LUA_HOOKRET, -LUA_HOOKTAILCALL, LUA_HOOKLINE, -and LUA_HOOKCOUNT. -Moreover, for line events, the field currentline is also set. -To get the value of any other field in ar, -the hook must call lua_getinfo. - - -

-For call events, event can be LUA_HOOKCALL, -the normal value, or LUA_HOOKTAILCALL, for a tail call; -in this case, there will be no corresponding return event. - - -

-While Lua is running a hook, it disables other calls to hooks. -Therefore, if a hook calls back Lua to execute a function or a chunk, -this execution occurs without any calls to hooks. - - -

-Hook functions cannot have continuations, -that is, they cannot call lua_yieldk, -lua_pcallk, or lua_callk with a non-null k. - - -

-Hook functions can yield under the following conditions: -Only count and line events can yield -and they cannot yield any value; -to yield a hook function must finish its execution -calling lua_yield with nresults equal to zero. - - - - - -


lua_sethook

-[-0, +0, –] -

void lua_sethook (lua_State *L, lua_Hook f, int mask, int count);
- -

-Sets the debugging hook function. - - -

-Argument f is the hook function. -mask specifies on which events the hook will be called: -it is formed by a bitwise or of the constants -LUA_MASKCALL, -LUA_MASKRET, -LUA_MASKLINE, -and LUA_MASKCOUNT. -The count argument is only meaningful when the mask -includes LUA_MASKCOUNT. -For each event, the hook is called as explained below: - -

    - -
  • The call hook: is called when the interpreter calls a function. -The hook is called just after Lua enters the new function, -before the function gets its arguments. -
  • - -
  • The return hook: is called when the interpreter returns from a function. -The hook is called just before Lua leaves the function. -There is no standard way to access the values -to be returned by the function. -
  • - -
  • The line hook: is called when the interpreter is about to -start the execution of a new line of code, -or when it jumps back in the code (even to the same line). -(This event only happens while Lua is executing a Lua function.) -
  • - -
  • The count hook: is called after the interpreter executes every -count instructions. -(This event only happens while Lua is executing a Lua function.) -
  • - -
- -

-A hook is disabled by setting mask to zero. - - - - - -


lua_setlocal

-[-(0|1), +0, –] -

const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);
- -

-Sets the value of a local variable of a given activation record. -Parameters ar and n are as in lua_getlocal -(see lua_getlocal). -lua_setlocal assigns the value at the top of the stack -to the variable and returns its name. -It also pops the value from the stack. - - -

-Returns NULL (and pops nothing) -when the index is greater than -the number of active local variables. - - - - - -


lua_setupvalue

-[-(0|1), +0, –] -

const char *lua_setupvalue (lua_State *L, int funcindex, int n);
- -

-Sets the value of a closure's upvalue. -It assigns the value at the top of the stack -to the upvalue and returns its name. -It also pops the value from the stack. -Parameters funcindex and n are as in the lua_getupvalue -(see lua_getupvalue). - - -

-Returns NULL (and pops nothing) -when the index is greater than the number of upvalues. - - - - - -


lua_upvalueid

-[-0, +0, –] -

void *lua_upvalueid (lua_State *L, int funcindex, int n);
- -

-Returns a unique identifier for the upvalue numbered n -from the closure at index funcindex. -Parameters funcindex and n are as in the lua_getupvalue -(see lua_getupvalue) -(but n cannot be greater than the number of upvalues). - - -

-These unique identifiers allow a program to check whether different -closures share upvalues. -Lua closures that share an upvalue -(that is, that access a same external local variable) -will return identical ids for those upvalue indices. - - - - - -


lua_upvaluejoin

-[-0, +0, –] -

void lua_upvaluejoin (lua_State *L, int funcindex1, int n1,
-                                    int funcindex2, int n2);
- -

-Make the n1-th upvalue of the Lua closure at index funcindex1 -refer to the n2-th upvalue of the Lua closure at index funcindex2. - - - - - - - -

5 – The Auxiliary Library

- -

- -The auxiliary library provides several convenient functions -to interface C with Lua. -While the basic API provides the primitive functions for all -interactions between C and Lua, -the auxiliary library provides higher-level functions for some -common tasks. - - -

-All functions and types from the auxiliary library -are defined in header file lauxlib.h and -have a prefix luaL_. - - -

-All functions in the auxiliary library are built on -top of the basic API, -and so they provide nothing that cannot be done with that API. -Nevertheless, the use of the auxiliary library ensures -more consistency to your code. - - -

-Several functions in the auxiliary library use internally some -extra stack slots. -When a function in the auxiliary library uses less than five slots, -it does not check the stack size; -it simply assumes that there are enough slots. - - -

-Several functions in the auxiliary library are used to -check C function arguments. -Because the error message is formatted for arguments -(e.g., "bad argument #1"), -you should not use these functions for other stack values. - - -

-Functions called luaL_check* -always raise an error if the check is not satisfied. - - - -

5.1 – Functions and Types

- -

-Here we list all functions and types from the auxiliary library -in alphabetical order. - - - -


luaL_addchar

-[-?, +?, e] -

void luaL_addchar (luaL_Buffer *B, char c);
- -

-Adds the byte c to the buffer B -(see luaL_Buffer). - - - - - -


luaL_addlstring

-[-?, +?, e] -

void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l);
- -

-Adds the string pointed to by s with length l to -the buffer B -(see luaL_Buffer). -The string can contain embedded zeros. - - - - - -


luaL_addsize

-[-?, +?, e] -

void luaL_addsize (luaL_Buffer *B, size_t n);
- -

-Adds to the buffer B (see luaL_Buffer) -a string of length n previously copied to the -buffer area (see luaL_prepbuffer). - - - - - -


luaL_addstring

-[-?, +?, e] -

void luaL_addstring (luaL_Buffer *B, const char *s);
- -

-Adds the zero-terminated string pointed to by s -to the buffer B -(see luaL_Buffer). - - - - - -


luaL_addvalue

-[-1, +?, e] -

void luaL_addvalue (luaL_Buffer *B);
- -

-Adds the value at the top of the stack -to the buffer B -(see luaL_Buffer). -Pops the value. - - -

-This is the only function on string buffers that can (and must) -be called with an extra element on the stack, -which is the value to be added to the buffer. - - - - - -


luaL_argcheck

-[-0, +0, v] -

void luaL_argcheck (lua_State *L,
-                    int cond,
-                    int arg,
-                    const char *extramsg);
- -

-Checks whether cond is true. -If it is not, raises an error with a standard message (see luaL_argerror). - - - - - -


luaL_argerror

-[-0, +0, v] -

int luaL_argerror (lua_State *L, int arg, const char *extramsg);
- -

-Raises an error reporting a problem with argument arg -of the C function that called it, -using a standard message -that includes extramsg as a comment: - -

-     bad argument #arg to 'funcname' (extramsg)
-

-This function never returns. - - - - - -


luaL_Buffer

-
typedef struct luaL_Buffer luaL_Buffer;
- -

-Type for a string buffer. - - -

-A string buffer allows C code to build Lua strings piecemeal. -Its pattern of use is as follows: - -

    - -
  • First declare a variable b of type luaL_Buffer.
  • - -
  • Then initialize it with a call luaL_buffinit(L, &b).
  • - -
  • -Then add string pieces to the buffer calling any of -the luaL_add* functions. -
  • - -
  • -Finish by calling luaL_pushresult(&b). -This call leaves the final string on the top of the stack. -
  • - -
- -

-If you know beforehand the total size of the resulting string, -you can use the buffer like this: - -

    - -
  • First declare a variable b of type luaL_Buffer.
  • - -
  • Then initialize it and preallocate a space of -size sz with a call luaL_buffinitsize(L, &b, sz).
  • - -
  • Then copy the string into that space.
  • - -
  • -Finish by calling luaL_pushresultsize(&b, sz), -where sz is the total size of the resulting string -copied into that space. -
  • - -
- -

-During its normal operation, -a string buffer uses a variable number of stack slots. -So, while using a buffer, you cannot assume that you know where -the top of the stack is. -You can use the stack between successive calls to buffer operations -as long as that use is balanced; -that is, -when you call a buffer operation, -the stack is at the same level -it was immediately after the previous buffer operation. -(The only exception to this rule is luaL_addvalue.) -After calling luaL_pushresult the stack is back to its -level when the buffer was initialized, -plus the final string on its top. - - - - - -


luaL_buffinit

-[-0, +0, –] -

void luaL_buffinit (lua_State *L, luaL_Buffer *B);
- -

-Initializes a buffer B. -This function does not allocate any space; -the buffer must be declared as a variable -(see luaL_Buffer). - - - - - -


luaL_buffinitsize

-[-?, +?, e] -

char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz);
- -

-Equivalent to the sequence -luaL_buffinit, luaL_prepbuffsize. - - - - - -


luaL_callmeta

-[-0, +(0|1), e] -

int luaL_callmeta (lua_State *L, int obj, const char *e);
- -

-Calls a metamethod. - - -

-If the object at index obj has a metatable and this -metatable has a field e, -this function calls this field passing the object as its only argument. -In this case this function returns true and pushes onto the -stack the value returned by the call. -If there is no metatable or no metamethod, -this function returns false (without pushing any value on the stack). - - - - - -


luaL_checkany

-[-0, +0, v] -

void luaL_checkany (lua_State *L, int arg);
- -

-Checks whether the function has an argument -of any type (including nil) at position arg. - - - - - -


luaL_checkinteger

-[-0, +0, v] -

lua_Integer luaL_checkinteger (lua_State *L, int arg);
- -

-Checks whether the function argument arg is an integer -(or can be converted to an integer) -and returns this integer cast to a lua_Integer. - - - - - -


luaL_checklstring

-[-0, +0, v] -

const char *luaL_checklstring (lua_State *L, int arg, size_t *l);
- -

-Checks whether the function argument arg is a string -and returns this string; -if l is not NULL fills *l -with the string's length. - - -

-This function uses lua_tolstring to get its result, -so all conversions and caveats of that function apply here. - - - - - -


luaL_checknumber

-[-0, +0, v] -

lua_Number luaL_checknumber (lua_State *L, int arg);
- -

-Checks whether the function argument arg is a number -and returns this number. - - - - - -


luaL_checkoption

-[-0, +0, v] -

int luaL_checkoption (lua_State *L,
-                      int arg,
-                      const char *def,
-                      const char *const lst[]);
- -

-Checks whether the function argument arg is a string and -searches for this string in the array lst -(which must be NULL-terminated). -Returns the index in the array where the string was found. -Raises an error if the argument is not a string or -if the string cannot be found. - - -

-If def is not NULL, -the function uses def as a default value when -there is no argument arg or when this argument is nil. - - -

-This is a useful function for mapping strings to C enums. -(The usual convention in Lua libraries is -to use strings instead of numbers to select options.) - - - - - -


luaL_checkstack

-[-0, +0, v] -

void luaL_checkstack (lua_State *L, int sz, const char *msg);
- -

-Grows the stack size to top + sz elements, -raising an error if the stack cannot grow to that size. -msg is an additional text to go into the error message -(or NULL for no additional text). - - - - - -


luaL_checkstring

-[-0, +0, v] -

const char *luaL_checkstring (lua_State *L, int arg);
- -

-Checks whether the function argument arg is a string -and returns this string. - - -

-This function uses lua_tolstring to get its result, -so all conversions and caveats of that function apply here. - - - - - -


luaL_checktype

-[-0, +0, v] -

void luaL_checktype (lua_State *L, int arg, int t);
- -

-Checks whether the function argument arg has type t. -See lua_type for the encoding of types for t. - - - - - -


luaL_checkudata

-[-0, +0, v] -

void *luaL_checkudata (lua_State *L, int arg, const char *tname);
- -

-Checks whether the function argument arg is a userdata -of the type tname (see luaL_newmetatable) and -returns the userdata address (see lua_touserdata). - - - - - -


luaL_checkversion

-[-0, +0, –] -

void luaL_checkversion (lua_State *L);
- -

-Checks whether the core running the call, -the core that created the Lua state, -and the code making the call are all using the same version of Lua. -Also checks whether the core running the call -and the core that created the Lua state -are using the same address space. - - - - - -


luaL_dofile

-[-0, +?, e] -

int luaL_dofile (lua_State *L, const char *filename);
- -

-Loads and runs the given file. -It is defined as the following macro: - -

-     (luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
-

-It returns false if there are no errors -or true in case of errors. - - - - - -


luaL_dostring

-[-0, +?, –] -

int luaL_dostring (lua_State *L, const char *str);
- -

-Loads and runs the given string. -It is defined as the following macro: - -

-     (luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
-

-It returns false if there are no errors -or true in case of errors. - - - - - -


luaL_error

-[-0, +0, v] -

int luaL_error (lua_State *L, const char *fmt, ...);
- -

-Raises an error. -The error message format is given by fmt -plus any extra arguments, -following the same rules of lua_pushfstring. -It also adds at the beginning of the message the file name and -the line number where the error occurred, -if this information is available. - - -

-This function never returns, -but it is an idiom to use it in C functions -as return luaL_error(args). - - - - - -


luaL_execresult

-[-0, +3, e] -

int luaL_execresult (lua_State *L, int stat);
- -

-This function produces the return values for -process-related functions in the standard library -(os.execute and io.close). - - - - - -


luaL_fileresult

-[-0, +(1|3), e] -

int luaL_fileresult (lua_State *L, int stat, const char *fname);
- -

-This function produces the return values for -file-related functions in the standard library -(io.open, os.rename, file:seek, etc.). - - - - - -


luaL_getmetafield

-[-0, +(0|1), e] -

int luaL_getmetafield (lua_State *L, int obj, const char *e);
- -

-Pushes onto the stack the field e from the metatable -of the object at index obj and returns the type of pushed value. -If the object does not have a metatable, -or if the metatable does not have this field, -pushes nothing and returns LUA_TNIL. - - - - - -


luaL_getmetatable

-[-0, +1, –] -

int luaL_getmetatable (lua_State *L, const char *tname);
- -

-Pushes onto the stack the metatable associated with name tname -in the registry (see luaL_newmetatable). -If there is no metatable associated with tname, -returns false and pushes nil. - - - - - -


luaL_getsubtable

-[-0, +1, e] -

int luaL_getsubtable (lua_State *L, int idx, const char *fname);
- -

-Ensures that the value t[fname], -where t is the value at index idx, -is a table, -and pushes that table onto the stack. -Returns true if it finds a previous table there -and false if it creates a new table. - - - - - -


luaL_gsub

-[-0, +1, e] -

const char *luaL_gsub (lua_State *L,
-                       const char *s,
-                       const char *p,
-                       const char *r);
- -

-Creates a copy of string s by replacing -any occurrence of the string p -with the string r. -Pushes the resulting string on the stack and returns it. - - - - - -


luaL_len

-[-0, +0, e] -

lua_Integer luaL_len (lua_State *L, int index);
- -

-Returns the "length" of the value at the given index -as a number; -it is equivalent to the '#' operator in Lua (see §3.4.7). -Raises an error if the result of the operation is not an integer. -(This case only can happen through metamethods.) - - - - - -


luaL_loadbuffer

-[-0, +1, –] -

int luaL_loadbuffer (lua_State *L,
-                     const char *buff,
-                     size_t sz,
-                     const char *name);
- -

-Equivalent to luaL_loadbufferx with mode equal to NULL. - - - - - -


luaL_loadbufferx

-[-0, +1, –] -

int luaL_loadbufferx (lua_State *L,
-                      const char *buff,
-                      size_t sz,
-                      const char *name,
-                      const char *mode);
- -

-Loads a buffer as a Lua chunk. -This function uses lua_load to load the chunk in the -buffer pointed to by buff with size sz. - - -

-This function returns the same results as lua_load. -name is the chunk name, -used for debug information and error messages. -The string mode works as in function lua_load. - - - - - -


luaL_loadfile

-[-0, +1, e] -

int luaL_loadfile (lua_State *L, const char *filename);
- -

-Equivalent to luaL_loadfilex with mode equal to NULL. - - - - - -


luaL_loadfilex

-[-0, +1, e] -

int luaL_loadfilex (lua_State *L, const char *filename,
-                                            const char *mode);
- -

-Loads a file as a Lua chunk. -This function uses lua_load to load the chunk in the file -named filename. -If filename is NULL, -then it loads from the standard input. -The first line in the file is ignored if it starts with a #. - - -

-The string mode works as in function lua_load. - - -

-This function returns the same results as lua_load, -but it has an extra error code LUA_ERRFILE -if it cannot open/read the file or the file has a wrong mode. - - -

-As lua_load, this function only loads the chunk; -it does not run it. - - - - - -


luaL_loadstring

-[-0, +1, –] -

int luaL_loadstring (lua_State *L, const char *s);
- -

-Loads a string as a Lua chunk. -This function uses lua_load to load the chunk in -the zero-terminated string s. - - -

-This function returns the same results as lua_load. - - -

-Also as lua_load, this function only loads the chunk; -it does not run it. - - - - - -


luaL_newlib

-[-0, +1, e] -

void luaL_newlib (lua_State *L, const luaL_Reg l[]);
- -

-Creates a new table and registers there -the functions in list l. - - -

-It is implemented as the following macro: - -

-     (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
-

-The array l must be the actual array, -not a pointer to it. - - - - - -


luaL_newlibtable

-[-0, +1, e] -

void luaL_newlibtable (lua_State *L, const luaL_Reg l[]);
- -

-Creates a new table with a size optimized -to store all entries in the array l -(but does not actually store them). -It is intended to be used in conjunction with luaL_setfuncs -(see luaL_newlib). - - -

-It is implemented as a macro. -The array l must be the actual array, -not a pointer to it. - - - - - -


luaL_newmetatable

-[-0, +1, e] -

int luaL_newmetatable (lua_State *L, const char *tname);
- -

-If the registry already has the key tname, -returns 0. -Otherwise, -creates a new table to be used as a metatable for userdata, -adds to this new table the pair __name = tname, -adds to the registry the pair [tname] = new table, -and returns 1. -(The entry __name is used by some error-reporting functions.) - - -

-In both cases pushes onto the stack the final value associated -with tname in the registry. - - - - - -


luaL_newstate

-[-0, +0, –] -

lua_State *luaL_newstate (void);
- -

-Creates a new Lua state. -It calls lua_newstate with an -allocator based on the standard C realloc function -and then sets a panic function (see §4.6) that prints -an error message to the standard error output in case of fatal -errors. - - -

-Returns the new state, -or NULL if there is a memory allocation error. - - - - - -


luaL_openlibs

-[-0, +0, e] -

void luaL_openlibs (lua_State *L);
- -

-Opens all standard Lua libraries into the given state. - - - - - -


luaL_optinteger

-[-0, +0, v] -

lua_Integer luaL_optinteger (lua_State *L,
-                             int arg,
-                             lua_Integer d);
- -

-If the function argument arg is an integer -(or convertible to an integer), -returns this integer. -If this argument is absent or is nil, -returns d. -Otherwise, raises an error. - - - - - -


luaL_optlstring

-[-0, +0, v] -

const char *luaL_optlstring (lua_State *L,
-                             int arg,
-                             const char *d,
-                             size_t *l);
- -

-If the function argument arg is a string, -returns this string. -If this argument is absent or is nil, -returns d. -Otherwise, raises an error. - - -

-If l is not NULL, -fills the position *l with the result's length. - - - - - -


luaL_optnumber

-[-0, +0, v] -

lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number d);
- -

-If the function argument arg is a number, -returns this number. -If this argument is absent or is nil, -returns d. -Otherwise, raises an error. - - - - - -


luaL_optstring

-[-0, +0, v] -

const char *luaL_optstring (lua_State *L,
-                            int arg,
-                            const char *d);
- -

-If the function argument arg is a string, -returns this string. -If this argument is absent or is nil, -returns d. -Otherwise, raises an error. - - - - - -


luaL_prepbuffer

-[-?, +?, e] -

char *luaL_prepbuffer (luaL_Buffer *B);
- -

-Equivalent to luaL_prepbuffsize -with the predefined size LUAL_BUFFERSIZE. - - - - - -


luaL_prepbuffsize

-[-?, +?, e] -

char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz);
- -

-Returns an address to a space of size sz -where you can copy a string to be added to buffer B -(see luaL_Buffer). -After copying the string into this space you must call -luaL_addsize with the size of the string to actually add -it to the buffer. - - - - - -


luaL_pushresult

-[-?, +1, e] -

void luaL_pushresult (luaL_Buffer *B);
- -

-Finishes the use of buffer B leaving the final string on -the top of the stack. - - - - - -


luaL_pushresultsize

-[-?, +1, e] -

void luaL_pushresultsize (luaL_Buffer *B, size_t sz);
- -

-Equivalent to the sequence luaL_addsize, luaL_pushresult. - - - - - -


luaL_ref

-[-1, +0, e] -

int luaL_ref (lua_State *L, int t);
- -

-Creates and returns a reference, -in the table at index t, -for the object at the top of the stack (and pops the object). - - -

-A reference is a unique integer key. -As long as you do not manually add integer keys into table t, -luaL_ref ensures the uniqueness of the key it returns. -You can retrieve an object referred by reference r -by calling lua_rawgeti(L, t, r). -Function luaL_unref frees a reference and its associated object. - - -

-If the object at the top of the stack is nil, -luaL_ref returns the constant LUA_REFNIL. -The constant LUA_NOREF is guaranteed to be different -from any reference returned by luaL_ref. - - - - - -


luaL_Reg

-
typedef struct luaL_Reg {
-  const char *name;
-  lua_CFunction func;
-} luaL_Reg;
- -

-Type for arrays of functions to be registered by -luaL_setfuncs. -name is the function name and func is a pointer to -the function. -Any array of luaL_Reg must end with a sentinel entry -in which both name and func are NULL. - - - - - -


luaL_requiref

-[-0, +1, e] -

void luaL_requiref (lua_State *L, const char *modname,
-                    lua_CFunction openf, int glb);
- -

-If modname is not already present in package.loaded, -calls function openf with string modname as an argument -and sets the call result in package.loaded[modname], -as if that function has been called through require. - - -

-If glb is true, -also stores the module into global modname. - - -

-Leaves a copy of the module on the stack. - - - - - -


luaL_setfuncs

-[-nup, +0, e] -

void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);
- -

-Registers all functions in the array l -(see luaL_Reg) into the table on the top of the stack -(below optional upvalues, see next). - - -

-When nup is not zero, -all functions are created sharing nup upvalues, -which must be previously pushed on the stack -on top of the library table. -These values are popped from the stack after the registration. - - - - - -


luaL_setmetatable

-[-0, +0, –] -

void luaL_setmetatable (lua_State *L, const char *tname);
- -

-Sets the metatable of the object at the top of the stack -as the metatable associated with name tname -in the registry (see luaL_newmetatable). - - - - - -


luaL_Stream

-
typedef struct luaL_Stream {
-  FILE *f;
-  lua_CFunction closef;
-} luaL_Stream;
- -

-The standard representation for file handles, -which is used by the standard I/O library. - - -

-A file handle is implemented as a full userdata, -with a metatable called LUA_FILEHANDLE -(where LUA_FILEHANDLE is a macro with the actual metatable's name). -The metatable is created by the I/O library -(see luaL_newmetatable). - - -

-This userdata must start with the structure luaL_Stream; -it can contain other data after this initial structure. -Field f points to the corresponding C stream -(or it can be NULL to indicate an incompletely created handle). -Field closef points to a Lua function -that will be called to close the stream -when the handle is closed or collected; -this function receives the file handle as its sole argument and -must return either true (in case of success) -or nil plus an error message (in case of error). -Once Lua calls this field, -the field value is changed to NULL -to signal that the handle is closed. - - - - - -


luaL_testudata

-[-0, +0, e] -

void *luaL_testudata (lua_State *L, int arg, const char *tname);
- -

-This function works like luaL_checkudata, -except that, when the test fails, -it returns NULL instead of raising an error. - - - - - -


luaL_tolstring

-[-0, +1, e] -

const char *luaL_tolstring (lua_State *L, int idx, size_t *len);
- -

-Converts any Lua value at the given index to a C string -in a reasonable format. -The resulting string is pushed onto the stack and also -returned by the function. -If len is not NULL, -the function also sets *len with the string length. - - -

-If the value has a metatable with a "__tostring" field, -then luaL_tolstring calls the corresponding metamethod -with the value as argument, -and uses the result of the call as its result. - - - - - -


luaL_traceback

-[-0, +1, e] -

void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,
-                     int level);
- -

-Creates and pushes a traceback of the stack L1. -If msg is not NULL it is appended -at the beginning of the traceback. -The level parameter tells at which level -to start the traceback. - - - - - -


luaL_typename

-[-0, +0, –] -

const char *luaL_typename (lua_State *L, int index);
- -

-Returns the name of the type of the value at the given index. - - - - - -


luaL_unref

-[-0, +0, –] -

void luaL_unref (lua_State *L, int t, int ref);
- -

-Releases reference ref from the table at index t -(see luaL_ref). -The entry is removed from the table, -so that the referred object can be collected. -The reference ref is also freed to be used again. - - -

-If ref is LUA_NOREF or LUA_REFNIL, -luaL_unref does nothing. - - - - - -


luaL_where

-[-0, +1, e] -

void luaL_where (lua_State *L, int lvl);
- -

-Pushes onto the stack a string identifying the current position -of the control at level lvl in the call stack. -Typically this string has the following format: - -

-     chunkname:currentline:
-

-Level 0 is the running function, -level 1 is the function that called the running function, -etc. - - -

-This function is used to build a prefix for error messages. - - - - - - - -

6 – Standard Libraries

- -

-The standard Lua libraries provide useful functions -that are implemented directly through the C API. -Some of these functions provide essential services to the language -(e.g., type and getmetatable); -others provide access to "outside" services (e.g., I/O); -and others could be implemented in Lua itself, -but are quite useful or have critical performance requirements that -deserve an implementation in C (e.g., table.sort). - - -

-All libraries are implemented through the official C API -and are provided as separate C modules. -Currently, Lua has the following standard libraries: - -

    - -
  • basic library (§6.1);
  • - -
  • coroutine library (§6.2);
  • - -
  • package library (§6.3);
  • - -
  • string manipulation (§6.4);
  • - -
  • basic UTF-8 support (§6.5);
  • - -
  • table manipulation (§6.6);
  • - -
  • mathematical functions (§6.7) (sin, log, etc.);
  • - -
  • input and output (§6.8);
  • - -
  • operating system facilities (§6.9);
  • - -
  • debug facilities (§6.10).
  • - -

-Except for the basic and the package libraries, -each library provides all its functions as fields of a global table -or as methods of its objects. - - -

-To have access to these libraries, -the C host program should call the luaL_openlibs function, -which opens all standard libraries. -Alternatively, -the host program can open them individually by using -luaL_requiref to call -luaopen_base (for the basic library), -luaopen_package (for the package library), -luaopen_coroutine (for the coroutine library), -luaopen_string (for the string library), -luaopen_utf8 (for the UTF8 library), -luaopen_table (for the table library), -luaopen_math (for the mathematical library), -luaopen_io (for the I/O library), -luaopen_os (for the operating system library), -and luaopen_debug (for the debug library). -These functions are declared in lualib.h. - - - -

6.1 – Basic Functions

- -

-The basic library provides core functions to Lua. -If you do not include this library in your application, -you should check carefully whether you need to provide -implementations for some of its facilities. - - -

-


assert (v [, message])

- - -

-Calls error if -the value of its argument v is false (i.e., nil or false); -otherwise, returns all its arguments. -In case of error, -message is the error object; -when absent, it defaults to "assertion failed!" - - - - -

-


collectgarbage ([opt [, arg]])

- - -

-This function is a generic interface to the garbage collector. -It performs different functions according to its first argument, opt: - -

    - -
  • "collect": -performs a full garbage-collection cycle. -This is the default option. -
  • - -
  • "stop": -stops automatic execution of the garbage collector. -The collector will run only when explicitly invoked, -until a call to restart it. -
  • - -
  • "restart": -restarts automatic execution of the garbage collector. -
  • - -
  • "count": -returns the total memory in use by Lua in Kbytes. -The value has a fractional part, -so that it multiplied by 1024 -gives the exact number of bytes in use by Lua -(except for overflows). -
  • - -
  • "step": -performs a garbage-collection step. -The step "size" is controlled by arg. -With a zero value, -the collector will perform one basic (indivisible) step. -For non-zero values, -the collector will perform as if that amount of memory -(in KBytes) had been allocated by Lua. -Returns true if the step finished a collection cycle. -
  • - -
  • "setpause": -sets arg as the new value for the pause of -the collector (see §2.5). -Returns the previous value for pause. -
  • - -
  • "setstepmul": -sets arg as the new value for the step multiplier of -the collector (see §2.5). -Returns the previous value for step. -
  • - -
  • "isrunning": -returns a boolean that tells whether the collector is running -(i.e., not stopped). -
  • - -
- - - -

-


dofile ([filename])

-Opens the named file and executes its contents as a Lua chunk. -When called without arguments, -dofile executes the contents of the standard input (stdin). -Returns all values returned by the chunk. -In case of errors, dofile propagates the error -to its caller (that is, dofile does not run in protected mode). - - - - -

-


error (message [, level])

-Terminates the last protected function called -and returns message as the error object. -Function error never returns. - - -

-Usually, error adds some information about the error position -at the beginning of the message, if the message is a string. -The level argument specifies how to get the error position. -With level 1 (the default), the error position is where the -error function was called. -Level 2 points the error to where the function -that called error was called; and so on. -Passing a level 0 avoids the addition of error position information -to the message. - - - - -

-


_G

-A global variable (not a function) that -holds the global environment (see §2.2). -Lua itself does not use this variable; -changing its value does not affect any environment, -nor vice versa. - - - - -

-


getmetatable (object)

- - -

-If object does not have a metatable, returns nil. -Otherwise, -if the object's metatable has a "__metatable" field, -returns the associated value. -Otherwise, returns the metatable of the given object. - - - - -

-


ipairs (t)

- - -

-Returns three values (an iterator function, the table t, and 0) -so that the construction - -

-     for i,v in ipairs(t) do body end
-

-will iterate over the key–value pairs -(1,t[1]), (2,t[2]), ..., -up to the first nil value. - - - - -

-


load (chunk [, chunkname [, mode [, env]]])

- - -

-Loads a chunk. - - -

-If chunk is a string, the chunk is this string. -If chunk is a function, -load calls it repeatedly to get the chunk pieces. -Each call to chunk must return a string that concatenates -with previous results. -A return of an empty string, nil, or no value signals the end of the chunk. - - -

-If there are no syntactic errors, -returns the compiled chunk as a function; -otherwise, returns nil plus the error message. - - -

-If the resulting function has upvalues, -the first upvalue is set to the value of env, -if that parameter is given, -or to the value of the global environment. -Other upvalues are initialized with nil. -(When you load a main chunk, -the resulting function will always have exactly one upvalue, -the _ENV variable (see §2.2). -However, -when you load a binary chunk created from a function (see string.dump), -the resulting function can have an arbitrary number of upvalues.) -All upvalues are fresh, that is, -they are not shared with any other function. - - -

-chunkname is used as the name of the chunk for error messages -and debug information (see §4.9). -When absent, -it defaults to chunk, if chunk is a string, -or to "=(load)" otherwise. - - -

-The string mode controls whether the chunk can be text or binary -(that is, a precompiled chunk). -It may be the string "b" (only binary chunks), -"t" (only text chunks), -or "bt" (both binary and text). -The default is "bt". - - -

-Lua does not check the consistency of binary chunks. -Maliciously crafted binary chunks can crash -the interpreter. - - - - -

-


loadfile ([filename [, mode [, env]]])

- - -

-Similar to load, -but gets the chunk from file filename -or from the standard input, -if no file name is given. - - - - -

-


next (table [, index])

- - -

-Allows a program to traverse all fields of a table. -Its first argument is a table and its second argument -is an index in this table. -next returns the next index of the table -and its associated value. -When called with nil as its second argument, -next returns an initial index -and its associated value. -When called with the last index, -or with nil in an empty table, -next returns nil. -If the second argument is absent, then it is interpreted as nil. -In particular, -you can use next(t) to check whether a table is empty. - - -

-The order in which the indices are enumerated is not specified, -even for numeric indices. -(To traverse a table in numeric order, -use a numerical for.) - - -

-The behavior of next is undefined if, -during the traversal, -you assign any value to a non-existent field in the table. -You may however modify existing fields. -In particular, you may clear existing fields. - - - - -

-


pairs (t)

- - -

-If t has a metamethod __pairs, -calls it with t as argument and returns the first three -results from the call. - - -

-Otherwise, -returns three values: the next function, the table t, and nil, -so that the construction - -

-     for k,v in pairs(t) do body end
-

-will iterate over all key–value pairs of table t. - - -

-See function next for the caveats of modifying -the table during its traversal. - - - - -

-


pcall (f [, arg1, ···])

- - -

-Calls function f with -the given arguments in protected mode. -This means that any error inside f is not propagated; -instead, pcall catches the error -and returns a status code. -Its first result is the status code (a boolean), -which is true if the call succeeds without errors. -In such case, pcall also returns all results from the call, -after this first result. -In case of any error, pcall returns false plus the error message. - - - - -

-


print (···)

-Receives any number of arguments -and prints their values to stdout, -using the tostring function to convert each argument to a string. -print is not intended for formatted output, -but only as a quick way to show a value, -for instance for debugging. -For complete control over the output, -use string.format and io.write. - - - - -

-


rawequal (v1, v2)

-Checks whether v1 is equal to v2, -without invoking any metamethod. -Returns a boolean. - - - - -

-


rawget (table, index)

-Gets the real value of table[index], -without invoking any metamethod. -table must be a table; -index may be any value. - - - - -

-


rawlen (v)

-Returns the length of the object v, -which must be a table or a string, -without invoking any metamethod. -Returns an integer. - - - - -

-


rawset (table, index, value)

-Sets the real value of table[index] to value, -without invoking any metamethod. -table must be a table, -index any value different from nil and NaN, -and value any Lua value. - - -

-This function returns table. - - - - -

-


select (index, ···)

- - -

-If index is a number, -returns all arguments after argument number index; -a negative number indexes from the end (-1 is the last argument). -Otherwise, index must be the string "#", -and select returns the total number of extra arguments it received. - - - - -

-


setmetatable (table, metatable)

- - -

-Sets the metatable for the given table. -(You cannot change the metatable of other types from Lua, only from C.) -If metatable is nil, -removes the metatable of the given table. -If the original metatable has a "__metatable" field, -raises an error. - - -

-This function returns table. - - - - -

-


tonumber (e [, base])

- - -

-When called with no base, -tonumber tries to convert its argument to a number. -If the argument is already a number or -a string convertible to a number, -then tonumber returns this number; -otherwise, it returns nil. - - -

-The conversion of strings can result in integers or floats, -according to the lexical conventions of Lua (see §3.1). -(The string may have leading and trailing spaces and a sign.) - - -

-When called with base, -then e must be a string to be interpreted as -an integer numeral in that base. -The base may be any integer between 2 and 36, inclusive. -In bases above 10, the letter 'A' (in either upper or lower case) -represents 10, 'B' represents 11, and so forth, -with 'Z' representing 35. -If the string e is not a valid numeral in the given base, -the function returns nil. - - - - -

-


tostring (v)

-Receives a value of any type and -converts it to a string in a human-readable format. -Floats always produce strings with some -floating-point indication (either a decimal dot or an exponent). -(For complete control of how numbers are converted, -use string.format.) - - -

-If the metatable of v has a "__tostring" field, -then tostring calls the corresponding value -with v as argument, -and uses the result of the call as its result. - - - - -

-


type (v)

-Returns the type of its only argument, coded as a string. -The possible results of this function are -"nil" (a string, not the value nil), -"number", -"string", -"boolean", -"table", -"function", -"thread", -and "userdata". - - - - -

-


_VERSION

-A global variable (not a function) that -holds a string containing the current interpreter version. -The current value of this variable is "Lua 5.3". - - - - -

-


xpcall (f, msgh [, arg1, ···])

- - -

-This function is similar to pcall, -except that it sets a new message handler msgh. - - - - - - - -

6.2 – Coroutine Manipulation

- -

-The operations related to coroutines comprise a sub-library of -the basic library and come inside the table coroutine. -See §2.6 for a general description of coroutines. - - -

-


coroutine.create (f)

- - -

-Creates a new coroutine, with body f. -f must be a Lua function. -Returns this new coroutine, -an object with type "thread". - - - - -

-


coroutine.isyieldable ()

- - -

-Returns true when the running coroutine can yield. - - -

-A running coroutine is yieldable if it is not the main thread and -it is not inside a non-yieldable C function. - - - - -

-


coroutine.resume (co [, val1, ···])

- - -

-Starts or continues the execution of coroutine co. -The first time you resume a coroutine, -it starts running its body. -The values val1, ... are passed -as the arguments to the body function. -If the coroutine has yielded, -resume restarts it; -the values val1, ... are passed -as the results from the yield. - - -

-If the coroutine runs without any errors, -resume returns true plus any values passed to yield -(when the coroutine yields) or any values returned by the body function -(when the coroutine terminates). -If there is any error, -resume returns false plus the error message. - - - - -

-


coroutine.running ()

- - -

-Returns the running coroutine plus a boolean, -true when the running coroutine is the main one. - - - - -

-


coroutine.status (co)

- - -

-Returns the status of coroutine co, as a string: -"running", -if the coroutine is running (that is, it called status); -"suspended", if the coroutine is suspended in a call to yield, -or if it has not started running yet; -"normal" if the coroutine is active but not running -(that is, it has resumed another coroutine); -and "dead" if the coroutine has finished its body function, -or if it has stopped with an error. - - - - -

-


coroutine.wrap (f)

- - -

-Creates a new coroutine, with body f. -f must be a Lua function. -Returns a function that resumes the coroutine each time it is called. -Any arguments passed to the function behave as the -extra arguments to resume. -Returns the same values returned by resume, -except the first boolean. -In case of error, propagates the error. - - - - -

-


coroutine.yield (···)

- - -

-Suspends the execution of the calling coroutine. -Any arguments to yield are passed as extra results to resume. - - - - - - - -

6.3 – Modules

- -

-The package library provides basic -facilities for loading modules in Lua. -It exports one function directly in the global environment: -require. -Everything else is exported in a table package. - - -

-


require (modname)

- - -

-Loads the given module. -The function starts by looking into the package.loaded table -to determine whether modname is already loaded. -If it is, then require returns the value stored -at package.loaded[modname]. -Otherwise, it tries to find a loader for the module. - - -

-To find a loader, -require is guided by the package.searchers sequence. -By changing this sequence, -we can change how require looks for a module. -The following explanation is based on the default configuration -for package.searchers. - - -

-First require queries package.preload[modname]. -If it has a value, -this value (which must be a function) is the loader. -Otherwise require searches for a Lua loader using the -path stored in package.path. -If that also fails, it searches for a C loader using the -path stored in package.cpath. -If that also fails, -it tries an all-in-one loader (see package.searchers). - - -

-Once a loader is found, -require calls the loader with two arguments: -modname and an extra value dependent on how it got the loader. -(If the loader came from a file, -this extra value is the file name.) -If the loader returns any non-nil value, -require assigns the returned value to package.loaded[modname]. -If the loader does not return a non-nil value and -has not assigned any value to package.loaded[modname], -then require assigns true to this entry. -In any case, require returns the -final value of package.loaded[modname]. - - -

-If there is any error loading or running the module, -or if it cannot find any loader for the module, -then require raises an error. - - - - -

-


package.config

- - -

-A string describing some compile-time configurations for packages. -This string is a sequence of lines: - -

    - -
  • The first line is the directory separator string. -Default is '\' for Windows and '/' for all other systems.
  • - -
  • The second line is the character that separates templates in a path. -Default is ';'.
  • - -
  • The third line is the string that marks the -substitution points in a template. -Default is '?'.
  • - -
  • The fourth line is a string that, in a path in Windows, -is replaced by the executable's directory. -Default is '!'.
  • - -
  • The fifth line is a mark to ignore all text after it -when building the luaopen_ function name. -Default is '-'.
  • - -
- - - -

-


package.cpath

- - -

-The path used by require to search for a C loader. - - -

-Lua initializes the C path package.cpath in the same way -it initializes the Lua path package.path, -using the environment variable LUA_CPATH_5_3 -or the environment variable LUA_CPATH -or a default path defined in luaconf.h. - - - - -

-


package.loaded

- - -

-A table used by require to control which -modules are already loaded. -When you require a module modname and -package.loaded[modname] is not false, -require simply returns the value stored there. - - -

-This variable is only a reference to the real table; -assignments to this variable do not change the -table used by require. - - - - -

-


package.loadlib (libname, funcname)

- - -

-Dynamically links the host program with the C library libname. - - -

-If funcname is "*", -then it only links with the library, -making the symbols exported by the library -available to other dynamically linked libraries. -Otherwise, -it looks for a function funcname inside the library -and returns this function as a C function. -So, funcname must follow the lua_CFunction prototype -(see lua_CFunction). - - -

-This is a low-level function. -It completely bypasses the package and module system. -Unlike require, -it does not perform any path searching and -does not automatically adds extensions. -libname must be the complete file name of the C library, -including if necessary a path and an extension. -funcname must be the exact name exported by the C library -(which may depend on the C compiler and linker used). - - -

-This function is not supported by Standard C. -As such, it is only available on some platforms -(Windows, Linux, Mac OS X, Solaris, BSD, -plus other Unix systems that support the dlfcn standard). - - - - -

-


package.path

- - -

-The path used by require to search for a Lua loader. - - -

-At start-up, Lua initializes this variable with -the value of the environment variable LUA_PATH_5_3 or -the environment variable LUA_PATH or -with a default path defined in luaconf.h, -if those environment variables are not defined. -Any ";;" in the value of the environment variable -is replaced by the default path. - - - - -

-


package.preload

- - -

-A table to store loaders for specific modules -(see require). - - -

-This variable is only a reference to the real table; -assignments to this variable do not change the -table used by require. - - - - -

-


package.searchers

- - -

-A table used by require to control how to load modules. - - -

-Each entry in this table is a searcher function. -When looking for a module, -require calls each of these searchers in ascending order, -with the module name (the argument given to require) as its -sole parameter. -The function can return another function (the module loader) -plus an extra value that will be passed to that loader, -or a string explaining why it did not find that module -(or nil if it has nothing to say). - - -

-Lua initializes this table with four searcher functions. - - -

-The first searcher simply looks for a loader in the -package.preload table. - - -

-The second searcher looks for a loader as a Lua library, -using the path stored at package.path. -The search is done as described in function package.searchpath. - - -

-The third searcher looks for a loader as a C library, -using the path given by the variable package.cpath. -Again, -the search is done as described in function package.searchpath. -For instance, -if the C path is the string - -

-     "./?.so;./?.dll;/usr/local/?/init.so"
-

-the searcher for module foo -will try to open the files ./foo.so, ./foo.dll, -and /usr/local/foo/init.so, in that order. -Once it finds a C library, -this searcher first uses a dynamic link facility to link the -application with the library. -Then it tries to find a C function inside the library to -be used as the loader. -The name of this C function is the string "luaopen_" -concatenated with a copy of the module name where each dot -is replaced by an underscore. -Moreover, if the module name has a hyphen, -its suffix after (and including) the first hyphen is removed. -For instance, if the module name is a.b.c-v2.1, -the function name will be luaopen_a_b_c. - - -

-The fourth searcher tries an all-in-one loader. -It searches the C path for a library for -the root name of the given module. -For instance, when requiring a.b.c, -it will search for a C library for a. -If found, it looks into it for an open function for -the submodule; -in our example, that would be luaopen_a_b_c. -With this facility, a package can pack several C submodules -into one single library, -with each submodule keeping its original open function. - - -

-All searchers except the first one (preload) return as the extra value -the file name where the module was found, -as returned by package.searchpath. -The first searcher returns no extra value. - - - - -

-


package.searchpath (name, path [, sep [, rep]])

- - -

-Searches for the given name in the given path. - - -

-A path is a string containing a sequence of -templates separated by semicolons. -For each template, -the function replaces each interrogation mark (if any) -in the template with a copy of name -wherein all occurrences of sep -(a dot, by default) -were replaced by rep -(the system's directory separator, by default), -and then tries to open the resulting file name. - - -

-For instance, if the path is the string - -

-     "./?.lua;./?.lc;/usr/local/?/init.lua"
-

-the search for the name foo.a -will try to open the files -./foo/a.lua, ./foo/a.lc, and -/usr/local/foo/a/init.lua, in that order. - - -

-Returns the resulting name of the first file that it can -open in read mode (after closing the file), -or nil plus an error message if none succeeds. -(This error message lists all file names it tried to open.) - - - - - - - -

6.4 – String Manipulation

- -

-This library provides generic functions for string manipulation, -such as finding and extracting substrings, and pattern matching. -When indexing a string in Lua, the first character is at position 1 -(not at 0, as in C). -Indices are allowed to be negative and are interpreted as indexing backwards, -from the end of the string. -Thus, the last character is at position -1, and so on. - - -

-The string library provides all its functions inside the table -string. -It also sets a metatable for strings -where the __index field points to the string table. -Therefore, you can use the string functions in object-oriented style. -For instance, string.byte(s,i) -can be written as s:byte(i). - - -

-The string library assumes one-byte character encodings. - - -

-


string.byte (s [, i [, j]])

-Returns the internal numerical codes of the characters s[i], -s[i+1], ..., s[j]. -The default value for i is 1; -the default value for j is i. -These indices are corrected -following the same rules of function string.sub. - - -

-Numerical codes are not necessarily portable across platforms. - - - - -

-


string.char (···)

-Receives zero or more integers. -Returns a string with length equal to the number of arguments, -in which each character has the internal numerical code equal -to its corresponding argument. - - -

-Numerical codes are not necessarily portable across platforms. - - - - -

-


string.dump (function [, strip])

- - -

-Returns a string containing a binary representation -(a binary chunk) -of the given function, -so that a later load on this string returns -a copy of the function (but with new upvalues). -If strip is a true value, -the binary representation is created without debug information -about the function -(local variable names, lines, etc.). - - -

-Functions with upvalues have only their number of upvalues saved. -When (re)loaded, -those upvalues receive fresh instances containing nil. -(You can use the debug library to serialize -and reload the upvalues of a function -in a way adequate to your needs.) - - - - -

-


string.find (s, pattern [, init [, plain]])

- - -

-Looks for the first match of -pattern (see §6.4.1) in the string s. -If it finds a match, then find returns the indices of s -where this occurrence starts and ends; -otherwise, it returns nil. -A third, optional numerical argument init specifies -where to start the search; -its default value is 1 and can be negative. -A value of true as a fourth, optional argument plain -turns off the pattern matching facilities, -so the function does a plain "find substring" operation, -with no characters in pattern being considered magic. -Note that if plain is given, then init must be given as well. - - -

-If the pattern has captures, -then in a successful match -the captured values are also returned, -after the two indices. - - - - -

-


string.format (formatstring, ···)

- - -

-Returns a formatted version of its variable number of arguments -following the description given in its first argument (which must be a string). -The format string follows the same rules as the ISO C function sprintf. -The only differences are that the options/modifiers -*, h, L, l, n, -and p are not supported -and that there is an extra option, q. -The q option formats a string between double quotes, -using escape sequences when necessary to ensure that -it can safely be read back by the Lua interpreter. -For instance, the call - -

-     string.format('%q', 'a string with "quotes" and \n new line')
-

-may produce the string: - -

-     "a string with \"quotes\" and \
-      new line"
-
- -

-Options -A and a (when available), -E, e, f, -G, and g all expect a number as argument. -Options c, d, -i, o, u, X, and x -expect an integer. -Option q expects a string; -option s expects a string without embedded zeros. -If the argument to option s is not a string, -it is converted to one following the same rules of tostring. - - - - -

-


string.gmatch (s, pattern)

-Returns an iterator function that, -each time it is called, -returns the next captures from pattern (see §6.4.1) -over the string s. -If pattern specifies no captures, -then the whole match is produced in each call. - - -

-As an example, the following loop -will iterate over all the words from string s, -printing one per line: - -

-     s = "hello world from Lua"
-     for w in string.gmatch(s, "%a+") do
-       print(w)
-     end
-

-The next example collects all pairs key=value from the -given string into a table: - -

-     t = {}
-     s = "from=world, to=Lua"
-     for k, v in string.gmatch(s, "(%w+)=(%w+)") do
-       t[k] = v
-     end
-
- -

-For this function, a caret '^' at the start of a pattern does not -work as an anchor, as this would prevent the iteration. - - - - -

-


string.gsub (s, pattern, repl [, n])

-Returns a copy of s -in which all (or the first n, if given) -occurrences of the pattern (see §6.4.1) have been -replaced by a replacement string specified by repl, -which can be a string, a table, or a function. -gsub also returns, as its second value, -the total number of matches that occurred. -The name gsub comes from Global SUBstitution. - - -

-If repl is a string, then its value is used for replacement. -The character % works as an escape character: -any sequence in repl of the form %d, -with d between 1 and 9, -stands for the value of the d-th captured substring. -The sequence %0 stands for the whole match. -The sequence %% stands for a single %. - - -

-If repl is a table, then the table is queried for every match, -using the first capture as the key. - - -

-If repl is a function, then this function is called every time a -match occurs, with all captured substrings passed as arguments, -in order. - - -

-In any case, -if the pattern specifies no captures, -then it behaves as if the whole pattern was inside a capture. - - -

-If the value returned by the table query or by the function call -is a string or a number, -then it is used as the replacement string; -otherwise, if it is false or nil, -then there is no replacement -(that is, the original match is kept in the string). - - -

-Here are some examples: - -

-     x = string.gsub("hello world", "(%w+)", "%1 %1")
-     --> x="hello hello world world"
-     
-     x = string.gsub("hello world", "%w+", "%0 %0", 1)
-     --> x="hello hello world"
-     
-     x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")
-     --> x="world hello Lua from"
-     
-     x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)
-     --> x="home = /home/roberto, user = roberto"
-     
-     x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
-           return load(s)()
-         end)
-     --> x="4+5 = 9"
-     
-     local t = {name="lua", version="5.3"}
-     x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
-     --> x="lua-5.3.tar.gz"
-
- - - -

-


string.len (s)

-Receives a string and returns its length. -The empty string "" has length 0. -Embedded zeros are counted, -so "a\000bc\000" has length 5. - - - - -

-


string.lower (s)

-Receives a string and returns a copy of this string with all -uppercase letters changed to lowercase. -All other characters are left unchanged. -The definition of what an uppercase letter is depends on the current locale. - - - - -

-


string.match (s, pattern [, init])

-Looks for the first match of -pattern (see §6.4.1) in the string s. -If it finds one, then match returns -the captures from the pattern; -otherwise it returns nil. -If pattern specifies no captures, -then the whole match is returned. -A third, optional numerical argument init specifies -where to start the search; -its default value is 1 and can be negative. - - - - -

-


string.pack (fmt, v1, v2, ···)

- - -

-Returns a binary string containing the values v1, v2, etc. -packed (that is, serialized in binary form) -according to the format string fmt (see §6.4.2). - - - - -

-


string.packsize (fmt)

- - -

-Returns the size of a string resulting from string.pack -with the given format. -The format string cannot have the variable-length options -'s' or 'z' (see §6.4.2). - - - - -

-


string.rep (s, n [, sep])

-Returns a string that is the concatenation of n copies of -the string s separated by the string sep. -The default value for sep is the empty string -(that is, no separator). -Returns the empty string if n is not positive. - - - - -

-


string.reverse (s)

-Returns a string that is the string s reversed. - - - - -

-


string.sub (s, i [, j])

-Returns the substring of s that -starts at i and continues until j; -i and j can be negative. -If j is absent, then it is assumed to be equal to -1 -(which is the same as the string length). -In particular, -the call string.sub(s,1,j) returns a prefix of s -with length j, -and string.sub(s, -i) returns a suffix of s -with length i. - - -

-If, after the translation of negative indices, -i is less than 1, -it is corrected to 1. -If j is greater than the string length, -it is corrected to that length. -If, after these corrections, -i is greater than j, -the function returns the empty string. - - - - -

-


string.unpack (fmt, s [, pos])

- - -

-Returns the values packed in string s (see string.pack) -according to the format string fmt (see §6.4.2). -An optional pos marks where -to start reading in s (default is 1). -After the read values, -this function also returns the index of the first unread byte in s. - - - - -

-


string.upper (s)

-Receives a string and returns a copy of this string with all -lowercase letters changed to uppercase. -All other characters are left unchanged. -The definition of what a lowercase letter is depends on the current locale. - - - - - -

6.4.1 – Patterns

- -

-Patterns in Lua are described by regular strings, -which are interpreted as patterns by the pattern-matching functions -string.find, -string.gmatch, -string.gsub, -and string.match. -This section describes the syntax and the meaning -(that is, what they match) of these strings. - - - -

Character Class:

-A character class is used to represent a set of characters. -The following combinations are allowed in describing a character class: - -

    - -
  • x: -(where x is not one of the magic characters -^$()%.[]*+-?) -represents the character x itself. -
  • - -
  • .: (a dot) represents all characters.
  • - -
  • %a: represents all letters.
  • - -
  • %c: represents all control characters.
  • - -
  • %d: represents all digits.
  • - -
  • %g: represents all printable characters except space.
  • - -
  • %l: represents all lowercase letters.
  • - -
  • %p: represents all punctuation characters.
  • - -
  • %s: represents all space characters.
  • - -
  • %u: represents all uppercase letters.
  • - -
  • %w: represents all alphanumeric characters.
  • - -
  • %x: represents all hexadecimal digits.
  • - -
  • %x: (where x is any non-alphanumeric character) -represents the character x. -This is the standard way to escape the magic characters. -Any non-alphanumeric character -(including all punctuations, even the non-magical) -can be preceded by a '%' -when used to represent itself in a pattern. -
  • - -
  • [set]: -represents the class which is the union of all -characters in set. -A range of characters can be specified by -separating the end characters of the range, -in ascending order, with a '-'. -All classes %x described above can also be used as -components in set. -All other characters in set represent themselves. -For example, [%w_] (or [_%w]) -represents all alphanumeric characters plus the underscore, -[0-7] represents the octal digits, -and [0-7%l%-] represents the octal digits plus -the lowercase letters plus the '-' character. - - -

    -The interaction between ranges and classes is not defined. -Therefore, patterns like [%a-z] or [a-%%] -have no meaning. -

  • - -
  • [^set]: -represents the complement of set, -where set is interpreted as above. -
  • - -

-For all classes represented by single letters (%a, %c, etc.), -the corresponding uppercase letter represents the complement of the class. -For instance, %S represents all non-space characters. - - -

-The definitions of letter, space, and other character groups -depend on the current locale. -In particular, the class [a-z] may not be equivalent to %l. - - - - - -

Pattern Item:

-A pattern item can be - -

    - -
  • -a single character class, -which matches any single character in the class; -
  • - -
  • -a single character class followed by '*', -which matches zero or more repetitions of characters in the class. -These repetition items will always match the longest possible sequence; -
  • - -
  • -a single character class followed by '+', -which matches one or more repetitions of characters in the class. -These repetition items will always match the longest possible sequence; -
  • - -
  • -a single character class followed by '-', -which also matches zero or more repetitions of characters in the class. -Unlike '*', -these repetition items will always match the shortest possible sequence; -
  • - -
  • -a single character class followed by '?', -which matches zero or one occurrence of a character in the class. -It always matches one occurrence if possible; -
  • - -
  • -%n, for n between 1 and 9; -such item matches a substring equal to the n-th captured string -(see below); -
  • - -
  • -%bxy, where x and y are two distinct characters; -such item matches strings that start with x, end with y, -and where the x and y are balanced. -This means that, if one reads the string from left to right, -counting +1 for an x and -1 for a y, -the ending y is the first y where the count reaches 0. -For instance, the item %b() matches expressions with -balanced parentheses. -
  • - -
  • -%f[set], a frontier pattern; -such item matches an empty string at any position such that -the next character belongs to set -and the previous character does not belong to set. -The set set is interpreted as previously described. -The beginning and the end of the subject are handled as if -they were the character '\0'. -
  • - -
- - - - -

Pattern:

-A pattern is a sequence of pattern items. -A caret '^' at the beginning of a pattern anchors the match at the -beginning of the subject string. -A '$' at the end of a pattern anchors the match at the -end of the subject string. -At other positions, -'^' and '$' have no special meaning and represent themselves. - - - - - -

Captures:

-A pattern can contain sub-patterns enclosed in parentheses; -they describe captures. -When a match succeeds, the substrings of the subject string -that match captures are stored (captured) for future use. -Captures are numbered according to their left parentheses. -For instance, in the pattern "(a*(.)%w(%s*))", -the part of the string matching "a*(.)%w(%s*)" is -stored as the first capture (and therefore has number 1); -the character matching "." is captured with number 2, -and the part matching "%s*" has number 3. - - -

-As a special case, the empty capture () captures -the current string position (a number). -For instance, if we apply the pattern "()aa()" on the -string "flaaap", there will be two captures: 3 and 5. - - - - - - - -

6.4.2 – Format Strings for Pack and Unpack

- -

-The first argument to string.pack, -string.packsize, and string.unpack -is a format string, -which describes the layout of the structure being created or read. - - -

-A format string is a sequence of conversion options. -The conversion options are as follows: - -

    -
  • <: sets little endian
  • -
  • >: sets big endian
  • -
  • =: sets native endian
  • -
  • ![n]: sets maximum alignment to n -(default is native alignment)
  • -
  • b: a signed byte (char)
  • -
  • B: an unsigned byte (char)
  • -
  • h: a signed short (native size)
  • -
  • H: an unsigned short (native size)
  • -
  • l: a signed long (native size)
  • -
  • L: an unsigned long (native size)
  • -
  • j: a lua_Integer
  • -
  • J: a lua_Unsigned
  • -
  • T: a size_t (native size)
  • -
  • i[n]: a signed int with n bytes -(default is native size)
  • -
  • I[n]: an unsigned int with n bytes -(default is native size)
  • -
  • f: a float (native size)
  • -
  • d: a double (native size)
  • -
  • n: a lua_Number
  • -
  • cn: a fixed-sized string with n bytes
  • -
  • z: a zero-terminated string
  • -
  • s[n]: a string preceded by its length -coded as an unsigned integer with n bytes -(default is a size_t)
  • -
  • x: one byte of padding
  • -
  • Xop: an empty item that aligns -according to option op -(which is otherwise ignored)
  • -
  • ' ': (empty space) ignored
  • -

-(A "[n]" means an optional integral numeral.) -Except for padding, spaces, and configurations -(options "xX <=>!"), -each option corresponds to an argument (in string.pack) -or a result (in string.unpack). - - -

-For options "!n", "sn", "in", and "In", -n can be any integer between 1 and 16. -All integral options check overflows; -string.pack checks whether the given value fits in the given size; -string.unpack checks whether the read value fits in a Lua integer. - - -

-Any format string starts as if prefixed by "!1=", -that is, -with maximum alignment of 1 (no alignment) -and native endianness. - - -

-Alignment works as follows: -For each option, -the format gets extra padding until the data starts -at an offset that is a multiple of the minimum between the -option size and the maximum alignment; -this minimum must be a power of 2. -Options "c" and "z" are not aligned; -option "s" follows the alignment of its starting integer. - - -

-All padding is filled with zeros by string.pack -(and ignored by string.unpack). - - - - - - - -

6.5 – UTF-8 Support

- -

-This library provides basic support for UTF-8 encoding. -It provides all its functions inside the table utf8. -This library does not provide any support for Unicode other -than the handling of the encoding. -Any operation that needs the meaning of a character, -such as character classification, is outside its scope. - - -

-Unless stated otherwise, -all functions that expect a byte position as a parameter -assume that the given position is either the start of a byte sequence -or one plus the length of the subject string. -As in the string library, -negative indices count from the end of the string. - - -

-


utf8.char (···)

-Receives zero or more integers, -converts each one to its corresponding UTF-8 byte sequence -and returns a string with the concatenation of all these sequences. - - - - -

-


utf8.charpattern

-The pattern (a string, not a function) "[\0-\x7F\xC2-\xF4][\x80-\xBF]*" -(see §6.4.1), -which matches exactly one UTF-8 byte sequence, -assuming that the subject is a valid UTF-8 string. - - - - -

-


utf8.codes (s)

- - -

-Returns values so that the construction - -

-     for p, c in utf8.codes(s) do body end
-

-will iterate over all characters in string s, -with p being the position (in bytes) and c the code point -of each character. -It raises an error if it meets any invalid byte sequence. - - - - -

-


utf8.codepoint (s [, i [, j]])

-Returns the codepoints (as integers) from all characters in s -that start between byte position i and j (both included). -The default for i is 1 and for j is i. -It raises an error if it meets any invalid byte sequence. - - - - -

-


utf8.len (s [, i [, j]])

-Returns the number of UTF-8 characters in string s -that start between positions i and j (both inclusive). -The default for i is 1 and for j is -1. -If it finds any invalid byte sequence, -returns a false value plus the position of the first invalid byte. - - - - -

-


utf8.offset (s, n [, i])

-Returns the position (in bytes) where the encoding of the -n-th character of s -(counting from position i) starts. -A negative n gets characters before position i. -The default for i is 1 when n is non-negative -and #s + 1 otherwise, -so that utf8.offset(s, -n) gets the offset of the -n-th character from the end of the string. -If the specified character is neither in the subject -nor right after its end, -the function returns nil. - - -

-As a special case, -when n is 0 the function returns the start of the encoding -of the character that contains the i-th byte of s. - - -

-This function assumes that s is a valid UTF-8 string. - - - - - - - -

6.6 – Table Manipulation

- -

-This library provides generic functions for table manipulation. -It provides all its functions inside the table table. - - -

-Remember that, whenever an operation needs the length of a table, -the table must be a proper sequence -or have a __len metamethod (see §3.4.7). -All functions ignore non-numeric keys -in the tables given as arguments. - - -

-


table.concat (list [, sep [, i [, j]]])

- - -

-Given a list where all elements are strings or numbers, -returns the string list[i]..sep..list[i+1] ··· sep..list[j]. -The default value for sep is the empty string, -the default for i is 1, -and the default for j is #list. -If i is greater than j, returns the empty string. - - - - -

-


table.insert (list, [pos,] value)

- - -

-Inserts element value at position pos in list, -shifting up the elements -list[pos], list[pos+1], ···, list[#list]. -The default value for pos is #list+1, -so that a call table.insert(t,x) inserts x at the end -of list t. - - - - -

-


table.move (a1, f, e, t [,a2])

- - -

-Moves elements from table a1 to table a2. -This function performs the equivalent to the following -multiple assignment: -a2[t],··· = a1[f],···,a1[e]. -The default for a2 is a1. -The destination range can overlap with the source range. -Index f must be positive. - - - - -

-


table.pack (···)

- - -

-Returns a new table with all parameters stored into keys 1, 2, etc. -and with a field "n" with the total number of parameters. -Note that the resulting table may not be a sequence. - - - - -

-


table.remove (list [, pos])

- - -

-Removes from list the element at position pos, -returning the value of the removed element. -When pos is an integer between 1 and #list, -it shifts down the elements -list[pos+1], list[pos+2], ···, list[#list] -and erases element list[#list]; -The index pos can also be 0 when #list is 0, -or #list + 1; -in those cases, the function erases the element list[pos]. - - -

-The default value for pos is #list, -so that a call table.remove(l) removes the last element -of list l. - - - - -

-


table.sort (list [, comp])

- - -

-Sorts list elements in a given order, in-place, -from list[1] to list[#list]. -If comp is given, -then it must be a function that receives two list elements -and returns true when the first element must come -before the second in the final order -(so that not comp(list[i+1],list[i]) will be true after the sort). -If comp is not given, -then the standard Lua operator < is used instead. - - -

-The sort algorithm is not stable; -that is, elements considered equal by the given order -may have their relative positions changed by the sort. - - - - -

-


table.unpack (list [, i [, j]])

- - -

-Returns the elements from the given list. -This function is equivalent to - -

-     return list[i], list[i+1], ···, list[j]
-

-By default, i is 1 and j is #list. - - - - - - - -

6.7 – Mathematical Functions

- -

-This library provides basic mathematical functions. -It provides all its functions and constants inside the table math. -Functions with the annotation "integer/float" give -integer results for integer arguments -and float results for float (or mixed) arguments. -Rounding functions -(math.ceil, math.floor, and math.modf) -return an integer when the result fits in the range of an integer, -or a float otherwise. - - -

-


math.abs (x)

- - -

-Returns the absolute value of x. (integer/float) - - - - -

-


math.acos (x)

- - -

-Returns the arc cosine of x (in radians). - - - - -

-


math.asin (x)

- - -

-Returns the arc sine of x (in radians). - - - - -

-


math.atan (y [, x])

- - -

- -Returns the arc tangent of y/x (in radians), -but uses the signs of both parameters to find the -quadrant of the result. -(It also handles correctly the case of x being zero.) - - -

-The default value for x is 1, -so that the call math.atan(y) -returns the arc tangent of y. - - - - -

-


math.ceil (x)

- - -

-Returns the smallest integral value larger than or equal to x. - - - - -

-


math.cos (x)

- - -

-Returns the cosine of x (assumed to be in radians). - - - - -

-


math.deg (x)

- - -

-Converts the angle x from radians to degrees. - - - - -

-


math.exp (x)

- - -

-Returns the value ex -(where e is the base of natural logarithms). - - - - -

-


math.floor (x)

- - -

-Returns the largest integral value smaller than or equal to x. - - - - -

-


math.fmod (x, y)

- - -

-Returns the remainder of the division of x by y -that rounds the quotient towards zero. (integer/float) - - - - -

-


math.huge

- - -

-The float value HUGE_VAL, -a value larger than any other numerical value. - - - - -

-


math.log (x [, base])

- - -

-Returns the logarithm of x in the given base. -The default for base is e -(so that the function returns the natural logarithm of x). - - - - -

-


math.max (x, ···)

- - -

-Returns the argument with the maximum value, -according to the Lua operator <. (integer/float) - - - - -

-


math.maxinteger

-An integer with the maximum value for an integer. - - - - -

-


math.min (x, ···)

- - -

-Returns the argument with the minimum value, -according to the Lua operator <. (integer/float) - - - - -

-


math.mininteger

-An integer with the minimum value for an integer. - - - - -

-


math.modf (x)

- - -

-Returns the integral part of x and the fractional part of x. -Its second result is always a float. - - - - -

-


math.pi

- - -

-The value of π. - - - - -

-


math.rad (x)

- - -

-Converts the angle x from degrees to radians. - - - - -

-


math.random ([m [, n]])

- - -

-When called without arguments, -returns a pseudo-random float with uniform distribution -in the range [0,1). -When called with two integers m and n, -math.random returns a pseudo-random integer -with uniform distribution in the range [m, n]. -(The value m-n cannot be negative and must fit in a Lua integer.) -The call math.random(n) is equivalent to math.random(1,n). - - -

-This function is an interface to the underling -pseudo-random generator function provided by C. -No guarantees can be given for its statistical properties. - - - - -

-


math.randomseed (x)

- - -

-Sets x as the "seed" -for the pseudo-random generator: -equal seeds produce equal sequences of numbers. - - - - -

-


math.sin (x)

- - -

-Returns the sine of x (assumed to be in radians). - - - - -

-


math.sqrt (x)

- - -

-Returns the square root of x. -(You can also use the expression x^0.5 to compute this value.) - - - - -

-


math.tan (x)

- - -

-Returns the tangent of x (assumed to be in radians). - - - - -

-


math.tointeger (x)

- - -

-If the value x is convertible to an integer, -returns that integer. -Otherwise, returns nil. - - - - -

-


math.type (x)

- - -

-Returns "integer" if x is an integer, -"float" if it is a float, -or nil if x is not a number. - - - - -

-


math.ult (m, n)

- - -

-Returns a boolean, -true if integer m is below integer n when -they are compared as unsigned integers. - - - - - - - -

6.8 – Input and Output Facilities

- -

-The I/O library provides two different styles for file manipulation. -The first one uses implicit file handles; -that is, there are operations to set a default input file and a -default output file, -and all input/output operations are over these default files. -The second style uses explicit file handles. - - -

-When using implicit file handles, -all operations are supplied by table io. -When using explicit file handles, -the operation io.open returns a file handle -and then all operations are supplied as methods of the file handle. - - -

-The table io also provides -three predefined file handles with their usual meanings from C: -io.stdin, io.stdout, and io.stderr. -The I/O library never closes these files. - - -

-Unless otherwise stated, -all I/O functions return nil on failure -(plus an error message as a second result and -a system-dependent error code as a third result) -and some value different from nil on success. -On non-POSIX systems, -the computation of the error message and error code -in case of errors -may be not thread safe, -because they rely on the global C variable errno. - - -

-


io.close ([file])

- - -

-Equivalent to file:close(). -Without a file, closes the default output file. - - - - -

-


io.flush ()

- - -

-Equivalent to io.output():flush(). - - - - -

-


io.input ([file])

- - -

-When called with a file name, it opens the named file (in text mode), -and sets its handle as the default input file. -When called with a file handle, -it simply sets this file handle as the default input file. -When called without parameters, -it returns the current default input file. - - -

-In case of errors this function raises the error, -instead of returning an error code. - - - - -

-


io.lines ([filename ···])

- - -

-Opens the given file name in read mode -and returns an iterator function that -works like file:lines(···) over the opened file. -When the iterator function detects the end of file, -it returns no values (to finish the loop) and automatically closes the file. - - -

-The call io.lines() (with no file name) is equivalent -to io.input():lines("*l"); -that is, it iterates over the lines of the default input file. -In this case it does not close the file when the loop ends. - - -

-In case of errors this function raises the error, -instead of returning an error code. - - - - -

-


io.open (filename [, mode])

- - -

-This function opens a file, -in the mode specified in the string mode. -It returns a new file handle, -or, in case of errors, nil plus an error message. - - -

-The mode string can be any of the following: - -

    -
  • "r": read mode (the default);
  • -
  • "w": write mode;
  • -
  • "a": append mode;
  • -
  • "r+": update mode, all previous data is preserved;
  • -
  • "w+": update mode, all previous data is erased;
  • -
  • "a+": append update mode, previous data is preserved, - writing is only allowed at the end of file.
  • -

-The mode string can also have a 'b' at the end, -which is needed in some systems to open the file in binary mode. - - - - -

-


io.output ([file])

- - -

-Similar to io.input, but operates over the default output file. - - - - -

-


io.popen (prog [, mode])

- - -

-This function is system dependent and is not available -on all platforms. - - -

-Starts program prog in a separated process and returns -a file handle that you can use to read data from this program -(if mode is "r", the default) -or to write data to this program -(if mode is "w"). - - - - -

-


io.read (···)

- - -

-Equivalent to io.input():read(···). - - - - -

-


io.tmpfile ()

- - -

-Returns a handle for a temporary file. -This file is opened in update mode -and it is automatically removed when the program ends. - - - - -

-


io.type (obj)

- - -

-Checks whether obj is a valid file handle. -Returns the string "file" if obj is an open file handle, -"closed file" if obj is a closed file handle, -or nil if obj is not a file handle. - - - - -

-


io.write (···)

- - -

-Equivalent to io.output():write(···). - - - - -

-


file:close ()

- - -

-Closes file. -Note that files are automatically closed when -their handles are garbage collected, -but that takes an unpredictable amount of time to happen. - - -

-When closing a file handle created with io.popen, -file:close returns the same values -returned by os.execute. - - - - -

-


file:flush ()

- - -

-Saves any written data to file. - - - - -

-


file:lines (···)

- - -

-Returns an iterator function that, -each time it is called, -reads the file according to the given formats. -When no format is given, -uses "l" as a default. -As an example, the construction - -

-     for c in file:lines(1) do body end
-

-will iterate over all characters of the file, -starting at the current position. -Unlike io.lines, this function does not close the file -when the loop ends. - - -

-In case of errors this function raises the error, -instead of returning an error code. - - - - -

-


file:read (···)

- - -

-Reads the file file, -according to the given formats, which specify what to read. -For each format, -the function returns a string or a number with the characters read, -or nil if it cannot read data with the specified format. -(In this latter case, -the function does not read subsequent formats.) -When called without formats, -it uses a default format that reads the next line -(see below). - - -

-The available formats are - -

    - -
  • "n": -reads a numeral and returns it as a float or an integer, -following the lexical conventions of Lua. -(The numeral may have leading spaces and a sign.) -This format always reads the longest input sequence that -is a valid prefix for a number; -if that prefix does not form a valid number -(e.g., an empty string, "0x", or "3.4e-"), -it is discarded and the function returns nil. -
  • - -
  • "i": -reads an integral number and returns it as an integer. -
  • - -
  • "a": -reads the whole file, starting at the current position. -On end of file, it returns the empty string. -
  • - -
  • "l": -reads the next line skipping the end of line, -returning nil on end of file. -This is the default format. -
  • - -
  • "L": -reads the next line keeping the end-of-line character (if present), -returning nil on end of file. -
  • - -
  • number: -reads a string with up to this number of bytes, -returning nil on end of file. -If number is zero, -it reads nothing and returns an empty string, -or nil on end of file. -
  • - -

-The formats "l" and "L" should be used only for text files. - - - - -

-


file:seek ([whence [, offset]])

- - -

-Sets and gets the file position, -measured from the beginning of the file, -to the position given by offset plus a base -specified by the string whence, as follows: - -

    -
  • "set": base is position 0 (beginning of the file);
  • -
  • "cur": base is current position;
  • -
  • "end": base is end of file;
  • -

-In case of success, seek returns the final file position, -measured in bytes from the beginning of the file. -If seek fails, it returns nil, -plus a string describing the error. - - -

-The default value for whence is "cur", -and for offset is 0. -Therefore, the call file:seek() returns the current -file position, without changing it; -the call file:seek("set") sets the position to the -beginning of the file (and returns 0); -and the call file:seek("end") sets the position to the -end of the file, and returns its size. - - - - -

-


file:setvbuf (mode [, size])

- - -

-Sets the buffering mode for an output file. -There are three available modes: - -

    - -
  • "no": -no buffering; the result of any output operation appears immediately. -
  • - -
  • "full": -full buffering; output operation is performed only -when the buffer is full or when -you explicitly flush the file (see io.flush). -
  • - -
  • "line": -line buffering; output is buffered until a newline is output -or there is any input from some special files -(such as a terminal device). -
  • - -

-For the last two cases, size -specifies the size of the buffer, in bytes. -The default is an appropriate size. - - - - -

-


file:write (···)

- - -

-Writes the value of each of its arguments to file. -The arguments must be strings or numbers. - - -

-In case of success, this function returns file. -Otherwise it returns nil plus a string describing the error. - - - - - - - -

6.9 – Operating System Facilities

- -

-This library is implemented through table os. - - -

-


os.clock ()

- - -

-Returns an approximation of the amount in seconds of CPU time -used by the program. - - - - -

-


os.date ([format [, time]])

- - -

-Returns a string or a table containing date and time, -formatted according to the given string format. - - -

-If the time argument is present, -this is the time to be formatted -(see the os.time function for a description of this value). -Otherwise, date formats the current time. - - -

-If format starts with '!', -then the date is formatted in Coordinated Universal Time. -After this optional character, -if format is the string "*t", -then date returns a table with the following fields: -year (four digits), month (1–12), day (1–31), -hour (0–23), min (0–59), sec (0–61), -wday (weekday, Sunday is 1), -yday (day of the year), -and isdst (daylight saving flag, a boolean). -This last field may be absent -if the information is not available. - - -

-If format is not "*t", -then date returns the date as a string, -formatted according to the same rules as the ISO C function strftime. - - -

-When called without arguments, -date returns a reasonable date and time representation that depends on -the host system and on the current locale -(that is, os.date() is equivalent to os.date("%c")). - - -

-On non-POSIX systems, -this function may be not thread safe -because of its reliance on C function gmtime and C function localtime. - - - - -

-


os.difftime (t2, t1)

- - -

-Returns the difference, in seconds, -from time t1 to time t2 -(where the times are values returned by os.time). -In POSIX, Windows, and some other systems, -this value is exactly t2-t1. - - - - -

-


os.execute ([command])

- - -

-This function is equivalent to the ISO C function system. -It passes command to be executed by an operating system shell. -Its first result is true -if the command terminated successfully, -or nil otherwise. -After this first result -the function returns a string plus a number, -as follows: - -

    - -
  • "exit": -the command terminated normally; -the following number is the exit status of the command. -
  • - -
  • "signal": -the command was terminated by a signal; -the following number is the signal that terminated the command. -
  • - -
- -

-When called without a command, -os.execute returns a boolean that is true if a shell is available. - - - - -

-


os.exit ([code [, close]])

- - -

-Calls the ISO C function exit to terminate the host program. -If code is true, -the returned status is EXIT_SUCCESS; -if code is false, -the returned status is EXIT_FAILURE; -if code is a number, -the returned status is this number. -The default value for code is true. - - -

-If the optional second argument close is true, -closes the Lua state before exiting. - - - - -

-


os.getenv (varname)

- - -

-Returns the value of the process environment variable varname, -or nil if the variable is not defined. - - - - -

-


os.remove (filename)

- - -

-Deletes the file (or empty directory, on POSIX systems) -with the given name. -If this function fails, it returns nil, -plus a string describing the error and the error code. - - - - -

-


os.rename (oldname, newname)

- - -

-Renames file or directory named oldname to newname. -If this function fails, it returns nil, -plus a string describing the error and the error code. - - - - -

-


os.setlocale (locale [, category])

- - -

-Sets the current locale of the program. -locale is a system-dependent string specifying a locale; -category is an optional string describing which category to change: -"all", "collate", "ctype", -"monetary", "numeric", or "time"; -the default category is "all". -The function returns the name of the new locale, -or nil if the request cannot be honored. - - -

-If locale is the empty string, -the current locale is set to an implementation-defined native locale. -If locale is the string "C", -the current locale is set to the standard C locale. - - -

-When called with nil as the first argument, -this function only returns the name of the current locale -for the given category. - - -

-This function may be not thread safe -because of its reliance on C function setlocale. - - - - -

-


os.time ([table])

- - -

-Returns the current time when called without arguments, -or a time representing the date and time specified by the given table. -This table must have fields year, month, and day, -and may have fields -hour (default is 12), -min (default is 0), -sec (default is 0), -and isdst (default is nil). -For a description of these fields, see the os.date function. - - -

-The returned value is a number, whose meaning depends on your system. -In POSIX, Windows, and some other systems, -this number counts the number -of seconds since some given start time (the "epoch"). -In other systems, the meaning is not specified, -and the number returned by time can be used only as an argument to -os.date and os.difftime. - - - - -

-


os.tmpname ()

- - -

-Returns a string with a file name that can -be used for a temporary file. -The file must be explicitly opened before its use -and explicitly removed when no longer needed. - - -

-On POSIX systems, -this function also creates a file with that name, -to avoid security risks. -(Someone else might create the file with wrong permissions -in the time between getting the name and creating the file.) -You still have to open the file to use it -and to remove it (even if you do not use it). - - -

-When possible, -you may prefer to use io.tmpfile, -which automatically removes the file when the program ends. - - - - - - - -

6.10 – The Debug Library

- -

-This library provides -the functionality of the debug interface (§4.9) to Lua programs. -You should exert care when using this library. -Several of its functions -violate basic assumptions about Lua code -(e.g., that variables local to a function -cannot be accessed from outside; -that userdata metatables cannot be changed by Lua code; -that Lua programs do not crash) -and therefore can compromise otherwise secure code. -Moreover, some functions in this library may be slow. - - -

-All functions in this library are provided -inside the debug table. -All functions that operate over a thread -have an optional first argument which is the -thread to operate over. -The default is always the current thread. - - -

-


debug.debug ()

- - -

-Enters an interactive mode with the user, -running each string that the user enters. -Using simple commands and other debug facilities, -the user can inspect global and local variables, -change their values, evaluate expressions, and so on. -A line containing only the word cont finishes this function, -so that the caller continues its execution. - - -

-Note that commands for debug.debug are not lexically nested -within any function and so have no direct access to local variables. - - - - -

-


debug.gethook ([thread])

- - -

-Returns the current hook settings of the thread, as three values: -the current hook function, the current hook mask, -and the current hook count -(as set by the debug.sethook function). - - - - -

-


debug.getinfo ([thread,] f [, what])

- - -

-Returns a table with information about a function. -You can give the function directly -or you can give a number as the value of f, -which means the function running at level f of the call stack -of the given thread: -level 0 is the current function (getinfo itself); -level 1 is the function that called getinfo -(except for tail calls, which do not count on the stack); -and so on. -If f is a number larger than the number of active functions, -then getinfo returns nil. - - -

-The returned table can contain all the fields returned by lua_getinfo, -with the string what describing which fields to fill in. -The default for what is to get all information available, -except the table of valid lines. -If present, -the option 'f' -adds a field named func with the function itself. -If present, -the option 'L' -adds a field named activelines with the table of -valid lines. - - -

-For instance, the expression debug.getinfo(1,"n").name returns -a table with a name for the current function, -if a reasonable name can be found, -and the expression debug.getinfo(print) -returns a table with all available information -about the print function. - - - - -

-


debug.getlocal ([thread,] f, local)

- - -

-This function returns the name and the value of the local variable -with index local of the function at level f of the stack. -This function accesses not only explicit local variables, -but also parameters, temporaries, etc. - - -

-The first parameter or local variable has index 1, and so on, -following the order that they are declared in the code, -counting only the variables that are active -in the current scope of the function. -Negative indices refer to vararg parameters; --1 is the first vararg parameter. -The function returns nil if there is no variable with the given index, -and raises an error when called with a level out of range. -(You can call debug.getinfo to check whether the level is valid.) - - -

-Variable names starting with '(' (open parenthesis) -represent variables with no known names -(internal variables such as loop control variables, -and variables from chunks saved without debug information). - - -

-The parameter f may also be a function. -In that case, getlocal returns only the name of function parameters. - - - - -

-


debug.getmetatable (value)

- - -

-Returns the metatable of the given value -or nil if it does not have a metatable. - - - - -

-


debug.getregistry ()

- - -

-Returns the registry table (see §4.5). - - - - -

-


debug.getupvalue (f, up)

- - -

-This function returns the name and the value of the upvalue -with index up of the function f. -The function returns nil if there is no upvalue with the given index. - - -

-Variable names starting with '(' (open parenthesis) -represent variables with no known names -(variables from chunks saved without debug information). - - - - -

-


debug.getuservalue (u)

- - -

-Returns the Lua value associated to u. -If u is not a userdata, -returns nil. - - - - -

-


debug.sethook ([thread,] hook, mask [, count])

- - -

-Sets the given function as a hook. -The string mask and the number count describe -when the hook will be called. -The string mask may have any combination of the following characters, -with the given meaning: - -

    -
  • 'c': the hook is called every time Lua calls a function;
  • -
  • 'r': the hook is called every time Lua returns from a function;
  • -
  • 'l': the hook is called every time Lua enters a new line of code.
  • -

-Moreover, -with a count different from zero, -the hook is called also after every count instructions. - - -

-When called without arguments, -debug.sethook turns off the hook. - - -

-When the hook is called, its first parameter is a string -describing the event that has triggered its call: -"call" (or "tail call"), -"return", -"line", and "count". -For line events, -the hook also gets the new line number as its second parameter. -Inside a hook, -you can call getinfo with level 2 to get more information about -the running function -(level 0 is the getinfo function, -and level 1 is the hook function). - - - - -

-


debug.setlocal ([thread,] level, local, value)

- - -

-This function assigns the value value to the local variable -with index local of the function at level level of the stack. -The function returns nil if there is no local -variable with the given index, -and raises an error when called with a level out of range. -(You can call getinfo to check whether the level is valid.) -Otherwise, it returns the name of the local variable. - - -

-See debug.getlocal for more information about -variable indices and names. - - - - -

-


debug.setmetatable (value, table)

- - -

-Sets the metatable for the given value to the given table -(which can be nil). -Returns value. - - - - -

-


debug.setupvalue (f, up, value)

- - -

-This function assigns the value value to the upvalue -with index up of the function f. -The function returns nil if there is no upvalue -with the given index. -Otherwise, it returns the name of the upvalue. - - - - -

-


debug.setuservalue (udata, value)

- - -

-Sets the given value as -the Lua value associated to the given udata. -udata must be a full userdata. - - -

-Returns udata. - - - - -

-


debug.traceback ([thread,] [message [, level]])

- - -

-If message is present but is neither a string nor nil, -this function returns message without further processing. -Otherwise, -it returns a string with a traceback of the call stack. -The optional message string is appended -at the beginning of the traceback. -An optional level number tells at which level -to start the traceback -(default is 1, the function calling traceback). - - - - -

-


debug.upvalueid (f, n)

- - -

-Returns a unique identifier (as a light userdata) -for the upvalue numbered n -from the given function. - - -

-These unique identifiers allow a program to check whether different -closures share upvalues. -Lua closures that share an upvalue -(that is, that access a same external local variable) -will return identical ids for those upvalue indices. - - - - -

-


debug.upvaluejoin (f1, n1, f2, n2)

- - -

-Make the n1-th upvalue of the Lua closure f1 -refer to the n2-th upvalue of the Lua closure f2. - - - - - - - -

7 – Lua Standalone

- -

-Although Lua has been designed as an extension language, -to be embedded in a host C program, -it is also frequently used as a standalone language. -An interpreter for Lua as a standalone language, -called simply lua, -is provided with the standard distribution. -The standalone interpreter includes -all standard libraries, including the debug library. -Its usage is: - -

-     lua [options] [script [args]]
-

-The options are: - -

    -
  • -e stat: executes string stat;
  • -
  • -l mod: "requires" mod;
  • -
  • -i: enters interactive mode after running script;
  • -
  • -v: prints version information;
  • -
  • -E: ignores environment variables;
  • -
  • --: stops handling options;
  • -
  • -: executes stdin as a file and stops handling options.
  • -

-After handling its options, lua runs the given script. -When called without arguments, -lua behaves as lua -v -i -when the standard input (stdin) is a terminal, -and as lua - otherwise. - - -

-When called without option -E, -the interpreter checks for an environment variable LUA_INIT_5_3 -(or LUA_INIT if the versioned name is not defined) -before running any argument. -If the variable content has the format @filename, -then lua executes the file. -Otherwise, lua executes the string itself. - - -

-When called with option -E, -besides ignoring LUA_INIT, -Lua also ignores -the values of LUA_PATH and LUA_CPATH, -setting the values of -package.path and package.cpath -with the default paths defined in luaconf.h. - - -

-All options are handled in order, except -i and -E. -For instance, an invocation like - -

-     $ lua -e'a=1' -e 'print(a)' script.lua
-

-will first set a to 1, then print the value of a, -and finally run the file script.lua with no arguments. -(Here $ is the shell prompt. Your prompt may be different.) - - -

-Before running any code, -lua collects all command-line arguments -in a global table called arg. -The script name goes to index 0, -the first argument after the script name goes to index 1, -and so on. -Any arguments before the script name -(that is, the interpreter name plus its options) -go to negative indices. -For instance, in the call - -

-     $ lua -la b.lua t1 t2
-

-the table is like this: - -

-     arg = { [-2] = "lua", [-1] = "-la",
-             [0] = "b.lua",
-             [1] = "t1", [2] = "t2" }
-

-If there is no script in the call, -the interpreter name goes to index 0, -followed by the other arguments. -For instance, the call - -

-     $ lua -e "print(arg[1])"
-

-will print "-e". -If there is a script, -the script is called with parameters -arg[1], ···, arg[#arg]. -(Like all chunks in Lua, -the script is compiled as a vararg function.) - - -

-In interactive mode, -Lua repeatedly prompts and waits for a line. -After reading a line, -Lua first try to interpret the line as an expression. -If it succeeds, it prints its value. -Otherwise, it interprets the line as a statement. -If you write an incomplete statement, -the interpreter waits for its completion -by issuing a different prompt. - - -

-In case of unprotected errors in the script, -the interpreter reports the error to the standard error stream. -If the error object is not a string but -has a metamethod __tostring, -the interpreter calls this metamethod to produce the final message. -Otherwise, the interpreter converts the error object to a string -and adds a stack traceback to it. - - -

-When finishing normally, -the interpreter closes its main Lua state -(see lua_close). -The script can avoid this step by -calling os.exit to terminate. - - -

-To allow the use of Lua as a -script interpreter in Unix systems, -the standalone interpreter skips -the first line of a chunk if it starts with #. -Therefore, Lua scripts can be made into executable programs -by using chmod +x and the #! form, -as in - -

-     #!/usr/local/bin/lua
-

-(Of course, -the location of the Lua interpreter may be different in your machine. -If lua is in your PATH, -then - -

-     #!/usr/bin/env lua
-

-is a more portable solution.) - - - -

8 – Incompatibilities with the Previous Version

- -

-Here we list the incompatibilities that you may find when moving a program -from Lua 5.2 to Lua 5.3. -You can avoid some incompatibilities by compiling Lua with -appropriate options (see file luaconf.h). -However, -all these compatibility options will be removed in the future. - - -

-Lua versions can always change the C API in ways that -do not imply source-code changes in a program, -such as the numeric values for constants -or the implementation of functions as macros. -Therefore, -you should not assume that binaries are compatible between -different Lua versions. -Always recompile clients of the Lua API when -using a new version. - - -

-Similarly, Lua versions can always change the internal representation -of precompiled chunks; -precompiled chunks are not compatible between different Lua versions. - - -

-The standard paths in the official distribution may -change between versions. - - - -

8.1 – Changes in the Language

-
    - -
  • -The main difference between Lua 5.2 and Lua 5.3 is the -introduction of an integer subtype for numbers. -Although this change should not affect "normal" computations, -some computations -(mainly those that involve some kind of overflow) -can give different results. - - -

    -You can fix these differences by forcing a number to be a float -(in Lua 5.2 all numbers were float), -in particular writing constants with an ending .0 -or using x = x + 0.0 to convert a variable. -(This recommendation is only for a quick fix -for an occasional incompatibility; -it is not a general guideline for good programming. -For good programming, -use floats where you need floats -and integers where you need integers.) -

  • - -
  • -The conversion of a float to a string now adds a .0 suffix -to the result if it looks like an integer. -(For instance, the float 2.0 will be printed as 2.0, -not as 2.) -You should always use an explicit format -when you need a specific format for numbers. - - -

    -(Formally this is not an incompatibility, -because Lua does not specify how numbers are formatted as strings, -but some programs assumed a specific format.) -

  • - -
  • -The generational mode for the garbage collector was removed. -(It was an experimental feature in Lua 5.2.) -
  • - -
- - - - -

8.2 – Changes in the Libraries

-
    - -
  • -The bit32 library has been deprecated. -It is easy to require a compatible external library or, -better yet, to replace its functions with appropriate bitwise operations. -(Keep in mind that bit32 operates on 32-bit integers, -while the bitwise operators in standard Lua operate on 64-bit integers.) -
  • - -
  • -The Table library now respects metamethods -for setting and getting elements. -
  • - -
  • -The ipairs iterator now respects metamethods and -its __ipairs metamethod has been deprecated. -
  • - -
  • -Option names in io.read do not have a starting '*' anymore. -For compatibility, Lua will continue to ignore this character. -
  • - -
  • -The following functions were deprecated in the mathematical library: -atan2, cosh, sinh, tanh, pow, -frexp, and ldexp. -You can replace math.pow(x,y) with x^y; -you can replace math.atan2 with math.atan, -which now accepts one or two parameters; -you can replace math.ldexp(x,exp) with x * 2.0^exp. -For the other operations, -you can either use an external library or -implement them in Lua. -
  • - -
  • -The searcher for C loaders used by require -changed the way it handles versioned names. -Now, the version should come after the module name -(as is usual in most other tools). -For compatibility, that searcher still tries the old format -if it cannot find an open function according to the new style. -(Lua 5.2 already worked that way, -but it did not document the change.) -
  • - -
- - - - -

8.3 – Changes in the API

- - -
    - -
  • -Continuation functions now receive as parameters what they needed -to get through lua_getctx, -so lua_getctx has been removed. -Adapt your code accordingly. -
  • - -
  • -Function lua_dump has an extra parameter, strip. -Use 0 as the value of this parameter to get the old behavior. -
  • - -
  • -Functions to inject/project unsigned integers -(lua_pushunsigned, lua_tounsigned, lua_tounsignedx, -luaL_checkunsigned, luaL_optunsigned) -were deprecated. -Use their signed equivalents with a type cast. -
  • - -
  • -Macros to project non-default integer types -(luaL_checkint, luaL_optint, luaL_checklong, luaL_optlong) -were deprecated. -Use their equivalent over lua_Integer with a type cast -(or, when possible, use lua_Integer in your code). -
  • - -
- - - - -

9 – The Complete Syntax of Lua

- -

-Here is the complete syntax of Lua in extended BNF. -As usual in extended BNF, -{A} means 0 or more As, -and [A] means an optional A. -(For operator precedences, see §3.4.8; -for a description of the terminals -Name, Numeral, -and LiteralString, see §3.1.) - - - - -

-
-	chunk ::= block
-
-	block ::= {stat} [retstat]
-
-	stat ::=  ‘;’ | 
-		 varlist ‘=’ explist | 
-		 functioncall | 
-		 label | 
-		 break | 
-		 goto Name | 
-		 do block end | 
-		 while exp do block end | 
-		 repeat block until exp | 
-		 if exp then block {elseif exp then block} [else block] end | 
-		 for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end | 
-		 for namelist in explist do block end | 
-		 function funcname funcbody | 
-		 local function Name funcbody | 
-		 local namelist [‘=’ explist] 
-
-	retstat ::= return [explist] [‘;’]
-
-	label ::= ‘::’ Name ‘::’
-
-	funcname ::= Name {‘.’ Name} [‘:’ Name]
-
-	varlist ::= var {‘,’ var}
-
-	var ::=  Name | prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name 
-
-	namelist ::= Name {‘,’ Name}
-
-	explist ::= exp {‘,’ exp}
-
-	exp ::=  nil | false | true | Numeral | LiteralString | ‘...’ | functiondef | 
-		 prefixexp | tableconstructor | exp binop exp | unop exp 
-
-	prefixexp ::= var | functioncall | ‘(’ exp ‘)’
-
-	functioncall ::=  prefixexp args | prefixexp ‘:’ Name args 
-
-	args ::=  ‘(’ [explist] ‘)’ | tableconstructor | LiteralString 
-
-	functiondef ::= function funcbody
-
-	funcbody ::= ‘(’ [parlist] ‘)’ block end
-
-	parlist ::= namelist [‘,’ ‘...’] | ‘...’
-
-	tableconstructor ::= ‘{’ [fieldlist] ‘}’
-
-	fieldlist ::= field {fieldsep field} [fieldsep]
-
-	field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp
-
-	fieldsep ::= ‘,’ | ‘;’
-
-	binop ::=  ‘+’ | ‘-’ | ‘*’ | ‘/’ | ‘//’ | ‘^’ | ‘%’ | 
-		 ‘&’ | ‘~’ | ‘|’ | ‘>>’ | ‘<<’ | ‘..’ | 
-		 ‘<’ | ‘<=’ | ‘>’ | ‘>=’ | ‘==’ | ‘~=’ | 
-		 and | or
-
-	unop ::= ‘-’ | not | ‘#’ | ‘~’
-
-
- -

- - - - - - - - -


- -Last update: -Tue Jan 6 10:10:50 BRST 2015 - - - - - diff --git a/3rd/lua/doc/osi-certified-72x60.png b/3rd/lua/doc/osi-certified-72x60.png deleted file mode 100644 index 07df5f6ee7a7a8b2108025dcd815f73f145a83af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3774 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 - - -Lua 5.3 readme - - - - - - - -
-

-Lua -Welcome to Lua 5.3.0 -

- -

-about -· -installation -· -changes -· -license -· -reference manual - -

About Lua

- -

-Lua is a powerful, fast, lightweight, embeddable scripting language -developed by a -team -at -PUC-Rio, -the Pontifical Catholic University of Rio de Janeiro in Brazil. -Lua is -free software -used in many products and projects around the world. - -

-Lua's -official web site -provides complete information -about Lua, -including -an -executive summary -and -updated -documentation, -especially the -reference manual, -which may differ slightly from the -local copy -distributed in this package. - -

Installing Lua

- -

-Lua is distributed in -source -form. -You need to build it before using it. -Building Lua should be straightforward -because -Lua is implemented in pure ANSI C and compiles unmodified in all known -platforms that have an ANSI C compiler. -Lua also compiles unmodified as C++. -The instructions given below for building Lua are for Unix-like platforms. -See also -instructions for other systems -and -customization options. - -

-If you don't have the time or the inclination to compile Lua yourself, -get a binary from -LuaBinaries. -Try also -LuaDist, -a multi-platform distribution of Lua that includes batteries. - -

Building Lua

- -

-In most Unix-like platforms, simply do "make" with a suitable target. -Here are the details. - -

    -
  1. -Open a terminal window and move to -the top-level directory, which is named lua-5.3.0. -The Makefile there controls both the build process and the installation process. -

    -

  2. - Do "make" and see if your platform is listed. - The platforms currently supported are: -

    -

    - aix bsd c89 freebsd generic linux macosx mingw posix solaris -

    -

    - If your platform is listed, just do "make xxx", where xxx - is your platform name. -

    - If your platform is not listed, try the closest one or posix, generic, - c89, in this order. -

    -

  3. -The compilation takes only a few moments -and produces three files in the src directory: -lua (the interpreter), -luac (the compiler), -and liblua.a (the library). -

    -

  4. - To check that Lua has been built correctly, do "make test" - after building Lua. This will run the interpreter and print its version. -
-

-If you're running Linux and get compilation errors, -make sure you have installed the readline development package. -If you get link errors after that, -then try "make linux MYLIBS=-ltermcap". - -

Installing Lua

-

- Once you have built Lua, you may want to install it in an official - place in your system. In this case, do "make install". The official - place and the way to install files are defined in the Makefile. You'll - probably need the right permissions to install files. - -

- To build and install Lua in one step, do "make xxx install", - where xxx is your platform name. - -

- To install Lua locally, do "make local". - This will create a directory install with subdirectories - bin, include, lib, man, share, - and install Lua as listed below. - - To install Lua locally, but in some other directory, do - "make install INSTALL_TOP=xxx", where xxx is your chosen directory. - The installation starts in the src and doc directories, - so take care if INSTALL_TOP is not an absolute path. - -

-
- bin: -
- lua luac -
- include: -
- lauxlib.h lua.h lua.hpp luaconf.h lualib.h -
- lib: -
- liblua.a -
- man/man1: -
- lua.1 luac.1 -
- -

- These are the only directories you need for development. - If you only want to run Lua programs, - you only need the files in bin and man. - The files in include and lib are needed for - embedding Lua in C or C++ programs. - -

Customization

-

- Three kinds of things can be customized by editing a file: -

    -
  • Where and how to install Lua — edit Makefile. -
  • How to build Lua — edit src/Makefile. -
  • Lua features — edit src/luaconf.h. -
- -

- You don't actually need to edit the Makefiles because you may set the - relevant variables in the command line when invoking make. - Nevertheless, it's probably best to edit and save the Makefiles to - record the changes you've made. - -

- On the other hand, if you need to customize some Lua features, you'll need - to edit src/luaconf.h before building and installing Lua. - The edited file will be the one installed, and - it will be used by any Lua clients that you build, to ensure consistency. - Further customization is available to experts by editing the Lua sources. - -

Building Lua on other systems

- -

- If you're not using the usual Unix tools, then the instructions for - building Lua depend on the compiler you use. You'll need to create - projects (or whatever your compiler uses) for building the library, - the interpreter, and the compiler, as follows: - -

-
-library: -
-lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c -lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c -ltm.c lundump.c lvm.c lzio.c -lauxlib.c lbaselib.c lbitlib.c lcorolib.c ldblib.c liolib.c -lmathlib.c loslib.c lstrlib.c ltablib.c lutf8lib.c loadlib.c linit.c -
-interpreter: -
- library, lua.c -
-compiler: -
- library, luac.c -
- -

- To use Lua as a library in your own programs you'll need to know how to - create and use libraries with your compiler. Moreover, to dynamically load - C libraries for Lua you'll need to know how to create dynamic libraries - and you'll need to make sure that the Lua API functions are accessible to - those dynamic libraries — but don't link the Lua library - into each dynamic library. For Unix, we recommend that the Lua library - be linked statically into the host program and its symbols exported for - dynamic linking; src/Makefile does this for the Lua interpreter. - For Windows, we recommend that the Lua library be a DLL. - In all cases, the compiler luac should be linked statically. - -

- As mentioned above, you may edit src/luaconf.h to customize - some features before building Lua. - -

Changes since Lua 5.2

- -

-Here are the main changes introduced in Lua 5.3. -The -reference manual -lists the -incompatibilities that had to be introduced. - -

Main changes

-
    -
  • integers (64-bit by default) -
  • official support for 32-bit numbers -
  • bitwise operators -
  • basic utf-8 support -
  • functions for packing and unpacking values - -
- -Here are the other changes introduced in Lua 5.3: -

Language

-
    -
  • userdata can have any Lua value as uservalue -
  • integer division -
  • more flexible rules for some metamethods -
- -

Libraries

-
    -
  • ipairs and the table library respect metamethods -
  • strip option in string.dump -
  • table library respects metamethods -
  • new function table.move -
  • new function string.pack -
  • new function string.unpack -
  • new function string.packsize -
- -

C API

-
    -
  • simpler API for continuation functions in C -
  • lua_gettable and similar functions return type of resulted value -
  • strip option in lua_dump -
  • new function: lua_geti -
  • new function: lua_seti -
  • new function: lua_isyieldable -
  • new function: lua_numbertointeger -
  • new function: lua_rotate -
  • new function: lua_stringtonumber -
- -

Lua standalone interpreter

-
    -
  • can be used as calculator; no need to prefix with '=' -
  • arg table available to all code -
- -

License

- -[osi certified] - - -

-Lua is free software distributed under the terms of the -MIT license -reproduced below; -it may be used for any purpose, including commercial purposes, -at absolutely no cost without having to ask us. - -The only requirement is that if you do use Lua, -then you should give us credit by including the appropriate copyright notice somewhere in your product or its documentation. - -For details, see -this. - -

-Copyright © 1994–2015 Lua.org, PUC-Rio. - -

-Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -

-The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -

-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -

-

- -


- -Last update: -Fri Dec 12 09:58:42 BRST 2014 - - - - - diff --git a/3rd/lua/src/Makefile b/3rd/lua/src/Makefile deleted file mode 100644 index 2e7a412..0000000 --- a/3rd/lua/src/Makefile +++ /dev/null @@ -1,197 +0,0 @@ -# Makefile for building Lua -# See ../doc/readme.html for installation and customization instructions. - -# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= - -# Your platform. See PLATS for possible values. -PLAT= none - -CC= gcc -std=gnu99 -CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS) -LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS) -LIBS= -lm $(SYSLIBS) $(MYLIBS) - -AR= ar rcu -RANLIB= ranlib -RM= rm -f - -SYSCFLAGS= -SYSLDFLAGS= -SYSLIBS= - -MYCFLAGS= -MYLDFLAGS= -MYLIBS= -MYOBJS= - -# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE ======= - -PLATS= aix bsd c89 freebsd generic linux macosx mingw posix solaris - -LUA_A= liblua.a -CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o \ - lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o \ - ltm.o lundump.o lvm.o lzio.o -LIB_O= lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o \ - lmathlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o loadlib.o linit.o -BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS) - -LUA_T= lua -LUA_O= lua.o - -LUAC_T= luac -LUAC_O= luac.o - -ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O) -ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) -ALL_A= $(LUA_A) - -# Targets start here. -default: $(PLAT) - -all: $(ALL_T) - -o: $(ALL_O) - -a: $(ALL_A) - -$(LUA_A): $(BASE_O) - $(AR) $@ $(BASE_O) - $(RANLIB) $@ - -$(LUA_T): $(LUA_O) $(LUA_A) - $(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) - -$(LUAC_T): $(LUAC_O) $(LUA_A) - $(CC) -o $@ $(LDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) - -clean: - $(RM) $(ALL_T) $(ALL_O) - -depend: - @$(CC) $(CFLAGS) -MM l*.c - -echo: - @echo "PLAT= $(PLAT)" - @echo "CC= $(CC)" - @echo "CFLAGS= $(CFLAGS)" - @echo "LDFLAGS= $(SYSLDFLAGS)" - @echo "LIBS= $(LIBS)" - @echo "AR= $(AR)" - @echo "RANLIB= $(RANLIB)" - @echo "RM= $(RM)" - -# Convenience targets for popular platforms -ALL= all - -none: - @echo "Please do 'make PLATFORM' where PLATFORM is one of these:" - @echo " $(PLATS)" - -aix: - $(MAKE) $(ALL) CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-ldl" SYSLDFLAGS="-brtl -bexpall" - -bsd: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-Wl,-E" - -c89: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_C89" CC="gcc -std=c89" - @echo '' - @echo '*** C89 does not guarantee 64-bit integers for Lua.' - @echo '' - - -freebsd: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -lreadline" - -generic: $(ALL) - -linux: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline" - -macosx: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_MACOSX" SYSLIBS="-lreadline" CC=cc - -mingw: - $(MAKE) "LUA_A=lua53.dll" "LUA_T=lua.exe" \ - "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \ - "SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe - $(MAKE) "LUAC_T=luac.exe" luac.exe - -posix: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX" - -solaris: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN -D_REENTRANT" SYSLIBS="-ldl" - -# list targets that do not create files (but not all makes understand .PHONY) -.PHONY: all $(PLATS) default o a clean depend echo none - -# DO NOT DELETE - -lapi.o: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ - lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \ - ltable.h lundump.h lvm.h -lauxlib.o: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h -lbaselib.o: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lbitlib.o: lbitlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lcode.o: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ - llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ - ldo.h lgc.h lstring.h ltable.h lvm.h -lcorolib.o: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lctype.o: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h -ldblib.o: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -ldebug.o: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ - lobject.h ltm.h lzio.h lmem.h lcode.h llex.h lopcodes.h lparser.h \ - ldebug.h ldo.h lfunc.h lstring.h lgc.h ltable.h lvm.h -ldo.o: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ - lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lopcodes.h \ - lparser.h lstring.h ltable.h lundump.h lvm.h -ldump.o: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \ - ltm.h lzio.h lmem.h lundump.h -lfunc.o: lfunc.c lprefix.h lua.h luaconf.h lfunc.h lobject.h llimits.h \ - lgc.h lstate.h ltm.h lzio.h lmem.h -lgc.o: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ - llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h -linit.o: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h -liolib.o: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -llex.o: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldo.h \ - lobject.h lstate.h ltm.h lzio.h lmem.h lgc.h llex.h lparser.h lstring.h \ - ltable.h -lmathlib.o: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lmem.o: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ - llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h -loadlib.o: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lobject.o: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \ - ldebug.h lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h \ - lvm.h -lopcodes.o: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h -loslib.o: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lparser.o: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ - llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ - ldo.h lfunc.h lstring.h lgc.h ltable.h -lstate.o: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ - lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h llex.h \ - lstring.h ltable.h -lstring.o: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ - lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h -lstrlib.o: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -ltable.o: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ - llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h -ltablib.o: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -ltm.o: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ - llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h ltable.h lvm.h -lua.o: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -luac.o: luac.c lprefix.h lua.h luaconf.h lauxlib.h lobject.h llimits.h \ - lstate.h ltm.h lzio.h lmem.h lundump.h ldebug.h lopcodes.h -lundump.o: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ - lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h \ - lundump.h -lutf8lib.o: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ - llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h \ - ltable.h lvm.h -lzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \ - lobject.h ltm.h lzio.h - -# (end of Makefile) diff --git a/3rd/lua/src/lapi.c b/3rd/lua/src/lapi.c deleted file mode 100644 index fbfafa3..0000000 --- a/3rd/lua/src/lapi.c +++ /dev/null @@ -1,1270 +0,0 @@ -/* -** $Id: lapi.c,v 2.244 2014/12/26 14:43:45 roberto Exp $ -** Lua API -** See Copyright Notice in lua.h -*/ - -#define lapi_c -#define LUA_CORE - -#include "lprefix.h" - - -#include -#include - -#include "lua.h" - -#include "lapi.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lundump.h" -#include "lvm.h" - - - -const char lua_ident[] = - "$LuaVersion: " LUA_COPYRIGHT " $" - "$LuaAuthors: " LUA_AUTHORS " $"; - - -/* value at a non-valid index */ -#define NONVALIDVALUE cast(TValue *, luaO_nilobject) - -/* corresponding test */ -#define isvalid(o) ((o) != luaO_nilobject) - -/* test for pseudo index */ -#define ispseudo(i) ((i) <= LUA_REGISTRYINDEX) - -/* test for upvalue */ -#define isupvalue(i) ((i) < LUA_REGISTRYINDEX) - -/* test for valid but not pseudo index */ -#define isstackindex(i, o) (isvalid(o) && !ispseudo(i)) - -#define api_checkvalidindex(o) api_check(isvalid(o), "invalid index") - -#define api_checkstackindex(i, o) \ - api_check(isstackindex(i, o), "index not in the stack") - - -static TValue *index2addr (lua_State *L, int idx) { - CallInfo *ci = L->ci; - if (idx > 0) { - TValue *o = ci->func + idx; - api_check(idx <= ci->top - (ci->func + 1), "unacceptable index"); - if (o >= L->top) return NONVALIDVALUE; - else return o; - } - else if (!ispseudo(idx)) { /* negative index */ - api_check(idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index"); - return L->top + idx; - } - else if (idx == LUA_REGISTRYINDEX) - return &G(L)->l_registry; - else { /* upvalues */ - idx = LUA_REGISTRYINDEX - idx; - api_check(idx <= MAXUPVAL + 1, "upvalue index too large"); - if (ttislcf(ci->func)) /* light C function? */ - return NONVALIDVALUE; /* it has no upvalues */ - else { - CClosure *func = clCvalue(ci->func); - return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : NONVALIDVALUE; - } - } -} - - -/* -** to be called by 'lua_checkstack' in protected mode, to grow stack -** capturing memory errors -*/ -static void growstack (lua_State *L, void *ud) { - int size = *(int *)ud; - luaD_growstack(L, size); -} - - -LUA_API int lua_checkstack (lua_State *L, int n) { - int res; - CallInfo *ci = L->ci; - lua_lock(L); - api_check(n >= 0, "negative 'n'"); - if (L->stack_last - L->top > n) /* stack large enough? */ - res = 1; /* yes; check is OK */ - else { /* no; need to grow stack */ - int inuse = cast_int(L->top - L->stack) + EXTRA_STACK; - if (inuse > LUAI_MAXSTACK - n) /* can grow without overflow? */ - res = 0; /* no */ - else /* try to grow stack */ - res = (luaD_rawrunprotected(L, &growstack, &n) == LUA_OK); - } - if (res && ci->top < L->top + n) - ci->top = L->top + n; /* adjust frame top */ - lua_unlock(L); - return res; -} - - -LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) { - int i; - if (from == to) return; - lua_lock(to); - api_checknelems(from, n); - api_check(G(from) == G(to), "moving among independent states"); - api_check(to->ci->top - to->top >= n, "not enough elements to move"); - from->top -= n; - for (i = 0; i < n; i++) { - setobj2s(to, to->top++, from->top + i); - } - lua_unlock(to); -} - - -LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { - lua_CFunction old; - lua_lock(L); - old = G(L)->panic; - G(L)->panic = panicf; - lua_unlock(L); - return old; -} - - -LUA_API const lua_Number *lua_version (lua_State *L) { - static const lua_Number version = LUA_VERSION_NUM; - if (L == NULL) return &version; - else return G(L)->version; -} - - - -/* -** basic stack manipulation -*/ - - -/* -** convert an acceptable stack index into an absolute index -*/ -LUA_API int lua_absindex (lua_State *L, int idx) { - return (idx > 0 || ispseudo(idx)) - ? idx - : cast_int(L->top - L->ci->func + idx); -} - - -LUA_API int lua_gettop (lua_State *L) { - return cast_int(L->top - (L->ci->func + 1)); -} - - -LUA_API void lua_settop (lua_State *L, int idx) { - StkId func = L->ci->func; - lua_lock(L); - if (idx >= 0) { - api_check(idx <= L->stack_last - (func + 1), "new top too large"); - while (L->top < (func + 1) + idx) - setnilvalue(L->top++); - L->top = (func + 1) + idx; - } - else { - api_check(-(idx+1) <= (L->top - (func + 1)), "invalid new top"); - L->top += idx+1; /* 'subtract' index (index is negative) */ - } - lua_unlock(L); -} - - -/* -** Reverse the stack segment from 'from' to 'to' -** (auxiliary to 'lua_rotate') -*/ -static void reverse (lua_State *L, StkId from, StkId to) { - for (; from < to; from++, to--) { - TValue temp; - setobj(L, &temp, from); - setobjs2s(L, from, to); - setobj2s(L, to, &temp); - } -} - - -/* -** Let x = AB, where A is a prefix of length 'n'. Then, -** rotate x n == BA. But BA == (A^r . B^r)^r. -*/ -LUA_API void lua_rotate (lua_State *L, int idx, int n) { - StkId p, t, m; - lua_lock(L); - t = L->top - 1; /* end of stack segment being rotated */ - p = index2addr(L, idx); /* start of segment */ - api_checkstackindex(idx, p); - api_check((n >= 0 ? n : -n) <= (t - p + 1), "invalid 'n'"); - m = (n >= 0 ? t - n : p - n - 1); /* end of prefix */ - reverse(L, p, m); /* reverse the prefix with length 'n' */ - reverse(L, m + 1, t); /* reverse the suffix */ - reverse(L, p, t); /* reverse the entire segment */ - lua_unlock(L); -} - - -LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) { - TValue *fr, *to; - lua_lock(L); - fr = index2addr(L, fromidx); - to = index2addr(L, toidx); - api_checkvalidindex(to); - setobj(L, to, fr); - if (isupvalue(toidx)) /* function upvalue? */ - luaC_barrier(L, clCvalue(L->ci->func), fr); - /* LUA_REGISTRYINDEX does not need gc barrier - (collector revisits it before finishing collection) */ - lua_unlock(L); -} - - -LUA_API void lua_pushvalue (lua_State *L, int idx) { - lua_lock(L); - setobj2s(L, L->top, index2addr(L, idx)); - api_incr_top(L); - lua_unlock(L); -} - - - -/* -** access functions (stack -> C) -*/ - - -LUA_API int lua_type (lua_State *L, int idx) { - StkId o = index2addr(L, idx); - return (isvalid(o) ? ttnov(o) : LUA_TNONE); -} - - -LUA_API const char *lua_typename (lua_State *L, int t) { - UNUSED(L); - api_check(LUA_TNONE <= t && t < LUA_NUMTAGS, "invalid tag"); - return ttypename(t); -} - - -LUA_API int lua_iscfunction (lua_State *L, int idx) { - StkId o = index2addr(L, idx); - return (ttislcf(o) || (ttisCclosure(o))); -} - - -LUA_API int lua_isinteger (lua_State *L, int idx) { - StkId o = index2addr(L, idx); - return ttisinteger(o); -} - - -LUA_API int lua_isnumber (lua_State *L, int idx) { - lua_Number n; - const TValue *o = index2addr(L, idx); - return tonumber(o, &n); -} - - -LUA_API int lua_isstring (lua_State *L, int idx) { - const TValue *o = index2addr(L, idx); - return (ttisstring(o) || cvt2str(o)); -} - - -LUA_API int lua_isuserdata (lua_State *L, int idx) { - const TValue *o = index2addr(L, idx); - return (ttisfulluserdata(o) || ttislightuserdata(o)); -} - - -LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { - StkId o1 = index2addr(L, index1); - StkId o2 = index2addr(L, index2); - return (isvalid(o1) && isvalid(o2)) ? luaV_rawequalobj(o1, o2) : 0; -} - - -LUA_API void lua_arith (lua_State *L, int op) { - lua_lock(L); - if (op != LUA_OPUNM && op != LUA_OPBNOT) - api_checknelems(L, 2); /* all other operations expect two operands */ - else { /* for unary operations, add fake 2nd operand */ - api_checknelems(L, 1); - setobjs2s(L, L->top, L->top - 1); - L->top++; - } - /* first operand at top - 2, second at top - 1; result go to top - 2 */ - luaO_arith(L, op, L->top - 2, L->top - 1, L->top - 2); - L->top--; /* remove second operand */ - lua_unlock(L); -} - - -LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) { - StkId o1, o2; - int i = 0; - lua_lock(L); /* may call tag method */ - o1 = index2addr(L, index1); - o2 = index2addr(L, index2); - if (isvalid(o1) && isvalid(o2)) { - switch (op) { - case LUA_OPEQ: i = luaV_equalobj(L, o1, o2); break; - case LUA_OPLT: i = luaV_lessthan(L, o1, o2); break; - case LUA_OPLE: i = luaV_lessequal(L, o1, o2); break; - default: api_check(0, "invalid option"); - } - } - lua_unlock(L); - return i; -} - - -LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) { - size_t sz = luaO_str2num(s, L->top); - if (sz != 0) - api_incr_top(L); - return sz; -} - - -LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *pisnum) { - lua_Number n; - const TValue *o = index2addr(L, idx); - int isnum = tonumber(o, &n); - if (!isnum) - n = 0; /* call to 'tonumber' may change 'n' even if it fails */ - if (pisnum) *pisnum = isnum; - return n; -} - - -LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *pisnum) { - lua_Integer res; - const TValue *o = index2addr(L, idx); - int isnum = tointeger(o, &res); - if (!isnum) - res = 0; /* call to 'tointeger' may change 'n' even if it fails */ - if (pisnum) *pisnum = isnum; - return res; -} - - -LUA_API int lua_toboolean (lua_State *L, int idx) { - const TValue *o = index2addr(L, idx); - return !l_isfalse(o); -} - - -LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) { - StkId o = index2addr(L, idx); - if (!ttisstring(o)) { - if (!cvt2str(o)) { /* not convertible? */ - if (len != NULL) *len = 0; - return NULL; - } - lua_lock(L); /* 'luaO_tostring' may create a new string */ - luaC_checkGC(L); - o = index2addr(L, idx); /* previous call may reallocate the stack */ - luaO_tostring(L, o); - lua_unlock(L); - } - if (len != NULL) *len = tsvalue(o)->len; - return svalue(o); -} - - -LUA_API size_t lua_rawlen (lua_State *L, int idx) { - StkId o = index2addr(L, idx); - switch (ttnov(o)) { - case LUA_TSTRING: return tsvalue(o)->len; - case LUA_TUSERDATA: return uvalue(o)->len; - case LUA_TTABLE: return luaH_getn(hvalue(o)); - default: return 0; - } -} - - -LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { - StkId o = index2addr(L, idx); - if (ttislcf(o)) return fvalue(o); - else if (ttisCclosure(o)) - return clCvalue(o)->f; - else return NULL; /* not a C function */ -} - - -LUA_API void *lua_touserdata (lua_State *L, int idx) { - StkId o = index2addr(L, idx); - switch (ttnov(o)) { - case LUA_TUSERDATA: return getudatamem(uvalue(o)); - case LUA_TLIGHTUSERDATA: return pvalue(o); - default: return NULL; - } -} - - -LUA_API lua_State *lua_tothread (lua_State *L, int idx) { - StkId o = index2addr(L, idx); - return (!ttisthread(o)) ? NULL : thvalue(o); -} - - -LUA_API const void *lua_topointer (lua_State *L, int idx) { - StkId o = index2addr(L, idx); - switch (ttype(o)) { - case LUA_TTABLE: return hvalue(o); - case LUA_TLCL: return clLvalue(o); - case LUA_TCCL: return clCvalue(o); - case LUA_TLCF: return cast(void *, cast(size_t, fvalue(o))); - case LUA_TTHREAD: return thvalue(o); - case LUA_TUSERDATA: - case LUA_TLIGHTUSERDATA: - return lua_touserdata(L, idx); - default: return NULL; - } -} - - - -/* -** push functions (C -> stack) -*/ - - -LUA_API void lua_pushnil (lua_State *L) { - lua_lock(L); - setnilvalue(L->top); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushnumber (lua_State *L, lua_Number n) { - lua_lock(L); - setfltvalue(L->top, n); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { - lua_lock(L); - setivalue(L->top, n); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) { - TString *ts; - lua_lock(L); - luaC_checkGC(L); - ts = luaS_newlstr(L, s, len); - setsvalue2s(L, L->top, ts); - api_incr_top(L); - lua_unlock(L); - return getstr(ts); -} - - -LUA_API const char *lua_pushstring (lua_State *L, const char *s) { - if (s == NULL) { - lua_pushnil(L); - return NULL; - } - else { - TString *ts; - lua_lock(L); - luaC_checkGC(L); - ts = luaS_new(L, s); - setsvalue2s(L, L->top, ts); - api_incr_top(L); - lua_unlock(L); - return getstr(ts); - } -} - - -LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, - va_list argp) { - const char *ret; - lua_lock(L); - luaC_checkGC(L); - ret = luaO_pushvfstring(L, fmt, argp); - lua_unlock(L); - return ret; -} - - -LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) { - const char *ret; - va_list argp; - lua_lock(L); - luaC_checkGC(L); - va_start(argp, fmt); - ret = luaO_pushvfstring(L, fmt, argp); - va_end(argp); - lua_unlock(L); - return ret; -} - - -LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { - lua_lock(L); - if (n == 0) { - setfvalue(L->top, fn); - } - else { - CClosure *cl; - api_checknelems(L, n); - api_check(n <= MAXUPVAL, "upvalue index too large"); - luaC_checkGC(L); - cl = luaF_newCclosure(L, n); - cl->f = fn; - L->top -= n; - while (n--) { - setobj2n(L, &cl->upvalue[n], L->top + n); - /* does not need barrier because closure is white */ - } - setclCvalue(L, L->top, cl); - } - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushboolean (lua_State *L, int b) { - lua_lock(L); - setbvalue(L->top, (b != 0)); /* ensure that true is 1 */ - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushlightuserdata (lua_State *L, void *p) { - lua_lock(L); - setpvalue(L->top, p); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API int lua_pushthread (lua_State *L) { - lua_lock(L); - setthvalue(L, L->top, L); - api_incr_top(L); - lua_unlock(L); - return (G(L)->mainthread == L); -} - - - -/* -** get functions (Lua -> stack) -*/ - - -LUA_API int lua_getglobal (lua_State *L, const char *name) { - Table *reg = hvalue(&G(L)->l_registry); - const TValue *gt; /* global table */ - lua_lock(L); - gt = luaH_getint(reg, LUA_RIDX_GLOBALS); - setsvalue2s(L, L->top++, luaS_new(L, name)); - luaV_gettable(L, gt, L->top - 1, L->top - 1); - lua_unlock(L); - return ttnov(L->top - 1); -} - - -LUA_API int lua_gettable (lua_State *L, int idx) { - StkId t; - lua_lock(L); - t = index2addr(L, idx); - luaV_gettable(L, t, L->top - 1, L->top - 1); - lua_unlock(L); - return ttnov(L->top - 1); -} - - -LUA_API int lua_getfield (lua_State *L, int idx, const char *k) { - StkId t; - lua_lock(L); - t = index2addr(L, idx); - setsvalue2s(L, L->top, luaS_new(L, k)); - api_incr_top(L); - luaV_gettable(L, t, L->top - 1, L->top - 1); - lua_unlock(L); - return ttnov(L->top - 1); -} - - -LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { - StkId t; - lua_lock(L); - t = index2addr(L, idx); - setivalue(L->top, n); - api_incr_top(L); - luaV_gettable(L, t, L->top - 1, L->top - 1); - lua_unlock(L); - return ttnov(L->top - 1); -} - - -LUA_API int lua_rawget (lua_State *L, int idx) { - StkId t; - lua_lock(L); - t = index2addr(L, idx); - api_check(ttistable(t), "table expected"); - setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1)); - lua_unlock(L); - return ttnov(L->top - 1); -} - - -LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) { - StkId t; - lua_lock(L); - t = index2addr(L, idx); - api_check(ttistable(t), "table expected"); - setobj2s(L, L->top, luaH_getint(hvalue(t), n)); - api_incr_top(L); - lua_unlock(L); - return ttnov(L->top - 1); -} - - -LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) { - StkId t; - TValue k; - lua_lock(L); - t = index2addr(L, idx); - api_check(ttistable(t), "table expected"); - setpvalue(&k, cast(void *, p)); - setobj2s(L, L->top, luaH_get(hvalue(t), &k)); - api_incr_top(L); - lua_unlock(L); - return ttnov(L->top - 1); -} - - -LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { - Table *t; - lua_lock(L); - luaC_checkGC(L); - t = luaH_new(L); - sethvalue(L, L->top, t); - api_incr_top(L); - if (narray > 0 || nrec > 0) - luaH_resize(L, t, narray, nrec); - lua_unlock(L); -} - - -LUA_API int lua_getmetatable (lua_State *L, int objindex) { - const TValue *obj; - Table *mt; - int res = 0; - lua_lock(L); - obj = index2addr(L, objindex); - switch (ttnov(obj)) { - case LUA_TTABLE: - mt = hvalue(obj)->metatable; - break; - case LUA_TUSERDATA: - mt = uvalue(obj)->metatable; - break; - default: - mt = G(L)->mt[ttnov(obj)]; - break; - } - if (mt != NULL) { - sethvalue(L, L->top, mt); - api_incr_top(L); - res = 1; - } - lua_unlock(L); - return res; -} - - -LUA_API int lua_getuservalue (lua_State *L, int idx) { - StkId o; - lua_lock(L); - o = index2addr(L, idx); - api_check(ttisfulluserdata(o), "full userdata expected"); - getuservalue(L, uvalue(o), L->top); - api_incr_top(L); - lua_unlock(L); - return ttnov(L->top - 1); -} - - -/* -** set functions (stack -> Lua) -*/ - - -LUA_API void lua_setglobal (lua_State *L, const char *name) { - Table *reg = hvalue(&G(L)->l_registry); - const TValue *gt; /* global table */ - lua_lock(L); - api_checknelems(L, 1); - gt = luaH_getint(reg, LUA_RIDX_GLOBALS); - setsvalue2s(L, L->top++, luaS_new(L, name)); - luaV_settable(L, gt, L->top - 1, L->top - 2); - L->top -= 2; /* pop value and key */ - lua_unlock(L); -} - - -LUA_API void lua_settable (lua_State *L, int idx) { - StkId t; - lua_lock(L); - api_checknelems(L, 2); - t = index2addr(L, idx); - luaV_settable(L, t, L->top - 2, L->top - 1); - L->top -= 2; /* pop index and value */ - lua_unlock(L); -} - - -LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { - StkId t; - lua_lock(L); - api_checknelems(L, 1); - t = index2addr(L, idx); - setsvalue2s(L, L->top++, luaS_new(L, k)); - luaV_settable(L, t, L->top - 1, L->top - 2); - L->top -= 2; /* pop value and key */ - lua_unlock(L); -} - - -LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) { - StkId t; - lua_lock(L); - api_checknelems(L, 1); - t = index2addr(L, idx); - setivalue(L->top++, n); - luaV_settable(L, t, L->top - 1, L->top - 2); - L->top -= 2; /* pop value and key */ - lua_unlock(L); -} - - -LUA_API void lua_rawset (lua_State *L, int idx) { - StkId o; - Table *t; - lua_lock(L); - api_checknelems(L, 2); - o = index2addr(L, idx); - api_check(ttistable(o), "table expected"); - t = hvalue(o); - setobj2t(L, luaH_set(L, t, L->top-2), L->top-1); - invalidateTMcache(t); - luaC_barrierback(L, t, L->top-1); - L->top -= 2; - lua_unlock(L); -} - - -LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) { - StkId o; - Table *t; - lua_lock(L); - api_checknelems(L, 1); - o = index2addr(L, idx); - api_check(ttistable(o), "table expected"); - t = hvalue(o); - luaH_setint(L, t, n, L->top - 1); - luaC_barrierback(L, t, L->top-1); - L->top--; - lua_unlock(L); -} - - -LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) { - StkId o; - Table *t; - TValue k; - lua_lock(L); - api_checknelems(L, 1); - o = index2addr(L, idx); - api_check(ttistable(o), "table expected"); - t = hvalue(o); - setpvalue(&k, cast(void *, p)); - setobj2t(L, luaH_set(L, t, &k), L->top - 1); - luaC_barrierback(L, t, L->top - 1); - L->top--; - lua_unlock(L); -} - - -LUA_API int lua_setmetatable (lua_State *L, int objindex) { - TValue *obj; - Table *mt; - lua_lock(L); - api_checknelems(L, 1); - obj = index2addr(L, objindex); - if (ttisnil(L->top - 1)) - mt = NULL; - else { - api_check(ttistable(L->top - 1), "table expected"); - mt = hvalue(L->top - 1); - } - switch (ttnov(obj)) { - case LUA_TTABLE: { - hvalue(obj)->metatable = mt; - if (mt) { - luaC_objbarrier(L, gcvalue(obj), mt); - luaC_checkfinalizer(L, gcvalue(obj), mt); - } - break; - } - case LUA_TUSERDATA: { - uvalue(obj)->metatable = mt; - if (mt) { - luaC_objbarrier(L, uvalue(obj), mt); - luaC_checkfinalizer(L, gcvalue(obj), mt); - } - break; - } - default: { - G(L)->mt[ttnov(obj)] = mt; - break; - } - } - L->top--; - lua_unlock(L); - return 1; -} - - -LUA_API void lua_setuservalue (lua_State *L, int idx) { - StkId o; - lua_lock(L); - api_checknelems(L, 1); - o = index2addr(L, idx); - api_check(ttisfulluserdata(o), "full userdata expected"); - setuservalue(L, uvalue(o), L->top - 1); - luaC_barrier(L, gcvalue(o), L->top - 1); - L->top--; - lua_unlock(L); -} - - -/* -** 'load' and 'call' functions (run Lua code) -*/ - - -#define checkresults(L,na,nr) \ - api_check((nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)), \ - "results from function overflow current stack size") - - -LUA_API void lua_callk (lua_State *L, int nargs, int nresults, - lua_KContext ctx, lua_KFunction k) { - StkId func; - lua_lock(L); - api_check(k == NULL || !isLua(L->ci), - "cannot use continuations inside hooks"); - api_checknelems(L, nargs+1); - api_check(L->status == LUA_OK, "cannot do calls on non-normal thread"); - checkresults(L, nargs, nresults); - func = L->top - (nargs+1); - if (k != NULL && L->nny == 0) { /* need to prepare continuation? */ - L->ci->u.c.k = k; /* save continuation */ - L->ci->u.c.ctx = ctx; /* save context */ - luaD_call(L, func, nresults, 1); /* do the call */ - } - else /* no continuation or no yieldable */ - luaD_call(L, func, nresults, 0); /* just do the call */ - adjustresults(L, nresults); - lua_unlock(L); -} - - - -/* -** Execute a protected call. -*/ -struct CallS { /* data to 'f_call' */ - StkId func; - int nresults; -}; - - -static void f_call (lua_State *L, void *ud) { - struct CallS *c = cast(struct CallS *, ud); - luaD_call(L, c->func, c->nresults, 0); -} - - - -LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, - lua_KContext ctx, lua_KFunction k) { - struct CallS c; - int status; - ptrdiff_t func; - lua_lock(L); - api_check(k == NULL || !isLua(L->ci), - "cannot use continuations inside hooks"); - api_checknelems(L, nargs+1); - api_check(L->status == LUA_OK, "cannot do calls on non-normal thread"); - checkresults(L, nargs, nresults); - if (errfunc == 0) - func = 0; - else { - StkId o = index2addr(L, errfunc); - api_checkstackindex(errfunc, o); - func = savestack(L, o); - } - c.func = L->top - (nargs+1); /* function to be called */ - if (k == NULL || L->nny > 0) { /* no continuation or no yieldable? */ - c.nresults = nresults; /* do a 'conventional' protected call */ - status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); - } - else { /* prepare continuation (call is already protected by 'resume') */ - CallInfo *ci = L->ci; - ci->u.c.k = k; /* save continuation */ - ci->u.c.ctx = ctx; /* save context */ - /* save information for error recovery */ - ci->extra = savestack(L, c.func); - ci->u.c.old_errfunc = L->errfunc; - L->errfunc = func; - setoah(ci->callstatus, L->allowhook); /* save value of 'allowhook' */ - ci->callstatus |= CIST_YPCALL; /* function can do error recovery */ - luaD_call(L, c.func, nresults, 1); /* do the call */ - ci->callstatus &= ~CIST_YPCALL; - L->errfunc = ci->u.c.old_errfunc; - status = LUA_OK; /* if it is here, there were no errors */ - } - adjustresults(L, nresults); - lua_unlock(L); - return status; -} - - -LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, - const char *chunkname, const char *mode) { - ZIO z; - int status; - lua_lock(L); - if (!chunkname) chunkname = "?"; - luaZ_init(L, &z, reader, data); - status = luaD_protectedparser(L, &z, chunkname, mode); - if (status == LUA_OK) { /* no errors? */ - LClosure *f = clLvalue(L->top - 1); /* get newly created function */ - if (f->nupvalues >= 1) { /* does it have an upvalue? */ - /* get global table from registry */ - Table *reg = hvalue(&G(L)->l_registry); - const TValue *gt = luaH_getint(reg, LUA_RIDX_GLOBALS); - /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */ - setobj(L, f->upvals[0]->v, gt); - luaC_upvalbarrier(L, f->upvals[0]); - } - } - lua_unlock(L); - return status; -} - - -LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data, int strip) { - int status; - TValue *o; - lua_lock(L); - api_checknelems(L, 1); - o = L->top - 1; - if (isLfunction(o)) - status = luaU_dump(L, getproto(o), writer, data, strip); - else - status = 1; - lua_unlock(L); - return status; -} - - -LUA_API int lua_status (lua_State *L) { - return L->status; -} - - -/* -** Garbage-collection function -*/ - -LUA_API int lua_gc (lua_State *L, int what, int data) { - int res = 0; - global_State *g; - lua_lock(L); - g = G(L); - switch (what) { - case LUA_GCSTOP: { - g->gcrunning = 0; - break; - } - case LUA_GCRESTART: { - luaE_setdebt(g, 0); - g->gcrunning = 1; - break; - } - case LUA_GCCOLLECT: { - luaC_fullgc(L, 0); - break; - } - case LUA_GCCOUNT: { - /* GC values are expressed in Kbytes: #bytes/2^10 */ - res = cast_int(gettotalbytes(g) >> 10); - break; - } - case LUA_GCCOUNTB: { - res = cast_int(gettotalbytes(g) & 0x3ff); - break; - } - case LUA_GCSTEP: { - l_mem debt = 1; /* =1 to signal that it did an actual step */ - int oldrunning = g->gcrunning; - g->gcrunning = 1; /* allow GC to run */ - if (data == 0) { - luaE_setdebt(g, -GCSTEPSIZE); /* to do a "small" step */ - luaC_step(L); - } - else { /* add 'data' to total debt */ - debt = cast(l_mem, data) * 1024 + g->GCdebt; - luaE_setdebt(g, debt); - luaC_checkGC(L); - } - g->gcrunning = oldrunning; /* restore previous state */ - if (debt > 0 && g->gcstate == GCSpause) /* end of cycle? */ - res = 1; /* signal it */ - break; - } - case LUA_GCSETPAUSE: { - res = g->gcpause; - g->gcpause = data; - break; - } - case LUA_GCSETSTEPMUL: { - res = g->gcstepmul; - if (data < 40) data = 40; /* avoid ridiculous low values (and 0) */ - g->gcstepmul = data; - break; - } - case LUA_GCISRUNNING: { - res = g->gcrunning; - break; - } - default: res = -1; /* invalid option */ - } - lua_unlock(L); - return res; -} - - - -/* -** miscellaneous functions -*/ - - -LUA_API int lua_error (lua_State *L) { - lua_lock(L); - api_checknelems(L, 1); - luaG_errormsg(L); - /* code unreachable; will unlock when control actually leaves the kernel */ - return 0; /* to avoid warnings */ -} - - -LUA_API int lua_next (lua_State *L, int idx) { - StkId t; - int more; - lua_lock(L); - t = index2addr(L, idx); - api_check(ttistable(t), "table expected"); - more = luaH_next(L, hvalue(t), L->top - 1); - if (more) { - api_incr_top(L); - } - else /* no more elements */ - L->top -= 1; /* remove key */ - lua_unlock(L); - return more; -} - - -LUA_API void lua_concat (lua_State *L, int n) { - lua_lock(L); - api_checknelems(L, n); - if (n >= 2) { - luaC_checkGC(L); - luaV_concat(L, n); - } - else if (n == 0) { /* push empty string */ - setsvalue2s(L, L->top, luaS_newlstr(L, "", 0)); - api_incr_top(L); - } - /* else n == 1; nothing to do */ - lua_unlock(L); -} - - -LUA_API void lua_len (lua_State *L, int idx) { - StkId t; - lua_lock(L); - t = index2addr(L, idx); - luaV_objlen(L, L->top, t); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) { - lua_Alloc f; - lua_lock(L); - if (ud) *ud = G(L)->ud; - f = G(L)->frealloc; - lua_unlock(L); - return f; -} - - -LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) { - lua_lock(L); - G(L)->ud = ud; - G(L)->frealloc = f; - lua_unlock(L); -} - - -LUA_API void *lua_newuserdata (lua_State *L, size_t size) { - Udata *u; - lua_lock(L); - luaC_checkGC(L); - u = luaS_newudata(L, size); - setuvalue(L, L->top, u); - api_incr_top(L); - lua_unlock(L); - return getudatamem(u); -} - - - -static const char *aux_upvalue (StkId fi, int n, TValue **val, - CClosure **owner, UpVal **uv) { - switch (ttype(fi)) { - case LUA_TCCL: { /* C closure */ - CClosure *f = clCvalue(fi); - if (!(1 <= n && n <= f->nupvalues)) return NULL; - *val = &f->upvalue[n-1]; - if (owner) *owner = f; - return ""; - } - case LUA_TLCL: { /* Lua closure */ - LClosure *f = clLvalue(fi); - TString *name; - Proto *p = f->p; - if (!(1 <= n && n <= p->sizeupvalues)) return NULL; - *val = f->upvals[n-1]->v; - if (uv) *uv = f->upvals[n - 1]; - name = p->upvalues[n-1].name; - return (name == NULL) ? "(*no name)" : getstr(name); - } - default: return NULL; /* not a closure */ - } -} - - -LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { - const char *name; - TValue *val = NULL; /* to avoid warnings */ - lua_lock(L); - name = aux_upvalue(index2addr(L, funcindex), n, &val, NULL, NULL); - if (name) { - setobj2s(L, L->top, val); - api_incr_top(L); - } - lua_unlock(L); - return name; -} - - -LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { - const char *name; - TValue *val = NULL; /* to avoid warnings */ - CClosure *owner = NULL; - UpVal *uv = NULL; - StkId fi; - lua_lock(L); - fi = index2addr(L, funcindex); - api_checknelems(L, 1); - name = aux_upvalue(fi, n, &val, &owner, &uv); - if (name) { - L->top--; - setobj(L, val, L->top); - if (owner) { luaC_barrier(L, owner, L->top); } - else if (uv) { luaC_upvalbarrier(L, uv); } - } - lua_unlock(L); - return name; -} - - -static UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) { - LClosure *f; - StkId fi = index2addr(L, fidx); - api_check(ttisLclosure(fi), "Lua function expected"); - f = clLvalue(fi); - api_check((1 <= n && n <= f->p->sizeupvalues), "invalid upvalue index"); - if (pf) *pf = f; - return &f->upvals[n - 1]; /* get its upvalue pointer */ -} - - -LUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) { - StkId fi = index2addr(L, fidx); - switch (ttype(fi)) { - case LUA_TLCL: { /* lua closure */ - return *getupvalref(L, fidx, n, NULL); - } - case LUA_TCCL: { /* C closure */ - CClosure *f = clCvalue(fi); - api_check(1 <= n && n <= f->nupvalues, "invalid upvalue index"); - return &f->upvalue[n - 1]; - } - default: { - api_check(0, "closure expected"); - return NULL; - } - } -} - - -LUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1, - int fidx2, int n2) { - LClosure *f1; - UpVal **up1 = getupvalref(L, fidx1, n1, &f1); - UpVal **up2 = getupvalref(L, fidx2, n2, NULL); - luaC_upvdeccount(L, *up1); - *up1 = *up2; - (*up1)->refcount++; - if (upisopen(*up1)) (*up1)->u.open.touched = 1; - luaC_upvalbarrier(L, *up1); -} - - diff --git a/3rd/lua/src/lapi.h b/3rd/lua/src/lapi.h deleted file mode 100644 index 092f5e9..0000000 --- a/3rd/lua/src/lapi.h +++ /dev/null @@ -1,24 +0,0 @@ -/* -** $Id: lapi.h,v 2.8 2014/07/15 21:26:50 roberto Exp $ -** Auxiliary functions from Lua API -** See Copyright Notice in lua.h -*/ - -#ifndef lapi_h -#define lapi_h - - -#include "llimits.h" -#include "lstate.h" - -#define api_incr_top(L) {L->top++; api_check(L->top <= L->ci->top, \ - "stack overflow");} - -#define adjustresults(L,nres) \ - { if ((nres) == LUA_MULTRET && L->ci->top < L->top) L->ci->top = L->top; } - -#define api_checknelems(L,n) api_check((n) < (L->top - L->ci->func), \ - "not enough elements in the stack") - - -#endif diff --git a/3rd/lua/src/lauxlib.c b/3rd/lua/src/lauxlib.c deleted file mode 100644 index 1c41d6a..0000000 --- a/3rd/lua/src/lauxlib.c +++ /dev/null @@ -1,972 +0,0 @@ -/* -** $Id: lauxlib.c,v 1.279 2014/12/14 18:32:26 roberto Exp $ -** Auxiliary functions for building Lua libraries -** See Copyright Notice in lua.h -*/ - -#define lauxlib_c -#define LUA_LIB - -#include "lprefix.h" - - -#include -#include -#include -#include -#include - - -/* This file uses only the official API of Lua. -** Any function declared here could be written as an application function. -*/ - -#include "lua.h" - -#include "lauxlib.h" - - -/* -** {====================================================== -** Traceback -** ======================================================= -*/ - - -#define LEVELS1 12 /* size of the first part of the stack */ -#define LEVELS2 10 /* size of the second part of the stack */ - - - -/* -** search for 'objidx' in table at index -1. -** return 1 + string at top if find a good name. -*/ -static int findfield (lua_State *L, int objidx, int level) { - if (level == 0 || !lua_istable(L, -1)) - return 0; /* not found */ - lua_pushnil(L); /* start 'next' loop */ - while (lua_next(L, -2)) { /* for each pair in table */ - if (lua_type(L, -2) == LUA_TSTRING) { /* ignore non-string keys */ - if (lua_rawequal(L, objidx, -1)) { /* found object? */ - lua_pop(L, 1); /* remove value (but keep name) */ - return 1; - } - else if (findfield(L, objidx, level - 1)) { /* try recursively */ - lua_remove(L, -2); /* remove table (but keep name) */ - lua_pushliteral(L, "."); - lua_insert(L, -2); /* place '.' between the two names */ - lua_concat(L, 3); - return 1; - } - } - lua_pop(L, 1); /* remove value */ - } - return 0; /* not found */ -} - - -/* -** Search for a name for a function in all loaded modules -** (registry._LOADED). -*/ -static int pushglobalfuncname (lua_State *L, lua_Debug *ar) { - int top = lua_gettop(L); - lua_getinfo(L, "f", ar); /* push function */ - lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); - if (findfield(L, top + 1, 2)) { - const char *name = lua_tostring(L, -1); - if (strncmp(name, "_G.", 3) == 0) { /* name start with '_G.'? */ - lua_pushstring(L, name + 3); /* push name without prefix */ - lua_remove(L, -2); /* remove original name */ - } - lua_copy(L, -1, top + 1); /* move name to proper place */ - lua_pop(L, 2); /* remove pushed values */ - return 1; - } - else { - lua_settop(L, top); /* remove function and global table */ - return 0; - } -} - - -static void pushfuncname (lua_State *L, lua_Debug *ar) { - if (pushglobalfuncname(L, ar)) { /* try first a global name */ - lua_pushfstring(L, "function '%s'", lua_tostring(L, -1)); - lua_remove(L, -2); /* remove name */ - } - else if (*ar->namewhat != '\0') /* is there a name from code? */ - lua_pushfstring(L, "%s '%s'", ar->namewhat, ar->name); /* use it */ - else if (*ar->what == 'm') /* main? */ - lua_pushliteral(L, "main chunk"); - else if (*ar->what != 'C') /* for Lua functions, use */ - lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined); - else /* nothing left... */ - lua_pushliteral(L, "?"); -} - - -static int countlevels (lua_State *L) { - lua_Debug ar; - int li = 1, le = 1; - /* find an upper bound */ - while (lua_getstack(L, le, &ar)) { li = le; le *= 2; } - /* do a binary search */ - while (li < le) { - int m = (li + le)/2; - if (lua_getstack(L, m, &ar)) li = m + 1; - else le = m; - } - return le - 1; -} - - -LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, - const char *msg, int level) { - lua_Debug ar; - int top = lua_gettop(L); - int numlevels = countlevels(L1); - int mark = (numlevels > LEVELS1 + LEVELS2) ? LEVELS1 : 0; - if (msg) lua_pushfstring(L, "%s\n", msg); - lua_pushliteral(L, "stack traceback:"); - while (lua_getstack(L1, level++, &ar)) { - if (level == mark) { /* too many levels? */ - lua_pushliteral(L, "\n\t..."); /* add a '...' */ - level = numlevels - LEVELS2; /* and skip to last ones */ - } - else { - lua_getinfo(L1, "Slnt", &ar); - lua_pushfstring(L, "\n\t%s:", ar.short_src); - if (ar.currentline > 0) - lua_pushfstring(L, "%d:", ar.currentline); - lua_pushliteral(L, " in "); - pushfuncname(L, &ar); - if (ar.istailcall) - lua_pushliteral(L, "\n\t(...tail calls...)"); - lua_concat(L, lua_gettop(L) - top); - } - } - lua_concat(L, lua_gettop(L) - top); -} - -/* }====================================================== */ - - -/* -** {====================================================== -** Error-report functions -** ======================================================= -*/ - -LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) { - lua_Debug ar; - if (!lua_getstack(L, 0, &ar)) /* no stack frame? */ - return luaL_error(L, "bad argument #%d (%s)", arg, extramsg); - lua_getinfo(L, "n", &ar); - if (strcmp(ar.namewhat, "method") == 0) { - arg--; /* do not count 'self' */ - if (arg == 0) /* error is in the self argument itself? */ - return luaL_error(L, "calling '%s' on bad self (%s)", - ar.name, extramsg); - } - if (ar.name == NULL) - ar.name = (pushglobalfuncname(L, &ar)) ? lua_tostring(L, -1) : "?"; - return luaL_error(L, "bad argument #%d to '%s' (%s)", - arg, ar.name, extramsg); -} - - -static int typeerror (lua_State *L, int arg, const char *tname) { - const char *msg; - const char *typearg; /* name for the type of the actual argument */ - if (luaL_getmetafield(L, arg, "__name") == LUA_TSTRING) - typearg = lua_tostring(L, -1); /* use the given type name */ - else if (lua_type(L, arg) == LUA_TLIGHTUSERDATA) - typearg = "light userdata"; /* special name for messages */ - else - typearg = luaL_typename(L, arg); /* standard name */ - msg = lua_pushfstring(L, "%s expected, got %s", tname, typearg); - return luaL_argerror(L, arg, msg); -} - - -static void tag_error (lua_State *L, int arg, int tag) { - typeerror(L, arg, lua_typename(L, tag)); -} - - -LUALIB_API void luaL_where (lua_State *L, int level) { - lua_Debug ar; - if (lua_getstack(L, level, &ar)) { /* check function at level */ - lua_getinfo(L, "Sl", &ar); /* get info about it */ - if (ar.currentline > 0) { /* is there info? */ - lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline); - return; - } - } - lua_pushliteral(L, ""); /* else, no information available... */ -} - - -LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { - va_list argp; - va_start(argp, fmt); - luaL_where(L, 1); - lua_pushvfstring(L, fmt, argp); - va_end(argp); - lua_concat(L, 2); - return lua_error(L); -} - - -LUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fname) { - int en = errno; /* calls to Lua API may change this value */ - if (stat) { - lua_pushboolean(L, 1); - return 1; - } - else { - lua_pushnil(L); - if (fname) - lua_pushfstring(L, "%s: %s", fname, strerror(en)); - else - lua_pushstring(L, strerror(en)); - lua_pushinteger(L, en); - return 3; - } -} - - -#if !defined(l_inspectstat) /* { */ - -#if defined(LUA_USE_POSIX) - -#include - -/* -** use appropriate macros to interpret 'pclose' return status -*/ -#define l_inspectstat(stat,what) \ - if (WIFEXITED(stat)) { stat = WEXITSTATUS(stat); } \ - else if (WIFSIGNALED(stat)) { stat = WTERMSIG(stat); what = "signal"; } - -#else - -#define l_inspectstat(stat,what) /* no op */ - -#endif - -#endif /* } */ - - -LUALIB_API int luaL_execresult (lua_State *L, int stat) { - const char *what = "exit"; /* type of termination */ - if (stat == -1) /* error? */ - return luaL_fileresult(L, 0, NULL); - else { - l_inspectstat(stat, what); /* interpret result */ - if (*what == 'e' && stat == 0) /* successful termination? */ - lua_pushboolean(L, 1); - else - lua_pushnil(L); - lua_pushstring(L, what); - lua_pushinteger(L, stat); - return 3; /* return true/nil,what,code */ - } -} - -/* }====================================================== */ - - -/* -** {====================================================== -** Userdata's metatable manipulation -** ======================================================= -*/ - -LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) { - if (luaL_getmetatable(L, tname)) /* name already in use? */ - return 0; /* leave previous value on top, but return 0 */ - lua_pop(L, 1); - lua_newtable(L); /* create metatable */ - lua_pushstring(L, tname); - lua_setfield(L, -2, "__name"); /* metatable.__name = tname */ - lua_pushvalue(L, -1); - lua_setfield(L, LUA_REGISTRYINDEX, tname); /* registry.name = metatable */ - return 1; -} - - -LUALIB_API void luaL_setmetatable (lua_State *L, const char *tname) { - luaL_getmetatable(L, tname); - lua_setmetatable(L, -2); -} - - -LUALIB_API void *luaL_testudata (lua_State *L, int ud, const char *tname) { - void *p = lua_touserdata(L, ud); - if (p != NULL) { /* value is a userdata? */ - if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ - luaL_getmetatable(L, tname); /* get correct metatable */ - if (!lua_rawequal(L, -1, -2)) /* not the same? */ - p = NULL; /* value is a userdata with wrong metatable */ - lua_pop(L, 2); /* remove both metatables */ - return p; - } - } - return NULL; /* value is not a userdata with a metatable */ -} - - -LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { - void *p = luaL_testudata(L, ud, tname); - if (p == NULL) typeerror(L, ud, tname); - return p; -} - -/* }====================================================== */ - - -/* -** {====================================================== -** Argument check functions -** ======================================================= -*/ - -LUALIB_API int luaL_checkoption (lua_State *L, int arg, const char *def, - const char *const lst[]) { - const char *name = (def) ? luaL_optstring(L, arg, def) : - luaL_checkstring(L, arg); - int i; - for (i=0; lst[i]; i++) - if (strcmp(lst[i], name) == 0) - return i; - return luaL_argerror(L, arg, - lua_pushfstring(L, "invalid option '%s'", name)); -} - - -LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) { - /* keep some extra space to run error routines, if needed */ - const int extra = LUA_MINSTACK; - if (!lua_checkstack(L, space + extra)) { - if (msg) - luaL_error(L, "stack overflow (%s)", msg); - else - luaL_error(L, "stack overflow"); - } -} - - -LUALIB_API void luaL_checktype (lua_State *L, int arg, int t) { - if (lua_type(L, arg) != t) - tag_error(L, arg, t); -} - - -LUALIB_API void luaL_checkany (lua_State *L, int arg) { - if (lua_type(L, arg) == LUA_TNONE) - luaL_argerror(L, arg, "value expected"); -} - - -LUALIB_API const char *luaL_checklstring (lua_State *L, int arg, size_t *len) { - const char *s = lua_tolstring(L, arg, len); - if (!s) tag_error(L, arg, LUA_TSTRING); - return s; -} - - -LUALIB_API const char *luaL_optlstring (lua_State *L, int arg, - const char *def, size_t *len) { - if (lua_isnoneornil(L, arg)) { - if (len) - *len = (def ? strlen(def) : 0); - return def; - } - else return luaL_checklstring(L, arg, len); -} - - -LUALIB_API lua_Number luaL_checknumber (lua_State *L, int arg) { - int isnum; - lua_Number d = lua_tonumberx(L, arg, &isnum); - if (!isnum) - tag_error(L, arg, LUA_TNUMBER); - return d; -} - - -LUALIB_API lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number def) { - return luaL_opt(L, luaL_checknumber, arg, def); -} - - -static void interror (lua_State *L, int arg) { - if (lua_isnumber(L, arg)) - luaL_argerror(L, arg, "number has no integer representation"); - else - tag_error(L, arg, LUA_TNUMBER); -} - - -LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int arg) { - int isnum; - lua_Integer d = lua_tointegerx(L, arg, &isnum); - if (!isnum) { - interror(L, arg); - } - return d; -} - - -LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int arg, - lua_Integer def) { - return luaL_opt(L, luaL_checkinteger, arg, def); -} - -/* }====================================================== */ - - -/* -** {====================================================== -** Generic Buffer manipulation -** ======================================================= -*/ - -/* -** check whether buffer is using a userdata on the stack as a temporary -** buffer -*/ -#define buffonstack(B) ((B)->b != (B)->initb) - - -/* -** returns a pointer to a free area with at least 'sz' bytes -*/ -LUALIB_API char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz) { - lua_State *L = B->L; - if (B->size - B->n < sz) { /* not enough space? */ - char *newbuff; - size_t newsize = B->size * 2; /* double buffer size */ - if (newsize - B->n < sz) /* not big enough? */ - newsize = B->n + sz; - if (newsize < B->n || newsize - B->n < sz) - luaL_error(L, "buffer too large"); - /* create larger buffer */ - newbuff = (char *)lua_newuserdata(L, newsize * sizeof(char)); - /* move content to new buffer */ - memcpy(newbuff, B->b, B->n * sizeof(char)); - if (buffonstack(B)) - lua_remove(L, -2); /* remove old buffer */ - B->b = newbuff; - B->size = newsize; - } - return &B->b[B->n]; -} - - -LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { - char *b = luaL_prepbuffsize(B, l); - memcpy(b, s, l * sizeof(char)); - luaL_addsize(B, l); -} - - -LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { - luaL_addlstring(B, s, strlen(s)); -} - - -LUALIB_API void luaL_pushresult (luaL_Buffer *B) { - lua_State *L = B->L; - lua_pushlstring(L, B->b, B->n); - if (buffonstack(B)) - lua_remove(L, -2); /* remove old buffer */ -} - - -LUALIB_API void luaL_pushresultsize (luaL_Buffer *B, size_t sz) { - luaL_addsize(B, sz); - luaL_pushresult(B); -} - - -LUALIB_API void luaL_addvalue (luaL_Buffer *B) { - lua_State *L = B->L; - size_t l; - const char *s = lua_tolstring(L, -1, &l); - if (buffonstack(B)) - lua_insert(L, -2); /* put value below buffer */ - luaL_addlstring(B, s, l); - lua_remove(L, (buffonstack(B)) ? -2 : -1); /* remove value */ -} - - -LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { - B->L = L; - B->b = B->initb; - B->n = 0; - B->size = LUAL_BUFFERSIZE; -} - - -LUALIB_API char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz) { - luaL_buffinit(L, B); - return luaL_prepbuffsize(B, sz); -} - -/* }====================================================== */ - - -/* -** {====================================================== -** Reference system -** ======================================================= -*/ - -/* index of free-list header */ -#define freelist 0 - - -LUALIB_API int luaL_ref (lua_State *L, int t) { - int ref; - if (lua_isnil(L, -1)) { - lua_pop(L, 1); /* remove from stack */ - return LUA_REFNIL; /* 'nil' has a unique fixed reference */ - } - t = lua_absindex(L, t); - lua_rawgeti(L, t, freelist); /* get first free element */ - ref = (int)lua_tointeger(L, -1); /* ref = t[freelist] */ - lua_pop(L, 1); /* remove it from stack */ - if (ref != 0) { /* any free element? */ - lua_rawgeti(L, t, ref); /* remove it from list */ - lua_rawseti(L, t, freelist); /* (t[freelist] = t[ref]) */ - } - else /* no free elements */ - ref = (int)lua_rawlen(L, t) + 1; /* get a new reference */ - lua_rawseti(L, t, ref); - return ref; -} - - -LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { - if (ref >= 0) { - t = lua_absindex(L, t); - lua_rawgeti(L, t, freelist); - lua_rawseti(L, t, ref); /* t[ref] = t[freelist] */ - lua_pushinteger(L, ref); - lua_rawseti(L, t, freelist); /* t[freelist] = ref */ - } -} - -/* }====================================================== */ - - -/* -** {====================================================== -** Load functions -** ======================================================= -*/ - -typedef struct LoadF { - int n; /* number of pre-read characters */ - FILE *f; /* file being read */ - char buff[BUFSIZ]; /* area for reading file */ -} LoadF; - - -static const char *getF (lua_State *L, void *ud, size_t *size) { - LoadF *lf = (LoadF *)ud; - (void)L; /* not used */ - if (lf->n > 0) { /* are there pre-read characters to be read? */ - *size = lf->n; /* return them (chars already in buffer) */ - lf->n = 0; /* no more pre-read characters */ - } - else { /* read a block from file */ - /* 'fread' can return > 0 *and* set the EOF flag. If next call to - 'getF' called 'fread', it might still wait for user input. - The next check avoids this problem. */ - if (feof(lf->f)) return NULL; - *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); /* read block */ - } - return lf->buff; -} - - -static int errfile (lua_State *L, const char *what, int fnameindex) { - const char *serr = strerror(errno); - const char *filename = lua_tostring(L, fnameindex) + 1; - lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr); - lua_remove(L, fnameindex); - return LUA_ERRFILE; -} - - -static int skipBOM (LoadF *lf) { - const char *p = "\xEF\xBB\xBF"; /* Utf8 BOM mark */ - int c; - lf->n = 0; - do { - c = getc(lf->f); - if (c == EOF || c != *(const unsigned char *)p++) return c; - lf->buff[lf->n++] = c; /* to be read by the parser */ - } while (*p != '\0'); - lf->n = 0; /* prefix matched; discard it */ - return getc(lf->f); /* return next character */ -} - - -/* -** reads the first character of file 'f' and skips an optional BOM mark -** in its beginning plus its first line if it starts with '#'. Returns -** true if it skipped the first line. In any case, '*cp' has the -** first "valid" character of the file (after the optional BOM and -** a first-line comment). -*/ -static int skipcomment (LoadF *lf, int *cp) { - int c = *cp = skipBOM(lf); - if (c == '#') { /* first line is a comment (Unix exec. file)? */ - do { /* skip first line */ - c = getc(lf->f); - } while (c != EOF && c != '\n') ; - *cp = getc(lf->f); /* skip end-of-line, if present */ - return 1; /* there was a comment */ - } - else return 0; /* no comment */ -} - - -LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename, - const char *mode) { - LoadF lf; - int status, readstatus; - int c; - int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ - if (filename == NULL) { - lua_pushliteral(L, "=stdin"); - lf.f = stdin; - } - else { - lua_pushfstring(L, "@%s", filename); - lf.f = fopen(filename, "r"); - if (lf.f == NULL) return errfile(L, "open", fnameindex); - } - if (skipcomment(&lf, &c)) /* read initial portion */ - lf.buff[lf.n++] = '\n'; /* add line to correct line numbers */ - if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */ - lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */ - if (lf.f == NULL) return errfile(L, "reopen", fnameindex); - skipcomment(&lf, &c); /* re-read initial portion */ - } - if (c != EOF) - lf.buff[lf.n++] = c; /* 'c' is the first character of the stream */ - status = lua_load(L, getF, &lf, lua_tostring(L, -1), mode); - readstatus = ferror(lf.f); - if (filename) fclose(lf.f); /* close file (even in case of errors) */ - if (readstatus) { - lua_settop(L, fnameindex); /* ignore results from 'lua_load' */ - return errfile(L, "read", fnameindex); - } - lua_remove(L, fnameindex); - return status; -} - - -typedef struct LoadS { - const char *s; - size_t size; -} LoadS; - - -static const char *getS (lua_State *L, void *ud, size_t *size) { - LoadS *ls = (LoadS *)ud; - (void)L; /* not used */ - if (ls->size == 0) return NULL; - *size = ls->size; - ls->size = 0; - return ls->s; -} - - -LUALIB_API int luaL_loadbufferx (lua_State *L, const char *buff, size_t size, - const char *name, const char *mode) { - LoadS ls; - ls.s = buff; - ls.size = size; - return lua_load(L, getS, &ls, name, mode); -} - - -LUALIB_API int luaL_loadstring (lua_State *L, const char *s) { - return luaL_loadbuffer(L, s, strlen(s), s); -} - -/* }====================================================== */ - - - -LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) { - if (!lua_getmetatable(L, obj)) /* no metatable? */ - return LUA_TNIL; - else { - int tt; - lua_pushstring(L, event); - tt = lua_rawget(L, -2); - if (tt == LUA_TNIL) /* is metafield nil? */ - lua_pop(L, 2); /* remove metatable and metafield */ - else - lua_remove(L, -2); /* remove only metatable */ - return tt; /* return metafield type */ - } -} - - -LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) { - obj = lua_absindex(L, obj); - if (luaL_getmetafield(L, obj, event) == LUA_TNIL) /* no metafield? */ - return 0; - lua_pushvalue(L, obj); - lua_call(L, 1, 1); - return 1; -} - - -LUALIB_API lua_Integer luaL_len (lua_State *L, int idx) { - lua_Integer l; - int isnum; - lua_len(L, idx); - l = lua_tointegerx(L, -1, &isnum); - if (!isnum) - luaL_error(L, "object length is not an integer"); - lua_pop(L, 1); /* remove object */ - return l; -} - - -LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { - if (!luaL_callmeta(L, idx, "__tostring")) { /* no metafield? */ - switch (lua_type(L, idx)) { - case LUA_TNUMBER: { - if (lua_isinteger(L, idx)) - lua_pushfstring(L, "%I", lua_tointeger(L, idx)); - else - lua_pushfstring(L, "%f", lua_tonumber(L, idx)); - break; - } - case LUA_TSTRING: - lua_pushvalue(L, idx); - break; - case LUA_TBOOLEAN: - lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false")); - break; - case LUA_TNIL: - lua_pushliteral(L, "nil"); - break; - default: - lua_pushfstring(L, "%s: %p", luaL_typename(L, idx), - lua_topointer(L, idx)); - break; - } - } - return lua_tolstring(L, -1, len); -} - - -/* -** {====================================================== -** Compatibility with 5.1 module functions -** ======================================================= -*/ -#if defined(LUA_COMPAT_MODULE) - -static const char *luaL_findtable (lua_State *L, int idx, - const char *fname, int szhint) { - const char *e; - if (idx) lua_pushvalue(L, idx); - do { - e = strchr(fname, '.'); - if (e == NULL) e = fname + strlen(fname); - lua_pushlstring(L, fname, e - fname); - if (lua_rawget(L, -2) == LUA_TNIL) { /* no such field? */ - lua_pop(L, 1); /* remove this nil */ - lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */ - lua_pushlstring(L, fname, e - fname); - lua_pushvalue(L, -2); - lua_settable(L, -4); /* set new table into field */ - } - else if (!lua_istable(L, -1)) { /* field has a non-table value? */ - lua_pop(L, 2); /* remove table and value */ - return fname; /* return problematic part of the name */ - } - lua_remove(L, -2); /* remove previous table */ - fname = e + 1; - } while (*e == '.'); - return NULL; -} - - -/* -** Count number of elements in a luaL_Reg list. -*/ -static int libsize (const luaL_Reg *l) { - int size = 0; - for (; l && l->name; l++) size++; - return size; -} - - -/* -** Find or create a module table with a given name. The function -** first looks at the _LOADED table and, if that fails, try a -** global variable with that name. In any case, leaves on the stack -** the module table. -*/ -LUALIB_API void luaL_pushmodule (lua_State *L, const char *modname, - int sizehint) { - luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); /* get _LOADED table */ - if (lua_getfield(L, -1, modname) != LUA_TTABLE) { /* no _LOADED[modname]? */ - lua_pop(L, 1); /* remove previous result */ - /* try global variable (and create one if it does not exist) */ - lua_pushglobaltable(L); - if (luaL_findtable(L, 0, modname, sizehint) != NULL) - luaL_error(L, "name conflict for module '%s'", modname); - lua_pushvalue(L, -1); - lua_setfield(L, -3, modname); /* _LOADED[modname] = new table */ - } - lua_remove(L, -2); /* remove _LOADED table */ -} - - -LUALIB_API void luaL_openlib (lua_State *L, const char *libname, - const luaL_Reg *l, int nup) { - luaL_checkversion(L); - if (libname) { - luaL_pushmodule(L, libname, libsize(l)); /* get/create library table */ - lua_insert(L, -(nup + 1)); /* move library table to below upvalues */ - } - if (l) - luaL_setfuncs(L, l, nup); - else - lua_pop(L, nup); /* remove upvalues */ -} - -#endif -/* }====================================================== */ - -/* -** set functions from list 'l' into table at top - 'nup'; each -** function gets the 'nup' elements at the top as upvalues. -** Returns with only the table at the stack. -*/ -LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) { - luaL_checkstack(L, nup, "too many upvalues"); - for (; l->name != NULL; l++) { /* fill the table with given functions */ - int i; - for (i = 0; i < nup; i++) /* copy upvalues to the top */ - lua_pushvalue(L, -nup); - lua_pushcclosure(L, l->func, nup); /* closure with those upvalues */ - lua_setfield(L, -(nup + 2), l->name); - } - lua_pop(L, nup); /* remove upvalues */ -} - - -/* -** ensure that stack[idx][fname] has a table and push that table -** into the stack -*/ -LUALIB_API int luaL_getsubtable (lua_State *L, int idx, const char *fname) { - if (lua_getfield(L, idx, fname) == LUA_TTABLE) - return 1; /* table already there */ - else { - lua_pop(L, 1); /* remove previous result */ - idx = lua_absindex(L, idx); - lua_newtable(L); - lua_pushvalue(L, -1); /* copy to be left at top */ - lua_setfield(L, idx, fname); /* assign new table to field */ - return 0; /* false, because did not find table there */ - } -} - - -/* -** Stripped-down 'require': After checking "loaded" table, calls 'openf' -** to open a module, registers the result in 'package.loaded' table and, -** if 'glb' is true, also registers the result in the global table. -** Leaves resulting module on the top. -*/ -LUALIB_API void luaL_requiref (lua_State *L, const char *modname, - lua_CFunction openf, int glb) { - luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED"); - lua_getfield(L, -1, modname); /* _LOADED[modname] */ - if (!lua_toboolean(L, -1)) { /* package not already loaded? */ - lua_pop(L, 1); /* remove field */ - lua_pushcfunction(L, openf); - lua_pushstring(L, modname); /* argument to open function */ - lua_call(L, 1, 1); /* call 'openf' to open module */ - lua_pushvalue(L, -1); /* make copy of module (call result) */ - lua_setfield(L, -3, modname); /* _LOADED[modname] = module */ - } - lua_remove(L, -2); /* remove _LOADED table */ - if (glb) { - lua_pushvalue(L, -1); /* copy of module */ - lua_setglobal(L, modname); /* _G[modname] = module */ - } -} - - -LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p, - const char *r) { - const char *wild; - size_t l = strlen(p); - luaL_Buffer b; - luaL_buffinit(L, &b); - while ((wild = strstr(s, p)) != NULL) { - luaL_addlstring(&b, s, wild - s); /* push prefix */ - luaL_addstring(&b, r); /* push replacement in place of pattern */ - s = wild + l; /* continue after 'p' */ - } - luaL_addstring(&b, s); /* push last suffix */ - luaL_pushresult(&b); - return lua_tostring(L, -1); -} - - -static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { - (void)ud; (void)osize; /* not used */ - if (nsize == 0) { - free(ptr); - return NULL; - } - else - return realloc(ptr, nsize); -} - - -static int panic (lua_State *L) { - lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n", - lua_tostring(L, -1)); - return 0; /* return to Lua to abort */ -} - - -LUALIB_API lua_State *luaL_newstate (void) { - lua_State *L = lua_newstate(l_alloc, NULL); - if (L) lua_atpanic(L, &panic); - return L; -} - - -LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) { - const lua_Number *v = lua_version(L); - if (sz != LUAL_NUMSIZES) /* check numeric types */ - luaL_error(L, "core and library have incompatible numeric types"); - if (v != lua_version(NULL)) - luaL_error(L, "multiple Lua VMs detected"); - else if (*v != ver) - luaL_error(L, "version mismatch: app. needs %f, Lua core provides %f", - ver, *v); -} - diff --git a/3rd/lua/src/lauxlib.h b/3rd/lua/src/lauxlib.h deleted file mode 100644 index 0bac246..0000000 --- a/3rd/lua/src/lauxlib.h +++ /dev/null @@ -1,256 +0,0 @@ -/* -** $Id: lauxlib.h,v 1.128 2014/10/29 16:11:17 roberto Exp $ -** Auxiliary functions for building Lua libraries -** See Copyright Notice in lua.h -*/ - - -#ifndef lauxlib_h -#define lauxlib_h - - -#include -#include - -#include "lua.h" - - - -/* extra error code for 'luaL_load' */ -#define LUA_ERRFILE (LUA_ERRERR+1) - - -typedef struct luaL_Reg { - const char *name; - lua_CFunction func; -} luaL_Reg; - - -#define LUAL_NUMSIZES (sizeof(lua_Integer)*16 + sizeof(lua_Number)) - -LUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver, size_t sz); -#define luaL_checkversion(L) \ - luaL_checkversion_(L, LUA_VERSION_NUM, LUAL_NUMSIZES) - -LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); -LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); -LUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len); -LUALIB_API int (luaL_argerror) (lua_State *L, int arg, const char *extramsg); -LUALIB_API const char *(luaL_checklstring) (lua_State *L, int arg, - size_t *l); -LUALIB_API const char *(luaL_optlstring) (lua_State *L, int arg, - const char *def, size_t *l); -LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int arg); -LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int arg, lua_Number def); - -LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int arg); -LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int arg, - lua_Integer def); - -LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); -LUALIB_API void (luaL_checktype) (lua_State *L, int arg, int t); -LUALIB_API void (luaL_checkany) (lua_State *L, int arg); - -LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); -LUALIB_API void (luaL_setmetatable) (lua_State *L, const char *tname); -LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname); -LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); - -LUALIB_API void (luaL_where) (lua_State *L, int lvl); -LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); - -LUALIB_API int (luaL_checkoption) (lua_State *L, int arg, const char *def, - const char *const lst[]); - -LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname); -LUALIB_API int (luaL_execresult) (lua_State *L, int stat); - -/* pre-defined references */ -#define LUA_NOREF (-2) -#define LUA_REFNIL (-1) - -LUALIB_API int (luaL_ref) (lua_State *L, int t); -LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); - -LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename, - const char *mode); - -#define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL) - -LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz, - const char *name, const char *mode); -LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); - -LUALIB_API lua_State *(luaL_newstate) (void); - -LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx); - -LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, - const char *r); - -LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup); - -LUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname); - -LUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1, - const char *msg, int level); - -LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname, - lua_CFunction openf, int glb); - -/* -** =============================================================== -** some useful macros -** =============================================================== -*/ - - -#define luaL_newlibtable(L,l) \ - lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1) - -#define luaL_newlib(L,l) \ - (luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) - -#define luaL_argcheck(L, cond,arg,extramsg) \ - ((void)((cond) || luaL_argerror(L, (arg), (extramsg)))) -#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) -#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) - -#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) - -#define luaL_dofile(L, fn) \ - (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) - -#define luaL_dostring(L, s) \ - (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) - -#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) - -#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) - -#define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL) - - -/* -** {====================================================== -** Generic Buffer manipulation -** ======================================================= -*/ - -typedef struct luaL_Buffer { - char *b; /* buffer address */ - size_t size; /* buffer size */ - size_t n; /* number of characters in buffer */ - lua_State *L; - char initb[LUAL_BUFFERSIZE]; /* initial buffer */ -} luaL_Buffer; - - -#define luaL_addchar(B,c) \ - ((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), \ - ((B)->b[(B)->n++] = (c))) - -#define luaL_addsize(B,s) ((B)->n += (s)) - -LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); -LUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz); -LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); -LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); -LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); -LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); -LUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz); -LUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); - -#define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE) - -/* }====================================================== */ - - - -/* -** {====================================================== -** File handles for IO library -** ======================================================= -*/ - -/* -** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and -** initial structure 'luaL_Stream' (it may contain other fields -** after that initial structure). -*/ - -#define LUA_FILEHANDLE "FILE*" - - -typedef struct luaL_Stream { - FILE *f; /* stream (NULL for incompletely created streams) */ - lua_CFunction closef; /* to close stream (NULL for closed streams) */ -} luaL_Stream; - -/* }====================================================== */ - - - -/* compatibility with old module system */ -#if defined(LUA_COMPAT_MODULE) - -LUALIB_API void (luaL_pushmodule) (lua_State *L, const char *modname, - int sizehint); -LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname, - const luaL_Reg *l, int nup); - -#define luaL_register(L,n,l) (luaL_openlib(L,(n),(l),0)) - -#endif - - -/* -** {================================================================== -** "Abstraction Layer" for basic report of messages and errors -** =================================================================== -*/ - -/* print a string */ -#if !defined(lua_writestring) -#define lua_writestring(s,l) fwrite((s), sizeof(char), (l), stdout) -#endif - -/* print a newline and flush the output */ -#if !defined(lua_writeline) -#define lua_writeline() (lua_writestring("\n", 1), fflush(stdout)) -#endif - -/* print an error message */ -#if !defined(lua_writestringerror) -#define lua_writestringerror(s,p) \ - (fprintf(stderr, (s), (p)), fflush(stderr)) -#endif - -/* }================================================================== */ - - -/* -** {============================================================ -** Compatibility with deprecated conversions -** ============================================================= -*/ -#if defined(LUA_COMPAT_APIINTCASTS) - -#define luaL_checkunsigned(L,a) ((lua_Unsigned)luaL_checkinteger(L,a)) -#define luaL_optunsigned(L,a,d) \ - ((lua_Unsigned)luaL_optinteger(L,a,(lua_Integer)(d))) - -#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) -#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) - -#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) -#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) - -#endif -/* }============================================================ */ - - - -#endif - - diff --git a/3rd/lua/src/lbaselib.c b/3rd/lua/src/lbaselib.c deleted file mode 100644 index a240395..0000000 --- a/3rd/lua/src/lbaselib.c +++ /dev/null @@ -1,520 +0,0 @@ -/* -** $Id: lbaselib.c,v 1.309 2014/12/10 12:26:42 roberto Exp $ -** Basic library -** See Copyright Notice in lua.h -*/ - -#define lbaselib_c -#define LUA_LIB - -#include "lprefix.h" - - -#include -#include -#include -#include - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -static int luaB_print (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - int i; - lua_getglobal(L, "tostring"); - for (i=1; i<=n; i++) { - const char *s; - size_t l; - lua_pushvalue(L, -1); /* function to be called */ - lua_pushvalue(L, i); /* value to print */ - lua_call(L, 1, 1); - s = lua_tolstring(L, -1, &l); /* get result */ - if (s == NULL) - return luaL_error(L, "'tostring' must return a string to 'print'"); - if (i>1) lua_writestring("\t", 1); - lua_writestring(s, l); - lua_pop(L, 1); /* pop result */ - } - lua_writeline(); - return 0; -} - - -#define SPACECHARS " \f\n\r\t\v" - -static const char *b_str2int (const char *s, int base, lua_Integer *pn) { - lua_Unsigned n = 0; - int neg = 0; - s += strspn(s, SPACECHARS); /* skip initial spaces */ - if (*s == '-') { s++; neg = 1; } /* handle signal */ - else if (*s == '+') s++; - if (!isalnum((unsigned char)*s)) /* no digit? */ - return NULL; - do { - int digit = (isdigit((unsigned char)*s)) ? *s - '0' - : toupper((unsigned char)*s) - 'A' + 10; - if (digit >= base) return NULL; /* invalid numeral */ - n = n * base + digit; - s++; - } while (isalnum((unsigned char)*s)); - s += strspn(s, SPACECHARS); /* skip trailing spaces */ - *pn = (lua_Integer)((neg) ? (0u - n) : n); - return s; -} - - -static int luaB_tonumber (lua_State *L) { - if (lua_isnoneornil(L, 2)) { /* standard conversion? */ - luaL_checkany(L, 1); - if (lua_type(L, 1) == LUA_TNUMBER) { /* already a number? */ - lua_settop(L, 1); /* yes; return it */ - return 1; - } - else { - size_t l; - const char *s = lua_tolstring(L, 1, &l); - if (s != NULL && lua_stringtonumber(L, s) == l + 1) - return 1; /* successful conversion to number */ - /* else not a number */ - } - } - else { - size_t l; - const char *s; - lua_Integer n = 0; /* to avoid warnings */ - lua_Integer base = luaL_checkinteger(L, 2); - luaL_checktype(L, 1, LUA_TSTRING); /* before 'luaL_checklstring'! */ - s = luaL_checklstring(L, 1, &l); - luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); - if (b_str2int(s, (int)base, &n) == s + l) { - lua_pushinteger(L, n); - return 1; - } /* else not a number */ - } /* else not a number */ - lua_pushnil(L); /* not a number */ - return 1; -} - - -static int luaB_error (lua_State *L) { - int level = (int)luaL_optinteger(L, 2, 1); - lua_settop(L, 1); - if (lua_isstring(L, 1) && level > 0) { /* add extra information? */ - luaL_where(L, level); - lua_pushvalue(L, 1); - lua_concat(L, 2); - } - return lua_error(L); -} - - -static int luaB_getmetatable (lua_State *L) { - luaL_checkany(L, 1); - if (!lua_getmetatable(L, 1)) { - lua_pushnil(L); - return 1; /* no metatable */ - } - luaL_getmetafield(L, 1, "__metatable"); - return 1; /* returns either __metatable field (if present) or metatable */ -} - - -static int luaB_setmetatable (lua_State *L) { - int t = lua_type(L, 2); - luaL_checktype(L, 1, LUA_TTABLE); - luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2, - "nil or table expected"); - if (luaL_getmetafield(L, 1, "__metatable") != LUA_TNIL) - return luaL_error(L, "cannot change a protected metatable"); - lua_settop(L, 2); - lua_setmetatable(L, 1); - return 1; -} - - -static int luaB_rawequal (lua_State *L) { - luaL_checkany(L, 1); - luaL_checkany(L, 2); - lua_pushboolean(L, lua_rawequal(L, 1, 2)); - return 1; -} - - -static int luaB_rawlen (lua_State *L) { - int t = lua_type(L, 1); - luaL_argcheck(L, t == LUA_TTABLE || t == LUA_TSTRING, 1, - "table or string expected"); - lua_pushinteger(L, lua_rawlen(L, 1)); - return 1; -} - - -static int luaB_rawget (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checkany(L, 2); - lua_settop(L, 2); - lua_rawget(L, 1); - return 1; -} - -static int luaB_rawset (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checkany(L, 2); - luaL_checkany(L, 3); - lua_settop(L, 3); - lua_rawset(L, 1); - return 1; -} - - -static int luaB_collectgarbage (lua_State *L) { - static const char *const opts[] = {"stop", "restart", "collect", - "count", "step", "setpause", "setstepmul", - "isrunning", NULL}; - static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, - LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL, - LUA_GCISRUNNING}; - int o = optsnum[luaL_checkoption(L, 1, "collect", opts)]; - int ex = (int)luaL_optinteger(L, 2, 0); - int res = lua_gc(L, o, ex); - switch (o) { - case LUA_GCCOUNT: { - int b = lua_gc(L, LUA_GCCOUNTB, 0); - lua_pushnumber(L, (lua_Number)res + ((lua_Number)b/1024)); - return 1; - } - case LUA_GCSTEP: case LUA_GCISRUNNING: { - lua_pushboolean(L, res); - return 1; - } - default: { - lua_pushinteger(L, res); - return 1; - } - } -} - - -/* -** This function has all type names as upvalues, to maximize performance. -*/ -static int luaB_type (lua_State *L) { - luaL_checkany(L, 1); - lua_pushvalue(L, lua_upvalueindex(lua_type(L, 1) + 1)); - return 1; -} - - -static int pairsmeta (lua_State *L, const char *method, int iszero, - lua_CFunction iter) { - if (luaL_getmetafield(L, 1, method) == LUA_TNIL) { /* no metamethod? */ - luaL_checktype(L, 1, LUA_TTABLE); /* argument must be a table */ - lua_pushcfunction(L, iter); /* will return generator, */ - lua_pushvalue(L, 1); /* state, */ - if (iszero) lua_pushinteger(L, 0); /* and initial value */ - else lua_pushnil(L); - } - else { - lua_pushvalue(L, 1); /* argument 'self' to metamethod */ - lua_call(L, 1, 3); /* get 3 values from metamethod */ - } - return 3; -} - - -static int luaB_next (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - lua_settop(L, 2); /* create a 2nd argument if there isn't one */ - if (lua_next(L, 1)) - return 2; - else { - lua_pushnil(L); - return 1; - } -} - - -static int luaB_pairs (lua_State *L) { - return pairsmeta(L, "__pairs", 0, luaB_next); -} - - -/* -** Traversal function for 'ipairs' for raw tables -*/ -static int ipairsaux_raw (lua_State *L) { - lua_Integer i = luaL_checkinteger(L, 2) + 1; - luaL_checktype(L, 1, LUA_TTABLE); - lua_pushinteger(L, i); - return (lua_rawgeti(L, 1, i) == LUA_TNIL) ? 1 : 2; -} - - -/* -** Traversal function for 'ipairs' for tables with metamethods -*/ -static int ipairsaux (lua_State *L) { - lua_Integer i = luaL_checkinteger(L, 2) + 1; - lua_pushinteger(L, i); - return (lua_geti(L, 1, i) == LUA_TNIL) ? 1 : 2; -} - - -/* -** This function will use either 'ipairsaux' or 'ipairsaux_raw' to -** traverse a table, depending on whether the table has metamethods -** that can affect the traversal. -*/ -static int luaB_ipairs (lua_State *L) { - lua_CFunction iter = (luaL_getmetafield(L, 1, "__index") != LUA_TNIL) - ? ipairsaux : ipairsaux_raw; -#if defined(LUA_COMPAT_IPAIRS) - return pairsmeta(L, "__ipairs", 1, iter); -#else - luaL_checkany(L, 1); - lua_pushcfunction(L, iter); /* iteration function */ - lua_pushvalue(L, 1); /* state */ - lua_pushinteger(L, 0); /* initial value */ - return 3; -#endif -} - - -static int load_aux (lua_State *L, int status, int envidx) { - if (status == LUA_OK) { - if (envidx != 0) { /* 'env' parameter? */ - lua_pushvalue(L, envidx); /* environment for loaded function */ - if (!lua_setupvalue(L, -2, 1)) /* set it as 1st upvalue */ - lua_pop(L, 1); /* remove 'env' if not used by previous call */ - } - return 1; - } - else { /* error (message is on top of the stack) */ - lua_pushnil(L); - lua_insert(L, -2); /* put before error message */ - return 2; /* return nil plus error message */ - } -} - - -static int luaB_loadfile (lua_State *L) { - const char *fname = luaL_optstring(L, 1, NULL); - const char *mode = luaL_optstring(L, 2, NULL); - int env = (!lua_isnone(L, 3) ? 3 : 0); /* 'env' index or 0 if no 'env' */ - int status = luaL_loadfilex(L, fname, mode); - return load_aux(L, status, env); -} - - -/* -** {====================================================== -** Generic Read function -** ======================================================= -*/ - - -/* -** reserved slot, above all arguments, to hold a copy of the returned -** string to avoid it being collected while parsed. 'load' has four -** optional arguments (chunk, source name, mode, and environment). -*/ -#define RESERVEDSLOT 5 - - -/* -** Reader for generic 'load' function: 'lua_load' uses the -** stack for internal stuff, so the reader cannot change the -** stack top. Instead, it keeps its resulting string in a -** reserved slot inside the stack. -*/ -static const char *generic_reader (lua_State *L, void *ud, size_t *size) { - (void)(ud); /* not used */ - luaL_checkstack(L, 2, "too many nested functions"); - lua_pushvalue(L, 1); /* get function */ - lua_call(L, 0, 1); /* call it */ - if (lua_isnil(L, -1)) { - lua_pop(L, 1); /* pop result */ - *size = 0; - return NULL; - } - else if (!lua_isstring(L, -1)) - luaL_error(L, "reader function must return a string"); - lua_replace(L, RESERVEDSLOT); /* save string in reserved slot */ - return lua_tolstring(L, RESERVEDSLOT, size); -} - - -static int luaB_load (lua_State *L) { - int status; - size_t l; - const char *s = lua_tolstring(L, 1, &l); - const char *mode = luaL_optstring(L, 3, "bt"); - int env = (!lua_isnone(L, 4) ? 4 : 0); /* 'env' index or 0 if no 'env' */ - if (s != NULL) { /* loading a string? */ - const char *chunkname = luaL_optstring(L, 2, s); - status = luaL_loadbufferx(L, s, l, chunkname, mode); - } - else { /* loading from a reader function */ - const char *chunkname = luaL_optstring(L, 2, "=(load)"); - luaL_checktype(L, 1, LUA_TFUNCTION); - lua_settop(L, RESERVEDSLOT); /* create reserved slot */ - status = lua_load(L, generic_reader, NULL, chunkname, mode); - } - return load_aux(L, status, env); -} - -/* }====================================================== */ - - -static int dofilecont (lua_State *L, int d1, lua_KContext d2) { - (void)d1; (void)d2; /* only to match 'lua_Kfunction' prototype */ - return lua_gettop(L) - 1; -} - - -static int luaB_dofile (lua_State *L) { - const char *fname = luaL_optstring(L, 1, NULL); - lua_settop(L, 1); - if (luaL_loadfile(L, fname) != LUA_OK) - return lua_error(L); - lua_callk(L, 0, LUA_MULTRET, 0, dofilecont); - return dofilecont(L, 0, 0); -} - - -static int luaB_assert (lua_State *L) { - if (lua_toboolean(L, 1)) /* condition is true? */ - return lua_gettop(L); /* return all arguments */ - else { /* error */ - luaL_checkany(L, 1); /* there must be a condition */ - lua_remove(L, 1); /* remove it */ - lua_pushliteral(L, "assertion failed!"); /* default message */ - lua_settop(L, 1); /* leave only message (default if no other one) */ - return luaB_error(L); /* call 'error' */ - } -} - - -static int luaB_select (lua_State *L) { - int n = lua_gettop(L); - if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') { - lua_pushinteger(L, n-1); - return 1; - } - else { - lua_Integer i = luaL_checkinteger(L, 1); - if (i < 0) i = n + i; - else if (i > n) i = n; - luaL_argcheck(L, 1 <= i, 1, "index out of range"); - return n - (int)i; - } -} - - -/* -** Continuation function for 'pcall' and 'xpcall'. Both functions -** already pushed a 'true' before doing the call, so in case of success -** 'finishpcall' only has to return everything in the stack minus -** 'extra' values (where 'extra' is exactly the number of items to be -** ignored). -*/ -static int finishpcall (lua_State *L, int status, lua_KContext extra) { - if (status != LUA_OK && status != LUA_YIELD) { /* error? */ - lua_pushboolean(L, 0); /* first result (false) */ - lua_pushvalue(L, -2); /* error message */ - return 2; /* return false, msg */ - } - else - return lua_gettop(L) - (int)extra; /* return all results */ -} - - -static int luaB_pcall (lua_State *L) { - int status; - luaL_checkany(L, 1); - lua_pushboolean(L, 1); /* first result if no errors */ - lua_insert(L, 1); /* put it in place */ - status = lua_pcallk(L, lua_gettop(L) - 2, LUA_MULTRET, 0, 0, finishpcall); - return finishpcall(L, status, 0); -} - - -/* -** Do a protected call with error handling. After 'lua_rotate', the -** stack will have ; so, the function passes -** 2 to 'finishpcall' to skip the 2 first values when returning results. -*/ -static int luaB_xpcall (lua_State *L) { - int status; - int n = lua_gettop(L); - luaL_checktype(L, 2, LUA_TFUNCTION); /* check error function */ - lua_pushboolean(L, 1); /* first result */ - lua_pushvalue(L, 1); /* function */ - lua_rotate(L, 3, 2); /* move them below function's arguments */ - status = lua_pcallk(L, n - 2, LUA_MULTRET, 2, 2, finishpcall); - return finishpcall(L, status, 2); -} - - -static int luaB_tostring (lua_State *L) { - luaL_checkany(L, 1); - luaL_tolstring(L, 1, NULL); - return 1; -} - - -static const luaL_Reg base_funcs[] = { - {"assert", luaB_assert}, - {"collectgarbage", luaB_collectgarbage}, - {"dofile", luaB_dofile}, - {"error", luaB_error}, - {"getmetatable", luaB_getmetatable}, - {"ipairs", luaB_ipairs}, - {"loadfile", luaB_loadfile}, - {"load", luaB_load}, -#if defined(LUA_COMPAT_LOADSTRING) - {"loadstring", luaB_load}, -#endif - {"next", luaB_next}, - {"pairs", luaB_pairs}, - {"pcall", luaB_pcall}, - {"print", luaB_print}, - {"rawequal", luaB_rawequal}, - {"rawlen", luaB_rawlen}, - {"rawget", luaB_rawget}, - {"rawset", luaB_rawset}, - {"select", luaB_select}, - {"setmetatable", luaB_setmetatable}, - {"tonumber", luaB_tonumber}, - {"tostring", luaB_tostring}, - {"xpcall", luaB_xpcall}, - /* placeholders */ - {"type", NULL}, - {"_G", NULL}, - {"_VERSION", NULL}, - {NULL, NULL} -}; - - -LUAMOD_API int luaopen_base (lua_State *L) { - int i; - /* open lib into global table */ - lua_pushglobaltable(L); - luaL_setfuncs(L, base_funcs, 0); - /* set global _G */ - lua_pushvalue(L, -1); - lua_setfield(L, -2, "_G"); - /* set global _VERSION */ - lua_pushliteral(L, LUA_VERSION); - lua_setfield(L, -2, "_VERSION"); - /* set function 'type' with proper upvalues */ - for (i = 0; i < LUA_NUMTAGS; i++) /* push all type names as upvalues */ - lua_pushstring(L, lua_typename(L, i)); - lua_pushcclosure(L, luaB_type, LUA_NUMTAGS); - lua_setfield(L, -2, "type"); - return 1; -} - diff --git a/3rd/lua/src/lbitlib.c b/3rd/lua/src/lbitlib.c deleted file mode 100644 index 15d5f0c..0000000 --- a/3rd/lua/src/lbitlib.c +++ /dev/null @@ -1,230 +0,0 @@ -/* -** $Id: lbitlib.c,v 1.28 2014/11/02 19:19:04 roberto Exp $ -** Standard library for bitwise operations -** See Copyright Notice in lua.h -*/ - -#define lbitlib_c -#define LUA_LIB - -#include "lprefix.h" - - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -#if defined(LUA_COMPAT_BITLIB) /* { */ - - -/* number of bits to consider in a number */ -#if !defined(LUA_NBITS) -#define LUA_NBITS 32 -#endif - - -/* -** a lua_Unsigned with its first LUA_NBITS bits equal to 1. (Shift must -** be made in two parts to avoid problems when LUA_NBITS is equal to the -** number of bits in a lua_Unsigned.) -*/ -#define ALLONES (~(((~(lua_Unsigned)0) << (LUA_NBITS - 1)) << 1)) - - -/* macro to trim extra bits */ -#define trim(x) ((x) & ALLONES) - - -/* builds a number with 'n' ones (1 <= n <= LUA_NBITS) */ -#define mask(n) (~((ALLONES << 1) << ((n) - 1))) - - - -static lua_Unsigned andaux (lua_State *L) { - int i, n = lua_gettop(L); - lua_Unsigned r = ~(lua_Unsigned)0; - for (i = 1; i <= n; i++) - r &= luaL_checkunsigned(L, i); - return trim(r); -} - - -static int b_and (lua_State *L) { - lua_Unsigned r = andaux(L); - lua_pushunsigned(L, r); - return 1; -} - - -static int b_test (lua_State *L) { - lua_Unsigned r = andaux(L); - lua_pushboolean(L, r != 0); - return 1; -} - - -static int b_or (lua_State *L) { - int i, n = lua_gettop(L); - lua_Unsigned r = 0; - for (i = 1; i <= n; i++) - r |= luaL_checkunsigned(L, i); - lua_pushunsigned(L, trim(r)); - return 1; -} - - -static int b_xor (lua_State *L) { - int i, n = lua_gettop(L); - lua_Unsigned r = 0; - for (i = 1; i <= n; i++) - r ^= luaL_checkunsigned(L, i); - lua_pushunsigned(L, trim(r)); - return 1; -} - - -static int b_not (lua_State *L) { - lua_Unsigned r = ~luaL_checkunsigned(L, 1); - lua_pushunsigned(L, trim(r)); - return 1; -} - - -static int b_shift (lua_State *L, lua_Unsigned r, lua_Integer i) { - if (i < 0) { /* shift right? */ - i = -i; - r = trim(r); - if (i >= LUA_NBITS) r = 0; - else r >>= i; - } - else { /* shift left */ - if (i >= LUA_NBITS) r = 0; - else r <<= i; - r = trim(r); - } - lua_pushunsigned(L, r); - return 1; -} - - -static int b_lshift (lua_State *L) { - return b_shift(L, luaL_checkunsigned(L, 1), luaL_checkinteger(L, 2)); -} - - -static int b_rshift (lua_State *L) { - return b_shift(L, luaL_checkunsigned(L, 1), -luaL_checkinteger(L, 2)); -} - - -static int b_arshift (lua_State *L) { - lua_Unsigned r = luaL_checkunsigned(L, 1); - lua_Integer i = luaL_checkinteger(L, 2); - if (i < 0 || !(r & ((lua_Unsigned)1 << (LUA_NBITS - 1)))) - return b_shift(L, r, -i); - else { /* arithmetic shift for 'negative' number */ - if (i >= LUA_NBITS) r = ALLONES; - else - r = trim((r >> i) | ~(trim(~(lua_Unsigned)0) >> i)); /* add signal bit */ - lua_pushunsigned(L, r); - return 1; - } -} - - -static int b_rot (lua_State *L, lua_Integer d) { - lua_Unsigned r = luaL_checkunsigned(L, 1); - int i = d & (LUA_NBITS - 1); /* i = d % NBITS */ - r = trim(r); - if (i != 0) /* avoid undefined shift of LUA_NBITS when i == 0 */ - r = (r << i) | (r >> (LUA_NBITS - i)); - lua_pushunsigned(L, trim(r)); - return 1; -} - - -static int b_lrot (lua_State *L) { - return b_rot(L, luaL_checkinteger(L, 2)); -} - - -static int b_rrot (lua_State *L) { - return b_rot(L, -luaL_checkinteger(L, 2)); -} - - -/* -** get field and width arguments for field-manipulation functions, -** checking whether they are valid. -** ('luaL_error' called without 'return' to avoid later warnings about -** 'width' being used uninitialized.) -*/ -static int fieldargs (lua_State *L, int farg, int *width) { - lua_Integer f = luaL_checkinteger(L, farg); - lua_Integer w = luaL_optinteger(L, farg + 1, 1); - luaL_argcheck(L, 0 <= f, farg, "field cannot be negative"); - luaL_argcheck(L, 0 < w, farg + 1, "width must be positive"); - if (f + w > LUA_NBITS) - luaL_error(L, "trying to access non-existent bits"); - *width = (int)w; - return (int)f; -} - - -static int b_extract (lua_State *L) { - int w; - lua_Unsigned r = trim(luaL_checkunsigned(L, 1)); - int f = fieldargs(L, 2, &w); - r = (r >> f) & mask(w); - lua_pushunsigned(L, r); - return 1; -} - - -static int b_replace (lua_State *L) { - int w; - lua_Unsigned r = trim(luaL_checkunsigned(L, 1)); - lua_Unsigned v = luaL_checkunsigned(L, 2); - int f = fieldargs(L, 3, &w); - int m = mask(w); - v &= m; /* erase bits outside given width */ - r = (r & ~(m << f)) | (v << f); - lua_pushunsigned(L, r); - return 1; -} - - -static const luaL_Reg bitlib[] = { - {"arshift", b_arshift}, - {"band", b_and}, - {"bnot", b_not}, - {"bor", b_or}, - {"bxor", b_xor}, - {"btest", b_test}, - {"extract", b_extract}, - {"lrotate", b_lrot}, - {"lshift", b_lshift}, - {"replace", b_replace}, - {"rrotate", b_rrot}, - {"rshift", b_rshift}, - {NULL, NULL} -}; - - - -LUAMOD_API int luaopen_bit32 (lua_State *L) { - luaL_newlib(L, bitlib); - return 1; -} - - -#else /* }{ */ - - -LUAMOD_API int luaopen_bit32 (lua_State *L) { - return luaL_error(L, "library 'bit32' has been deprecated"); -} - -#endif /* } */ diff --git a/3rd/lua/src/lcode.c b/3rd/lua/src/lcode.c deleted file mode 100644 index 5e34624..0000000 --- a/3rd/lua/src/lcode.c +++ /dev/null @@ -1,954 +0,0 @@ -/* -** $Id: lcode.c,v 2.99 2014/12/29 16:49:25 roberto Exp $ -** Code generator for Lua -** See Copyright Notice in lua.h -*/ - -#define lcode_c -#define LUA_CORE - -#include "lprefix.h" - - -#include -#include - -#include "lua.h" - -#include "lcode.h" -#include "ldebug.h" -#include "ldo.h" -#include "lgc.h" -#include "llex.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" -#include "lstring.h" -#include "ltable.h" -#include "lvm.h" - - -/* Maximum number of registers in a Lua function */ -#define MAXREGS 250 - - -#define hasjumps(e) ((e)->t != (e)->f) - - -static int tonumeral(expdesc *e, TValue *v) { - if (e->t != NO_JUMP || e->f != NO_JUMP) - return 0; /* not a numeral */ - switch (e->k) { - case VKINT: - if (v) setivalue(v, e->u.ival); - return 1; - case VKFLT: - if (v) setfltvalue(v, e->u.nval); - return 1; - default: return 0; - } -} - - -void luaK_nil (FuncState *fs, int from, int n) { - Instruction *previous; - int l = from + n - 1; /* last register to set nil */ - if (fs->pc > fs->lasttarget) { /* no jumps to current position? */ - previous = &fs->f->code[fs->pc-1]; - if (GET_OPCODE(*previous) == OP_LOADNIL) { - int pfrom = GETARG_A(*previous); - int pl = pfrom + GETARG_B(*previous); - if ((pfrom <= from && from <= pl + 1) || - (from <= pfrom && pfrom <= l + 1)) { /* can connect both? */ - if (pfrom < from) from = pfrom; /* from = min(from, pfrom) */ - if (pl > l) l = pl; /* l = max(l, pl) */ - SETARG_A(*previous, from); - SETARG_B(*previous, l - from); - return; - } - } /* else go through */ - } - luaK_codeABC(fs, OP_LOADNIL, from, n - 1, 0); /* else no optimization */ -} - - -int luaK_jump (FuncState *fs) { - int jpc = fs->jpc; /* save list of jumps to here */ - int j; - fs->jpc = NO_JUMP; - j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP); - luaK_concat(fs, &j, jpc); /* keep them on hold */ - return j; -} - - -void luaK_ret (FuncState *fs, int first, int nret) { - luaK_codeABC(fs, OP_RETURN, first, nret+1, 0); -} - - -static int condjump (FuncState *fs, OpCode op, int A, int B, int C) { - luaK_codeABC(fs, op, A, B, C); - return luaK_jump(fs); -} - - -static void fixjump (FuncState *fs, int pc, int dest) { - Instruction *jmp = &fs->f->code[pc]; - int offset = dest-(pc+1); - lua_assert(dest != NO_JUMP); - if (abs(offset) > MAXARG_sBx) - luaX_syntaxerror(fs->ls, "control structure too long"); - SETARG_sBx(*jmp, offset); -} - - -/* -** returns current 'pc' and marks it as a jump target (to avoid wrong -** optimizations with consecutive instructions not in the same basic block). -*/ -int luaK_getlabel (FuncState *fs) { - fs->lasttarget = fs->pc; - return fs->pc; -} - - -static int getjump (FuncState *fs, int pc) { - int offset = GETARG_sBx(fs->f->code[pc]); - if (offset == NO_JUMP) /* point to itself represents end of list */ - return NO_JUMP; /* end of list */ - else - return (pc+1)+offset; /* turn offset into absolute position */ -} - - -static Instruction *getjumpcontrol (FuncState *fs, int pc) { - Instruction *pi = &fs->f->code[pc]; - if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1)))) - return pi-1; - else - return pi; -} - - -/* -** check whether list has any jump that do not produce a value -** (or produce an inverted value) -*/ -static int need_value (FuncState *fs, int list) { - for (; list != NO_JUMP; list = getjump(fs, list)) { - Instruction i = *getjumpcontrol(fs, list); - if (GET_OPCODE(i) != OP_TESTSET) return 1; - } - return 0; /* not found */ -} - - -static int patchtestreg (FuncState *fs, int node, int reg) { - Instruction *i = getjumpcontrol(fs, node); - if (GET_OPCODE(*i) != OP_TESTSET) - return 0; /* cannot patch other instructions */ - if (reg != NO_REG && reg != GETARG_B(*i)) - SETARG_A(*i, reg); - else /* no register to put value or register already has the value */ - *i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i)); - - return 1; -} - - -static void removevalues (FuncState *fs, int list) { - for (; list != NO_JUMP; list = getjump(fs, list)) - patchtestreg(fs, list, NO_REG); -} - - -static void patchlistaux (FuncState *fs, int list, int vtarget, int reg, - int dtarget) { - while (list != NO_JUMP) { - int next = getjump(fs, list); - if (patchtestreg(fs, list, reg)) - fixjump(fs, list, vtarget); - else - fixjump(fs, list, dtarget); /* jump to default target */ - list = next; - } -} - - -static void dischargejpc (FuncState *fs) { - patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc); - fs->jpc = NO_JUMP; -} - - -void luaK_patchlist (FuncState *fs, int list, int target) { - if (target == fs->pc) - luaK_patchtohere(fs, list); - else { - lua_assert(target < fs->pc); - patchlistaux(fs, list, target, NO_REG, target); - } -} - - -void luaK_patchclose (FuncState *fs, int list, int level) { - level++; /* argument is +1 to reserve 0 as non-op */ - while (list != NO_JUMP) { - int next = getjump(fs, list); - lua_assert(GET_OPCODE(fs->f->code[list]) == OP_JMP && - (GETARG_A(fs->f->code[list]) == 0 || - GETARG_A(fs->f->code[list]) >= level)); - SETARG_A(fs->f->code[list], level); - list = next; - } -} - - -void luaK_patchtohere (FuncState *fs, int list) { - luaK_getlabel(fs); - luaK_concat(fs, &fs->jpc, list); -} - - -void luaK_concat (FuncState *fs, int *l1, int l2) { - if (l2 == NO_JUMP) return; - else if (*l1 == NO_JUMP) - *l1 = l2; - else { - int list = *l1; - int next; - while ((next = getjump(fs, list)) != NO_JUMP) /* find last element */ - list = next; - fixjump(fs, list, l2); - } -} - - -static int luaK_code (FuncState *fs, Instruction i) { - Proto *f = fs->f; - dischargejpc(fs); /* 'pc' will change */ - /* put new instruction in code array */ - luaM_growvector(fs->ls->L, f->code, fs->pc, f->sizecode, Instruction, - MAX_INT, "opcodes"); - f->code[fs->pc] = i; - /* save corresponding line information */ - luaM_growvector(fs->ls->L, f->lineinfo, fs->pc, f->sizelineinfo, int, - MAX_INT, "opcodes"); - f->lineinfo[fs->pc] = fs->ls->lastline; - return fs->pc++; -} - - -int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) { - lua_assert(getOpMode(o) == iABC); - lua_assert(getBMode(o) != OpArgN || b == 0); - lua_assert(getCMode(o) != OpArgN || c == 0); - lua_assert(a <= MAXARG_A && b <= MAXARG_B && c <= MAXARG_C); - return luaK_code(fs, CREATE_ABC(o, a, b, c)); -} - - -int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { - lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx); - lua_assert(getCMode(o) == OpArgN); - lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx); - return luaK_code(fs, CREATE_ABx(o, a, bc)); -} - - -static int codeextraarg (FuncState *fs, int a) { - lua_assert(a <= MAXARG_Ax); - return luaK_code(fs, CREATE_Ax(OP_EXTRAARG, a)); -} - - -int luaK_codek (FuncState *fs, int reg, int k) { - if (k <= MAXARG_Bx) - return luaK_codeABx(fs, OP_LOADK, reg, k); - else { - int p = luaK_codeABx(fs, OP_LOADKX, reg, 0); - codeextraarg(fs, k); - return p; - } -} - - -void luaK_checkstack (FuncState *fs, int n) { - int newstack = fs->freereg + n; - if (newstack > fs->f->maxstacksize) { - if (newstack >= MAXREGS) - luaX_syntaxerror(fs->ls, "function or expression too complex"); - fs->f->maxstacksize = cast_byte(newstack); - } -} - - -void luaK_reserveregs (FuncState *fs, int n) { - luaK_checkstack(fs, n); - fs->freereg += n; -} - - -static void freereg (FuncState *fs, int reg) { - if (!ISK(reg) && reg >= fs->nactvar) { - fs->freereg--; - lua_assert(reg == fs->freereg); - } -} - - -static void freeexp (FuncState *fs, expdesc *e) { - if (e->k == VNONRELOC) - freereg(fs, e->u.info); -} - - -/* -** Use scanner's table to cache position of constants in constant list -** and try to reuse constants -*/ -static int addk (FuncState *fs, TValue *key, TValue *v) { - lua_State *L = fs->ls->L; - Proto *f = fs->f; - TValue *idx = luaH_set(L, fs->ls->h, key); /* index scanner table */ - int k, oldsize; - if (ttisinteger(idx)) { /* is there an index there? */ - k = cast_int(ivalue(idx)); - /* correct value? (warning: must distinguish floats from integers!) */ - if (k < fs->nk && ttype(&f->k[k]) == ttype(v) && - luaV_rawequalobj(&f->k[k], v)) - return k; /* reuse index */ - } - /* constant not found; create a new entry */ - oldsize = f->sizek; - k = fs->nk; - /* numerical value does not need GC barrier; - table has no metatable, so it does not need to invalidate cache */ - setivalue(idx, k); - luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants"); - while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); - setobj(L, &f->k[k], v); - fs->nk++; - luaC_barrier(L, f, v); - return k; -} - - -int luaK_stringK (FuncState *fs, TString *s) { - TValue o; - setsvalue(fs->ls->L, &o, s); - return addk(fs, &o, &o); -} - - -/* -** Integers use userdata as keys to avoid collision with floats with same -** value; conversion to 'void*' used only for hashing, no "precision" -** problems -*/ -int luaK_intK (FuncState *fs, lua_Integer n) { - TValue k, o; - setpvalue(&k, cast(void*, cast(size_t, n))); - setivalue(&o, n); - return addk(fs, &k, &o); -} - - -static int luaK_numberK (FuncState *fs, lua_Number r) { - TValue o; - setfltvalue(&o, r); - return addk(fs, &o, &o); -} - - -static int boolK (FuncState *fs, int b) { - TValue o; - setbvalue(&o, b); - return addk(fs, &o, &o); -} - - -static int nilK (FuncState *fs) { - TValue k, v; - setnilvalue(&v); - /* cannot use nil as key; instead use table itself to represent nil */ - sethvalue(fs->ls->L, &k, fs->ls->h); - return addk(fs, &k, &v); -} - - -void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) { - if (e->k == VCALL) { /* expression is an open function call? */ - SETARG_C(getcode(fs, e), nresults+1); - } - else if (e->k == VVARARG) { - SETARG_B(getcode(fs, e), nresults+1); - SETARG_A(getcode(fs, e), fs->freereg); - luaK_reserveregs(fs, 1); - } -} - - -void luaK_setoneret (FuncState *fs, expdesc *e) { - if (e->k == VCALL) { /* expression is an open function call? */ - e->k = VNONRELOC; - e->u.info = GETARG_A(getcode(fs, e)); - } - else if (e->k == VVARARG) { - SETARG_B(getcode(fs, e), 2); - e->k = VRELOCABLE; /* can relocate its simple result */ - } -} - - -void luaK_dischargevars (FuncState *fs, expdesc *e) { - switch (e->k) { - case VLOCAL: { - e->k = VNONRELOC; - break; - } - case VUPVAL: { - e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0); - e->k = VRELOCABLE; - break; - } - case VINDEXED: { - OpCode op = OP_GETTABUP; /* assume 't' is in an upvalue */ - freereg(fs, e->u.ind.idx); - if (e->u.ind.vt == VLOCAL) { /* 't' is in a register? */ - freereg(fs, e->u.ind.t); - op = OP_GETTABLE; - } - e->u.info = luaK_codeABC(fs, op, 0, e->u.ind.t, e->u.ind.idx); - e->k = VRELOCABLE; - break; - } - case VVARARG: - case VCALL: { - luaK_setoneret(fs, e); - break; - } - default: break; /* there is one value available (somewhere) */ - } -} - - -static int code_label (FuncState *fs, int A, int b, int jump) { - luaK_getlabel(fs); /* those instructions may be jump targets */ - return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump); -} - - -static void discharge2reg (FuncState *fs, expdesc *e, int reg) { - luaK_dischargevars(fs, e); - switch (e->k) { - case VNIL: { - luaK_nil(fs, reg, 1); - break; - } - case VFALSE: case VTRUE: { - luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0); - break; - } - case VK: { - luaK_codek(fs, reg, e->u.info); - break; - } - case VKFLT: { - luaK_codek(fs, reg, luaK_numberK(fs, e->u.nval)); - break; - } - case VKINT: { - luaK_codek(fs, reg, luaK_intK(fs, e->u.ival)); - break; - } - case VRELOCABLE: { - Instruction *pc = &getcode(fs, e); - SETARG_A(*pc, reg); - break; - } - case VNONRELOC: { - if (reg != e->u.info) - luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0); - break; - } - default: { - lua_assert(e->k == VVOID || e->k == VJMP); - return; /* nothing to do... */ - } - } - e->u.info = reg; - e->k = VNONRELOC; -} - - -static void discharge2anyreg (FuncState *fs, expdesc *e) { - if (e->k != VNONRELOC) { - luaK_reserveregs(fs, 1); - discharge2reg(fs, e, fs->freereg-1); - } -} - - -static void exp2reg (FuncState *fs, expdesc *e, int reg) { - discharge2reg(fs, e, reg); - if (e->k == VJMP) - luaK_concat(fs, &e->t, e->u.info); /* put this jump in 't' list */ - if (hasjumps(e)) { - int final; /* position after whole expression */ - int p_f = NO_JUMP; /* position of an eventual LOAD false */ - int p_t = NO_JUMP; /* position of an eventual LOAD true */ - if (need_value(fs, e->t) || need_value(fs, e->f)) { - int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs); - p_f = code_label(fs, reg, 0, 1); - p_t = code_label(fs, reg, 1, 0); - luaK_patchtohere(fs, fj); - } - final = luaK_getlabel(fs); - patchlistaux(fs, e->f, final, reg, p_f); - patchlistaux(fs, e->t, final, reg, p_t); - } - e->f = e->t = NO_JUMP; - e->u.info = reg; - e->k = VNONRELOC; -} - - -void luaK_exp2nextreg (FuncState *fs, expdesc *e) { - luaK_dischargevars(fs, e); - freeexp(fs, e); - luaK_reserveregs(fs, 1); - exp2reg(fs, e, fs->freereg - 1); -} - - -int luaK_exp2anyreg (FuncState *fs, expdesc *e) { - luaK_dischargevars(fs, e); - if (e->k == VNONRELOC) { - if (!hasjumps(e)) return e->u.info; /* exp is already in a register */ - if (e->u.info >= fs->nactvar) { /* reg. is not a local? */ - exp2reg(fs, e, e->u.info); /* put value on it */ - return e->u.info; - } - } - luaK_exp2nextreg(fs, e); /* default */ - return e->u.info; -} - - -void luaK_exp2anyregup (FuncState *fs, expdesc *e) { - if (e->k != VUPVAL || hasjumps(e)) - luaK_exp2anyreg(fs, e); -} - - -void luaK_exp2val (FuncState *fs, expdesc *e) { - if (hasjumps(e)) - luaK_exp2anyreg(fs, e); - else - luaK_dischargevars(fs, e); -} - - -int luaK_exp2RK (FuncState *fs, expdesc *e) { - luaK_exp2val(fs, e); - switch (e->k) { - case VTRUE: - case VFALSE: - case VNIL: { - if (fs->nk <= MAXINDEXRK) { /* constant fits in RK operand? */ - e->u.info = (e->k == VNIL) ? nilK(fs) : boolK(fs, (e->k == VTRUE)); - e->k = VK; - return RKASK(e->u.info); - } - else break; - } - case VKINT: { - e->u.info = luaK_intK(fs, e->u.ival); - e->k = VK; - goto vk; - } - case VKFLT: { - e->u.info = luaK_numberK(fs, e->u.nval); - e->k = VK; - /* go through */ - } - case VK: { - vk: - if (e->u.info <= MAXINDEXRK) /* constant fits in 'argC'? */ - return RKASK(e->u.info); - else break; - } - default: break; - } - /* not a constant in the right range: put it in a register */ - return luaK_exp2anyreg(fs, e); -} - - -void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { - switch (var->k) { - case VLOCAL: { - freeexp(fs, ex); - exp2reg(fs, ex, var->u.info); - return; - } - case VUPVAL: { - int e = luaK_exp2anyreg(fs, ex); - luaK_codeABC(fs, OP_SETUPVAL, e, var->u.info, 0); - break; - } - case VINDEXED: { - OpCode op = (var->u.ind.vt == VLOCAL) ? OP_SETTABLE : OP_SETTABUP; - int e = luaK_exp2RK(fs, ex); - luaK_codeABC(fs, op, var->u.ind.t, var->u.ind.idx, e); - break; - } - default: { - lua_assert(0); /* invalid var kind to store */ - break; - } - } - freeexp(fs, ex); -} - - -void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { - int ereg; - luaK_exp2anyreg(fs, e); - ereg = e->u.info; /* register where 'e' was placed */ - freeexp(fs, e); - e->u.info = fs->freereg; /* base register for op_self */ - e->k = VNONRELOC; - luaK_reserveregs(fs, 2); /* function and 'self' produced by op_self */ - luaK_codeABC(fs, OP_SELF, e->u.info, ereg, luaK_exp2RK(fs, key)); - freeexp(fs, key); -} - - -static void invertjump (FuncState *fs, expdesc *e) { - Instruction *pc = getjumpcontrol(fs, e->u.info); - lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET && - GET_OPCODE(*pc) != OP_TEST); - SETARG_A(*pc, !(GETARG_A(*pc))); -} - - -static int jumponcond (FuncState *fs, expdesc *e, int cond) { - if (e->k == VRELOCABLE) { - Instruction ie = getcode(fs, e); - if (GET_OPCODE(ie) == OP_NOT) { - fs->pc--; /* remove previous OP_NOT */ - return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond); - } - /* else go through */ - } - discharge2anyreg(fs, e); - freeexp(fs, e); - return condjump(fs, OP_TESTSET, NO_REG, e->u.info, cond); -} - - -void luaK_goiftrue (FuncState *fs, expdesc *e) { - int pc; /* pc of last jump */ - luaK_dischargevars(fs, e); - switch (e->k) { - case VJMP: { - invertjump(fs, e); - pc = e->u.info; - break; - } - case VK: case VKFLT: case VKINT: case VTRUE: { - pc = NO_JUMP; /* always true; do nothing */ - break; - } - default: { - pc = jumponcond(fs, e, 0); - break; - } - } - luaK_concat(fs, &e->f, pc); /* insert last jump in 'f' list */ - luaK_patchtohere(fs, e->t); - e->t = NO_JUMP; -} - - -void luaK_goiffalse (FuncState *fs, expdesc *e) { - int pc; /* pc of last jump */ - luaK_dischargevars(fs, e); - switch (e->k) { - case VJMP: { - pc = e->u.info; - break; - } - case VNIL: case VFALSE: { - pc = NO_JUMP; /* always false; do nothing */ - break; - } - default: { - pc = jumponcond(fs, e, 1); - break; - } - } - luaK_concat(fs, &e->t, pc); /* insert last jump in 't' list */ - luaK_patchtohere(fs, e->f); - e->f = NO_JUMP; -} - - -static void codenot (FuncState *fs, expdesc *e) { - luaK_dischargevars(fs, e); - switch (e->k) { - case VNIL: case VFALSE: { - e->k = VTRUE; - break; - } - case VK: case VKFLT: case VKINT: case VTRUE: { - e->k = VFALSE; - break; - } - case VJMP: { - invertjump(fs, e); - break; - } - case VRELOCABLE: - case VNONRELOC: { - discharge2anyreg(fs, e); - freeexp(fs, e); - e->u.info = luaK_codeABC(fs, OP_NOT, 0, e->u.info, 0); - e->k = VRELOCABLE; - break; - } - default: { - lua_assert(0); /* cannot happen */ - break; - } - } - /* interchange true and false lists */ - { int temp = e->f; e->f = e->t; e->t = temp; } - removevalues(fs, e->f); - removevalues(fs, e->t); -} - - -void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { - lua_assert(!hasjumps(t)); - t->u.ind.t = t->u.info; - t->u.ind.idx = luaK_exp2RK(fs, k); - t->u.ind.vt = (t->k == VUPVAL) ? VUPVAL - : check_exp(vkisinreg(t->k), VLOCAL); - t->k = VINDEXED; -} - - -/* -** return false if folding can raise an error -*/ -static int validop (int op, TValue *v1, TValue *v2) { - switch (op) { - case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR: - case LUA_OPSHL: case LUA_OPSHR: case LUA_OPBNOT: { /* conversion errors */ - lua_Integer i; - return (tointeger(v1, &i) && tointeger(v2, &i)); - } - case LUA_OPDIV: case LUA_OPIDIV: case LUA_OPMOD: /* division by 0 */ - return (nvalue(v2) != 0); - default: return 1; /* everything else is valid */ - } -} - - -/* -** Try to "constant-fold" an operation; return 1 iff successful -*/ -static int constfolding (FuncState *fs, int op, expdesc *e1, expdesc *e2) { - TValue v1, v2, res; - if (!tonumeral(e1, &v1) || !tonumeral(e2, &v2) || !validop(op, &v1, &v2)) - return 0; /* non-numeric operands or not safe to fold */ - luaO_arith(fs->ls->L, op, &v1, &v2, &res); /* does operation */ - if (ttisinteger(&res)) { - e1->k = VKINT; - e1->u.ival = ivalue(&res); - } - else { /* folds neither NaN nor 0.0 (to avoid collapsing with -0.0) */ - lua_Number n = fltvalue(&res); - if (luai_numisnan(n) || n == 0) - return 0; - e1->k = VKFLT; - e1->u.nval = n; - } - return 1; -} - - -/* -** Code for binary and unary expressions that "produce values" -** (arithmetic operations, bitwise operations, concat, length). First -** try to do constant folding (only for numeric [arithmetic and -** bitwise] operations, which is what 'lua_arith' accepts). -** Expression to produce final result will be encoded in 'e1'. -*/ -static void codeexpval (FuncState *fs, OpCode op, - expdesc *e1, expdesc *e2, int line) { - lua_assert(op >= OP_ADD); - if (op <= OP_BNOT && constfolding(fs, op - OP_ADD + LUA_OPADD, e1, e2)) - return; /* result has been folded */ - else { - int o1, o2; - /* move operands to registers (if needed) */ - if (op == OP_UNM || op == OP_BNOT || op == OP_LEN) { /* unary op? */ - o2 = 0; /* no second expression */ - o1 = luaK_exp2anyreg(fs, e1); /* cannot operate on constants */ - } - else { /* regular case (binary operators) */ - o2 = luaK_exp2RK(fs, e2); /* both operands are "RK" */ - o1 = luaK_exp2RK(fs, e1); - } - if (o1 > o2) { /* free registers in proper order */ - freeexp(fs, e1); - freeexp(fs, e2); - } - else { - freeexp(fs, e2); - freeexp(fs, e1); - } - e1->u.info = luaK_codeABC(fs, op, 0, o1, o2); /* generate opcode */ - e1->k = VRELOCABLE; /* all those operations are relocable */ - luaK_fixline(fs, line); - } -} - - -static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1, - expdesc *e2) { - int o1 = luaK_exp2RK(fs, e1); - int o2 = luaK_exp2RK(fs, e2); - freeexp(fs, e2); - freeexp(fs, e1); - if (cond == 0 && op != OP_EQ) { - int temp; /* exchange args to replace by '<' or '<=' */ - temp = o1; o1 = o2; o2 = temp; /* o1 <==> o2 */ - cond = 1; - } - e1->u.info = condjump(fs, op, cond, o1, o2); - e1->k = VJMP; -} - - -void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) { - expdesc e2; - e2.t = e2.f = NO_JUMP; e2.k = VKINT; e2.u.ival = 0; - switch (op) { - case OPR_MINUS: case OPR_BNOT: case OPR_LEN: { - codeexpval(fs, cast(OpCode, (op - OPR_MINUS) + OP_UNM), e, &e2, line); - break; - } - case OPR_NOT: codenot(fs, e); break; - default: lua_assert(0); - } -} - - -void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { - switch (op) { - case OPR_AND: { - luaK_goiftrue(fs, v); - break; - } - case OPR_OR: { - luaK_goiffalse(fs, v); - break; - } - case OPR_CONCAT: { - luaK_exp2nextreg(fs, v); /* operand must be on the 'stack' */ - break; - } - case OPR_ADD: case OPR_SUB: - case OPR_MUL: case OPR_DIV: case OPR_IDIV: - case OPR_MOD: case OPR_POW: - case OPR_BAND: case OPR_BOR: case OPR_BXOR: - case OPR_SHL: case OPR_SHR: { - if (!tonumeral(v, NULL)) luaK_exp2RK(fs, v); - break; - } - default: { - luaK_exp2RK(fs, v); - break; - } - } -} - - -void luaK_posfix (FuncState *fs, BinOpr op, - expdesc *e1, expdesc *e2, int line) { - switch (op) { - case OPR_AND: { - lua_assert(e1->t == NO_JUMP); /* list must be closed */ - luaK_dischargevars(fs, e2); - luaK_concat(fs, &e2->f, e1->f); - *e1 = *e2; - break; - } - case OPR_OR: { - lua_assert(e1->f == NO_JUMP); /* list must be closed */ - luaK_dischargevars(fs, e2); - luaK_concat(fs, &e2->t, e1->t); - *e1 = *e2; - break; - } - case OPR_CONCAT: { - luaK_exp2val(fs, e2); - if (e2->k == VRELOCABLE && GET_OPCODE(getcode(fs, e2)) == OP_CONCAT) { - lua_assert(e1->u.info == GETARG_B(getcode(fs, e2))-1); - freeexp(fs, e1); - SETARG_B(getcode(fs, e2), e1->u.info); - e1->k = VRELOCABLE; e1->u.info = e2->u.info; - } - else { - luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */ - codeexpval(fs, OP_CONCAT, e1, e2, line); - } - break; - } - case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV: - case OPR_IDIV: case OPR_MOD: case OPR_POW: - case OPR_BAND: case OPR_BOR: case OPR_BXOR: - case OPR_SHL: case OPR_SHR: { - codeexpval(fs, cast(OpCode, (op - OPR_ADD) + OP_ADD), e1, e2, line); - break; - } - case OPR_EQ: case OPR_LT: case OPR_LE: { - codecomp(fs, cast(OpCode, op - OPR_EQ + OP_EQ), 1, e1, e2); - break; - } - case OPR_NE: case OPR_GT: case OPR_GE: { - codecomp(fs, cast(OpCode, op - OPR_NE + OP_EQ), 0, e1, e2); - break; - } - default: lua_assert(0); - } -} - - -void luaK_fixline (FuncState *fs, int line) { - fs->f->lineinfo[fs->pc - 1] = line; -} - - -void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) { - int c = (nelems - 1)/LFIELDS_PER_FLUSH + 1; - int b = (tostore == LUA_MULTRET) ? 0 : tostore; - lua_assert(tostore != 0); - if (c <= MAXARG_C) - luaK_codeABC(fs, OP_SETLIST, base, b, c); - else if (c <= MAXARG_Ax) { - luaK_codeABC(fs, OP_SETLIST, base, b, 0); - codeextraarg(fs, c); - } - else - luaX_syntaxerror(fs->ls, "constructor too long"); - fs->freereg = base + 1; /* free registers with list values */ -} - diff --git a/3rd/lua/src/lcode.h b/3rd/lua/src/lcode.h deleted file mode 100644 index 43ab86d..0000000 --- a/3rd/lua/src/lcode.h +++ /dev/null @@ -1,87 +0,0 @@ -/* -** $Id: lcode.h,v 1.63 2013/12/30 20:47:58 roberto Exp $ -** Code generator for Lua -** See Copyright Notice in lua.h -*/ - -#ifndef lcode_h -#define lcode_h - -#include "llex.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" - - -/* -** Marks the end of a patch list. It is an invalid value both as an absolute -** address, and as a list link (would link an element to itself). -*/ -#define NO_JUMP (-1) - - -/* -** grep "ORDER OPR" if you change these enums (ORDER OP) -*/ -typedef enum BinOpr { - OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW, - OPR_DIV, - OPR_IDIV, - OPR_BAND, OPR_BOR, OPR_BXOR, - OPR_SHL, OPR_SHR, - OPR_CONCAT, - OPR_EQ, OPR_LT, OPR_LE, - OPR_NE, OPR_GT, OPR_GE, - OPR_AND, OPR_OR, - OPR_NOBINOPR -} BinOpr; - - -typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; - - -#define getcode(fs,e) ((fs)->f->code[(e)->u.info]) - -#define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx) - -#define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET) - -#define luaK_jumpto(fs,t) luaK_patchlist(fs, luaK_jump(fs), t) - -LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx); -LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C); -LUAI_FUNC int luaK_codek (FuncState *fs, int reg, int k); -LUAI_FUNC void luaK_fixline (FuncState *fs, int line); -LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n); -LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n); -LUAI_FUNC void luaK_checkstack (FuncState *fs, int n); -LUAI_FUNC int luaK_stringK (FuncState *fs, TString *s); -LUAI_FUNC int luaK_intK (FuncState *fs, lua_Integer n); -LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e); -LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e); -LUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e); -LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e); -LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e); -LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e); -LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key); -LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k); -LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e); -LUAI_FUNC void luaK_goiffalse (FuncState *fs, expdesc *e); -LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e); -LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults); -LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e); -LUAI_FUNC int luaK_jump (FuncState *fs); -LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret); -LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target); -LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list); -LUAI_FUNC void luaK_patchclose (FuncState *fs, int list, int level); -LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2); -LUAI_FUNC int luaK_getlabel (FuncState *fs); -LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v, int line); -LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v); -LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, - expdesc *v2, int line); -LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore); - - -#endif diff --git a/3rd/lua/src/lcorolib.c b/3rd/lua/src/lcorolib.c deleted file mode 100644 index 0c0b7fa..0000000 --- a/3rd/lua/src/lcorolib.c +++ /dev/null @@ -1,168 +0,0 @@ -/* -** $Id: lcorolib.c,v 1.9 2014/11/02 19:19:04 roberto Exp $ -** Coroutine Library -** See Copyright Notice in lua.h -*/ - -#define lcorolib_c -#define LUA_LIB - -#include "lprefix.h" - - -#include - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -static lua_State *getco (lua_State *L) { - lua_State *co = lua_tothread(L, 1); - luaL_argcheck(L, co, 1, "thread expected"); - return co; -} - - -static int auxresume (lua_State *L, lua_State *co, int narg) { - int status; - if (!lua_checkstack(co, narg)) { - lua_pushliteral(L, "too many arguments to resume"); - return -1; /* error flag */ - } - if (lua_status(co) == LUA_OK && lua_gettop(co) == 0) { - lua_pushliteral(L, "cannot resume dead coroutine"); - return -1; /* error flag */ - } - lua_xmove(L, co, narg); - status = lua_resume(co, L, narg); - if (status == LUA_OK || status == LUA_YIELD) { - int nres = lua_gettop(co); - if (!lua_checkstack(L, nres + 1)) { - lua_pop(co, nres); /* remove results anyway */ - lua_pushliteral(L, "too many results to resume"); - return -1; /* error flag */ - } - lua_xmove(co, L, nres); /* move yielded values */ - return nres; - } - else { - lua_xmove(co, L, 1); /* move error message */ - return -1; /* error flag */ - } -} - - -static int luaB_coresume (lua_State *L) { - lua_State *co = getco(L); - int r; - r = auxresume(L, co, lua_gettop(L) - 1); - if (r < 0) { - lua_pushboolean(L, 0); - lua_insert(L, -2); - return 2; /* return false + error message */ - } - else { - lua_pushboolean(L, 1); - lua_insert(L, -(r + 1)); - return r + 1; /* return true + 'resume' returns */ - } -} - - -static int luaB_auxwrap (lua_State *L) { - lua_State *co = lua_tothread(L, lua_upvalueindex(1)); - int r = auxresume(L, co, lua_gettop(L)); - if (r < 0) { - if (lua_isstring(L, -1)) { /* error object is a string? */ - luaL_where(L, 1); /* add extra info */ - lua_insert(L, -2); - lua_concat(L, 2); - } - return lua_error(L); /* propagate error */ - } - return r; -} - - -static int luaB_cocreate (lua_State *L) { - lua_State *NL; - luaL_checktype(L, 1, LUA_TFUNCTION); - NL = lua_newthread(L); - lua_pushvalue(L, 1); /* move function to top */ - lua_xmove(L, NL, 1); /* move function from L to NL */ - return 1; -} - - -static int luaB_cowrap (lua_State *L) { - luaB_cocreate(L); - lua_pushcclosure(L, luaB_auxwrap, 1); - return 1; -} - - -static int luaB_yield (lua_State *L) { - return lua_yield(L, lua_gettop(L)); -} - - -static int luaB_costatus (lua_State *L) { - lua_State *co = getco(L); - if (L == co) lua_pushliteral(L, "running"); - else { - switch (lua_status(co)) { - case LUA_YIELD: - lua_pushliteral(L, "suspended"); - break; - case LUA_OK: { - lua_Debug ar; - if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */ - lua_pushliteral(L, "normal"); /* it is running */ - else if (lua_gettop(co) == 0) - lua_pushliteral(L, "dead"); - else - lua_pushliteral(L, "suspended"); /* initial state */ - break; - } - default: /* some error occurred */ - lua_pushliteral(L, "dead"); - break; - } - } - return 1; -} - - -static int luaB_yieldable (lua_State *L) { - lua_pushboolean(L, lua_isyieldable(L)); - return 1; -} - - -static int luaB_corunning (lua_State *L) { - int ismain = lua_pushthread(L); - lua_pushboolean(L, ismain); - return 2; -} - - -static const luaL_Reg co_funcs[] = { - {"create", luaB_cocreate}, - {"resume", luaB_coresume}, - {"running", luaB_corunning}, - {"status", luaB_costatus}, - {"wrap", luaB_cowrap}, - {"yield", luaB_yield}, - {"isyieldable", luaB_yieldable}, - {NULL, NULL} -}; - - - -LUAMOD_API int luaopen_coroutine (lua_State *L) { - luaL_newlib(L, co_funcs); - return 1; -} - diff --git a/3rd/lua/src/lctype.c b/3rd/lua/src/lctype.c deleted file mode 100644 index ae9367e..0000000 --- a/3rd/lua/src/lctype.c +++ /dev/null @@ -1,55 +0,0 @@ -/* -** $Id: lctype.c,v 1.12 2014/11/02 19:19:04 roberto Exp $ -** 'ctype' functions for Lua -** See Copyright Notice in lua.h -*/ - -#define lctype_c -#define LUA_CORE - -#include "lprefix.h" - - -#include "lctype.h" - -#if !LUA_USE_CTYPE /* { */ - -#include - -LUAI_DDEF const lu_byte luai_ctype_[UCHAR_MAX + 2] = { - 0x00, /* EOZ */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0. */ - 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 1. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, /* 2. */ - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, /* 3. */ - 0x16, 0x16, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x05, /* 4. */ - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* 5. */ - 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x05, - 0x04, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x05, /* 6. */ - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* 7. */ - 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 8. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 9. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* a. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* b. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* c. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* d. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* e. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* f. */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -#endif /* } */ diff --git a/3rd/lua/src/lctype.h b/3rd/lua/src/lctype.h deleted file mode 100644 index 99c7d12..0000000 --- a/3rd/lua/src/lctype.h +++ /dev/null @@ -1,95 +0,0 @@ -/* -** $Id: lctype.h,v 1.12 2011/07/15 12:50:29 roberto Exp $ -** 'ctype' functions for Lua -** See Copyright Notice in lua.h -*/ - -#ifndef lctype_h -#define lctype_h - -#include "lua.h" - - -/* -** WARNING: the functions defined here do not necessarily correspond -** to the similar functions in the standard C ctype.h. They are -** optimized for the specific needs of Lua -*/ - -#if !defined(LUA_USE_CTYPE) - -#if 'A' == 65 && '0' == 48 -/* ASCII case: can use its own tables; faster and fixed */ -#define LUA_USE_CTYPE 0 -#else -/* must use standard C ctype */ -#define LUA_USE_CTYPE 1 -#endif - -#endif - - -#if !LUA_USE_CTYPE /* { */ - -#include - -#include "llimits.h" - - -#define ALPHABIT 0 -#define DIGITBIT 1 -#define PRINTBIT 2 -#define SPACEBIT 3 -#define XDIGITBIT 4 - - -#define MASK(B) (1 << (B)) - - -/* -** add 1 to char to allow index -1 (EOZ) -*/ -#define testprop(c,p) (luai_ctype_[(c)+1] & (p)) - -/* -** 'lalpha' (Lua alphabetic) and 'lalnum' (Lua alphanumeric) both include '_' -*/ -#define lislalpha(c) testprop(c, MASK(ALPHABIT)) -#define lislalnum(c) testprop(c, (MASK(ALPHABIT) | MASK(DIGITBIT))) -#define lisdigit(c) testprop(c, MASK(DIGITBIT)) -#define lisspace(c) testprop(c, MASK(SPACEBIT)) -#define lisprint(c) testprop(c, MASK(PRINTBIT)) -#define lisxdigit(c) testprop(c, MASK(XDIGITBIT)) - -/* -** this 'ltolower' only works for alphabetic characters -*/ -#define ltolower(c) ((c) | ('A' ^ 'a')) - - -/* two more entries for 0 and -1 (EOZ) */ -LUAI_DDEC const lu_byte luai_ctype_[UCHAR_MAX + 2]; - - -#else /* }{ */ - -/* -** use standard C ctypes -*/ - -#include - - -#define lislalpha(c) (isalpha(c) || (c) == '_') -#define lislalnum(c) (isalnum(c) || (c) == '_') -#define lisdigit(c) (isdigit(c)) -#define lisspace(c) (isspace(c)) -#define lisprint(c) (isprint(c)) -#define lisxdigit(c) (isxdigit(c)) - -#define ltolower(c) (tolower(c)) - -#endif /* } */ - -#endif - diff --git a/3rd/lua/src/ldblib.c b/3rd/lua/src/ldblib.c deleted file mode 100644 index 24a11b5..0000000 --- a/3rd/lua/src/ldblib.c +++ /dev/null @@ -1,437 +0,0 @@ -/* -** $Id: ldblib.c,v 1.148 2015/01/02 12:52:22 roberto Exp $ -** Interface from Lua to its debug API -** See Copyright Notice in lua.h -*/ - -#define ldblib_c -#define LUA_LIB - -#include "lprefix.h" - - -#include -#include -#include - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -/* -** The hook table at registry[&HOOKKEY] maps threads to their current -** hook function. (We only need the unique address of 'HOOKKEY'.) -*/ -static const int HOOKKEY = 0; - - -static int db_getregistry (lua_State *L) { - lua_pushvalue(L, LUA_REGISTRYINDEX); - return 1; -} - - -static int db_getmetatable (lua_State *L) { - luaL_checkany(L, 1); - if (!lua_getmetatable(L, 1)) { - lua_pushnil(L); /* no metatable */ - } - return 1; -} - - -static int db_setmetatable (lua_State *L) { - int t = lua_type(L, 2); - luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2, - "nil or table expected"); - lua_settop(L, 2); - lua_setmetatable(L, 1); - return 1; /* return 1st argument */ -} - - -static int db_getuservalue (lua_State *L) { - if (lua_type(L, 1) != LUA_TUSERDATA) - lua_pushnil(L); - else - lua_getuservalue(L, 1); - return 1; -} - - -static int db_setuservalue (lua_State *L) { - luaL_checktype(L, 1, LUA_TUSERDATA); - luaL_checkany(L, 2); - lua_settop(L, 2); - lua_setuservalue(L, 1); - return 1; -} - - -/* -** Auxiliary function used by several library functions: check for -** an optional thread as function's first argument and set 'arg' with -** 1 if this argument is present (so that functions can skip it to -** access their other arguments) -*/ -static lua_State *getthread (lua_State *L, int *arg) { - if (lua_isthread(L, 1)) { - *arg = 1; - return lua_tothread(L, 1); - } - else { - *arg = 0; - return L; /* function will operate over current thread */ - } -} - - -/* -** Variations of 'lua_settable', used by 'db_getinfo' to put results -** from 'lua_getinfo' into result table. Key is always a string; -** value can be a string, an int, or a boolean. -*/ -static void settabss (lua_State *L, const char *k, const char *v) { - lua_pushstring(L, v); - lua_setfield(L, -2, k); -} - -static void settabsi (lua_State *L, const char *k, int v) { - lua_pushinteger(L, v); - lua_setfield(L, -2, k); -} - -static void settabsb (lua_State *L, const char *k, int v) { - lua_pushboolean(L, v); - lua_setfield(L, -2, k); -} - - -/* -** In function 'db_getinfo', the call to 'lua_getinfo' may push -** results on the stack; later it creates the result table to put -** these objects. Function 'treatstackoption' puts the result from -** 'lua_getinfo' on top of the result table so that it can call -** 'lua_setfield'. -*/ -static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) { - if (L == L1) - lua_rotate(L, -2, 1); /* exchange object and table */ - else - lua_xmove(L1, L, 1); /* move object to the "main" stack */ - lua_setfield(L, -2, fname); /* put object into table */ -} - - -/* -** Calls 'lua_getinfo' and collects all results in a new table. -*/ -static int db_getinfo (lua_State *L) { - lua_Debug ar; - int arg; - lua_State *L1 = getthread(L, &arg); - const char *options = luaL_optstring(L, arg+2, "flnStu"); - if (lua_isfunction(L, arg + 1)) { /* info about a function? */ - options = lua_pushfstring(L, ">%s", options); /* add '>' to 'options' */ - lua_pushvalue(L, arg + 1); /* move function to 'L1' stack */ - lua_xmove(L, L1, 1); - } - else { /* stack level */ - if (!lua_getstack(L1, (int)luaL_checkinteger(L, arg + 1), &ar)) { - lua_pushnil(L); /* level out of range */ - return 1; - } - } - if (!lua_getinfo(L1, options, &ar)) - return luaL_argerror(L, arg+2, "invalid option"); - lua_newtable(L); /* table to collect results */ - if (strchr(options, 'S')) { - settabss(L, "source", ar.source); - settabss(L, "short_src", ar.short_src); - settabsi(L, "linedefined", ar.linedefined); - settabsi(L, "lastlinedefined", ar.lastlinedefined); - settabss(L, "what", ar.what); - } - if (strchr(options, 'l')) - settabsi(L, "currentline", ar.currentline); - if (strchr(options, 'u')) { - settabsi(L, "nups", ar.nups); - settabsi(L, "nparams", ar.nparams); - settabsb(L, "isvararg", ar.isvararg); - } - if (strchr(options, 'n')) { - settabss(L, "name", ar.name); - settabss(L, "namewhat", ar.namewhat); - } - if (strchr(options, 't')) - settabsb(L, "istailcall", ar.istailcall); - if (strchr(options, 'L')) - treatstackoption(L, L1, "activelines"); - if (strchr(options, 'f')) - treatstackoption(L, L1, "func"); - return 1; /* return table */ -} - - -static int db_getlocal (lua_State *L) { - int arg; - lua_State *L1 = getthread(L, &arg); - lua_Debug ar; - const char *name; - int nvar = (int)luaL_checkinteger(L, arg + 2); /* local-variable index */ - if (lua_isfunction(L, arg + 1)) { /* function argument? */ - lua_pushvalue(L, arg + 1); /* push function */ - lua_pushstring(L, lua_getlocal(L, NULL, nvar)); /* push local name */ - return 1; /* return only name (there is no value) */ - } - else { /* stack-level argument */ - int level = (int)luaL_checkinteger(L, arg + 1); - if (!lua_getstack(L1, level, &ar)) /* out of range? */ - return luaL_argerror(L, arg+1, "level out of range"); - name = lua_getlocal(L1, &ar, nvar); - if (name) { - lua_xmove(L1, L, 1); /* move local value */ - lua_pushstring(L, name); /* push name */ - lua_rotate(L, -2, 1); /* re-order */ - return 2; - } - else { - lua_pushnil(L); /* no name (nor value) */ - return 1; - } - } -} - - -static int db_setlocal (lua_State *L) { - int arg; - const char *name; - lua_State *L1 = getthread(L, &arg); - lua_Debug ar; - int level = (int)luaL_checkinteger(L, arg + 1); - int nvar = (int)luaL_checkinteger(L, arg + 2); - if (!lua_getstack(L1, level, &ar)) /* out of range? */ - return luaL_argerror(L, arg+1, "level out of range"); - luaL_checkany(L, arg+3); - lua_settop(L, arg+3); - lua_xmove(L, L1, 1); - name = lua_setlocal(L1, &ar, nvar); - if (name == NULL) - lua_pop(L1, 1); /* pop value (if not popped by 'lua_setlocal') */ - lua_pushstring(L, name); - return 1; -} - - -/* -** get (if 'get' is true) or set an upvalue from a closure -*/ -static int auxupvalue (lua_State *L, int get) { - const char *name; - int n = (int)luaL_checkinteger(L, 2); /* upvalue index */ - luaL_checktype(L, 1, LUA_TFUNCTION); /* closure */ - name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n); - if (name == NULL) return 0; - lua_pushstring(L, name); - lua_insert(L, -(get+1)); /* no-op if get is false */ - return get + 1; -} - - -static int db_getupvalue (lua_State *L) { - return auxupvalue(L, 1); -} - - -static int db_setupvalue (lua_State *L) { - luaL_checkany(L, 3); - return auxupvalue(L, 0); -} - - -/* -** Check whether a given upvalue from a given closure exists and -** returns its index -*/ -static int checkupval (lua_State *L, int argf, int argnup) { - int nup = (int)luaL_checkinteger(L, argnup); /* upvalue index */ - luaL_checktype(L, argf, LUA_TFUNCTION); /* closure */ - luaL_argcheck(L, (lua_getupvalue(L, argf, nup) != NULL), argnup, - "invalid upvalue index"); - return nup; -} - - -static int db_upvalueid (lua_State *L) { - int n = checkupval(L, 1, 2); - lua_pushlightuserdata(L, lua_upvalueid(L, 1, n)); - return 1; -} - - -static int db_upvaluejoin (lua_State *L) { - int n1 = checkupval(L, 1, 2); - int n2 = checkupval(L, 3, 4); - luaL_argcheck(L, !lua_iscfunction(L, 1), 1, "Lua function expected"); - luaL_argcheck(L, !lua_iscfunction(L, 3), 3, "Lua function expected"); - lua_upvaluejoin(L, 1, n1, 3, n2); - return 0; -} - - -/* -** Call hook function registered at hook table for the current -** thread (if there is one) -*/ -static void hookf (lua_State *L, lua_Debug *ar) { - static const char *const hooknames[] = - {"call", "return", "line", "count", "tail call"}; - lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY); - lua_pushthread(L); - if (lua_rawget(L, -2) == LUA_TFUNCTION) { /* is there a hook function? */ - lua_pushstring(L, hooknames[(int)ar->event]); /* push event name */ - if (ar->currentline >= 0) - lua_pushinteger(L, ar->currentline); /* push current line */ - else lua_pushnil(L); - lua_assert(lua_getinfo(L, "lS", ar)); - lua_call(L, 2, 0); /* call hook function */ - } -} - - -/* -** Convert a string mask (for 'sethook') into a bit mask -*/ -static int makemask (const char *smask, int count) { - int mask = 0; - if (strchr(smask, 'c')) mask |= LUA_MASKCALL; - if (strchr(smask, 'r')) mask |= LUA_MASKRET; - if (strchr(smask, 'l')) mask |= LUA_MASKLINE; - if (count > 0) mask |= LUA_MASKCOUNT; - return mask; -} - - -/* -** Convert a bit mask (for 'gethook') into a string mask -*/ -static char *unmakemask (int mask, char *smask) { - int i = 0; - if (mask & LUA_MASKCALL) smask[i++] = 'c'; - if (mask & LUA_MASKRET) smask[i++] = 'r'; - if (mask & LUA_MASKLINE) smask[i++] = 'l'; - smask[i] = '\0'; - return smask; -} - - -static int db_sethook (lua_State *L) { - int arg, mask, count; - lua_Hook func; - lua_State *L1 = getthread(L, &arg); - if (lua_isnoneornil(L, arg+1)) { /* no hook? */ - lua_settop(L, arg+1); - func = NULL; mask = 0; count = 0; /* turn off hooks */ - } - else { - const char *smask = luaL_checkstring(L, arg+2); - luaL_checktype(L, arg+1, LUA_TFUNCTION); - count = (int)luaL_optinteger(L, arg + 3, 0); - func = hookf; mask = makemask(smask, count); - } - if (lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY) == LUA_TNIL) { - lua_createtable(L, 0, 2); /* create a hook table */ - lua_pushvalue(L, -1); - lua_rawsetp(L, LUA_REGISTRYINDEX, &HOOKKEY); /* set it in position */ - lua_pushstring(L, "k"); - lua_setfield(L, -2, "__mode"); /** hooktable.__mode = "k" */ - lua_pushvalue(L, -1); - lua_setmetatable(L, -2); /* setmetatable(hooktable) = hooktable */ - } - lua_pushthread(L1); lua_xmove(L1, L, 1); /* key (thread) */ - lua_pushvalue(L, arg + 1); /* value (hook function) */ - lua_rawset(L, -3); /* hooktable[L1] = new Lua hook */ - lua_sethook(L1, func, mask, count); - return 0; -} - - -static int db_gethook (lua_State *L) { - int arg; - lua_State *L1 = getthread(L, &arg); - char buff[5]; - int mask = lua_gethookmask(L1); - lua_Hook hook = lua_gethook(L1); - if (hook == NULL) /* no hook? */ - lua_pushnil(L); - else if (hook != hookf) /* external hook? */ - lua_pushliteral(L, "external hook"); - else { /* hook table must exist */ - lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY); - lua_pushthread(L1); lua_xmove(L1, L, 1); - lua_rawget(L, -2); /* 1st result = hooktable[L1] */ - lua_remove(L, -2); /* remove hook table */ - } - lua_pushstring(L, unmakemask(mask, buff)); /* 2nd result = mask */ - lua_pushinteger(L, lua_gethookcount(L1)); /* 3rd result = count */ - return 3; -} - - -static int db_debug (lua_State *L) { - for (;;) { - char buffer[250]; - lua_writestringerror("%s", "lua_debug> "); - if (fgets(buffer, sizeof(buffer), stdin) == 0 || - strcmp(buffer, "cont\n") == 0) - return 0; - if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") || - lua_pcall(L, 0, 0, 0)) - lua_writestringerror("%s\n", lua_tostring(L, -1)); - lua_settop(L, 0); /* remove eventual returns */ - } -} - - -static int db_traceback (lua_State *L) { - int arg; - lua_State *L1 = getthread(L, &arg); - const char *msg = lua_tostring(L, arg + 1); - if (msg == NULL && !lua_isnoneornil(L, arg + 1)) /* non-string 'msg'? */ - lua_pushvalue(L, arg + 1); /* return it untouched */ - else { - int level = (int)luaL_optinteger(L, arg + 2, (L == L1) ? 1 : 0); - luaL_traceback(L, L1, msg, level); - } - return 1; -} - - -static const luaL_Reg dblib[] = { - {"debug", db_debug}, - {"getuservalue", db_getuservalue}, - {"gethook", db_gethook}, - {"getinfo", db_getinfo}, - {"getlocal", db_getlocal}, - {"getregistry", db_getregistry}, - {"getmetatable", db_getmetatable}, - {"getupvalue", db_getupvalue}, - {"upvaluejoin", db_upvaluejoin}, - {"upvalueid", db_upvalueid}, - {"setuservalue", db_setuservalue}, - {"sethook", db_sethook}, - {"setlocal", db_setlocal}, - {"setmetatable", db_setmetatable}, - {"setupvalue", db_setupvalue}, - {"traceback", db_traceback}, - {NULL, NULL} -}; - - -LUAMOD_API int luaopen_debug (lua_State *L) { - luaL_newlib(L, dblib); - return 1; -} - diff --git a/3rd/lua/src/ldebug.c b/3rd/lua/src/ldebug.c deleted file mode 100644 index 6986bf0..0000000 --- a/3rd/lua/src/ldebug.c +++ /dev/null @@ -1,643 +0,0 @@ -/* -** $Id: ldebug.c,v 2.110 2015/01/02 12:52:22 roberto Exp $ -** Debug Interface -** See Copyright Notice in lua.h -*/ - -#define ldebug_c -#define LUA_CORE - -#include "lprefix.h" - - -#include -#include -#include - -#include "lua.h" - -#include "lapi.h" -#include "lcode.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lvm.h" - - - -#define noLuaClosure(f) ((f) == NULL || (f)->c.tt == LUA_TCCL) - - -static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name); - - -static int currentpc (CallInfo *ci) { - lua_assert(isLua(ci)); - return pcRel(ci->u.l.savedpc, ci_func(ci)->p); -} - - -static int currentline (CallInfo *ci) { - return getfuncline(ci_func(ci)->p, currentpc(ci)); -} - - -/* -** this function can be called asynchronous (e.g. during a signal) -*/ -LUA_API void lua_sethook (lua_State *L, lua_Hook func, int mask, int count) { - if (func == NULL || mask == 0) { /* turn off hooks? */ - mask = 0; - func = NULL; - } - if (isLua(L->ci)) - L->oldpc = L->ci->u.l.savedpc; - L->hook = func; - L->basehookcount = count; - resethookcount(L); - L->hookmask = cast_byte(mask); -} - - -LUA_API lua_Hook lua_gethook (lua_State *L) { - return L->hook; -} - - -LUA_API int lua_gethookmask (lua_State *L) { - return L->hookmask; -} - - -LUA_API int lua_gethookcount (lua_State *L) { - return L->basehookcount; -} - - -LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { - int status; - CallInfo *ci; - if (level < 0) return 0; /* invalid (negative) level */ - lua_lock(L); - for (ci = L->ci; level > 0 && ci != &L->base_ci; ci = ci->previous) - level--; - if (level == 0 && ci != &L->base_ci) { /* level found? */ - status = 1; - ar->i_ci = ci; - } - else status = 0; /* no such level */ - lua_unlock(L); - return status; -} - - -static const char *upvalname (Proto *p, int uv) { - TString *s = check_exp(uv < p->sizeupvalues, p->upvalues[uv].name); - if (s == NULL) return "?"; - else return getstr(s); -} - - -static const char *findvararg (CallInfo *ci, int n, StkId *pos) { - int nparams = clLvalue(ci->func)->p->numparams; - if (n >= ci->u.l.base - ci->func - nparams) - return NULL; /* no such vararg */ - else { - *pos = ci->func + nparams + n; - return "(*vararg)"; /* generic name for any vararg */ - } -} - - -static const char *findlocal (lua_State *L, CallInfo *ci, int n, - StkId *pos) { - const char *name = NULL; - StkId base; - if (isLua(ci)) { - if (n < 0) /* access to vararg values? */ - return findvararg(ci, -n, pos); - else { - base = ci->u.l.base; - name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci)); - } - } - else - base = ci->func + 1; - if (name == NULL) { /* no 'standard' name? */ - StkId limit = (ci == L->ci) ? L->top : ci->next->func; - if (limit - base >= n && n > 0) /* is 'n' inside 'ci' stack? */ - name = "(*temporary)"; /* generic name for any valid slot */ - else - return NULL; /* no name */ - } - *pos = base + (n - 1); - return name; -} - - -LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { - const char *name; - lua_lock(L); - if (ar == NULL) { /* information about non-active function? */ - if (!isLfunction(L->top - 1)) /* not a Lua function? */ - name = NULL; - else /* consider live variables at function start (parameters) */ - name = luaF_getlocalname(clLvalue(L->top - 1)->p, n, 0); - } - else { /* active function; get information through 'ar' */ - StkId pos = 0; /* to avoid warnings */ - name = findlocal(L, ar->i_ci, n, &pos); - if (name) { - setobj2s(L, L->top, pos); - api_incr_top(L); - } - } - lua_unlock(L); - return name; -} - - -LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { - StkId pos = 0; /* to avoid warnings */ - const char *name = findlocal(L, ar->i_ci, n, &pos); - lua_lock(L); - if (name) { - setobjs2s(L, pos, L->top - 1); - L->top--; /* pop value */ - } - lua_unlock(L); - return name; -} - - -static void funcinfo (lua_Debug *ar, Closure *cl) { - if (noLuaClosure(cl)) { - ar->source = "=[C]"; - ar->linedefined = -1; - ar->lastlinedefined = -1; - ar->what = "C"; - } - else { - Proto *p = cl->l.p; - ar->source = p->source ? getstr(p->source) : "=?"; - ar->linedefined = p->linedefined; - ar->lastlinedefined = p->lastlinedefined; - ar->what = (ar->linedefined == 0) ? "main" : "Lua"; - } - luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); -} - - -static void collectvalidlines (lua_State *L, Closure *f) { - if (noLuaClosure(f)) { - setnilvalue(L->top); - api_incr_top(L); - } - else { - int i; - TValue v; - int *lineinfo = f->l.p->lineinfo; - Table *t = luaH_new(L); /* new table to store active lines */ - sethvalue(L, L->top, t); /* push it on stack */ - api_incr_top(L); - setbvalue(&v, 1); /* boolean 'true' to be the value of all indices */ - for (i = 0; i < f->l.p->sizelineinfo; i++) /* for all lines with code */ - luaH_setint(L, t, lineinfo[i], &v); /* table[line] = true */ - } -} - - -static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, - Closure *f, CallInfo *ci) { - int status = 1; - for (; *what; what++) { - switch (*what) { - case 'S': { - funcinfo(ar, f); - break; - } - case 'l': { - ar->currentline = (ci && isLua(ci)) ? currentline(ci) : -1; - break; - } - case 'u': { - ar->nups = (f == NULL) ? 0 : f->c.nupvalues; - if (noLuaClosure(f)) { - ar->isvararg = 1; - ar->nparams = 0; - } - else { - ar->isvararg = f->l.p->is_vararg; - ar->nparams = f->l.p->numparams; - } - break; - } - case 't': { - ar->istailcall = (ci) ? ci->callstatus & CIST_TAIL : 0; - break; - } - case 'n': { - /* calling function is a known Lua function? */ - if (ci && !(ci->callstatus & CIST_TAIL) && isLua(ci->previous)) - ar->namewhat = getfuncname(L, ci->previous, &ar->name); - else - ar->namewhat = NULL; - if (ar->namewhat == NULL) { - ar->namewhat = ""; /* not found */ - ar->name = NULL; - } - break; - } - case 'L': - case 'f': /* handled by lua_getinfo */ - break; - default: status = 0; /* invalid option */ - } - } - return status; -} - - -LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { - int status; - Closure *cl; - CallInfo *ci; - StkId func; - lua_lock(L); - if (*what == '>') { - ci = NULL; - func = L->top - 1; - api_check(ttisfunction(func), "function expected"); - what++; /* skip the '>' */ - L->top--; /* pop function */ - } - else { - ci = ar->i_ci; - func = ci->func; - lua_assert(ttisfunction(ci->func)); - } - cl = ttisclosure(func) ? clvalue(func) : NULL; - status = auxgetinfo(L, what, ar, cl, ci); - if (strchr(what, 'f')) { - setobjs2s(L, L->top, func); - api_incr_top(L); - } - if (strchr(what, 'L')) - collectvalidlines(L, cl); - lua_unlock(L); - return status; -} - - -/* -** {====================================================== -** Symbolic Execution -** ======================================================= -*/ - -static const char *getobjname (Proto *p, int lastpc, int reg, - const char **name); - - -/* -** find a "name" for the RK value 'c' -*/ -static void kname (Proto *p, int pc, int c, const char **name) { - if (ISK(c)) { /* is 'c' a constant? */ - TValue *kvalue = &p->k[INDEXK(c)]; - if (ttisstring(kvalue)) { /* literal constant? */ - *name = svalue(kvalue); /* it is its own name */ - return; - } - /* else no reasonable name found */ - } - else { /* 'c' is a register */ - const char *what = getobjname(p, pc, c, name); /* search for 'c' */ - if (what && *what == 'c') { /* found a constant name? */ - return; /* 'name' already filled */ - } - /* else no reasonable name found */ - } - *name = "?"; /* no reasonable name found */ -} - - -static int filterpc (int pc, int jmptarget) { - if (pc < jmptarget) /* is code conditional (inside a jump)? */ - return -1; /* cannot know who sets that register */ - else return pc; /* current position sets that register */ -} - - -/* -** try to find last instruction before 'lastpc' that modified register 'reg' -*/ -static int findsetreg (Proto *p, int lastpc, int reg) { - int pc; - int setreg = -1; /* keep last instruction that changed 'reg' */ - int jmptarget = 0; /* any code before this address is conditional */ - for (pc = 0; pc < lastpc; pc++) { - Instruction i = p->code[pc]; - OpCode op = GET_OPCODE(i); - int a = GETARG_A(i); - switch (op) { - case OP_LOADNIL: { - int b = GETARG_B(i); - if (a <= reg && reg <= a + b) /* set registers from 'a' to 'a+b' */ - setreg = filterpc(pc, jmptarget); - break; - } - case OP_TFORCALL: { - if (reg >= a + 2) /* affect all regs above its base */ - setreg = filterpc(pc, jmptarget); - break; - } - case OP_CALL: - case OP_TAILCALL: { - if (reg >= a) /* affect all registers above base */ - setreg = filterpc(pc, jmptarget); - break; - } - case OP_JMP: { - int b = GETARG_sBx(i); - int dest = pc + 1 + b; - /* jump is forward and do not skip 'lastpc'? */ - if (pc < dest && dest <= lastpc) { - if (dest > jmptarget) - jmptarget = dest; /* update 'jmptarget' */ - } - break; - } - default: - if (testAMode(op) && reg == a) /* any instruction that set A */ - setreg = filterpc(pc, jmptarget); - break; - } - } - return setreg; -} - - -static const char *getobjname (Proto *p, int lastpc, int reg, - const char **name) { - int pc; - *name = luaF_getlocalname(p, reg + 1, lastpc); - if (*name) /* is a local? */ - return "local"; - /* else try symbolic execution */ - pc = findsetreg(p, lastpc, reg); - if (pc != -1) { /* could find instruction? */ - Instruction i = p->code[pc]; - OpCode op = GET_OPCODE(i); - switch (op) { - case OP_MOVE: { - int b = GETARG_B(i); /* move from 'b' to 'a' */ - if (b < GETARG_A(i)) - return getobjname(p, pc, b, name); /* get name for 'b' */ - break; - } - case OP_GETTABUP: - case OP_GETTABLE: { - int k = GETARG_C(i); /* key index */ - int t = GETARG_B(i); /* table index */ - const char *vn = (op == OP_GETTABLE) /* name of indexed variable */ - ? luaF_getlocalname(p, t + 1, pc) - : upvalname(p, t); - kname(p, pc, k, name); - return (vn && strcmp(vn, LUA_ENV) == 0) ? "global" : "field"; - } - case OP_GETUPVAL: { - *name = upvalname(p, GETARG_B(i)); - return "upvalue"; - } - case OP_LOADK: - case OP_LOADKX: { - int b = (op == OP_LOADK) ? GETARG_Bx(i) - : GETARG_Ax(p->code[pc + 1]); - if (ttisstring(&p->k[b])) { - *name = svalue(&p->k[b]); - return "constant"; - } - break; - } - case OP_SELF: { - int k = GETARG_C(i); /* key index */ - kname(p, pc, k, name); - return "method"; - } - default: break; /* go through to return NULL */ - } - } - return NULL; /* could not find reasonable name */ -} - - -static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { - TMS tm = (TMS)0; /* to avoid warnings */ - Proto *p = ci_func(ci)->p; /* calling function */ - int pc = currentpc(ci); /* calling instruction index */ - Instruction i = p->code[pc]; /* calling instruction */ - if (ci->callstatus & CIST_HOOKED) { /* was it called inside a hook? */ - *name = "?"; - return "hook"; - } - switch (GET_OPCODE(i)) { - case OP_CALL: - case OP_TAILCALL: /* get function name */ - return getobjname(p, pc, GETARG_A(i), name); - case OP_TFORCALL: { /* for iterator */ - *name = "for iterator"; - return "for iterator"; - } - /* all other instructions can call only through metamethods */ - case OP_SELF: case OP_GETTABUP: case OP_GETTABLE: - tm = TM_INDEX; - break; - case OP_SETTABUP: case OP_SETTABLE: - tm = TM_NEWINDEX; - break; - case OP_ADD: case OP_SUB: case OP_MUL: case OP_MOD: - case OP_POW: case OP_DIV: case OP_IDIV: case OP_BAND: - case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR: { - int offset = cast_int(GET_OPCODE(i)) - cast_int(OP_ADD); /* ORDER OP */ - tm = cast(TMS, offset + cast_int(TM_ADD)); /* ORDER TM */ - break; - } - case OP_UNM: tm = TM_UNM; break; - case OP_BNOT: tm = TM_BNOT; break; - case OP_LEN: tm = TM_LEN; break; - case OP_CONCAT: tm = TM_CONCAT; break; - case OP_EQ: tm = TM_EQ; break; - case OP_LT: tm = TM_LT; break; - case OP_LE: tm = TM_LE; break; - default: lua_assert(0); /* other instructions cannot call a function */ - } - *name = getstr(G(L)->tmname[tm]); - return "metamethod"; -} - -/* }====================================================== */ - - - -/* -** The subtraction of two potentially unrelated pointers is -** not ISO C, but it should not crash a program; the subsequent -** checks are ISO C and ensure a correct result. -*/ -static int isinstack (CallInfo *ci, const TValue *o) { - ptrdiff_t i = o - ci->u.l.base; - return (0 <= i && i < (ci->top - ci->u.l.base) && ci->u.l.base + i == o); -} - - -/* -** Checks whether value 'o' came from an upvalue. (That can only happen -** with instructions OP_GETTABUP/OP_SETTABUP, which operate directly on -** upvalues.) -*/ -static const char *getupvalname (CallInfo *ci, const TValue *o, - const char **name) { - LClosure *c = ci_func(ci); - int i; - for (i = 0; i < c->nupvalues; i++) { - if (c->upvals[i]->v == o) { - *name = upvalname(c->p, i); - return "upvalue"; - } - } - return NULL; -} - - -static const char *varinfo (lua_State *L, const TValue *o) { - const char *name = NULL; /* to avoid warnings */ - CallInfo *ci = L->ci; - const char *kind = NULL; - if (isLua(ci)) { - kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */ - if (!kind && isinstack(ci, o)) /* no? try a register */ - kind = getobjname(ci_func(ci)->p, currentpc(ci), - cast_int(o - ci->u.l.base), &name); - } - return (kind) ? luaO_pushfstring(L, " (%s '%s')", kind, name) : ""; -} - - -l_noret luaG_typeerror (lua_State *L, const TValue *o, const char *op) { - const char *t = objtypename(o); - luaG_runerror(L, "attempt to %s a %s value%s", op, t, varinfo(L, o)); -} - - -l_noret luaG_concaterror (lua_State *L, const TValue *p1, const TValue *p2) { - if (ttisstring(p1) || cvt2str(p1)) p1 = p2; - luaG_typeerror(L, p1, "concatenate"); -} - - -l_noret luaG_opinterror (lua_State *L, const TValue *p1, - const TValue *p2, const char *msg) { - lua_Number temp; - if (!tonumber(p1, &temp)) /* first operand is wrong? */ - p2 = p1; /* now second is wrong */ - luaG_typeerror(L, p2, msg); -} - - -/* -** Error when both values are convertible to numbers, but not to integers -*/ -l_noret luaG_tointerror (lua_State *L, const TValue *p1, const TValue *p2) { - lua_Integer temp; - if (!tointeger(p1, &temp)) - p2 = p1; - luaG_runerror(L, "number%s has no integer representation", varinfo(L, p2)); -} - - -l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { - const char *t1 = objtypename(p1); - const char *t2 = objtypename(p2); - if (t1 == t2) - luaG_runerror(L, "attempt to compare two %s values", t1); - else - luaG_runerror(L, "attempt to compare %s with %s", t1, t2); -} - - -static void addinfo (lua_State *L, const char *msg) { - CallInfo *ci = L->ci; - if (isLua(ci)) { /* is Lua code? */ - char buff[LUA_IDSIZE]; /* add file:line information */ - int line = currentline(ci); - TString *src = ci_func(ci)->p->source; - if (src) - luaO_chunkid(buff, getstr(src), LUA_IDSIZE); - else { /* no source available; use "?" instead */ - buff[0] = '?'; buff[1] = '\0'; - } - luaO_pushfstring(L, "%s:%d: %s", buff, line, msg); - } -} - - -l_noret luaG_errormsg (lua_State *L) { - if (L->errfunc != 0) { /* is there an error handling function? */ - StkId errfunc = restorestack(L, L->errfunc); - setobjs2s(L, L->top, L->top - 1); /* move argument */ - setobjs2s(L, L->top - 1, errfunc); /* push function */ - L->top++; /* assume EXTRA_STACK */ - luaD_call(L, L->top - 2, 1, 0); /* call it */ - } - luaD_throw(L, LUA_ERRRUN); -} - - -l_noret luaG_runerror (lua_State *L, const char *fmt, ...) { - va_list argp; - va_start(argp, fmt); - addinfo(L, luaO_pushvfstring(L, fmt, argp)); - va_end(argp); - luaG_errormsg(L); -} - - -void luaG_traceexec (lua_State *L) { - CallInfo *ci = L->ci; - lu_byte mask = L->hookmask; - int counthook = ((mask & LUA_MASKCOUNT) && L->hookcount == 0); - if (counthook) - resethookcount(L); /* reset count */ - if (ci->callstatus & CIST_HOOKYIELD) { /* called hook last time? */ - ci->callstatus &= ~CIST_HOOKYIELD; /* erase mark */ - return; /* do not call hook again (VM yielded, so it did not move) */ - } - if (counthook) - luaD_hook(L, LUA_HOOKCOUNT, -1); /* call count hook */ - if (mask & LUA_MASKLINE) { - Proto *p = ci_func(ci)->p; - int npc = pcRel(ci->u.l.savedpc, p); - int newline = getfuncline(p, npc); - if (npc == 0 || /* call linehook when enter a new function, */ - ci->u.l.savedpc <= L->oldpc || /* when jump back (loop), or when */ - newline != getfuncline(p, pcRel(L->oldpc, p))) /* enter a new line */ - luaD_hook(L, LUA_HOOKLINE, newline); /* call line hook */ - } - L->oldpc = ci->u.l.savedpc; - if (L->status == LUA_YIELD) { /* did hook yield? */ - if (counthook) - L->hookcount = 1; /* undo decrement to zero */ - ci->u.l.savedpc--; /* undo increment (resume will increment it again) */ - ci->callstatus |= CIST_HOOKYIELD; /* mark that it yielded */ - ci->func = L->top - 1; /* protect stack below results */ - luaD_throw(L, LUA_YIELD); - } -} - diff --git a/3rd/lua/src/ldebug.h b/3rd/lua/src/ldebug.h deleted file mode 100644 index 0d8966c..0000000 --- a/3rd/lua/src/ldebug.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -** $Id: ldebug.h,v 2.12 2014/11/10 14:46:05 roberto Exp $ -** Auxiliary functions from Debug Interface module -** See Copyright Notice in lua.h -*/ - -#ifndef ldebug_h -#define ldebug_h - - -#include "lstate.h" - - -#define pcRel(pc, p) (cast(int, (pc) - (p)->code) - 1) - -#define getfuncline(f,pc) (((f)->lineinfo) ? (f)->lineinfo[pc] : -1) - -#define resethookcount(L) (L->hookcount = L->basehookcount) - -/* Active Lua function (given call info) */ -#define ci_func(ci) (clLvalue((ci)->func)) - - -LUAI_FUNC l_noret luaG_typeerror (lua_State *L, const TValue *o, - const char *opname); -LUAI_FUNC l_noret luaG_concaterror (lua_State *L, const TValue *p1, - const TValue *p2); -LUAI_FUNC l_noret luaG_opinterror (lua_State *L, const TValue *p1, - const TValue *p2, - const char *msg); -LUAI_FUNC l_noret luaG_tointerror (lua_State *L, const TValue *p1, - const TValue *p2); -LUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1, - const TValue *p2); -LUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...); -LUAI_FUNC l_noret luaG_errormsg (lua_State *L); -LUAI_FUNC void luaG_traceexec (lua_State *L); - - -#endif diff --git a/3rd/lua/src/ldo.c b/3rd/lua/src/ldo.c deleted file mode 100644 index 6159e51..0000000 --- a/3rd/lua/src/ldo.c +++ /dev/null @@ -1,717 +0,0 @@ -/* -** $Id: ldo.c,v 2.135 2014/11/11 17:13:39 roberto Exp $ -** Stack and Call structure of Lua -** See Copyright Notice in lua.h -*/ - -#define ldo_c -#define LUA_CORE - -#include "lprefix.h" - - -#include -#include -#include - -#include "lua.h" - -#include "lapi.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lundump.h" -#include "lvm.h" -#include "lzio.h" - - - -#define errorstatus(s) ((s) > LUA_YIELD) - - -/* -** {====================================================== -** Error-recovery functions -** ======================================================= -*/ - -/* -** LUAI_THROW/LUAI_TRY define how Lua does exception handling. By -** default, Lua handles errors with exceptions when compiling as -** C++ code, with _longjmp/_setjmp when asked to use them, and with -** longjmp/setjmp otherwise. -*/ -#if !defined(LUAI_THROW) /* { */ - -#if defined(__cplusplus) && !defined(LUA_USE_LONGJMP) /* { */ - -/* C++ exceptions */ -#define LUAI_THROW(L,c) throw(c) -#define LUAI_TRY(L,c,a) \ - try { a } catch(...) { if ((c)->status == 0) (c)->status = -1; } -#define luai_jmpbuf int /* dummy variable */ - -#elif defined(LUA_USE_POSIX) /* }{ */ - -/* in POSIX, try _longjmp/_setjmp (more efficient) */ -#define LUAI_THROW(L,c) _longjmp((c)->b, 1) -#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a } -#define luai_jmpbuf jmp_buf - -#else /* }{ */ - -/* ISO C handling with long jumps */ -#define LUAI_THROW(L,c) longjmp((c)->b, 1) -#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } -#define luai_jmpbuf jmp_buf - -#endif /* } */ - -#endif /* } */ - - - -/* chain list of long jump buffers */ -struct lua_longjmp { - struct lua_longjmp *previous; - luai_jmpbuf b; - volatile int status; /* error code */ -}; - - -static void seterrorobj (lua_State *L, int errcode, StkId oldtop) { - switch (errcode) { - case LUA_ERRMEM: { /* memory error? */ - setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */ - break; - } - case LUA_ERRERR: { - setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling")); - break; - } - default: { - setobjs2s(L, oldtop, L->top - 1); /* error message on current top */ - break; - } - } - L->top = oldtop + 1; -} - - -l_noret luaD_throw (lua_State *L, int errcode) { - if (L->errorJmp) { /* thread has an error handler? */ - L->errorJmp->status = errcode; /* set status */ - LUAI_THROW(L, L->errorJmp); /* jump to it */ - } - else { /* thread has no error handler */ - global_State *g = G(L); - L->status = cast_byte(errcode); /* mark it as dead */ - if (g->mainthread->errorJmp) { /* main thread has a handler? */ - setobjs2s(L, g->mainthread->top++, L->top - 1); /* copy error obj. */ - luaD_throw(g->mainthread, errcode); /* re-throw in main thread */ - } - else { /* no handler at all; abort */ - if (g->panic) { /* panic function? */ - seterrorobj(L, errcode, L->top); /* assume EXTRA_STACK */ - if (L->ci->top < L->top) - L->ci->top = L->top; /* pushing msg. can break this invariant */ - lua_unlock(L); - g->panic(L); /* call panic function (last chance to jump out) */ - } - abort(); - } - } -} - - -int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { - unsigned short oldnCcalls = L->nCcalls; - struct lua_longjmp lj; - lj.status = LUA_OK; - lj.previous = L->errorJmp; /* chain new error handler */ - L->errorJmp = &lj; - LUAI_TRY(L, &lj, - (*f)(L, ud); - ); - L->errorJmp = lj.previous; /* restore old error handler */ - L->nCcalls = oldnCcalls; - return lj.status; -} - -/* }====================================================== */ - - -static void correctstack (lua_State *L, TValue *oldstack) { - CallInfo *ci; - UpVal *up; - L->top = (L->top - oldstack) + L->stack; - for (up = L->openupval; up != NULL; up = up->u.open.next) - up->v = (up->v - oldstack) + L->stack; - for (ci = L->ci; ci != NULL; ci = ci->previous) { - ci->top = (ci->top - oldstack) + L->stack; - ci->func = (ci->func - oldstack) + L->stack; - if (isLua(ci)) - ci->u.l.base = (ci->u.l.base - oldstack) + L->stack; - } -} - - -/* some space for error handling */ -#define ERRORSTACKSIZE (LUAI_MAXSTACK + 200) - - -void luaD_reallocstack (lua_State *L, int newsize) { - TValue *oldstack = L->stack; - int lim = L->stacksize; - lua_assert(newsize <= LUAI_MAXSTACK || newsize == ERRORSTACKSIZE); - lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK); - luaM_reallocvector(L, L->stack, L->stacksize, newsize, TValue); - for (; lim < newsize; lim++) - setnilvalue(L->stack + lim); /* erase new segment */ - L->stacksize = newsize; - L->stack_last = L->stack + newsize - EXTRA_STACK; - correctstack(L, oldstack); -} - - -void luaD_growstack (lua_State *L, int n) { - int size = L->stacksize; - if (size > LUAI_MAXSTACK) /* error after extra size? */ - luaD_throw(L, LUA_ERRERR); - else { - int needed = cast_int(L->top - L->stack) + n + EXTRA_STACK; - int newsize = 2 * size; - if (newsize > LUAI_MAXSTACK) newsize = LUAI_MAXSTACK; - if (newsize < needed) newsize = needed; - if (newsize > LUAI_MAXSTACK) { /* stack overflow? */ - luaD_reallocstack(L, ERRORSTACKSIZE); - luaG_runerror(L, "stack overflow"); - } - else - luaD_reallocstack(L, newsize); - } -} - - -static int stackinuse (lua_State *L) { - CallInfo *ci; - StkId lim = L->top; - for (ci = L->ci; ci != NULL; ci = ci->previous) { - lua_assert(ci->top <= L->stack_last); - if (lim < ci->top) lim = ci->top; - } - return cast_int(lim - L->stack) + 1; /* part of stack in use */ -} - - -void luaD_shrinkstack (lua_State *L) { - int inuse = stackinuse(L); - int goodsize = inuse + (inuse / 8) + 2*EXTRA_STACK; - if (goodsize > LUAI_MAXSTACK) goodsize = LUAI_MAXSTACK; - if (L->stacksize > LUAI_MAXSTACK) /* was handling stack overflow? */ - luaE_freeCI(L); /* free all CIs (list grew because of an error) */ - else - luaE_shrinkCI(L); /* shrink list */ - if (inuse > LUAI_MAXSTACK || /* still handling stack overflow? */ - goodsize >= L->stacksize) /* would grow instead of shrink? */ - condmovestack(L); /* don't change stack (change only for debugging) */ - else - luaD_reallocstack(L, goodsize); /* shrink it */ -} - - -void luaD_hook (lua_State *L, int event, int line) { - lua_Hook hook = L->hook; - if (hook && L->allowhook) { - CallInfo *ci = L->ci; - ptrdiff_t top = savestack(L, L->top); - ptrdiff_t ci_top = savestack(L, ci->top); - lua_Debug ar; - ar.event = event; - ar.currentline = line; - ar.i_ci = ci; - luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ - ci->top = L->top + LUA_MINSTACK; - lua_assert(ci->top <= L->stack_last); - L->allowhook = 0; /* cannot call hooks inside a hook */ - ci->callstatus |= CIST_HOOKED; - lua_unlock(L); - (*hook)(L, &ar); - lua_lock(L); - lua_assert(!L->allowhook); - L->allowhook = 1; - ci->top = restorestack(L, ci_top); - L->top = restorestack(L, top); - ci->callstatus &= ~CIST_HOOKED; - } -} - - -static void callhook (lua_State *L, CallInfo *ci) { - int hook = LUA_HOOKCALL; - ci->u.l.savedpc++; /* hooks assume 'pc' is already incremented */ - if (isLua(ci->previous) && - GET_OPCODE(*(ci->previous->u.l.savedpc - 1)) == OP_TAILCALL) { - ci->callstatus |= CIST_TAIL; - hook = LUA_HOOKTAILCALL; - } - luaD_hook(L, hook, -1); - ci->u.l.savedpc--; /* correct 'pc' */ -} - - -static StkId adjust_varargs (lua_State *L, Proto *p, int actual) { - int i; - int nfixargs = p->numparams; - StkId base, fixed; - lua_assert(actual >= nfixargs); - /* move fixed parameters to final position */ - luaD_checkstack(L, p->maxstacksize); /* check again for new 'base' */ - fixed = L->top - actual; /* first fixed argument */ - base = L->top; /* final position of first argument */ - for (i=0; itop++, fixed + i); - setnilvalue(fixed + i); - } - return base; -} - - -/* -** Check whether __call metafield of 'func' is a function. If so, put -** it in stack below original 'func' so that 'luaD_precall' can call -** it. Raise an error if __call metafield is not a function. -*/ -static void tryfuncTM (lua_State *L, StkId func) { - const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL); - StkId p; - if (!ttisfunction(tm)) - luaG_typeerror(L, func, "call"); - /* Open a hole inside the stack at 'func' */ - for (p = L->top; p > func; p--) - setobjs2s(L, p, p-1); - L->top++; /* slot ensured by caller */ - setobj2s(L, func, tm); /* tag method is the new function to be called */ -} - - - -#define next_ci(L) (L->ci = (L->ci->next ? L->ci->next : luaE_extendCI(L))) - - -/* -** returns true if function has been executed (C function) -*/ -int luaD_precall (lua_State *L, StkId func, int nresults) { - lua_CFunction f; - CallInfo *ci; - int n; /* number of arguments (Lua) or returns (C) */ - ptrdiff_t funcr = savestack(L, func); - switch (ttype(func)) { - case LUA_TLCF: /* light C function */ - f = fvalue(func); - goto Cfunc; - case LUA_TCCL: { /* C closure */ - f = clCvalue(func)->f; - Cfunc: - luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ - ci = next_ci(L); /* now 'enter' new function */ - ci->nresults = nresults; - ci->func = restorestack(L, funcr); - ci->top = L->top + LUA_MINSTACK; - lua_assert(ci->top <= L->stack_last); - ci->callstatus = 0; - luaC_checkGC(L); /* stack grow uses memory */ - if (L->hookmask & LUA_MASKCALL) - luaD_hook(L, LUA_HOOKCALL, -1); - lua_unlock(L); - n = (*f)(L); /* do the actual call */ - lua_lock(L); - api_checknelems(L, n); - luaD_poscall(L, L->top - n); - return 1; - } - case LUA_TLCL: { /* Lua function: prepare its call */ - StkId base; - Proto *p = clLvalue(func)->p; - n = cast_int(L->top - func) - 1; /* number of real arguments */ - luaD_checkstack(L, p->maxstacksize); - for (; n < p->numparams; n++) - setnilvalue(L->top++); /* complete missing arguments */ - if (!p->is_vararg) { - func = restorestack(L, funcr); - base = func + 1; - } - else { - base = adjust_varargs(L, p, n); - func = restorestack(L, funcr); /* previous call can change stack */ - } - ci = next_ci(L); /* now 'enter' new function */ - ci->nresults = nresults; - ci->func = func; - ci->u.l.base = base; - ci->top = base + p->maxstacksize; - lua_assert(ci->top <= L->stack_last); - ci->u.l.savedpc = p->code; /* starting point */ - ci->callstatus = CIST_LUA; - L->top = ci->top; - luaC_checkGC(L); /* stack grow uses memory */ - if (L->hookmask & LUA_MASKCALL) - callhook(L, ci); - return 0; - } - default: { /* not a function */ - luaD_checkstack(L, 1); /* ensure space for metamethod */ - func = restorestack(L, funcr); /* previous call may change stack */ - tryfuncTM(L, func); /* try to get '__call' metamethod */ - return luaD_precall(L, func, nresults); /* now it must be a function */ - } - } -} - - -int luaD_poscall (lua_State *L, StkId firstResult) { - StkId res; - int wanted, i; - CallInfo *ci = L->ci; - if (L->hookmask & (LUA_MASKRET | LUA_MASKLINE)) { - if (L->hookmask & LUA_MASKRET) { - ptrdiff_t fr = savestack(L, firstResult); /* hook may change stack */ - luaD_hook(L, LUA_HOOKRET, -1); - firstResult = restorestack(L, fr); - } - L->oldpc = ci->previous->u.l.savedpc; /* 'oldpc' for caller function */ - } - res = ci->func; /* res == final position of 1st result */ - wanted = ci->nresults; - L->ci = ci = ci->previous; /* back to caller */ - /* move results to correct place */ - for (i = wanted; i != 0 && firstResult < L->top; i--) - setobjs2s(L, res++, firstResult++); - while (i-- > 0) - setnilvalue(res++); - L->top = res; - return (wanted - LUA_MULTRET); /* 0 iff wanted == LUA_MULTRET */ -} - - -/* -** Call a function (C or Lua). The function to be called is at *func. -** The arguments are on the stack, right after the function. -** When returns, all the results are on the stack, starting at the original -** function position. -*/ -void luaD_call (lua_State *L, StkId func, int nResults, int allowyield) { - if (++L->nCcalls >= LUAI_MAXCCALLS) { - if (L->nCcalls == LUAI_MAXCCALLS) - luaG_runerror(L, "C stack overflow"); - else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3))) - luaD_throw(L, LUA_ERRERR); /* error while handing stack error */ - } - if (!allowyield) L->nny++; - if (!luaD_precall(L, func, nResults)) /* is a Lua function? */ - luaV_execute(L); /* call it */ - if (!allowyield) L->nny--; - L->nCcalls--; -} - - -/* -** Completes the execution of an interrupted C function, calling its -** continuation function. -*/ -static void finishCcall (lua_State *L, int status) { - CallInfo *ci = L->ci; - int n; - /* must have a continuation and must be able to call it */ - lua_assert(ci->u.c.k != NULL && L->nny == 0); - /* error status can only happen in a protected call */ - lua_assert((ci->callstatus & CIST_YPCALL) || status == LUA_YIELD); - if (ci->callstatus & CIST_YPCALL) { /* was inside a pcall? */ - ci->callstatus &= ~CIST_YPCALL; /* finish 'lua_pcall' */ - L->errfunc = ci->u.c.old_errfunc; - } - /* finish 'lua_callk'/'lua_pcall'; CIST_YPCALL and 'errfunc' already - handled */ - adjustresults(L, ci->nresults); - /* call continuation function */ - lua_unlock(L); - n = (*ci->u.c.k)(L, status, ci->u.c.ctx); - lua_lock(L); - api_checknelems(L, n); - /* finish 'luaD_precall' */ - luaD_poscall(L, L->top - n); -} - - -/* -** Executes "full continuation" (everything in the stack) of a -** previously interrupted coroutine until the stack is empty (or another -** interruption long-jumps out of the loop). If the coroutine is -** recovering from an error, 'ud' points to the error status, which must -** be passed to the first continuation function (otherwise the default -** status is LUA_YIELD). -*/ -static void unroll (lua_State *L, void *ud) { - if (ud != NULL) /* error status? */ - finishCcall(L, *(int *)ud); /* finish 'lua_pcallk' callee */ - while (L->ci != &L->base_ci) { /* something in the stack */ - if (!isLua(L->ci)) /* C function? */ - finishCcall(L, LUA_YIELD); /* complete its execution */ - else { /* Lua function */ - luaV_finishOp(L); /* finish interrupted instruction */ - luaV_execute(L); /* execute down to higher C 'boundary' */ - } - } -} - - -/* -** Try to find a suspended protected call (a "recover point") for the -** given thread. -*/ -static CallInfo *findpcall (lua_State *L) { - CallInfo *ci; - for (ci = L->ci; ci != NULL; ci = ci->previous) { /* search for a pcall */ - if (ci->callstatus & CIST_YPCALL) - return ci; - } - return NULL; /* no pending pcall */ -} - - -/* -** Recovers from an error in a coroutine. Finds a recover point (if -** there is one) and completes the execution of the interrupted -** 'luaD_pcall'. If there is no recover point, returns zero. -*/ -static int recover (lua_State *L, int status) { - StkId oldtop; - CallInfo *ci = findpcall(L); - if (ci == NULL) return 0; /* no recovery point */ - /* "finish" luaD_pcall */ - oldtop = restorestack(L, ci->extra); - luaF_close(L, oldtop); - seterrorobj(L, status, oldtop); - L->ci = ci; - L->allowhook = getoah(ci->callstatus); /* restore original 'allowhook' */ - L->nny = 0; /* should be zero to be yieldable */ - luaD_shrinkstack(L); - L->errfunc = ci->u.c.old_errfunc; - return 1; /* continue running the coroutine */ -} - - -/* -** signal an error in the call to 'resume', not in the execution of the -** coroutine itself. (Such errors should not be handled by any coroutine -** error handler and should not kill the coroutine.) -*/ -static l_noret resume_error (lua_State *L, const char *msg, StkId firstArg) { - L->top = firstArg; /* remove args from the stack */ - setsvalue2s(L, L->top, luaS_new(L, msg)); /* push error message */ - api_incr_top(L); - luaD_throw(L, -1); /* jump back to 'lua_resume' */ -} - - -/* -** Do the work for 'lua_resume' in protected mode. Most of the work -** depends on the status of the coroutine: initial state, suspended -** inside a hook, or regularly suspended (optionally with a continuation -** function), plus erroneous cases: non-suspended coroutine or dead -** coroutine. -*/ -static void resume (lua_State *L, void *ud) { - int nCcalls = L->nCcalls; - StkId firstArg = cast(StkId, ud); - CallInfo *ci = L->ci; - if (nCcalls >= LUAI_MAXCCALLS) - resume_error(L, "C stack overflow", firstArg); - if (L->status == LUA_OK) { /* may be starting a coroutine */ - if (ci != &L->base_ci) /* not in base level? */ - resume_error(L, "cannot resume non-suspended coroutine", firstArg); - /* coroutine is in base level; start running it */ - if (!luaD_precall(L, firstArg - 1, LUA_MULTRET)) /* Lua function? */ - luaV_execute(L); /* call it */ - } - else if (L->status != LUA_YIELD) - resume_error(L, "cannot resume dead coroutine", firstArg); - else { /* resuming from previous yield */ - L->status = LUA_OK; /* mark that it is running (again) */ - ci->func = restorestack(L, ci->extra); - if (isLua(ci)) /* yielded inside a hook? */ - luaV_execute(L); /* just continue running Lua code */ - else { /* 'common' yield */ - if (ci->u.c.k != NULL) { /* does it have a continuation function? */ - int n; - lua_unlock(L); - n = (*ci->u.c.k)(L, LUA_YIELD, ci->u.c.ctx); /* call continuation */ - lua_lock(L); - api_checknelems(L, n); - firstArg = L->top - n; /* yield results come from continuation */ - } - luaD_poscall(L, firstArg); /* finish 'luaD_precall' */ - } - unroll(L, NULL); /* run continuation */ - } - lua_assert(nCcalls == L->nCcalls); -} - - -LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs) { - int status; - int oldnny = L->nny; /* save "number of non-yieldable" calls */ - lua_lock(L); - luai_userstateresume(L, nargs); - L->nCcalls = (from) ? from->nCcalls + 1 : 1; - L->nny = 0; /* allow yields */ - api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs); - status = luaD_rawrunprotected(L, resume, L->top - nargs); - if (status == -1) /* error calling 'lua_resume'? */ - status = LUA_ERRRUN; - else { /* continue running after recoverable errors */ - while (errorstatus(status) && recover(L, status)) { - /* unroll continuation */ - status = luaD_rawrunprotected(L, unroll, &status); - } - if (errorstatus(status)) { /* unrecoverable error? */ - L->status = cast_byte(status); /* mark thread as 'dead' */ - seterrorobj(L, status, L->top); /* push error message */ - L->ci->top = L->top; - } - else lua_assert(status == L->status); /* normal end or yield */ - } - L->nny = oldnny; /* restore 'nny' */ - L->nCcalls--; - lua_assert(L->nCcalls == ((from) ? from->nCcalls : 0)); - lua_unlock(L); - return status; -} - - -LUA_API int lua_isyieldable (lua_State *L) { - return (L->nny == 0); -} - - -LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx, - lua_KFunction k) { - CallInfo *ci = L->ci; - luai_userstateyield(L, nresults); - lua_lock(L); - api_checknelems(L, nresults); - if (L->nny > 0) { - if (L != G(L)->mainthread) - luaG_runerror(L, "attempt to yield across a C-call boundary"); - else - luaG_runerror(L, "attempt to yield from outside a coroutine"); - } - L->status = LUA_YIELD; - ci->extra = savestack(L, ci->func); /* save current 'func' */ - if (isLua(ci)) { /* inside a hook? */ - api_check(k == NULL, "hooks cannot continue after yielding"); - } - else { - if ((ci->u.c.k = k) != NULL) /* is there a continuation? */ - ci->u.c.ctx = ctx; /* save context */ - ci->func = L->top - nresults - 1; /* protect stack below results */ - luaD_throw(L, LUA_YIELD); - } - lua_assert(ci->callstatus & CIST_HOOKED); /* must be inside a hook */ - lua_unlock(L); - return 0; /* return to 'luaD_hook' */ -} - - -int luaD_pcall (lua_State *L, Pfunc func, void *u, - ptrdiff_t old_top, ptrdiff_t ef) { - int status; - CallInfo *old_ci = L->ci; - lu_byte old_allowhooks = L->allowhook; - unsigned short old_nny = L->nny; - ptrdiff_t old_errfunc = L->errfunc; - L->errfunc = ef; - status = luaD_rawrunprotected(L, func, u); - if (status != LUA_OK) { /* an error occurred? */ - StkId oldtop = restorestack(L, old_top); - luaF_close(L, oldtop); /* close possible pending closures */ - seterrorobj(L, status, oldtop); - L->ci = old_ci; - L->allowhook = old_allowhooks; - L->nny = old_nny; - luaD_shrinkstack(L); - } - L->errfunc = old_errfunc; - return status; -} - - - -/* -** Execute a protected parser. -*/ -struct SParser { /* data to 'f_parser' */ - ZIO *z; - Mbuffer buff; /* dynamic structure used by the scanner */ - Dyndata dyd; /* dynamic structures used by the parser */ - const char *mode; - const char *name; -}; - - -static void checkmode (lua_State *L, const char *mode, const char *x) { - if (mode && strchr(mode, x[0]) == NULL) { - luaO_pushfstring(L, - "attempt to load a %s chunk (mode is '%s')", x, mode); - luaD_throw(L, LUA_ERRSYNTAX); - } -} - - -static void f_parser (lua_State *L, void *ud) { - LClosure *cl; - struct SParser *p = cast(struct SParser *, ud); - int c = zgetc(p->z); /* read first character */ - if (c == LUA_SIGNATURE[0]) { - checkmode(L, p->mode, "binary"); - cl = luaU_undump(L, p->z, &p->buff, p->name); - } - else { - checkmode(L, p->mode, "text"); - cl = luaY_parser(L, p->z, &p->buff, &p->dyd, p->name, c); - } - lua_assert(cl->nupvalues == cl->p->sizeupvalues); - luaF_initupvals(L, cl); -} - - -int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, - const char *mode) { - struct SParser p; - int status; - L->nny++; /* cannot yield during parsing */ - p.z = z; p.name = name; p.mode = mode; - p.dyd.actvar.arr = NULL; p.dyd.actvar.size = 0; - p.dyd.gt.arr = NULL; p.dyd.gt.size = 0; - p.dyd.label.arr = NULL; p.dyd.label.size = 0; - luaZ_initbuffer(L, &p.buff); - status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc); - luaZ_freebuffer(L, &p.buff); - luaM_freearray(L, p.dyd.actvar.arr, p.dyd.actvar.size); - luaM_freearray(L, p.dyd.gt.arr, p.dyd.gt.size); - luaM_freearray(L, p.dyd.label.arr, p.dyd.label.size); - L->nny--; - return status; -} - - diff --git a/3rd/lua/src/ldo.h b/3rd/lua/src/ldo.h deleted file mode 100644 index 05745c8..0000000 --- a/3rd/lua/src/ldo.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -** $Id: ldo.h,v 2.21 2014/10/25 11:50:46 roberto Exp $ -** Stack and Call structure of Lua -** See Copyright Notice in lua.h -*/ - -#ifndef ldo_h -#define ldo_h - - -#include "lobject.h" -#include "lstate.h" -#include "lzio.h" - - -#define luaD_checkstack(L,n) if (L->stack_last - L->top <= (n)) \ - luaD_growstack(L, n); else condmovestack(L); - - -#define incr_top(L) {L->top++; luaD_checkstack(L,0);} - -#define savestack(L,p) ((char *)(p) - (char *)L->stack) -#define restorestack(L,n) ((TValue *)((char *)L->stack + (n))) - - -/* type of protected functions, to be ran by 'runprotected' */ -typedef void (*Pfunc) (lua_State *L, void *ud); - -LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, - const char *mode); -LUAI_FUNC void luaD_hook (lua_State *L, int event, int line); -LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults); -LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults, - int allowyield); -LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, - ptrdiff_t oldtop, ptrdiff_t ef); -LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult); -LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize); -LUAI_FUNC void luaD_growstack (lua_State *L, int n); -LUAI_FUNC void luaD_shrinkstack (lua_State *L); - -LUAI_FUNC l_noret luaD_throw (lua_State *L, int errcode); -LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); - -#endif - diff --git a/3rd/lua/src/ldump.c b/3rd/lua/src/ldump.c deleted file mode 100644 index b6c7114..0000000 --- a/3rd/lua/src/ldump.c +++ /dev/null @@ -1,214 +0,0 @@ -/* -** $Id: ldump.c,v 2.34 2014/11/02 19:19:04 roberto Exp $ -** save precompiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#define ldump_c -#define LUA_CORE - -#include "lprefix.h" - - -#include - -#include "lua.h" - -#include "lobject.h" -#include "lstate.h" -#include "lundump.h" - - -typedef struct { - lua_State *L; - lua_Writer writer; - void *data; - int strip; - int status; -} DumpState; - - -/* -** All high-level dumps go through DumpVector; you can change it to -** change the endianness of the result -*/ -#define DumpVector(v,n,D) DumpBlock(v,(n)*sizeof((v)[0]),D) - -#define DumpLiteral(s,D) DumpBlock(s, sizeof(s) - sizeof(char), D) - - -static void DumpBlock (const void *b, size_t size, DumpState *D) { - if (D->status == 0) { - lua_unlock(D->L); - D->status = (*D->writer)(D->L, b, size, D->data); - lua_lock(D->L); - } -} - - -#define DumpVar(x,D) DumpVector(&x,1,D) - - -static void DumpByte (int y, DumpState *D) { - lu_byte x = (lu_byte)y; - DumpVar(x, D); -} - - -static void DumpInt (int x, DumpState *D) { - DumpVar(x, D); -} - - -static void DumpNumber (lua_Number x, DumpState *D) { - DumpVar(x, D); -} - - -static void DumpInteger (lua_Integer x, DumpState *D) { - DumpVar(x, D); -} - - -static void DumpString (const TString *s, DumpState *D) { - if (s == NULL) - DumpByte(0, D); - else { - size_t size = s->len + 1; /* include trailing '\0' */ - if (size < 0xFF) - DumpByte(cast_int(size), D); - else { - DumpByte(0xFF, D); - DumpVar(size, D); - } - DumpVector(getstr(s), size - 1, D); /* no need to save '\0' */ - } -} - - -static void DumpCode (const Proto *f, DumpState *D) { - DumpInt(f->sizecode, D); - DumpVector(f->code, f->sizecode, D); -} - - -static void DumpFunction(const Proto *f, TString *psource, DumpState *D); - -static void DumpConstants (const Proto *f, DumpState *D) { - int i; - int n = f->sizek; - DumpInt(n, D); - for (i = 0; i < n; i++) { - const TValue *o = &f->k[i]; - DumpByte(ttype(o), D); - switch (ttype(o)) { - case LUA_TNIL: - break; - case LUA_TBOOLEAN: - DumpByte(bvalue(o), D); - break; - case LUA_TNUMFLT: - DumpNumber(fltvalue(o), D); - break; - case LUA_TNUMINT: - DumpInteger(ivalue(o), D); - break; - case LUA_TSHRSTR: - case LUA_TLNGSTR: - DumpString(tsvalue(o), D); - break; - default: - lua_assert(0); - } - } -} - - -static void DumpProtos (const Proto *f, DumpState *D) { - int i; - int n = f->sizep; - DumpInt(n, D); - for (i = 0; i < n; i++) - DumpFunction(f->p[i], f->source, D); -} - - -static void DumpUpvalues (const Proto *f, DumpState *D) { - int i, n = f->sizeupvalues; - DumpInt(n, D); - for (i = 0; i < n; i++) { - DumpByte(f->upvalues[i].instack, D); - DumpByte(f->upvalues[i].idx, D); - } -} - - -static void DumpDebug (const Proto *f, DumpState *D) { - int i, n; - n = (D->strip) ? 0 : f->sizelineinfo; - DumpInt(n, D); - DumpVector(f->lineinfo, n, D); - n = (D->strip) ? 0 : f->sizelocvars; - DumpInt(n, D); - for (i = 0; i < n; i++) { - DumpString(f->locvars[i].varname, D); - DumpInt(f->locvars[i].startpc, D); - DumpInt(f->locvars[i].endpc, D); - } - n = (D->strip) ? 0 : f->sizeupvalues; - DumpInt(n, D); - for (i = 0; i < n; i++) - DumpString(f->upvalues[i].name, D); -} - - -static void DumpFunction (const Proto *f, TString *psource, DumpState *D) { - if (D->strip || f->source == psource) - DumpString(NULL, D); /* no debug info or same source as its parent */ - else - DumpString(f->source, D); - DumpInt(f->linedefined, D); - DumpInt(f->lastlinedefined, D); - DumpByte(f->numparams, D); - DumpByte(f->is_vararg, D); - DumpByte(f->maxstacksize, D); - DumpCode(f, D); - DumpConstants(f, D); - DumpUpvalues(f, D); - DumpProtos(f, D); - DumpDebug(f, D); -} - - -static void DumpHeader (DumpState *D) { - DumpLiteral(LUA_SIGNATURE, D); - DumpByte(LUAC_VERSION, D); - DumpByte(LUAC_FORMAT, D); - DumpLiteral(LUAC_DATA, D); - DumpByte(sizeof(int), D); - DumpByte(sizeof(size_t), D); - DumpByte(sizeof(Instruction), D); - DumpByte(sizeof(lua_Integer), D); - DumpByte(sizeof(lua_Number), D); - DumpInteger(LUAC_INT, D); - DumpNumber(LUAC_NUM, D); -} - - -/* -** dump Lua function as precompiled chunk -*/ -int luaU_dump(lua_State *L, const Proto *f, lua_Writer w, void *data, - int strip) { - DumpState D; - D.L = L; - D.writer = w; - D.data = data; - D.strip = strip; - D.status = 0; - DumpHeader(&D); - DumpByte(f->sizeupvalues, &D); - DumpFunction(f, NULL, &D); - return D.status; -} - diff --git a/3rd/lua/src/lfunc.c b/3rd/lua/src/lfunc.c deleted file mode 100644 index 67967da..0000000 --- a/3rd/lua/src/lfunc.c +++ /dev/null @@ -1,151 +0,0 @@ -/* -** $Id: lfunc.c,v 2.45 2014/11/02 19:19:04 roberto Exp $ -** Auxiliary functions to manipulate prototypes and closures -** See Copyright Notice in lua.h -*/ - -#define lfunc_c -#define LUA_CORE - -#include "lprefix.h" - - -#include - -#include "lua.h" - -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" - - - -CClosure *luaF_newCclosure (lua_State *L, int n) { - GCObject *o = luaC_newobj(L, LUA_TCCL, sizeCclosure(n)); - CClosure *c = gco2ccl(o); - c->nupvalues = cast_byte(n); - return c; -} - - -LClosure *luaF_newLclosure (lua_State *L, int n) { - GCObject *o = luaC_newobj(L, LUA_TLCL, sizeLclosure(n)); - LClosure *c = gco2lcl(o); - c->p = NULL; - c->nupvalues = cast_byte(n); - while (n--) c->upvals[n] = NULL; - return c; -} - -/* -** fill a closure with new closed upvalues -*/ -void luaF_initupvals (lua_State *L, LClosure *cl) { - int i; - for (i = 0; i < cl->nupvalues; i++) { - UpVal *uv = luaM_new(L, UpVal); - uv->refcount = 1; - uv->v = &uv->u.value; /* make it closed */ - setnilvalue(uv->v); - cl->upvals[i] = uv; - } -} - - -UpVal *luaF_findupval (lua_State *L, StkId level) { - UpVal **pp = &L->openupval; - UpVal *p; - UpVal *uv; - lua_assert(isintwups(L) || L->openupval == NULL); - while (*pp != NULL && (p = *pp)->v >= level) { - lua_assert(upisopen(p)); - if (p->v == level) /* found a corresponding upvalue? */ - return p; /* return it */ - pp = &p->u.open.next; - } - /* not found: create a new upvalue */ - uv = luaM_new(L, UpVal); - uv->refcount = 0; - uv->u.open.next = *pp; /* link it to list of open upvalues */ - uv->u.open.touched = 1; - *pp = uv; - uv->v = level; /* current value lives in the stack */ - if (!isintwups(L)) { /* thread not in list of threads with upvalues? */ - L->twups = G(L)->twups; /* link it to the list */ - G(L)->twups = L; - } - return uv; -} - - -void luaF_close (lua_State *L, StkId level) { - UpVal *uv; - while (L->openupval != NULL && (uv = L->openupval)->v >= level) { - lua_assert(upisopen(uv)); - L->openupval = uv->u.open.next; /* remove from 'open' list */ - if (uv->refcount == 0) /* no references? */ - luaM_free(L, uv); /* free upvalue */ - else { - setobj(L, &uv->u.value, uv->v); /* move value to upvalue slot */ - uv->v = &uv->u.value; /* now current value lives here */ - luaC_upvalbarrier(L, uv); - } - } -} - - -Proto *luaF_newproto (lua_State *L) { - GCObject *o = luaC_newobj(L, LUA_TPROTO, sizeof(Proto)); - Proto *f = gco2p(o); - f->k = NULL; - f->sizek = 0; - f->p = NULL; - f->sizep = 0; - f->code = NULL; - f->cache = NULL; - f->sizecode = 0; - f->lineinfo = NULL; - f->sizelineinfo = 0; - f->upvalues = NULL; - f->sizeupvalues = 0; - f->numparams = 0; - f->is_vararg = 0; - f->maxstacksize = 0; - f->locvars = NULL; - f->sizelocvars = 0; - f->linedefined = 0; - f->lastlinedefined = 0; - f->source = NULL; - return f; -} - - -void luaF_freeproto (lua_State *L, Proto *f) { - luaM_freearray(L, f->code, f->sizecode); - luaM_freearray(L, f->p, f->sizep); - luaM_freearray(L, f->k, f->sizek); - luaM_freearray(L, f->lineinfo, f->sizelineinfo); - luaM_freearray(L, f->locvars, f->sizelocvars); - luaM_freearray(L, f->upvalues, f->sizeupvalues); - luaM_free(L, f); -} - - -/* -** Look for n-th local variable at line 'line' in function 'func'. -** Returns NULL if not found. -*/ -const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { - int i; - for (i = 0; isizelocvars && f->locvars[i].startpc <= pc; i++) { - if (pc < f->locvars[i].endpc) { /* is variable active? */ - local_number--; - if (local_number == 0) - return getstr(f->locvars[i].varname); - } - } - return NULL; /* not found */ -} - diff --git a/3rd/lua/src/lfunc.h b/3rd/lua/src/lfunc.h deleted file mode 100644 index 256d3cf..0000000 --- a/3rd/lua/src/lfunc.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -** $Id: lfunc.h,v 2.14 2014/06/19 18:27:20 roberto Exp $ -** Auxiliary functions to manipulate prototypes and closures -** See Copyright Notice in lua.h -*/ - -#ifndef lfunc_h -#define lfunc_h - - -#include "lobject.h" - - -#define sizeCclosure(n) (cast(int, sizeof(CClosure)) + \ - cast(int, sizeof(TValue)*((n)-1))) - -#define sizeLclosure(n) (cast(int, sizeof(LClosure)) + \ - cast(int, sizeof(TValue *)*((n)-1))) - - -/* test whether thread is in 'twups' list */ -#define isintwups(L) (L->twups != L) - - -/* -** Upvalues for Lua closures -*/ -struct UpVal { - TValue *v; /* points to stack or to its own value */ - lu_mem refcount; /* reference counter */ - union { - struct { /* (when open) */ - UpVal *next; /* linked list */ - int touched; /* mark to avoid cycles with dead threads */ - } open; - TValue value; /* the value (when closed) */ - } u; -}; - -#define upisopen(up) ((up)->v != &(up)->u.value) - - -LUAI_FUNC Proto *luaF_newproto (lua_State *L); -LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nelems); -LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nelems); -LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl); -LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); -LUAI_FUNC void luaF_close (lua_State *L, StkId level); -LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); -LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, - int pc); - - -#endif diff --git a/3rd/lua/src/lgc.c b/3rd/lua/src/lgc.c deleted file mode 100644 index 8b95fb6..0000000 --- a/3rd/lua/src/lgc.c +++ /dev/null @@ -1,1159 +0,0 @@ -/* -** $Id: lgc.c,v 2.201 2014/12/20 13:58:15 roberto Exp $ -** Garbage Collector -** See Copyright Notice in lua.h -*/ - -#define lgc_c -#define LUA_CORE - -#include "lprefix.h" - - -#include - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" - - -/* -** internal state for collector while inside the atomic phase. The -** collector should never be in this state while running regular code. -*/ -#define GCSinsideatomic (GCSpause + 1) - -/* -** cost of sweeping one element (the size of a small object divided -** by some adjust for the sweep speed) -*/ -#define GCSWEEPCOST ((sizeof(TString) + 4) / 4) - -/* maximum number of elements to sweep in each single step */ -#define GCSWEEPMAX (cast_int((GCSTEPSIZE / GCSWEEPCOST) / 4)) - -/* cost of calling one finalizer */ -#define GCFINALIZECOST GCSWEEPCOST - - -/* -** macro to adjust 'stepmul': 'stepmul' is actually used like -** 'stepmul / STEPMULADJ' (value chosen by tests) -*/ -#define STEPMULADJ 200 - - -/* -** macro to adjust 'pause': 'pause' is actually used like -** 'pause / PAUSEADJ' (value chosen by tests) -*/ -#define PAUSEADJ 100 - - -/* -** 'makewhite' erases all color bits then sets only the current white -** bit -*/ -#define maskcolors (~(bitmask(BLACKBIT) | WHITEBITS)) -#define makewhite(g,x) \ - (x->marked = cast_byte((x->marked & maskcolors) | luaC_white(g))) - -#define white2gray(x) resetbits(x->marked, WHITEBITS) -#define black2gray(x) resetbit(x->marked, BLACKBIT) - - -#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) - -#define checkdeadkey(n) lua_assert(!ttisdeadkey(gkey(n)) || ttisnil(gval(n))) - - -#define checkconsistency(obj) \ - lua_longassert(!iscollectable(obj) || righttt(obj)) - - -#define markvalue(g,o) { checkconsistency(o); \ - if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); } - -#define markobject(g,t) \ - { if ((t) && iswhite(t)) reallymarkobject(g, obj2gco(t)); } - -static void reallymarkobject (global_State *g, GCObject *o); - - -/* -** {====================================================== -** Generic functions -** ======================================================= -*/ - - -/* -** one after last element in a hash array -*/ -#define gnodelast(h) gnode(h, cast(size_t, sizenode(h))) - - -/* -** link collectable object 'o' into list pointed by 'p' -*/ -#define linkgclist(o,p) ((o)->gclist = (p), (p) = obj2gco(o)) - - -/* -** if key is not marked, mark its entry as dead (therefore removing it -** from the table) -*/ -static void removeentry (Node *n) { - lua_assert(ttisnil(gval(n))); - if (valiswhite(gkey(n))) - setdeadvalue(wgkey(n)); /* unused and unmarked key; remove it */ -} - - -/* -** tells whether a key or value can be cleared from a weak -** table. Non-collectable objects are never removed from weak -** tables. Strings behave as 'values', so are never removed too. for -** other objects: if really collected, cannot keep them; for objects -** being finalized, keep them in keys, but not in values -*/ -static int iscleared (global_State *g, const TValue *o) { - if (!iscollectable(o)) return 0; - else if (ttisstring(o)) { - markobject(g, tsvalue(o)); /* strings are 'values', so are never weak */ - return 0; - } - else return iswhite(gcvalue(o)); -} - - -/* -** barrier that moves collector forward, that is, mark the white object -** being pointed by a black object. (If in sweep phase, clear the black -** object to white [sweep it] to avoid other barrier calls for this -** same object.) -*/ -void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) { - global_State *g = G(L); - lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); - if (keepinvariant(g)) /* must keep invariant? */ - reallymarkobject(g, v); /* restore invariant */ - else { /* sweep phase */ - lua_assert(issweepphase(g)); - makewhite(g, o); /* mark main obj. as white to avoid other barriers */ - } -} - - -/* -** barrier that moves collector backward, that is, mark the black object -** pointing to a white object as gray again. -*/ -void luaC_barrierback_ (lua_State *L, Table *t) { - global_State *g = G(L); - lua_assert(isblack(t) && !isdead(g, t)); - black2gray(t); /* make table gray (again) */ - linkgclist(t, g->grayagain); -} - - -/* -** barrier for assignments to closed upvalues. Because upvalues are -** shared among closures, it is impossible to know the color of all -** closures pointing to it. So, we assume that the object being assigned -** must be marked. -*/ -void luaC_upvalbarrier_ (lua_State *L, UpVal *uv) { - global_State *g = G(L); - GCObject *o = gcvalue(uv->v); - lua_assert(!upisopen(uv)); /* ensured by macro luaC_upvalbarrier */ - if (keepinvariant(g)) - markobject(g, o); -} - - -void luaC_fix (lua_State *L, GCObject *o) { - global_State *g = G(L); - lua_assert(g->allgc == o); /* object must be 1st in 'allgc' list! */ - white2gray(o); /* they will be gray forever */ - g->allgc = o->next; /* remove object from 'allgc' list */ - o->next = g->fixedgc; /* link it to 'fixedgc' list */ - g->fixedgc = o; -} - - -/* -** create a new collectable object (with given type and size) and link -** it to 'allgc' list. -*/ -GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { - global_State *g = G(L); - GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz)); - o->marked = luaC_white(g); - o->tt = tt; - o->next = g->allgc; - g->allgc = o; - return o; -} - -/* }====================================================== */ - - - -/* -** {====================================================== -** Mark functions -** ======================================================= -*/ - - -/* -** mark an object. Userdata, strings, and closed upvalues are visited -** and turned black here. Other objects are marked gray and added -** to appropriate list to be visited (and turned black) later. (Open -** upvalues are already linked in 'headuv' list.) -*/ -static void reallymarkobject (global_State *g, GCObject *o) { - reentry: - white2gray(o); - switch (o->tt) { - case LUA_TSHRSTR: - case LUA_TLNGSTR: { - gray2black(o); - g->GCmemtrav += sizestring(gco2ts(o)); - break; - } - case LUA_TUSERDATA: { - TValue uvalue; - markobject(g, gco2u(o)->metatable); /* mark its metatable */ - gray2black(o); - g->GCmemtrav += sizeudata(gco2u(o)); - getuservalue(g->mainthread, gco2u(o), &uvalue); - if (valiswhite(&uvalue)) { /* markvalue(g, &uvalue); */ - o = gcvalue(&uvalue); - goto reentry; - } - break; - } - case LUA_TLCL: { - linkgclist(gco2lcl(o), g->gray); - break; - } - case LUA_TCCL: { - linkgclist(gco2ccl(o), g->gray); - break; - } - case LUA_TTABLE: { - linkgclist(gco2t(o), g->gray); - break; - } - case LUA_TTHREAD: { - linkgclist(gco2th(o), g->gray); - break; - } - case LUA_TPROTO: { - linkgclist(gco2p(o), g->gray); - break; - } - default: lua_assert(0); break; - } -} - - -/* -** mark metamethods for basic types -*/ -static void markmt (global_State *g) { - int i; - for (i=0; i < LUA_NUMTAGS; i++) - markobject(g, g->mt[i]); -} - - -/* -** mark all objects in list of being-finalized -*/ -static void markbeingfnz (global_State *g) { - GCObject *o; - for (o = g->tobefnz; o != NULL; o = o->next) - markobject(g, o); -} - - -/* -** Mark all values stored in marked open upvalues from non-marked threads. -** (Values from marked threads were already marked when traversing the -** thread.) Remove from the list threads that no longer have upvalues and -** not-marked threads. -*/ -static void remarkupvals (global_State *g) { - lua_State *thread; - lua_State **p = &g->twups; - while ((thread = *p) != NULL) { - lua_assert(!isblack(thread)); /* threads are never black */ - if (isgray(thread) && thread->openupval != NULL) - p = &thread->twups; /* keep marked thread with upvalues in the list */ - else { /* thread is not marked or without upvalues */ - UpVal *uv; - *p = thread->twups; /* remove thread from the list */ - thread->twups = thread; /* mark that it is out of list */ - for (uv = thread->openupval; uv != NULL; uv = uv->u.open.next) { - if (uv->u.open.touched) { - markvalue(g, uv->v); /* remark upvalue's value */ - uv->u.open.touched = 0; - } - } - } - } -} - - -/* -** mark root set and reset all gray lists, to start a new collection -*/ -static void restartcollection (global_State *g) { - g->gray = g->grayagain = NULL; - g->weak = g->allweak = g->ephemeron = NULL; - markobject(g, g->mainthread); - markvalue(g, &g->l_registry); - markmt(g); - markbeingfnz(g); /* mark any finalizing object left from previous cycle */ -} - -/* }====================================================== */ - - -/* -** {====================================================== -** Traverse functions -** ======================================================= -*/ - -/* -** Traverse a table with weak values and link it to proper list. During -** propagate phase, keep it in 'grayagain' list, to be revisited in the -** atomic phase. In the atomic phase, if table has any white value, -** put it in 'weak' list, to be cleared. -*/ -static void traverseweakvalue (global_State *g, Table *h) { - Node *n, *limit = gnodelast(h); - /* if there is array part, assume it may have white values (it is not - worth traversing it now just to check) */ - int hasclears = (h->sizearray > 0); - for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ - checkdeadkey(n); - if (ttisnil(gval(n))) /* entry is empty? */ - removeentry(n); /* remove it */ - else { - lua_assert(!ttisnil(gkey(n))); - markvalue(g, gkey(n)); /* mark key */ - if (!hasclears && iscleared(g, gval(n))) /* is there a white value? */ - hasclears = 1; /* table will have to be cleared */ - } - } - if (g->gcstate == GCSpropagate) - linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */ - else if (hasclears) - linkgclist(h, g->weak); /* has to be cleared later */ -} - - -/* -** Traverse an ephemeron table and link it to proper list. Returns true -** iff any object was marked during this traversal (which implies that -** convergence has to continue). During propagation phase, keep table -** in 'grayagain' list, to be visited again in the atomic phase. In -** the atomic phase, if table has any white->white entry, it has to -** be revisited during ephemeron convergence (as that key may turn -** black). Otherwise, if it has any white key, table has to be cleared -** (in the atomic phase). -*/ -static int traverseephemeron (global_State *g, Table *h) { - int marked = 0; /* true if an object is marked in this traversal */ - int hasclears = 0; /* true if table has white keys */ - int hasww = 0; /* true if table has entry "white-key -> white-value" */ - Node *n, *limit = gnodelast(h); - unsigned int i; - /* traverse array part */ - for (i = 0; i < h->sizearray; i++) { - if (valiswhite(&h->array[i])) { - marked = 1; - reallymarkobject(g, gcvalue(&h->array[i])); - } - } - /* traverse hash part */ - for (n = gnode(h, 0); n < limit; n++) { - checkdeadkey(n); - if (ttisnil(gval(n))) /* entry is empty? */ - removeentry(n); /* remove it */ - else if (iscleared(g, gkey(n))) { /* key is not marked (yet)? */ - hasclears = 1; /* table must be cleared */ - if (valiswhite(gval(n))) /* value not marked yet? */ - hasww = 1; /* white-white entry */ - } - else if (valiswhite(gval(n))) { /* value not marked yet? */ - marked = 1; - reallymarkobject(g, gcvalue(gval(n))); /* mark it now */ - } - } - /* link table into proper list */ - if (g->gcstate == GCSpropagate) - linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */ - else if (hasww) /* table has white->white entries? */ - linkgclist(h, g->ephemeron); /* have to propagate again */ - else if (hasclears) /* table has white keys? */ - linkgclist(h, g->allweak); /* may have to clean white keys */ - return marked; -} - - -static void traversestrongtable (global_State *g, Table *h) { - Node *n, *limit = gnodelast(h); - unsigned int i; - for (i = 0; i < h->sizearray; i++) /* traverse array part */ - markvalue(g, &h->array[i]); - for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ - checkdeadkey(n); - if (ttisnil(gval(n))) /* entry is empty? */ - removeentry(n); /* remove it */ - else { - lua_assert(!ttisnil(gkey(n))); - markvalue(g, gkey(n)); /* mark key */ - markvalue(g, gval(n)); /* mark value */ - } - } -} - - -static lu_mem traversetable (global_State *g, Table *h) { - const char *weakkey, *weakvalue; - const TValue *mode = gfasttm(g, h->metatable, TM_MODE); - markobject(g, h->metatable); - if (mode && ttisstring(mode) && /* is there a weak mode? */ - ((weakkey = strchr(svalue(mode), 'k')), - (weakvalue = strchr(svalue(mode), 'v')), - (weakkey || weakvalue))) { /* is really weak? */ - black2gray(h); /* keep table gray */ - if (!weakkey) /* strong keys? */ - traverseweakvalue(g, h); - else if (!weakvalue) /* strong values? */ - traverseephemeron(g, h); - else /* all weak */ - linkgclist(h, g->allweak); /* nothing to traverse now */ - } - else /* not weak */ - traversestrongtable(g, h); - return sizeof(Table) + sizeof(TValue) * h->sizearray + - sizeof(Node) * cast(size_t, sizenode(h)); -} - - -static int traverseproto (global_State *g, Proto *f) { - int i; - if (f->cache && iswhite(f->cache)) - f->cache = NULL; /* allow cache to be collected */ - markobject(g, f->source); - for (i = 0; i < f->sizek; i++) /* mark literals */ - markvalue(g, &f->k[i]); - for (i = 0; i < f->sizeupvalues; i++) /* mark upvalue names */ - markobject(g, f->upvalues[i].name); - for (i = 0; i < f->sizep; i++) /* mark nested protos */ - markobject(g, f->p[i]); - for (i = 0; i < f->sizelocvars; i++) /* mark local-variable names */ - markobject(g, f->locvars[i].varname); - return sizeof(Proto) + sizeof(Instruction) * f->sizecode + - sizeof(Proto *) * f->sizep + - sizeof(TValue) * f->sizek + - sizeof(int) * f->sizelineinfo + - sizeof(LocVar) * f->sizelocvars + - sizeof(Upvaldesc) * f->sizeupvalues; -} - - -static lu_mem traverseCclosure (global_State *g, CClosure *cl) { - int i; - for (i = 0; i < cl->nupvalues; i++) /* mark its upvalues */ - markvalue(g, &cl->upvalue[i]); - return sizeCclosure(cl->nupvalues); -} - -/* -** open upvalues point to values in a thread, so those values should -** be marked when the thread is traversed except in the atomic phase -** (because then the value cannot be changed by the thread and the -** thread may not be traversed again) -*/ -static lu_mem traverseLclosure (global_State *g, LClosure *cl) { - int i; - markobject(g, cl->p); /* mark its prototype */ - for (i = 0; i < cl->nupvalues; i++) { /* mark its upvalues */ - UpVal *uv = cl->upvals[i]; - if (uv != NULL) { - if (upisopen(uv) && g->gcstate != GCSinsideatomic) - uv->u.open.touched = 1; /* can be marked in 'remarkupvals' */ - else - markvalue(g, uv->v); - } - } - return sizeLclosure(cl->nupvalues); -} - - -static lu_mem traversethread (global_State *g, lua_State *th) { - StkId o = th->stack; - if (o == NULL) - return 1; /* stack not completely built yet */ - lua_assert(g->gcstate == GCSinsideatomic || - th->openupval == NULL || isintwups(th)); - for (; o < th->top; o++) /* mark live elements in the stack */ - markvalue(g, o); - if (g->gcstate == GCSinsideatomic) { /* final traversal? */ - StkId lim = th->stack + th->stacksize; /* real end of stack */ - for (; o < lim; o++) /* clear not-marked stack slice */ - setnilvalue(o); - /* 'remarkupvals' may have removed thread from 'twups' list */ - if (!isintwups(th) && th->openupval != NULL) { - th->twups = g->twups; /* link it back to the list */ - g->twups = th; - } - } - else if (g->gckind != KGC_EMERGENCY) - luaD_shrinkstack(th); /* do not change stack in emergency cycle */ - return (sizeof(lua_State) + sizeof(TValue) * th->stacksize); -} - - -/* -** traverse one gray object, turning it to black (except for threads, -** which are always gray). -*/ -static void propagatemark (global_State *g) { - lu_mem size; - GCObject *o = g->gray; - lua_assert(isgray(o)); - gray2black(o); - switch (o->tt) { - case LUA_TTABLE: { - Table *h = gco2t(o); - g->gray = h->gclist; /* remove from 'gray' list */ - size = traversetable(g, h); - break; - } - case LUA_TLCL: { - LClosure *cl = gco2lcl(o); - g->gray = cl->gclist; /* remove from 'gray' list */ - size = traverseLclosure(g, cl); - break; - } - case LUA_TCCL: { - CClosure *cl = gco2ccl(o); - g->gray = cl->gclist; /* remove from 'gray' list */ - size = traverseCclosure(g, cl); - break; - } - case LUA_TTHREAD: { - lua_State *th = gco2th(o); - g->gray = th->gclist; /* remove from 'gray' list */ - linkgclist(th, g->grayagain); /* insert into 'grayagain' list */ - black2gray(o); - size = traversethread(g, th); - break; - } - case LUA_TPROTO: { - Proto *p = gco2p(o); - g->gray = p->gclist; /* remove from 'gray' list */ - size = traverseproto(g, p); - break; - } - default: lua_assert(0); return; - } - g->GCmemtrav += size; -} - - -static void propagateall (global_State *g) { - while (g->gray) propagatemark(g); -} - - -static void convergeephemerons (global_State *g) { - int changed; - do { - GCObject *w; - GCObject *next = g->ephemeron; /* get ephemeron list */ - g->ephemeron = NULL; /* tables may return to this list when traversed */ - changed = 0; - while ((w = next) != NULL) { - next = gco2t(w)->gclist; - if (traverseephemeron(g, gco2t(w))) { /* traverse marked some value? */ - propagateall(g); /* propagate changes */ - changed = 1; /* will have to revisit all ephemeron tables */ - } - } - } while (changed); -} - -/* }====================================================== */ - - -/* -** {====================================================== -** Sweep Functions -** ======================================================= -*/ - - -/* -** clear entries with unmarked keys from all weaktables in list 'l' up -** to element 'f' -*/ -static void clearkeys (global_State *g, GCObject *l, GCObject *f) { - for (; l != f; l = gco2t(l)->gclist) { - Table *h = gco2t(l); - Node *n, *limit = gnodelast(h); - for (n = gnode(h, 0); n < limit; n++) { - if (!ttisnil(gval(n)) && (iscleared(g, gkey(n)))) { - setnilvalue(gval(n)); /* remove value ... */ - removeentry(n); /* and remove entry from table */ - } - } - } -} - - -/* -** clear entries with unmarked values from all weaktables in list 'l' up -** to element 'f' -*/ -static void clearvalues (global_State *g, GCObject *l, GCObject *f) { - for (; l != f; l = gco2t(l)->gclist) { - Table *h = gco2t(l); - Node *n, *limit = gnodelast(h); - unsigned int i; - for (i = 0; i < h->sizearray; i++) { - TValue *o = &h->array[i]; - if (iscleared(g, o)) /* value was collected? */ - setnilvalue(o); /* remove value */ - } - for (n = gnode(h, 0); n < limit; n++) { - if (!ttisnil(gval(n)) && iscleared(g, gval(n))) { - setnilvalue(gval(n)); /* remove value ... */ - removeentry(n); /* and remove entry from table */ - } - } - } -} - - -void luaC_upvdeccount (lua_State *L, UpVal *uv) { - lua_assert(uv->refcount > 0); - uv->refcount--; - if (uv->refcount == 0 && !upisopen(uv)) - luaM_free(L, uv); -} - - -static void freeLclosure (lua_State *L, LClosure *cl) { - int i; - for (i = 0; i < cl->nupvalues; i++) { - UpVal *uv = cl->upvals[i]; - if (uv) - luaC_upvdeccount(L, uv); - } - luaM_freemem(L, cl, sizeLclosure(cl->nupvalues)); -} - - -static void freeobj (lua_State *L, GCObject *o) { - switch (o->tt) { - case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break; - case LUA_TLCL: { - freeLclosure(L, gco2lcl(o)); - break; - } - case LUA_TCCL: { - luaM_freemem(L, o, sizeCclosure(gco2ccl(o)->nupvalues)); - break; - } - case LUA_TTABLE: luaH_free(L, gco2t(o)); break; - case LUA_TTHREAD: luaE_freethread(L, gco2th(o)); break; - case LUA_TUSERDATA: luaM_freemem(L, o, sizeudata(gco2u(o))); break; - case LUA_TSHRSTR: - luaS_remove(L, gco2ts(o)); /* remove it from hash table */ - /* go through */ - case LUA_TLNGSTR: { - luaM_freemem(L, o, sizestring(gco2ts(o))); - break; - } - default: lua_assert(0); - } -} - - -#define sweepwholelist(L,p) sweeplist(L,p,MAX_LUMEM) -static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count); - - -/* -** sweep at most 'count' elements from a list of GCObjects erasing dead -** objects, where a dead object is one marked with the old (non current) -** white; change all non-dead objects back to white, preparing for next -** collection cycle. Return where to continue the traversal or NULL if -** list is finished. -*/ -static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) { - global_State *g = G(L); - int ow = otherwhite(g); - int white = luaC_white(g); /* current white */ - while (*p != NULL && count-- > 0) { - GCObject *curr = *p; - int marked = curr->marked; - if (isdeadm(ow, marked)) { /* is 'curr' dead? */ - *p = curr->next; /* remove 'curr' from list */ - freeobj(L, curr); /* erase 'curr' */ - } - else { /* change mark to 'white' */ - curr->marked = cast_byte((marked & maskcolors) | white); - p = &curr->next; /* go to next element */ - } - } - return (*p == NULL) ? NULL : p; -} - - -/* -** sweep a list until a live object (or end of list) -*/ -static GCObject **sweeptolive (lua_State *L, GCObject **p, int *n) { - GCObject **old = p; - int i = 0; - do { - i++; - p = sweeplist(L, p, 1); - } while (p == old); - if (n) *n += i; - return p; -} - -/* }====================================================== */ - - -/* -** {====================================================== -** Finalization -** ======================================================= -*/ - -/* -** If possible, free concatenation buffer and shrink string table -*/ -static void checkSizes (lua_State *L, global_State *g) { - if (g->gckind != KGC_EMERGENCY) { - l_mem olddebt = g->GCdebt; - luaZ_freebuffer(L, &g->buff); /* free concatenation buffer */ - if (g->strt.nuse < g->strt.size / 4) /* string table too big? */ - luaS_resize(L, g->strt.size / 2); /* shrink it a little */ - g->GCestimate += g->GCdebt - olddebt; /* update estimate */ - } -} - - -static GCObject *udata2finalize (global_State *g) { - GCObject *o = g->tobefnz; /* get first element */ - lua_assert(tofinalize(o)); - g->tobefnz = o->next; /* remove it from 'tobefnz' list */ - o->next = g->allgc; /* return it to 'allgc' list */ - g->allgc = o; - resetbit(o->marked, FINALIZEDBIT); /* object is "normal" again */ - if (issweepphase(g)) - makewhite(g, o); /* "sweep" object */ - return o; -} - - -static void dothecall (lua_State *L, void *ud) { - UNUSED(ud); - luaD_call(L, L->top - 2, 0, 0); -} - - -static void GCTM (lua_State *L, int propagateerrors) { - global_State *g = G(L); - const TValue *tm; - TValue v; - setgcovalue(L, &v, udata2finalize(g)); - tm = luaT_gettmbyobj(L, &v, TM_GC); - if (tm != NULL && ttisfunction(tm)) { /* is there a finalizer? */ - int status; - lu_byte oldah = L->allowhook; - int running = g->gcrunning; - L->allowhook = 0; /* stop debug hooks during GC metamethod */ - g->gcrunning = 0; /* avoid GC steps */ - setobj2s(L, L->top, tm); /* push finalizer... */ - setobj2s(L, L->top + 1, &v); /* ... and its argument */ - L->top += 2; /* and (next line) call the finalizer */ - status = luaD_pcall(L, dothecall, NULL, savestack(L, L->top - 2), 0); - L->allowhook = oldah; /* restore hooks */ - g->gcrunning = running; /* restore state */ - if (status != LUA_OK && propagateerrors) { /* error while running __gc? */ - if (status == LUA_ERRRUN) { /* is there an error object? */ - const char *msg = (ttisstring(L->top - 1)) - ? svalue(L->top - 1) - : "no message"; - luaO_pushfstring(L, "error in __gc metamethod (%s)", msg); - status = LUA_ERRGCMM; /* error in __gc metamethod */ - } - luaD_throw(L, status); /* re-throw error */ - } - } -} - - -/* -** call a few (up to 'g->gcfinnum') finalizers -*/ -static int runafewfinalizers (lua_State *L) { - global_State *g = G(L); - unsigned int i; - lua_assert(!g->tobefnz || g->gcfinnum > 0); - for (i = 0; g->tobefnz && i < g->gcfinnum; i++) - GCTM(L, 1); /* call one finalizer */ - g->gcfinnum = (!g->tobefnz) ? 0 /* nothing more to finalize? */ - : g->gcfinnum * 2; /* else call a few more next time */ - return i; -} - - -/* -** call all pending finalizers -*/ -static void callallpendingfinalizers (lua_State *L, int propagateerrors) { - global_State *g = G(L); - while (g->tobefnz) - GCTM(L, propagateerrors); -} - - -/* -** find last 'next' field in list 'p' list (to add elements in its end) -*/ -static GCObject **findlast (GCObject **p) { - while (*p != NULL) - p = &(*p)->next; - return p; -} - - -/* -** move all unreachable objects (or 'all' objects) that need -** finalization from list 'finobj' to list 'tobefnz' (to be finalized) -*/ -static void separatetobefnz (global_State *g, int all) { - GCObject *curr; - GCObject **p = &g->finobj; - GCObject **lastnext = findlast(&g->tobefnz); - while ((curr = *p) != NULL) { /* traverse all finalizable objects */ - lua_assert(tofinalize(curr)); - if (!(iswhite(curr) || all)) /* not being collected? */ - p = &curr->next; /* don't bother with it */ - else { - *p = curr->next; /* remove 'curr' from 'finobj' list */ - curr->next = *lastnext; /* link at the end of 'tobefnz' list */ - *lastnext = curr; - lastnext = &curr->next; - } - } -} - - -/* -** if object 'o' has a finalizer, remove it from 'allgc' list (must -** search the list to find it) and link it in 'finobj' list. -*/ -void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) { - global_State *g = G(L); - if (tofinalize(o) || /* obj. is already marked... */ - gfasttm(g, mt, TM_GC) == NULL) /* or has no finalizer? */ - return; /* nothing to be done */ - else { /* move 'o' to 'finobj' list */ - GCObject **p; - if (issweepphase(g)) { - makewhite(g, o); /* "sweep" object 'o' */ - if (g->sweepgc == &o->next) /* should not remove 'sweepgc' object */ - g->sweepgc = sweeptolive(L, g->sweepgc, NULL); /* change 'sweepgc' */ - } - /* search for pointer pointing to 'o' */ - for (p = &g->allgc; *p != o; p = &(*p)->next) { /* empty */ } - *p = o->next; /* remove 'o' from 'allgc' list */ - o->next = g->finobj; /* link it in 'finobj' list */ - g->finobj = o; - l_setbit(o->marked, FINALIZEDBIT); /* mark it as such */ - } -} - -/* }====================================================== */ - - - -/* -** {====================================================== -** GC control -** ======================================================= -*/ - - -/* -** Set a reasonable "time" to wait before starting a new GC cycle; cycle -** will start when memory use hits threshold. (Division by 'estimate' -** should be OK: it cannot be zero (because Lua cannot even start with -** less than PAUSEADJ bytes). -*/ -static void setpause (global_State *g) { - l_mem threshold, debt; - l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */ - lua_assert(estimate > 0); - threshold = (g->gcpause < MAX_LMEM / estimate) /* overflow? */ - ? estimate * g->gcpause /* no overflow */ - : MAX_LMEM; /* overflow; truncate to maximum */ - debt = gettotalbytes(g) - threshold; - luaE_setdebt(g, debt); -} - - -/* -** Enter first sweep phase. -** The call to 'sweeptolive' makes pointer point to an object inside -** the list (instead of to the header), so that the real sweep do not -** need to skip objects created between "now" and the start of the real -** sweep. -** Returns how many objects it swept. -*/ -static int entersweep (lua_State *L) { - global_State *g = G(L); - int n = 0; - g->gcstate = GCSswpallgc; - lua_assert(g->sweepgc == NULL); - g->sweepgc = sweeptolive(L, &g->allgc, &n); - return n; -} - - -void luaC_freeallobjects (lua_State *L) { - global_State *g = G(L); - separatetobefnz(g, 1); /* separate all objects with finalizers */ - lua_assert(g->finobj == NULL); - callallpendingfinalizers(L, 0); - lua_assert(g->tobefnz == NULL); - g->currentwhite = WHITEBITS; /* this "white" makes all objects look dead */ - g->gckind = KGC_NORMAL; - sweepwholelist(L, &g->finobj); - sweepwholelist(L, &g->allgc); - sweepwholelist(L, &g->fixedgc); /* collect fixed objects */ - lua_assert(g->strt.nuse == 0); -} - - -static l_mem atomic (lua_State *L) { - global_State *g = G(L); - l_mem work; - GCObject *origweak, *origall; - GCObject *grayagain = g->grayagain; /* save original list */ - lua_assert(g->ephemeron == NULL && g->weak == NULL); - lua_assert(!iswhite(g->mainthread)); - g->gcstate = GCSinsideatomic; - g->GCmemtrav = 0; /* start counting work */ - markobject(g, L); /* mark running thread */ - /* registry and global metatables may be changed by API */ - markvalue(g, &g->l_registry); - markmt(g); /* mark global metatables */ - /* remark occasional upvalues of (maybe) dead threads */ - remarkupvals(g); - propagateall(g); /* propagate changes */ - work = g->GCmemtrav; /* stop counting (do not recount 'grayagain') */ - g->gray = grayagain; - propagateall(g); /* traverse 'grayagain' list */ - g->GCmemtrav = 0; /* restart counting */ - convergeephemerons(g); - /* at this point, all strongly accessible objects are marked. */ - /* Clear values from weak tables, before checking finalizers */ - clearvalues(g, g->weak, NULL); - clearvalues(g, g->allweak, NULL); - origweak = g->weak; origall = g->allweak; - work += g->GCmemtrav; /* stop counting (objects being finalized) */ - separatetobefnz(g, 0); /* separate objects to be finalized */ - g->gcfinnum = 1; /* there may be objects to be finalized */ - markbeingfnz(g); /* mark objects that will be finalized */ - propagateall(g); /* remark, to propagate 'resurrection' */ - g->GCmemtrav = 0; /* restart counting */ - convergeephemerons(g); - /* at this point, all resurrected objects are marked. */ - /* remove dead objects from weak tables */ - clearkeys(g, g->ephemeron, NULL); /* clear keys from all ephemeron tables */ - clearkeys(g, g->allweak, NULL); /* clear keys from all 'allweak' tables */ - /* clear values from resurrected weak tables */ - clearvalues(g, g->weak, origweak); - clearvalues(g, g->allweak, origall); - g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */ - work += g->GCmemtrav; /* complete counting */ - return work; /* estimate of memory marked by 'atomic' */ -} - - -static lu_mem sweepstep (lua_State *L, global_State *g, - int nextstate, GCObject **nextlist) { - if (g->sweepgc) { - l_mem olddebt = g->GCdebt; - g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX); - g->GCestimate += g->GCdebt - olddebt; /* update estimate */ - if (g->sweepgc) /* is there still something to sweep? */ - return (GCSWEEPMAX * GCSWEEPCOST); - } - /* else enter next state */ - g->gcstate = nextstate; - g->sweepgc = nextlist; - return 0; -} - - -static lu_mem singlestep (lua_State *L) { - global_State *g = G(L); - switch (g->gcstate) { - case GCSpause: { - g->GCmemtrav = g->strt.size * sizeof(GCObject*); - restartcollection(g); - g->gcstate = GCSpropagate; - return g->GCmemtrav; - } - case GCSpropagate: { - g->GCmemtrav = 0; - lua_assert(g->gray); - propagatemark(g); - if (g->gray == NULL) /* no more gray objects? */ - g->gcstate = GCSatomic; /* finish propagate phase */ - return g->GCmemtrav; /* memory traversed in this step */ - } - case GCSatomic: { - lu_mem work; - int sw; - propagateall(g); /* make sure gray list is empty */ - work = atomic(L); /* work is what was traversed by 'atomic' */ - sw = entersweep(L); - g->GCestimate = gettotalbytes(g); /* first estimate */; - return work + sw * GCSWEEPCOST; - } - case GCSswpallgc: { /* sweep "regular" objects */ - return sweepstep(L, g, GCSswpfinobj, &g->finobj); - } - case GCSswpfinobj: { /* sweep objects with finalizers */ - return sweepstep(L, g, GCSswptobefnz, &g->tobefnz); - } - case GCSswptobefnz: { /* sweep objects to be finalized */ - return sweepstep(L, g, GCSswpend, NULL); - } - case GCSswpend: { /* finish sweeps */ - makewhite(g, g->mainthread); /* sweep main thread */ - checkSizes(L, g); - g->gcstate = GCScallfin; - return 0; - } - case GCScallfin: { /* call remaining finalizers */ - if (g->tobefnz && g->gckind != KGC_EMERGENCY) { - int n = runafewfinalizers(L); - return (n * GCFINALIZECOST); - } - else { /* emergency mode or no more finalizers */ - g->gcstate = GCSpause; /* finish collection */ - return 0; - } - } - default: lua_assert(0); return 0; - } -} - - -/* -** advances the garbage collector until it reaches a state allowed -** by 'statemask' -*/ -void luaC_runtilstate (lua_State *L, int statesmask) { - global_State *g = G(L); - while (!testbit(statesmask, g->gcstate)) - singlestep(L); -} - - -/* -** get GC debt and convert it from Kb to 'work units' (avoid zero debt -** and overflows) -*/ -static l_mem getdebt (global_State *g) { - l_mem debt = g->GCdebt; - int stepmul = g->gcstepmul; - debt = (debt / STEPMULADJ) + 1; - debt = (debt < MAX_LMEM / stepmul) ? debt * stepmul : MAX_LMEM; - return debt; -} - -/* -** performs a basic GC step when collector is running -*/ -void luaC_step (lua_State *L) { - global_State *g = G(L); - l_mem debt = getdebt(g); /* GC deficit (be paid now) */ - if (!g->gcrunning) { /* not running? */ - luaE_setdebt(g, -GCSTEPSIZE * 10); /* avoid being called too often */ - return; - } - do { /* repeat until pause or enough "credit" (negative debt) */ - lu_mem work = singlestep(L); /* perform one single step */ - debt -= work; - } while (debt > -GCSTEPSIZE && g->gcstate != GCSpause); - if (g->gcstate == GCSpause) - setpause(g); /* pause until next cycle */ - else { - debt = (debt / g->gcstepmul) * STEPMULADJ; /* convert 'work units' to Kb */ - luaE_setdebt(g, debt); - runafewfinalizers(L); - } -} - - -/* -** Performs a full GC cycle; if 'isemergency', set a flag to avoid -** some operations which could change the interpreter state in some -** unexpected ways (running finalizers and shrinking some structures). -** Before running the collection, check 'keepinvariant'; if it is true, -** there may be some objects marked as black, so the collector has -** to sweep all objects to turn them back to white (as white has not -** changed, nothing will be collected). -*/ -void luaC_fullgc (lua_State *L, int isemergency) { - global_State *g = G(L); - lua_assert(g->gckind == KGC_NORMAL); - if (isemergency) g->gckind = KGC_EMERGENCY; /* set flag */ - if (keepinvariant(g)) { /* black objects? */ - entersweep(L); /* sweep everything to turn them back to white */ - } - /* finish any pending sweep phase to start a new cycle */ - luaC_runtilstate(L, bitmask(GCSpause)); - luaC_runtilstate(L, ~bitmask(GCSpause)); /* start new collection */ - luaC_runtilstate(L, bitmask(GCScallfin)); /* run up to finalizers */ - /* estimate must be correct after a full GC cycle */ - lua_assert(g->GCestimate == gettotalbytes(g)); - luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */ - g->gckind = KGC_NORMAL; - setpause(g); -} - -/* }====================================================== */ - - diff --git a/3rd/lua/src/lgc.h b/3rd/lua/src/lgc.h deleted file mode 100644 index 0eedf84..0000000 --- a/3rd/lua/src/lgc.h +++ /dev/null @@ -1,138 +0,0 @@ -/* -** $Id: lgc.h,v 2.86 2014/10/25 11:50:46 roberto Exp $ -** Garbage Collector -** See Copyright Notice in lua.h -*/ - -#ifndef lgc_h -#define lgc_h - - -#include "lobject.h" -#include "lstate.h" - -/* -** Collectable objects may have one of three colors: white, which -** means the object is not marked; gray, which means the -** object is marked, but its references may be not marked; and -** black, which means that the object and all its references are marked. -** The main invariant of the garbage collector, while marking objects, -** is that a black object can never point to a white one. Moreover, -** any gray object must be in a "gray list" (gray, grayagain, weak, -** allweak, ephemeron) so that it can be visited again before finishing -** the collection cycle. These lists have no meaning when the invariant -** is not being enforced (e.g., sweep phase). -*/ - - - -/* how much to allocate before next GC step */ -#if !defined(GCSTEPSIZE) -/* ~100 small strings */ -#define GCSTEPSIZE (cast_int(100 * sizeof(TString))) -#endif - - -/* -** Possible states of the Garbage Collector -*/ -#define GCSpropagate 0 -#define GCSatomic 1 -#define GCSswpallgc 2 -#define GCSswpfinobj 3 -#define GCSswptobefnz 4 -#define GCSswpend 5 -#define GCScallfin 6 -#define GCSpause 7 - - -#define issweepphase(g) \ - (GCSswpallgc <= (g)->gcstate && (g)->gcstate <= GCSswpend) - - -/* -** macro to tell when main invariant (white objects cannot point to black -** ones) must be kept. During a collection, the sweep -** phase may break the invariant, as objects turned white may point to -** still-black objects. The invariant is restored when sweep ends and -** all objects are white again. -*/ - -#define keepinvariant(g) ((g)->gcstate <= GCSatomic) - - -/* -** some useful bit tricks -*/ -#define resetbits(x,m) ((x) &= cast(lu_byte, ~(m))) -#define setbits(x,m) ((x) |= (m)) -#define testbits(x,m) ((x) & (m)) -#define bitmask(b) (1<<(b)) -#define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2)) -#define l_setbit(x,b) setbits(x, bitmask(b)) -#define resetbit(x,b) resetbits(x, bitmask(b)) -#define testbit(x,b) testbits(x, bitmask(b)) - - -/* Layout for bit use in 'marked' field: */ -#define WHITE0BIT 0 /* object is white (type 0) */ -#define WHITE1BIT 1 /* object is white (type 1) */ -#define BLACKBIT 2 /* object is black */ -#define FINALIZEDBIT 3 /* object has been marked for finalization */ -/* bit 7 is currently used by tests (luaL_checkmemory) */ - -#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) - - -#define iswhite(x) testbits((x)->marked, WHITEBITS) -#define isblack(x) testbit((x)->marked, BLACKBIT) -#define isgray(x) /* neither white nor black */ \ - (!testbits((x)->marked, WHITEBITS | bitmask(BLACKBIT))) - -#define tofinalize(x) testbit((x)->marked, FINALIZEDBIT) - -#define otherwhite(g) ((g)->currentwhite ^ WHITEBITS) -#define isdeadm(ow,m) (!(((m) ^ WHITEBITS) & (ow))) -#define isdead(g,v) isdeadm(otherwhite(g), (v)->marked) - -#define changewhite(x) ((x)->marked ^= WHITEBITS) -#define gray2black(x) l_setbit((x)->marked, BLACKBIT) - -#define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) - - -#define luaC_condGC(L,c) \ - {if (G(L)->GCdebt > 0) {c;}; condchangemem(L);} -#define luaC_checkGC(L) luaC_condGC(L, luaC_step(L);) - - -#define luaC_barrier(L,p,v) { \ - if (iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) \ - luaC_barrier_(L,obj2gco(p),gcvalue(v)); } - -#define luaC_barrierback(L,p,v) { \ - if (iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) \ - luaC_barrierback_(L,p); } - -#define luaC_objbarrier(L,p,o) { \ - if (isblack(p) && iswhite(o)) \ - luaC_barrier_(L,obj2gco(p),obj2gco(o)); } - -#define luaC_upvalbarrier(L,uv) \ - { if (iscollectable((uv)->v) && !upisopen(uv)) \ - luaC_upvalbarrier_(L,uv); } - -LUAI_FUNC void luaC_fix (lua_State *L, GCObject *o); -LUAI_FUNC void luaC_freeallobjects (lua_State *L); -LUAI_FUNC void luaC_step (lua_State *L); -LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask); -LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency); -LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz); -LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v); -LUAI_FUNC void luaC_barrierback_ (lua_State *L, Table *o); -LUAI_FUNC void luaC_upvalbarrier_ (lua_State *L, UpVal *uv); -LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt); -LUAI_FUNC void luaC_upvdeccount (lua_State *L, UpVal *uv); - - -#endif diff --git a/3rd/lua/src/linit.c b/3rd/lua/src/linit.c deleted file mode 100644 index 8ce94cc..0000000 --- a/3rd/lua/src/linit.c +++ /dev/null @@ -1,68 +0,0 @@ -/* -** $Id: linit.c,v 1.38 2015/01/05 13:48:33 roberto Exp $ -** Initialization of libraries for lua.c and other clients -** See Copyright Notice in lua.h -*/ - - -#define linit_c -#define LUA_LIB - -/* -** If you embed Lua in your program and need to open the standard -** libraries, call luaL_openlibs in your program. If you need a -** different set of libraries, copy this file to your project and edit -** it to suit your needs. -** -** You can also *preload* libraries, so that a later 'require' can -** open the library, which is already linked to the application. -** For that, do the following code: -** -** luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD"); -** lua_pushcfunction(L, luaopen_modname); -** lua_setfield(L, -2, modname); -** lua_pop(L, 1); // remove _PRELOAD table -*/ - -#include "lprefix.h" - - -#include - -#include "lua.h" - -#include "lualib.h" -#include "lauxlib.h" - - -/* -** these libs are loaded by lua.c and are readily available to any Lua -** program -*/ -static const luaL_Reg loadedlibs[] = { - {"_G", luaopen_base}, - {LUA_LOADLIBNAME, luaopen_package}, - {LUA_COLIBNAME, luaopen_coroutine}, - {LUA_TABLIBNAME, luaopen_table}, - {LUA_IOLIBNAME, luaopen_io}, - {LUA_OSLIBNAME, luaopen_os}, - {LUA_STRLIBNAME, luaopen_string}, - {LUA_MATHLIBNAME, luaopen_math}, - {LUA_UTF8LIBNAME, luaopen_utf8}, - {LUA_DBLIBNAME, luaopen_debug}, -#if defined(LUA_COMPAT_BITLIB) - {LUA_BITLIBNAME, luaopen_bit32}, -#endif - {NULL, NULL} -}; - - -LUALIB_API void luaL_openlibs (lua_State *L) { - const luaL_Reg *lib; - /* "require" functions from 'loadedlibs' and set results to global table */ - for (lib = loadedlibs; lib->func; lib++) { - luaL_requiref(L, lib->name, lib->func, 1); - lua_pop(L, 1); /* remove lib */ - } -} - diff --git a/3rd/lua/src/liolib.c b/3rd/lua/src/liolib.c deleted file mode 100644 index 4dea396..0000000 --- a/3rd/lua/src/liolib.c +++ /dev/null @@ -1,757 +0,0 @@ -/* -** $Id: liolib.c,v 2.142 2015/01/02 12:50:28 roberto Exp $ -** Standard I/O (and system) library -** See Copyright Notice in lua.h -*/ - -#define liolib_c -#define LUA_LIB - -#include "lprefix.h" - - -#include -#include -#include -#include -#include -#include - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -#if !defined(l_checkmode) - -/* -** Check whether 'mode' matches '[rwa]%+?b?'. -** Change this macro to accept other modes for 'fopen' besides -** the standard ones. -*/ -#define l_checkmode(mode) \ - (*mode != '\0' && strchr("rwa", *(mode++)) != NULL && \ - (*mode != '+' || ++mode) && /* skip if char is '+' */ \ - (*mode != 'b' || ++mode) && /* skip if char is 'b' */ \ - (*mode == '\0')) - -#endif - -/* -** {====================================================== -** l_popen spawns a new process connected to the current -** one through the file streams. -** ======================================================= -*/ - -#if !defined(l_popen) /* { */ - -#if defined(LUA_USE_POSIX) /* { */ - -#define l_popen(L,c,m) (fflush(NULL), popen(c,m)) -#define l_pclose(L,file) (pclose(file)) - -#elif defined(LUA_USE_WINDOWS) /* }{ */ - -#define l_popen(L,c,m) (_popen(c,m)) -#define l_pclose(L,file) (_pclose(file)) - -#else /* }{ */ - -/* ISO C definitions */ -#define l_popen(L,c,m) \ - ((void)((void)c, m), \ - luaL_error(L, "'popen' not supported"), \ - (FILE*)0) -#define l_pclose(L,file) ((void)L, (void)file, -1) - -#endif /* } */ - -#endif /* } */ - -/* }====================================================== */ - - -#if !defined(l_getc) /* { */ - -#if defined(LUA_USE_POSIX) -#define l_getc(f) getc_unlocked(f) -#define l_lockfile(f) flockfile(f) -#define l_unlockfile(f) funlockfile(f) -#else -#define l_getc(f) getc(f) -#define l_lockfile(f) ((void)0) -#define l_unlockfile(f) ((void)0) -#endif - -#endif /* } */ - - -/* -** {====================================================== -** l_fseek: configuration for longer offsets -** ======================================================= -*/ - -#if !defined(l_fseek) /* { */ - -#if defined(LUA_USE_POSIX) /* { */ - -#include - -#define l_fseek(f,o,w) fseeko(f,o,w) -#define l_ftell(f) ftello(f) -#define l_seeknum off_t - -#elif defined(LUA_USE_WINDOWS) && !defined(_CRTIMP_TYPEINFO) \ - && defined(_MSC_VER) && (_MSC_VER >= 1400) /* }{ */ - -/* Windows (but not DDK) and Visual C++ 2005 or higher */ -#define l_fseek(f,o,w) _fseeki64(f,o,w) -#define l_ftell(f) _ftelli64(f) -#define l_seeknum __int64 - -#else /* }{ */ - -/* ISO C definitions */ -#define l_fseek(f,o,w) fseek(f,o,w) -#define l_ftell(f) ftell(f) -#define l_seeknum long - -#endif /* } */ - -#endif /* } */ - -/* }====================================================== */ - - -#define IO_PREFIX "_IO_" -#define IOPREF_LEN (sizeof(IO_PREFIX)/sizeof(char) - 1) -#define IO_INPUT (IO_PREFIX "input") -#define IO_OUTPUT (IO_PREFIX "output") - - -typedef luaL_Stream LStream; - - -#define tolstream(L) ((LStream *)luaL_checkudata(L, 1, LUA_FILEHANDLE)) - -#define isclosed(p) ((p)->closef == NULL) - - -static int io_type (lua_State *L) { - LStream *p; - luaL_checkany(L, 1); - p = (LStream *)luaL_testudata(L, 1, LUA_FILEHANDLE); - if (p == NULL) - lua_pushnil(L); /* not a file */ - else if (isclosed(p)) - lua_pushliteral(L, "closed file"); - else - lua_pushliteral(L, "file"); - return 1; -} - - -static int f_tostring (lua_State *L) { - LStream *p = tolstream(L); - if (isclosed(p)) - lua_pushliteral(L, "file (closed)"); - else - lua_pushfstring(L, "file (%p)", p->f); - return 1; -} - - -static FILE *tofile (lua_State *L) { - LStream *p = tolstream(L); - if (isclosed(p)) - luaL_error(L, "attempt to use a closed file"); - lua_assert(p->f); - return p->f; -} - - -/* -** When creating file handles, always creates a 'closed' file handle -** before opening the actual file; so, if there is a memory error, the -** file is not left opened. -*/ -static LStream *newprefile (lua_State *L) { - LStream *p = (LStream *)lua_newuserdata(L, sizeof(LStream)); - p->closef = NULL; /* mark file handle as 'closed' */ - luaL_setmetatable(L, LUA_FILEHANDLE); - return p; -} - - -/* -** Calls the 'close' function from a file handle. The 'volatile' avoids -** a bug in some versions of the Clang compiler (e.g., clang 3.0 for -** 32 bits). -*/ -static int aux_close (lua_State *L) { - LStream *p = tolstream(L); - volatile lua_CFunction cf = p->closef; - p->closef = NULL; /* mark stream as closed */ - return (*cf)(L); /* close it */ -} - - -static int io_close (lua_State *L) { - if (lua_isnone(L, 1)) /* no argument? */ - lua_getfield(L, LUA_REGISTRYINDEX, IO_OUTPUT); /* use standard output */ - tofile(L); /* make sure argument is an open stream */ - return aux_close(L); -} - - -static int f_gc (lua_State *L) { - LStream *p = tolstream(L); - if (!isclosed(p) && p->f != NULL) - aux_close(L); /* ignore closed and incompletely open files */ - return 0; -} - - -/* -** function to close regular files -*/ -static int io_fclose (lua_State *L) { - LStream *p = tolstream(L); - int res = fclose(p->f); - return luaL_fileresult(L, (res == 0), NULL); -} - - -static LStream *newfile (lua_State *L) { - LStream *p = newprefile(L); - p->f = NULL; - p->closef = &io_fclose; - return p; -} - - -static void opencheck (lua_State *L, const char *fname, const char *mode) { - LStream *p = newfile(L); - p->f = fopen(fname, mode); - if (p->f == NULL) - luaL_error(L, "cannot open file '%s' (%s)", fname, strerror(errno)); -} - - -static int io_open (lua_State *L) { - const char *filename = luaL_checkstring(L, 1); - const char *mode = luaL_optstring(L, 2, "r"); - LStream *p = newfile(L); - const char *md = mode; /* to traverse/check mode */ - luaL_argcheck(L, l_checkmode(md), 2, "invalid mode"); - p->f = fopen(filename, mode); - return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1; -} - - -/* -** function to close 'popen' files -*/ -static int io_pclose (lua_State *L) { - LStream *p = tolstream(L); - return luaL_execresult(L, l_pclose(L, p->f)); -} - - -static int io_popen (lua_State *L) { - const char *filename = luaL_checkstring(L, 1); - const char *mode = luaL_optstring(L, 2, "r"); - LStream *p = newprefile(L); - p->f = l_popen(L, filename, mode); - p->closef = &io_pclose; - return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1; -} - - -static int io_tmpfile (lua_State *L) { - LStream *p = newfile(L); - p->f = tmpfile(); - return (p->f == NULL) ? luaL_fileresult(L, 0, NULL) : 1; -} - - -static FILE *getiofile (lua_State *L, const char *findex) { - LStream *p; - lua_getfield(L, LUA_REGISTRYINDEX, findex); - p = (LStream *)lua_touserdata(L, -1); - if (isclosed(p)) - luaL_error(L, "standard %s file is closed", findex + IOPREF_LEN); - return p->f; -} - - -static int g_iofile (lua_State *L, const char *f, const char *mode) { - if (!lua_isnoneornil(L, 1)) { - const char *filename = lua_tostring(L, 1); - if (filename) - opencheck(L, filename, mode); - else { - tofile(L); /* check that it's a valid file handle */ - lua_pushvalue(L, 1); - } - lua_setfield(L, LUA_REGISTRYINDEX, f); - } - /* return current value */ - lua_getfield(L, LUA_REGISTRYINDEX, f); - return 1; -} - - -static int io_input (lua_State *L) { - return g_iofile(L, IO_INPUT, "r"); -} - - -static int io_output (lua_State *L) { - return g_iofile(L, IO_OUTPUT, "w"); -} - - -static int io_readline (lua_State *L); - - -static void aux_lines (lua_State *L, int toclose) { - int n = lua_gettop(L) - 1; /* number of arguments to read */ - lua_pushinteger(L, n); /* number of arguments to read */ - lua_pushboolean(L, toclose); /* close/not close file when finished */ - lua_rotate(L, 2, 2); /* move 'n' and 'toclose' to their positions */ - lua_pushcclosure(L, io_readline, 3 + n); -} - - -static int f_lines (lua_State *L) { - tofile(L); /* check that it's a valid file handle */ - aux_lines(L, 0); - return 1; -} - - -static int io_lines (lua_State *L) { - int toclose; - if (lua_isnone(L, 1)) lua_pushnil(L); /* at least one argument */ - if (lua_isnil(L, 1)) { /* no file name? */ - lua_getfield(L, LUA_REGISTRYINDEX, IO_INPUT); /* get default input */ - lua_replace(L, 1); /* put it at index 1 */ - tofile(L); /* check that it's a valid file handle */ - toclose = 0; /* do not close it after iteration */ - } - else { /* open a new file */ - const char *filename = luaL_checkstring(L, 1); - opencheck(L, filename, "r"); - lua_replace(L, 1); /* put file at index 1 */ - toclose = 1; /* close it after iteration */ - } - aux_lines(L, toclose); - return 1; -} - - -/* -** {====================================================== -** READ -** ======================================================= -*/ - - -/* maximum length of a numeral */ -#define MAXRN 200 - -/* auxiliary structure used by 'read_number' */ -typedef struct { - FILE *f; /* file being read */ - int c; /* current character (look ahead) */ - int n; /* number of elements in buffer 'buff' */ - char buff[MAXRN + 1]; /* +1 for ending '\0' */ -} RN; - - -/* -** Add current char to buffer (if not out of space) and read next one -*/ -static int nextc (RN *rn) { - if (rn->n >= MAXRN) { /* buffer overflow? */ - rn->buff[0] = '\0'; /* invalidate result */ - return 0; /* fail */ - } - else { - rn->buff[rn->n++] = rn->c; /* save current char */ - rn->c = l_getc(rn->f); /* read next one */ - return 1; - } -} - - -/* -** Accept current char if it is in 'set' (of size 1 or 2) -*/ -static int test2 (RN *rn, const char *set) { - if (rn->c == set[0] || (rn->c == set[1] && rn->c != '\0')) - return nextc(rn); - else return 0; -} - - -/* -** Read a sequence of (hex)digits -*/ -static int readdigits (RN *rn, int hex) { - int count = 0; - while ((hex ? isxdigit(rn->c) : isdigit(rn->c)) && nextc(rn)) - count++; - return count; -} - - -/* access to locale "radix character" (decimal point) */ -#if !defined(l_getlocaledecpoint) -#define l_getlocaledecpoint() (localeconv()->decimal_point[0]) -#endif - - -/* -** Read a number: first reads a valid prefix of a numeral into a buffer. -** Then it calls 'lua_stringtonumber' to check whether the format is -** correct and to convert it to a Lua number -*/ -static int read_number (lua_State *L, FILE *f) { - RN rn; - int count = 0; - int hex = 0; - char decp[2] = "."; - rn.f = f; rn.n = 0; - decp[0] = l_getlocaledecpoint(); /* get decimal point from locale */ - l_lockfile(rn.f); - do { rn.c = l_getc(rn.f); } while (isspace(rn.c)); /* skip spaces */ - test2(&rn, "-+"); /* optional signal */ - if (test2(&rn, "0")) { - if (test2(&rn, "xX")) hex = 1; /* numeral is hexadecimal */ - else count = 1; /* count initial '0' as a valid digit */ - } - count += readdigits(&rn, hex); /* integral part */ - if (test2(&rn, decp)) /* decimal point? */ - count += readdigits(&rn, hex); /* fractional part */ - if (count > 0 && test2(&rn, (hex ? "pP" : "eE"))) { /* exponent mark? */ - test2(&rn, "-+"); /* exponent signal */ - readdigits(&rn, 0); /* exponent digits */ - } - ungetc(rn.c, rn.f); /* unread look-ahead char */ - l_unlockfile(rn.f); - rn.buff[rn.n] = '\0'; /* finish string */ - if (lua_stringtonumber(L, rn.buff)) /* is this a valid number? */ - return 1; /* ok */ - else { /* invalid format */ - lua_pushnil(L); /* "result" to be removed */ - return 0; /* read fails */ - } -} - - -static int test_eof (lua_State *L, FILE *f) { - int c = getc(f); - ungetc(c, f); /* no-op when c == EOF */ - lua_pushlstring(L, NULL, 0); - return (c != EOF); -} - - -static int read_line (lua_State *L, FILE *f, int chop) { - luaL_Buffer b; - int c = '\0'; - luaL_buffinit(L, &b); - while (c != EOF && c != '\n') { /* repeat until end of line */ - char *buff = luaL_prepbuffer(&b); /* pre-allocate buffer */ - int i = 0; - l_lockfile(f); /* no memory errors can happen inside the lock */ - while (i < LUAL_BUFFERSIZE && (c = l_getc(f)) != EOF && c != '\n') - buff[i++] = c; - l_unlockfile(f); - luaL_addsize(&b, i); - } - if (!chop && c == '\n') /* want a newline and have one? */ - luaL_addchar(&b, c); /* add ending newline to result */ - luaL_pushresult(&b); /* close buffer */ - /* return ok if read something (either a newline or something else) */ - return (c == '\n' || lua_rawlen(L, -1) > 0); -} - - -static void read_all (lua_State *L, FILE *f) { - size_t nr; - luaL_Buffer b; - luaL_buffinit(L, &b); - do { /* read file in chunks of LUAL_BUFFERSIZE bytes */ - char *p = luaL_prepbuffsize(&b, LUAL_BUFFERSIZE); - nr = fread(p, sizeof(char), LUAL_BUFFERSIZE, f); - luaL_addsize(&b, nr); - } while (nr == LUAL_BUFFERSIZE); - luaL_pushresult(&b); /* close buffer */ -} - - -static int read_chars (lua_State *L, FILE *f, size_t n) { - size_t nr; /* number of chars actually read */ - char *p; - luaL_Buffer b; - luaL_buffinit(L, &b); - p = luaL_prepbuffsize(&b, n); /* prepare buffer to read whole block */ - nr = fread(p, sizeof(char), n, f); /* try to read 'n' chars */ - luaL_addsize(&b, nr); - luaL_pushresult(&b); /* close buffer */ - return (nr > 0); /* true iff read something */ -} - - -static int g_read (lua_State *L, FILE *f, int first) { - int nargs = lua_gettop(L) - 1; - int success; - int n; - clearerr(f); - if (nargs == 0) { /* no arguments? */ - success = read_line(L, f, 1); - n = first+1; /* to return 1 result */ - } - else { /* ensure stack space for all results and for auxlib's buffer */ - luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments"); - success = 1; - for (n = first; nargs-- && success; n++) { - if (lua_type(L, n) == LUA_TNUMBER) { - size_t l = (size_t)luaL_checkinteger(L, n); - success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l); - } - else { - const char *p = luaL_checkstring(L, n); - if (*p == '*') p++; /* skip optional '*' (for compatibility) */ - switch (*p) { - case 'n': /* number */ - success = read_number(L, f); - break; - case 'l': /* line */ - success = read_line(L, f, 1); - break; - case 'L': /* line with end-of-line */ - success = read_line(L, f, 0); - break; - case 'a': /* file */ - read_all(L, f); /* read entire file */ - success = 1; /* always success */ - break; - default: - return luaL_argerror(L, n, "invalid format"); - } - } - } - } - if (ferror(f)) - return luaL_fileresult(L, 0, NULL); - if (!success) { - lua_pop(L, 1); /* remove last result */ - lua_pushnil(L); /* push nil instead */ - } - return n - first; -} - - -static int io_read (lua_State *L) { - return g_read(L, getiofile(L, IO_INPUT), 1); -} - - -static int f_read (lua_State *L) { - return g_read(L, tofile(L), 2); -} - - -static int io_readline (lua_State *L) { - LStream *p = (LStream *)lua_touserdata(L, lua_upvalueindex(1)); - int i; - int n = (int)lua_tointeger(L, lua_upvalueindex(2)); - if (isclosed(p)) /* file is already closed? */ - return luaL_error(L, "file is already closed"); - lua_settop(L , 1); - luaL_checkstack(L, n, "too many arguments"); - for (i = 1; i <= n; i++) /* push arguments to 'g_read' */ - lua_pushvalue(L, lua_upvalueindex(3 + i)); - n = g_read(L, p->f, 2); /* 'n' is number of results */ - lua_assert(n > 0); /* should return at least a nil */ - if (lua_toboolean(L, -n)) /* read at least one value? */ - return n; /* return them */ - else { /* first result is nil: EOF or error */ - if (n > 1) { /* is there error information? */ - /* 2nd result is error message */ - return luaL_error(L, "%s", lua_tostring(L, -n + 1)); - } - if (lua_toboolean(L, lua_upvalueindex(3))) { /* generator created file? */ - lua_settop(L, 0); - lua_pushvalue(L, lua_upvalueindex(1)); - aux_close(L); /* close it */ - } - return 0; - } -} - -/* }====================================================== */ - - -static int g_write (lua_State *L, FILE *f, int arg) { - int nargs = lua_gettop(L) - arg; - int status = 1; - for (; nargs--; arg++) { - if (lua_type(L, arg) == LUA_TNUMBER) { - /* optimization: could be done exactly as for strings */ - int len = lua_isinteger(L, arg) - ? fprintf(f, LUA_INTEGER_FMT, lua_tointeger(L, arg)) - : fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)); - status = status && (len > 0); - } - else { - size_t l; - const char *s = luaL_checklstring(L, arg, &l); - status = status && (fwrite(s, sizeof(char), l, f) == l); - } - } - if (status) return 1; /* file handle already on stack top */ - else return luaL_fileresult(L, status, NULL); -} - - -static int io_write (lua_State *L) { - return g_write(L, getiofile(L, IO_OUTPUT), 1); -} - - -static int f_write (lua_State *L) { - FILE *f = tofile(L); - lua_pushvalue(L, 1); /* push file at the stack top (to be returned) */ - return g_write(L, f, 2); -} - - -static int f_seek (lua_State *L) { - static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; - static const char *const modenames[] = {"set", "cur", "end", NULL}; - FILE *f = tofile(L); - int op = luaL_checkoption(L, 2, "cur", modenames); - lua_Integer p3 = luaL_optinteger(L, 3, 0); - l_seeknum offset = (l_seeknum)p3; - luaL_argcheck(L, (lua_Integer)offset == p3, 3, - "not an integer in proper range"); - op = l_fseek(f, offset, mode[op]); - if (op) - return luaL_fileresult(L, 0, NULL); /* error */ - else { - lua_pushinteger(L, (lua_Integer)l_ftell(f)); - return 1; - } -} - - -static int f_setvbuf (lua_State *L) { - static const int mode[] = {_IONBF, _IOFBF, _IOLBF}; - static const char *const modenames[] = {"no", "full", "line", NULL}; - FILE *f = tofile(L); - int op = luaL_checkoption(L, 2, NULL, modenames); - lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE); - int res = setvbuf(f, NULL, mode[op], (size_t)sz); - return luaL_fileresult(L, res == 0, NULL); -} - - - -static int io_flush (lua_State *L) { - return luaL_fileresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); -} - - -static int f_flush (lua_State *L) { - return luaL_fileresult(L, fflush(tofile(L)) == 0, NULL); -} - - -/* -** functions for 'io' library -*/ -static const luaL_Reg iolib[] = { - {"close", io_close}, - {"flush", io_flush}, - {"input", io_input}, - {"lines", io_lines}, - {"open", io_open}, - {"output", io_output}, - {"popen", io_popen}, - {"read", io_read}, - {"tmpfile", io_tmpfile}, - {"type", io_type}, - {"write", io_write}, - {NULL, NULL} -}; - - -/* -** methods for file handles -*/ -static const luaL_Reg flib[] = { - {"close", io_close}, - {"flush", f_flush}, - {"lines", f_lines}, - {"read", f_read}, - {"seek", f_seek}, - {"setvbuf", f_setvbuf}, - {"write", f_write}, - {"__gc", f_gc}, - {"__tostring", f_tostring}, - {NULL, NULL} -}; - - -static void createmeta (lua_State *L) { - luaL_newmetatable(L, LUA_FILEHANDLE); /* create metatable for file handles */ - lua_pushvalue(L, -1); /* push metatable */ - lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */ - luaL_setfuncs(L, flib, 0); /* add file methods to new metatable */ - lua_pop(L, 1); /* pop new metatable */ -} - - -/* -** function to (not) close the standard files stdin, stdout, and stderr -*/ -static int io_noclose (lua_State *L) { - LStream *p = tolstream(L); - p->closef = &io_noclose; /* keep file opened */ - lua_pushnil(L); - lua_pushliteral(L, "cannot close standard file"); - return 2; -} - - -static void createstdfile (lua_State *L, FILE *f, const char *k, - const char *fname) { - LStream *p = newprefile(L); - p->f = f; - p->closef = &io_noclose; - if (k != NULL) { - lua_pushvalue(L, -1); - lua_setfield(L, LUA_REGISTRYINDEX, k); /* add file to registry */ - } - lua_setfield(L, -2, fname); /* add file to module */ -} - - -LUAMOD_API int luaopen_io (lua_State *L) { - luaL_newlib(L, iolib); /* new module */ - createmeta(L); - /* create (and set) default files */ - createstdfile(L, stdin, IO_INPUT, "stdin"); - createstdfile(L, stdout, IO_OUTPUT, "stdout"); - createstdfile(L, stderr, NULL, "stderr"); - return 1; -} - diff --git a/3rd/lua/src/llex.c b/3rd/lua/src/llex.c deleted file mode 100644 index 6e4a457..0000000 --- a/3rd/lua/src/llex.c +++ /dev/null @@ -1,602 +0,0 @@ -/* -** $Id: llex.c,v 2.89 2014/11/14 16:06:09 roberto Exp $ -** Lexical Analyzer -** See Copyright Notice in lua.h -*/ - -#define llex_c -#define LUA_CORE - -#include "lprefix.h" - - -#include -#include - -#include "lua.h" - -#include "lctype.h" -#include "ldo.h" -#include "lgc.h" -#include "llex.h" -#include "lobject.h" -#include "lparser.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "lzio.h" - - - -#define next(ls) (ls->current = zgetc(ls->z)) - - - -#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') - - -/* ORDER RESERVED */ -static const char *const luaX_tokens [] = { - "and", "break", "do", "else", "elseif", - "end", "false", "for", "function", "goto", "if", - "in", "local", "nil", "not", "or", "repeat", - "return", "then", "true", "until", "while", - "//", "..", "...", "==", ">=", "<=", "~=", - "<<", ">>", "::", "", - "", "", "", "" -}; - - -#define save_and_next(ls) (save(ls, ls->current), next(ls)) - - -static l_noret lexerror (LexState *ls, const char *msg, int token); - - -static void save (LexState *ls, int c) { - Mbuffer *b = ls->buff; - if (luaZ_bufflen(b) + 1 > luaZ_sizebuffer(b)) { - size_t newsize; - if (luaZ_sizebuffer(b) >= MAX_SIZE/2) - lexerror(ls, "lexical element too long", 0); - newsize = luaZ_sizebuffer(b) * 2; - luaZ_resizebuffer(ls->L, b, newsize); - } - b->buffer[luaZ_bufflen(b)++] = cast(char, c); -} - - -void luaX_init (lua_State *L) { - int i; - TString *e = luaS_new(L, LUA_ENV); /* create env name */ - luaC_fix(L, obj2gco(e)); /* never collect this name */ - for (i=0; iextra = cast_byte(i+1); /* reserved word */ - } -} - - -const char *luaX_token2str (LexState *ls, int token) { - if (token < FIRST_RESERVED) { /* single-byte symbols? */ - lua_assert(token == cast_uchar(token)); - return luaO_pushfstring(ls->L, "'%c'", token); - } - else { - const char *s = luaX_tokens[token - FIRST_RESERVED]; - if (token < TK_EOS) /* fixed format (symbols and reserved words)? */ - return luaO_pushfstring(ls->L, "'%s'", s); - else /* names, strings, and numerals */ - return s; - } -} - - -static const char *txtToken (LexState *ls, int token) { - switch (token) { - case TK_NAME: case TK_STRING: - case TK_FLT: case TK_INT: - save(ls, '\0'); - return luaO_pushfstring(ls->L, "'%s'", luaZ_buffer(ls->buff)); - default: - return luaX_token2str(ls, token); - } -} - - -static l_noret lexerror (LexState *ls, const char *msg, int token) { - char buff[LUA_IDSIZE]; - luaO_chunkid(buff, getstr(ls->source), LUA_IDSIZE); - msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg); - if (token) - luaO_pushfstring(ls->L, "%s near %s", msg, txtToken(ls, token)); - luaD_throw(ls->L, LUA_ERRSYNTAX); -} - - -l_noret luaX_syntaxerror (LexState *ls, const char *msg) { - lexerror(ls, msg, ls->t.token); -} - - -/* -** creates a new string and anchors it in scanner's table so that -** it will not be collected until the end of the compilation -** (by that time it should be anchored somewhere) -*/ -TString *luaX_newstring (LexState *ls, const char *str, size_t l) { - lua_State *L = ls->L; - TValue *o; /* entry for 'str' */ - TString *ts = luaS_newlstr(L, str, l); /* create new string */ - setsvalue2s(L, L->top++, ts); /* temporarily anchor it in stack */ - o = luaH_set(L, ls->h, L->top - 1); - if (ttisnil(o)) { /* not in use yet? */ - /* boolean value does not need GC barrier; - table has no metatable, so it does not need to invalidate cache */ - setbvalue(o, 1); /* t[string] = true */ - luaC_checkGC(L); - } - else { /* string already present */ - ts = tsvalue(keyfromval(o)); /* re-use value previously stored */ - } - L->top--; /* remove string from stack */ - return ts; -} - - -/* -** increment line number and skips newline sequence (any of -** \n, \r, \n\r, or \r\n) -*/ -static void inclinenumber (LexState *ls) { - int old = ls->current; - lua_assert(currIsNewline(ls)); - next(ls); /* skip '\n' or '\r' */ - if (currIsNewline(ls) && ls->current != old) - next(ls); /* skip '\n\r' or '\r\n' */ - if (++ls->linenumber >= MAX_INT) - lexerror(ls, "chunk has too many lines", 0); -} - - -void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source, - int firstchar) { - ls->t.token = 0; - ls->decpoint = '.'; - ls->L = L; - ls->current = firstchar; - ls->lookahead.token = TK_EOS; /* no look-ahead token */ - ls->z = z; - ls->fs = NULL; - ls->linenumber = 1; - ls->lastline = 1; - ls->source = source; - ls->envn = luaS_new(L, LUA_ENV); /* get env name */ - luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ -} - - - -/* -** ======================================================= -** LEXICAL ANALYZER -** ======================================================= -*/ - - -static int check_next1 (LexState *ls, int c) { - if (ls->current == c) { - next(ls); - return 1; - } - else return 0; -} - - -/* -** Check whether current char is in set 'set' (with two chars) and -** saves it -*/ -static int check_next2 (LexState *ls, const char *set) { - lua_assert(set[2] == '\0'); - if (ls->current == set[0] || ls->current == set[1]) { - save_and_next(ls); - return 1; - } - else return 0; -} - - -/* -** change all characters 'from' in buffer to 'to' -*/ -static void buffreplace (LexState *ls, char from, char to) { - if (from != to) { - size_t n = luaZ_bufflen(ls->buff); - char *p = luaZ_buffer(ls->buff); - while (n--) - if (p[n] == from) p[n] = to; - } -} - - -#if !defined(l_getlocaledecpoint) -#define l_getlocaledecpoint() (localeconv()->decimal_point[0]) -#endif - - -#define buff2num(b,o) (luaO_str2num(luaZ_buffer(b), o) != 0) - -/* -** in case of format error, try to change decimal point separator to -** the one defined in the current locale and check again -*/ -static void trydecpoint (LexState *ls, TValue *o) { - char old = ls->decpoint; - ls->decpoint = l_getlocaledecpoint(); - buffreplace(ls, old, ls->decpoint); /* try new decimal separator */ - if (!buff2num(ls->buff, o)) { - /* format error with correct decimal point: no more options */ - buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */ - lexerror(ls, "malformed number", TK_FLT); - } -} - - -/* LUA_NUMBER */ -/* -** this function is quite liberal in what it accepts, as 'luaO_str2num' -** will reject ill-formed numerals. -*/ -static int read_numeral (LexState *ls, SemInfo *seminfo) { - TValue obj; - const char *expo = "Ee"; - int first = ls->current; - lua_assert(lisdigit(ls->current)); - save_and_next(ls); - if (first == '0' && check_next2(ls, "xX")) /* hexadecimal? */ - expo = "Pp"; - for (;;) { - if (check_next2(ls, expo)) /* exponent part? */ - check_next2(ls, "-+"); /* optional exponent sign */ - if (lisxdigit(ls->current)) - save_and_next(ls); - else if (ls->current == '.') - save_and_next(ls); - else break; - } - save(ls, '\0'); - buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */ - if (!buff2num(ls->buff, &obj)) /* format error? */ - trydecpoint(ls, &obj); /* try to update decimal point separator */ - if (ttisinteger(&obj)) { - seminfo->i = ivalue(&obj); - return TK_INT; - } - else { - lua_assert(ttisfloat(&obj)); - seminfo->r = fltvalue(&obj); - return TK_FLT; - } -} - - -/* -** skip a sequence '[=*[' or ']=*]' and return its number of '='s or -** -1 if sequence is malformed -*/ -static int skip_sep (LexState *ls) { - int count = 0; - int s = ls->current; - lua_assert(s == '[' || s == ']'); - save_and_next(ls); - while (ls->current == '=') { - save_and_next(ls); - count++; - } - return (ls->current == s) ? count : (-count) - 1; -} - - -static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) { - int line = ls->linenumber; /* initial line (for error message) */ - save_and_next(ls); /* skip 2nd '[' */ - if (currIsNewline(ls)) /* string starts with a newline? */ - inclinenumber(ls); /* skip it */ - for (;;) { - switch (ls->current) { - case EOZ: { /* error */ - const char *what = (seminfo ? "string" : "comment"); - const char *msg = luaO_pushfstring(ls->L, - "unfinished long %s (starting at line %d)", what, line); - lexerror(ls, msg, TK_EOS); - break; /* to avoid warnings */ - } - case ']': { - if (skip_sep(ls) == sep) { - save_and_next(ls); /* skip 2nd ']' */ - goto endloop; - } - break; - } - case '\n': case '\r': { - save(ls, '\n'); - inclinenumber(ls); - if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */ - break; - } - default: { - if (seminfo) save_and_next(ls); - else next(ls); - } - } - } endloop: - if (seminfo) - seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep), - luaZ_bufflen(ls->buff) - 2*(2 + sep)); -} - - -static void esccheck (LexState *ls, int c, const char *msg) { - if (!c) { - if (ls->current != EOZ) - save_and_next(ls); /* add current to buffer for error message */ - lexerror(ls, msg, TK_STRING); - } -} - - -static int gethexa (LexState *ls) { - save_and_next(ls); - esccheck (ls, lisxdigit(ls->current), "hexadecimal digit expected"); - return luaO_hexavalue(ls->current); -} - - -static int readhexaesc (LexState *ls) { - int r = gethexa(ls); - r = (r << 4) + gethexa(ls); - luaZ_buffremove(ls->buff, 2); /* remove saved chars from buffer */ - return r; -} - - -static unsigned long readutf8esc (LexState *ls) { - unsigned long r; - int i = 4; /* chars to be removed: '\', 'u', '{', and first digit */ - save_and_next(ls); /* skip 'u' */ - esccheck(ls, ls->current == '{', "missing '{'"); - r = gethexa(ls); /* must have at least one digit */ - while ((save_and_next(ls), lisxdigit(ls->current))) { - i++; - r = (r << 4) + luaO_hexavalue(ls->current); - esccheck(ls, r <= 0x10FFFF, "UTF-8 value too large"); - } - esccheck(ls, ls->current == '}', "missing '}'"); - next(ls); /* skip '}' */ - luaZ_buffremove(ls->buff, i); /* remove saved chars from buffer */ - return r; -} - - -static void utf8esc (LexState *ls) { - char buff[UTF8BUFFSZ]; - int n = luaO_utf8esc(buff, readutf8esc(ls)); - for (; n > 0; n--) /* add 'buff' to string */ - save(ls, buff[UTF8BUFFSZ - n]); -} - - -static int readdecesc (LexState *ls) { - int i; - int r = 0; /* result accumulator */ - for (i = 0; i < 3 && lisdigit(ls->current); i++) { /* read up to 3 digits */ - r = 10*r + ls->current - '0'; - save_and_next(ls); - } - esccheck(ls, r <= UCHAR_MAX, "decimal escape too large"); - luaZ_buffremove(ls->buff, i); /* remove read digits from buffer */ - return r; -} - - -static void read_string (LexState *ls, int del, SemInfo *seminfo) { - save_and_next(ls); /* keep delimiter (for error messages) */ - while (ls->current != del) { - switch (ls->current) { - case EOZ: - lexerror(ls, "unfinished string", TK_EOS); - break; /* to avoid warnings */ - case '\n': - case '\r': - lexerror(ls, "unfinished string", TK_STRING); - break; /* to avoid warnings */ - case '\\': { /* escape sequences */ - int c; /* final character to be saved */ - save_and_next(ls); /* keep '\\' for error messages */ - switch (ls->current) { - case 'a': c = '\a'; goto read_save; - case 'b': c = '\b'; goto read_save; - case 'f': c = '\f'; goto read_save; - case 'n': c = '\n'; goto read_save; - case 'r': c = '\r'; goto read_save; - case 't': c = '\t'; goto read_save; - case 'v': c = '\v'; goto read_save; - case 'x': c = readhexaesc(ls); goto read_save; - case 'u': utf8esc(ls); goto no_save; - case '\n': case '\r': - inclinenumber(ls); c = '\n'; goto only_save; - case '\\': case '\"': case '\'': - c = ls->current; goto read_save; - case EOZ: goto no_save; /* will raise an error next loop */ - case 'z': { /* zap following span of spaces */ - luaZ_buffremove(ls->buff, 1); /* remove '\\' */ - next(ls); /* skip the 'z' */ - while (lisspace(ls->current)) { - if (currIsNewline(ls)) inclinenumber(ls); - else next(ls); - } - goto no_save; - } - default: { - esccheck(ls, lisdigit(ls->current), "invalid escape sequence"); - c = readdecesc(ls); /* digital escape '\ddd' */ - goto only_save; - } - } - read_save: - next(ls); - /* go through */ - only_save: - luaZ_buffremove(ls->buff, 1); /* remove '\\' */ - save(ls, c); - /* go through */ - no_save: break; - } - default: - save_and_next(ls); - } - } - save_and_next(ls); /* skip delimiter */ - seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1, - luaZ_bufflen(ls->buff) - 2); -} - - -static int llex (LexState *ls, SemInfo *seminfo) { - luaZ_resetbuffer(ls->buff); - for (;;) { - switch (ls->current) { - case '\n': case '\r': { /* line breaks */ - inclinenumber(ls); - break; - } - case ' ': case '\f': case '\t': case '\v': { /* spaces */ - next(ls); - break; - } - case '-': { /* '-' or '--' (comment) */ - next(ls); - if (ls->current != '-') return '-'; - /* else is a comment */ - next(ls); - if (ls->current == '[') { /* long comment? */ - int sep = skip_sep(ls); - luaZ_resetbuffer(ls->buff); /* 'skip_sep' may dirty the buffer */ - if (sep >= 0) { - read_long_string(ls, NULL, sep); /* skip long comment */ - luaZ_resetbuffer(ls->buff); /* previous call may dirty the buff. */ - break; - } - } - /* else short comment */ - while (!currIsNewline(ls) && ls->current != EOZ) - next(ls); /* skip until end of line (or end of file) */ - break; - } - case '[': { /* long string or simply '[' */ - int sep = skip_sep(ls); - if (sep >= 0) { - read_long_string(ls, seminfo, sep); - return TK_STRING; - } - else if (sep == -1) return '['; - else lexerror(ls, "invalid long string delimiter", TK_STRING); - } - case '=': { - next(ls); - if (check_next1(ls, '=')) return TK_EQ; - else return '='; - } - case '<': { - next(ls); - if (check_next1(ls, '=')) return TK_LE; - else if (check_next1(ls, '<')) return TK_SHL; - else return '<'; - } - case '>': { - next(ls); - if (check_next1(ls, '=')) return TK_GE; - else if (check_next1(ls, '>')) return TK_SHR; - else return '>'; - } - case '/': { - next(ls); - if (check_next1(ls, '/')) return TK_IDIV; - else return '/'; - } - case '~': { - next(ls); - if (check_next1(ls, '=')) return TK_NE; - else return '~'; - } - case ':': { - next(ls); - if (check_next1(ls, ':')) return TK_DBCOLON; - else return ':'; - } - case '"': case '\'': { /* short literal strings */ - read_string(ls, ls->current, seminfo); - return TK_STRING; - } - case '.': { /* '.', '..', '...', or number */ - save_and_next(ls); - if (check_next1(ls, '.')) { - if (check_next1(ls, '.')) - return TK_DOTS; /* '...' */ - else return TK_CONCAT; /* '..' */ - } - else if (!lisdigit(ls->current)) return '.'; - else return read_numeral(ls, seminfo); - } - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': { - return read_numeral(ls, seminfo); - } - case EOZ: { - return TK_EOS; - } - default: { - if (lislalpha(ls->current)) { /* identifier or reserved word? */ - TString *ts; - do { - save_and_next(ls); - } while (lislalnum(ls->current)); - ts = luaX_newstring(ls, luaZ_buffer(ls->buff), - luaZ_bufflen(ls->buff)); - seminfo->ts = ts; - if (isreserved(ts)) /* reserved word? */ - return ts->extra - 1 + FIRST_RESERVED; - else { - return TK_NAME; - } - } - else { /* single-char tokens (+ - / ...) */ - int c = ls->current; - next(ls); - return c; - } - } - } - } -} - - -void luaX_next (LexState *ls) { - ls->lastline = ls->linenumber; - if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ - ls->t = ls->lookahead; /* use this one */ - ls->lookahead.token = TK_EOS; /* and discharge it */ - } - else - ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */ -} - - -int luaX_lookahead (LexState *ls) { - lua_assert(ls->lookahead.token == TK_EOS); - ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); - return ls->lookahead.token; -} - diff --git a/3rd/lua/src/llex.h b/3rd/lua/src/llex.h deleted file mode 100644 index afb40b5..0000000 --- a/3rd/lua/src/llex.h +++ /dev/null @@ -1,86 +0,0 @@ -/* -** $Id: llex.h,v 1.78 2014/10/29 15:38:24 roberto Exp $ -** Lexical Analyzer -** See Copyright Notice in lua.h -*/ - -#ifndef llex_h -#define llex_h - -#include "lobject.h" -#include "lzio.h" - - -#define FIRST_RESERVED 257 - - -#if !defined(LUA_ENV) -#define LUA_ENV "_ENV" -#endif - - -/* -* WARNING: if you change the order of this enumeration, -* grep "ORDER RESERVED" -*/ -enum RESERVED { - /* terminal symbols denoted by reserved words */ - TK_AND = FIRST_RESERVED, TK_BREAK, - TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION, - TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, - TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, - /* other terminal symbols */ - TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, - TK_SHL, TK_SHR, - TK_DBCOLON, TK_EOS, - TK_FLT, TK_INT, TK_NAME, TK_STRING -}; - -/* number of reserved words */ -#define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1)) - - -typedef union { - lua_Number r; - lua_Integer i; - TString *ts; -} SemInfo; /* semantics information */ - - -typedef struct Token { - int token; - SemInfo seminfo; -} Token; - - -/* state of the lexer plus state of the parser when shared by all - functions */ -typedef struct LexState { - int current; /* current character (charint) */ - int linenumber; /* input line counter */ - int lastline; /* line of last token 'consumed' */ - Token t; /* current token */ - Token lookahead; /* look ahead token */ - struct FuncState *fs; /* current function (parser) */ - struct lua_State *L; - ZIO *z; /* input stream */ - Mbuffer *buff; /* buffer for tokens */ - Table *h; /* to avoid collection/reuse strings */ - struct Dyndata *dyd; /* dynamic structures used by the parser */ - TString *source; /* current source name */ - TString *envn; /* environment variable name */ - char decpoint; /* locale decimal point */ -} LexState; - - -LUAI_FUNC void luaX_init (lua_State *L); -LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, - TString *source, int firstchar); -LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l); -LUAI_FUNC void luaX_next (LexState *ls); -LUAI_FUNC int luaX_lookahead (LexState *ls); -LUAI_FUNC l_noret luaX_syntaxerror (LexState *ls, const char *s); -LUAI_FUNC const char *luaX_token2str (LexState *ls, int token); - - -#endif diff --git a/3rd/lua/src/llimits.h b/3rd/lua/src/llimits.h deleted file mode 100644 index 8f71a6f..0000000 --- a/3rd/lua/src/llimits.h +++ /dev/null @@ -1,242 +0,0 @@ -/* -** $Id: llimits.h,v 1.125 2014/12/19 13:30:23 roberto Exp $ -** Limits, basic types, and some other 'installation-dependent' definitions -** See Copyright Notice in lua.h -*/ - -#ifndef llimits_h -#define llimits_h - - -#include -#include - - -#include "lua.h" - -/* -** 'lu_mem' and 'l_mem' are unsigned/signed integers big enough to count -** the total memory used by Lua (in bytes). Usually, 'size_t' and -** 'ptrdiff_t' should work, but we use 'long' for 16-bit machines. -*/ -#if defined(LUAI_MEM) /* { external definitions? */ -typedef LUAI_UMEM lu_mem; -typedef LUAI_MEM l_mem; -#elif LUAI_BITSINT >= 32 /* }{ */ -typedef size_t lu_mem; -typedef ptrdiff_t l_mem; -#else /* 16-bit ints */ /* }{ */ -typedef unsigned long lu_mem; -typedef long l_mem; -#endif /* } */ - - -/* chars used as small naturals (so that 'char' is reserved for characters) */ -typedef unsigned char lu_byte; - - -/* maximum value for size_t */ -#define MAX_SIZET ((size_t)(~(size_t)0)) - -/* maximum size visible for Lua (must be representable in a lua_Integer */ -#define MAX_SIZE (sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \ - : (size_t)(LUA_MAXINTEGER)) - - -#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)) - -#define MAX_LMEM ((l_mem)(MAX_LUMEM >> 1)) - - -#define MAX_INT INT_MAX /* maximum value of an int */ - - -/* -** conversion of pointer to integer: -** this is for hashing only; there is no problem if the integer -** cannot hold the whole pointer value -*/ -#define point2int(p) ((unsigned int)((size_t)(p) & UINT_MAX)) - - - -/* type to ensure maximum alignment */ -#if defined(LUAI_USER_ALIGNMENT_T) -typedef LUAI_USER_ALIGNMENT_T L_Umaxalign; -#else -typedef union { double u; void *s; lua_Integer i; long l; } L_Umaxalign; -#endif - - - -/* types of 'usual argument conversions' for lua_Number and lua_Integer */ -typedef LUAI_UACNUMBER l_uacNumber; -typedef LUAI_UACINT l_uacInt; - - -/* internal assertions for in-house debugging */ -#if defined(lua_assert) -#define check_exp(c,e) (lua_assert(c), (e)) -/* to avoid problems with conditions too long */ -#define lua_longassert(c) { if (!(c)) lua_assert(0); } -#else -#define lua_assert(c) ((void)0) -#define check_exp(c,e) (e) -#define lua_longassert(c) ((void)0) -#endif - -/* -** assertion for checking API calls -*/ -#if defined(LUA_USE_APICHECK) -#include -#define luai_apicheck(e) assert(e) -#else -#define luai_apicheck(e) lua_assert(e) -#endif - - -#define api_check(e,msg) luai_apicheck((e) && msg) - - -#if !defined(UNUSED) -#define UNUSED(x) ((void)(x)) /* to avoid warnings */ -#endif - - -#define cast(t, exp) ((t)(exp)) - -#define cast_void(i) cast(void, (i)) -#define cast_byte(i) cast(lu_byte, (i)) -#define cast_num(i) cast(lua_Number, (i)) -#define cast_int(i) cast(int, (i)) -#define cast_uchar(i) cast(unsigned char, (i)) - - -/* cast a signed lua_Integer to lua_Unsigned */ -#if !defined(l_castS2U) -#define l_castS2U(i) ((lua_Unsigned)(i)) -#endif - -/* -** cast a lua_Unsigned to a signed lua_Integer; this cast is -** not strict ISO C, but two-complement architectures should -** work fine. -*/ -#if !defined(l_castU2S) -#define l_castU2S(i) ((lua_Integer)(i)) -#endif - - -/* -** non-return type -*/ -#if defined(__GNUC__) -#define l_noret void __attribute__((noreturn)) -#elif defined(_MSC_VER) && _MSC_VER >= 1200 -#define l_noret void __declspec(noreturn) -#else -#define l_noret void -#endif - - - -/* -** maximum depth for nested C calls and syntactical nested non-terminals -** in a program. (Value must fit in an unsigned short int.) -*/ -#if !defined(LUAI_MAXCCALLS) -#define LUAI_MAXCCALLS 200 -#endif - -/* -** maximum number of upvalues in a closure (both C and Lua). (Value -** must fit in an unsigned char.) -*/ -#define MAXUPVAL UCHAR_MAX - - -/* -** type for virtual-machine instructions; -** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) -*/ -#if LUAI_BITSINT >= 32 -typedef unsigned int Instruction; -#else -typedef unsigned long Instruction; -#endif - - - - -/* minimum size for the string table (must be power of 2) */ -#if !defined(MINSTRTABSIZE) -#define MINSTRTABSIZE 64 /* minimum size for "predefined" strings */ -#endif - - -/* minimum size for string buffer */ -#if !defined(LUA_MINBUFFER) -#define LUA_MINBUFFER 32 -#endif - - -#if !defined(lua_lock) -#define lua_lock(L) ((void) 0) -#define lua_unlock(L) ((void) 0) -#endif - -#if !defined(luai_threadyield) -#define luai_threadyield(L) {lua_unlock(L); lua_lock(L);} -#endif - - -/* -** these macros allow user-specific actions on threads when you defined -** LUAI_EXTRASPACE and need to do something extra when a thread is -** created/deleted/resumed/yielded. -*/ -#if !defined(luai_userstateopen) -#define luai_userstateopen(L) ((void)L) -#endif - -#if !defined(luai_userstateclose) -#define luai_userstateclose(L) ((void)L) -#endif - -#if !defined(luai_userstatethread) -#define luai_userstatethread(L,L1) ((void)L) -#endif - -#if !defined(luai_userstatefree) -#define luai_userstatefree(L,L1) ((void)L) -#endif - -#if !defined(luai_userstateresume) -#define luai_userstateresume(L,n) ((void)L) -#endif - -#if !defined(luai_userstateyield) -#define luai_userstateyield(L,n) ((void)L) -#endif - - - -/* -** macro to control inclusion of some hard tests on stack reallocation -*/ -#if !defined(HARDSTACKTESTS) -#define condmovestack(L) ((void)0) -#else -/* realloc stack keeping its size */ -#define condmovestack(L) luaD_reallocstack((L), (L)->stacksize) -#endif - -#if !defined(HARDMEMTESTS) -#define condchangemem(L) condmovestack(L) -#else -#define condchangemem(L) \ - ((void)(!(G(L)->gcrunning) || (luaC_fullgc(L, 0), 1))) -#endif - -#endif diff --git a/3rd/lua/src/lmathlib.c b/3rd/lua/src/lmathlib.c deleted file mode 100644 index 002c508..0000000 --- a/3rd/lua/src/lmathlib.c +++ /dev/null @@ -1,404 +0,0 @@ -/* -** $Id: lmathlib.c,v 1.114 2014/12/27 20:32:26 roberto Exp $ -** Standard mathematical library -** See Copyright Notice in lua.h -*/ - -#define lmathlib_c -#define LUA_LIB - -#include "lprefix.h" - - -#include -#include - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -#undef PI -#define PI (l_mathop(3.141592653589793238462643383279502884)) - - -#if !defined(l_rand) /* { */ -#if defined(LUA_USE_POSIX) -#define l_rand() random() -#define l_srand(x) srandom(x) -#define L_RANDMAX 2147483647 /* (2^31 - 1), following POSIX */ -#else -#define l_rand() rand() -#define l_srand(x) srand(x) -#define L_RANDMAX RAND_MAX -#endif -#endif /* } */ - - -static int math_abs (lua_State *L) { - if (lua_isinteger(L, 1)) { - lua_Integer n = lua_tointeger(L, 1); - if (n < 0) n = (lua_Integer)(0u - n); - lua_pushinteger(L, n); - } - else - lua_pushnumber(L, l_mathop(fabs)(luaL_checknumber(L, 1))); - return 1; -} - -static int math_sin (lua_State *L) { - lua_pushnumber(L, l_mathop(sin)(luaL_checknumber(L, 1))); - return 1; -} - -static int math_cos (lua_State *L) { - lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1))); - return 1; -} - -static int math_tan (lua_State *L) { - lua_pushnumber(L, l_mathop(tan)(luaL_checknumber(L, 1))); - return 1; -} - -static int math_asin (lua_State *L) { - lua_pushnumber(L, l_mathop(asin)(luaL_checknumber(L, 1))); - return 1; -} - -static int math_acos (lua_State *L) { - lua_pushnumber(L, l_mathop(acos)(luaL_checknumber(L, 1))); - return 1; -} - -static int math_atan (lua_State *L) { - lua_Number y = luaL_checknumber(L, 1); - lua_Number x = luaL_optnumber(L, 2, 1); - lua_pushnumber(L, l_mathop(atan2)(y, x)); - return 1; -} - - -static int math_toint (lua_State *L) { - int valid; - lua_Integer n = lua_tointegerx(L, 1, &valid); - if (valid) - lua_pushinteger(L, n); - else { - luaL_checkany(L, 1); - lua_pushnil(L); /* value is not convertible to integer */ - } - return 1; -} - - -static void pushnumint (lua_State *L, lua_Number d) { - lua_Integer n; - if (lua_numbertointeger(d, &n)) /* does 'd' fit in an integer? */ - lua_pushinteger(L, n); /* result is integer */ - else - lua_pushnumber(L, d); /* result is float */ -} - - -static int math_floor (lua_State *L) { - if (lua_isinteger(L, 1)) - lua_settop(L, 1); /* integer is its own floor */ - else { - lua_Number d = l_mathop(floor)(luaL_checknumber(L, 1)); - pushnumint(L, d); - } - return 1; -} - - -static int math_ceil (lua_State *L) { - if (lua_isinteger(L, 1)) - lua_settop(L, 1); /* integer is its own ceil */ - else { - lua_Number d = l_mathop(ceil)(luaL_checknumber(L, 1)); - pushnumint(L, d); - } - return 1; -} - - -static int math_fmod (lua_State *L) { - if (lua_isinteger(L, 1) && lua_isinteger(L, 2)) { - lua_Integer d = lua_tointeger(L, 2); - if ((lua_Unsigned)d + 1u <= 1u) { /* special cases: -1 or 0 */ - luaL_argcheck(L, d != 0, 2, "zero"); - lua_pushinteger(L, 0); /* avoid overflow with 0x80000... / -1 */ - } - else - lua_pushinteger(L, lua_tointeger(L, 1) % d); - } - else - lua_pushnumber(L, l_mathop(fmod)(luaL_checknumber(L, 1), - luaL_checknumber(L, 2))); - return 1; -} - - -/* -** next function does not use 'modf', avoiding problems with 'double*' -** (which is not compatible with 'float*') when lua_Number is not -** 'double'. -*/ -static int math_modf (lua_State *L) { - if (lua_isinteger(L ,1)) { - lua_settop(L, 1); /* number is its own integer part */ - lua_pushnumber(L, 0); /* no fractional part */ - } - else { - lua_Number n = luaL_checknumber(L, 1); - /* integer part (rounds toward zero) */ - lua_Number ip = (n < 0) ? l_mathop(ceil)(n) : l_mathop(floor)(n); - pushnumint(L, ip); - /* fractional part (test needed for inf/-inf) */ - lua_pushnumber(L, (n == ip) ? l_mathop(0.0) : (n - ip)); - } - return 2; -} - - -static int math_sqrt (lua_State *L) { - lua_pushnumber(L, l_mathop(sqrt)(luaL_checknumber(L, 1))); - return 1; -} - - -static int math_ult (lua_State *L) { - lua_Integer a = luaL_checkinteger(L, 1); - lua_Integer b = luaL_checkinteger(L, 2); - lua_pushboolean(L, (lua_Unsigned)a < (lua_Unsigned)b); - return 1; -} - -static int math_log (lua_State *L) { - lua_Number x = luaL_checknumber(L, 1); - lua_Number res; - if (lua_isnoneornil(L, 2)) - res = l_mathop(log)(x); - else { - lua_Number base = luaL_checknumber(L, 2); - if (base == 10.0) res = l_mathop(log10)(x); - else res = l_mathop(log)(x)/l_mathop(log)(base); - } - lua_pushnumber(L, res); - return 1; -} - -static int math_exp (lua_State *L) { - lua_pushnumber(L, l_mathop(exp)(luaL_checknumber(L, 1))); - return 1; -} - -static int math_deg (lua_State *L) { - lua_pushnumber(L, luaL_checknumber(L, 1) * (l_mathop(180.0) / PI)); - return 1; -} - -static int math_rad (lua_State *L) { - lua_pushnumber(L, luaL_checknumber(L, 1) * (PI / l_mathop(180.0))); - return 1; -} - - -static int math_min (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - int imin = 1; /* index of current minimum value */ - int i; - luaL_argcheck(L, n >= 1, 1, "value expected"); - for (i = 2; i <= n; i++) { - if (lua_compare(L, i, imin, LUA_OPLT)) - imin = i; - } - lua_pushvalue(L, imin); - return 1; -} - - -static int math_max (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - int imax = 1; /* index of current maximum value */ - int i; - luaL_argcheck(L, n >= 1, 1, "value expected"); - for (i = 2; i <= n; i++) { - if (lua_compare(L, imax, i, LUA_OPLT)) - imax = i; - } - lua_pushvalue(L, imax); - return 1; -} - -/* -** This function uses 'double' (instead of 'lua_Number') to ensure that -** all bits from 'l_rand' can be represented, and that 'RANDMAX + 1.0' -** will keep full precision (ensuring that 'r' is always less than 1.0.) -*/ -static int math_random (lua_State *L) { - lua_Integer low, up; - double r = (double)l_rand() * (1.0 / ((double)L_RANDMAX + 1.0)); - switch (lua_gettop(L)) { /* check number of arguments */ - case 0: { /* no arguments */ - lua_pushnumber(L, (lua_Number)r); /* Number between 0 and 1 */ - return 1; - } - case 1: { /* only upper limit */ - low = 1; - up = luaL_checkinteger(L, 1); - break; - } - case 2: { /* lower and upper limits */ - low = luaL_checkinteger(L, 1); - up = luaL_checkinteger(L, 2); - break; - } - default: return luaL_error(L, "wrong number of arguments"); - } - /* random integer in the interval [low, up] */ - luaL_argcheck(L, low <= up, 1, "interval is empty"); - luaL_argcheck(L, low >= 0 || up <= LUA_MAXINTEGER + low, 1, - "interval too large"); - r *= (double)(up - low) + 1.0; - lua_pushinteger(L, (lua_Integer)r + low); - return 1; -} - - -static int math_randomseed (lua_State *L) { - l_srand((unsigned int)(lua_Integer)luaL_checknumber(L, 1)); - (void)rand(); /* discard first value to avoid undesirable correlations */ - return 0; -} - - -static int math_type (lua_State *L) { - if (lua_type(L, 1) == LUA_TNUMBER) { - if (lua_isinteger(L, 1)) - lua_pushliteral(L, "integer"); - else - lua_pushliteral(L, "float"); - } - else { - luaL_checkany(L, 1); - lua_pushnil(L); - } - return 1; -} - - -/* -** {================================================================== -** Deprecated functions (for compatibility only) -** =================================================================== -*/ -#if defined(LUA_COMPAT_MATHLIB) - -static int math_cosh (lua_State *L) { - lua_pushnumber(L, l_mathop(cosh)(luaL_checknumber(L, 1))); - return 1; -} - -static int math_sinh (lua_State *L) { - lua_pushnumber(L, l_mathop(sinh)(luaL_checknumber(L, 1))); - return 1; -} - -static int math_tanh (lua_State *L) { - lua_pushnumber(L, l_mathop(tanh)(luaL_checknumber(L, 1))); - return 1; -} - -static int math_pow (lua_State *L) { - lua_Number x = luaL_checknumber(L, 1); - lua_Number y = luaL_checknumber(L, 2); - lua_pushnumber(L, l_mathop(pow)(x, y)); - return 1; -} - -static int math_frexp (lua_State *L) { - int e; - lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e)); - lua_pushinteger(L, e); - return 2; -} - -static int math_ldexp (lua_State *L) { - lua_Number x = luaL_checknumber(L, 1); - int ep = (int)luaL_checkinteger(L, 2); - lua_pushnumber(L, l_mathop(ldexp)(x, ep)); - return 1; -} - -static int math_log10 (lua_State *L) { - lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1))); - return 1; -} - -#endif -/* }================================================================== */ - - - -static const luaL_Reg mathlib[] = { - {"abs", math_abs}, - {"acos", math_acos}, - {"asin", math_asin}, - {"atan", math_atan}, - {"ceil", math_ceil}, - {"cos", math_cos}, - {"deg", math_deg}, - {"exp", math_exp}, - {"tointeger", math_toint}, - {"floor", math_floor}, - {"fmod", math_fmod}, - {"ult", math_ult}, - {"log", math_log}, - {"max", math_max}, - {"min", math_min}, - {"modf", math_modf}, - {"rad", math_rad}, - {"random", math_random}, - {"randomseed", math_randomseed}, - {"sin", math_sin}, - {"sqrt", math_sqrt}, - {"tan", math_tan}, - {"type", math_type}, -#if defined(LUA_COMPAT_MATHLIB) - {"atan2", math_atan}, - {"cosh", math_cosh}, - {"sinh", math_sinh}, - {"tanh", math_tanh}, - {"pow", math_pow}, - {"frexp", math_frexp}, - {"ldexp", math_ldexp}, - {"log10", math_log10}, -#endif - /* placeholders */ - {"pi", NULL}, - {"huge", NULL}, - {"maxinteger", NULL}, - {"mininteger", NULL}, - {NULL, NULL} -}; - - -/* -** Open math library -*/ -LUAMOD_API int luaopen_math (lua_State *L) { - luaL_newlib(L, mathlib); - lua_pushnumber(L, PI); - lua_setfield(L, -2, "pi"); - lua_pushnumber(L, (lua_Number)HUGE_VAL); - lua_setfield(L, -2, "huge"); - lua_pushinteger(L, LUA_MAXINTEGER); - lua_setfield(L, -2, "maxinteger"); - lua_pushinteger(L, LUA_MININTEGER); - lua_setfield(L, -2, "mininteger"); - return 1; -} - diff --git a/3rd/lua/src/lmem.c b/3rd/lua/src/lmem.c deleted file mode 100644 index 4feaf03..0000000 --- a/3rd/lua/src/lmem.c +++ /dev/null @@ -1,99 +0,0 @@ -/* -** $Id: lmem.c,v 1.89 2014/11/02 19:33:33 roberto Exp $ -** Interface to Memory Manager -** See Copyright Notice in lua.h -*/ - -#define lmem_c -#define LUA_CORE - -#include "lprefix.h" - - -#include - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" - - - -/* -** About the realloc function: -** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize); -** ('osize' is the old size, 'nsize' is the new size) -** -** * frealloc(ud, NULL, x, s) creates a new block of size 's' (no -** matter 'x'). -** -** * frealloc(ud, p, x, 0) frees the block 'p' -** (in this specific case, frealloc must return NULL); -** particularly, frealloc(ud, NULL, 0, 0) does nothing -** (which is equivalent to free(NULL) in ISO C) -** -** frealloc returns NULL if it cannot create or reallocate the area -** (any reallocation to an equal or smaller size cannot fail!) -*/ - - - -#define MINSIZEARRAY 4 - - -void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems, - int limit, const char *what) { - void *newblock; - int newsize; - if (*size >= limit/2) { /* cannot double it? */ - if (*size >= limit) /* cannot grow even a little? */ - luaG_runerror(L, "too many %s (limit is %d)", what, limit); - newsize = limit; /* still have at least one free place */ - } - else { - newsize = (*size)*2; - if (newsize < MINSIZEARRAY) - newsize = MINSIZEARRAY; /* minimum size */ - } - newblock = luaM_reallocv(L, block, *size, newsize, size_elems); - *size = newsize; /* update only when everything else is OK */ - return newblock; -} - - -l_noret luaM_toobig (lua_State *L) { - luaG_runerror(L, "memory allocation error: block too big"); -} - - - -/* -** generic allocation routine. -*/ -void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { - void *newblock; - global_State *g = G(L); - size_t realosize = (block) ? osize : 0; - lua_assert((realosize == 0) == (block == NULL)); -#if defined(HARDMEMTESTS) - if (nsize > realosize && g->gcrunning) - luaC_fullgc(L, 1); /* force a GC whenever possible */ -#endif - newblock = (*g->frealloc)(g->ud, block, osize, nsize); - if (newblock == NULL && nsize > 0) { - api_check( nsize > realosize, - "realloc cannot fail when shrinking a block"); - luaC_fullgc(L, 1); /* try to free some memory... */ - newblock = (*g->frealloc)(g->ud, block, osize, nsize); /* try again */ - if (newblock == NULL) - luaD_throw(L, LUA_ERRMEM); - } - lua_assert((nsize == 0) == (newblock == NULL)); - g->GCdebt = (g->GCdebt + nsize) - realosize; - return newblock; -} - diff --git a/3rd/lua/src/lmem.h b/3rd/lua/src/lmem.h deleted file mode 100644 index 30f4848..0000000 --- a/3rd/lua/src/lmem.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -** $Id: lmem.h,v 1.43 2014/12/19 17:26:14 roberto Exp $ -** Interface to Memory Manager -** See Copyright Notice in lua.h -*/ - -#ifndef lmem_h -#define lmem_h - - -#include - -#include "llimits.h" -#include "lua.h" - - -/* -** This macro reallocs a vector 'b' from 'on' to 'n' elements, where -** each element has size 'e'. In case of arithmetic overflow of the -** product 'n'*'e', it raises an error (calling 'luaM_toobig'). Because -** 'e' is always constant, it avoids the runtime division MAX_SIZET/(e). -** -** (The macro is somewhat complex to avoid warnings: The 'sizeof' -** comparison avoids a runtime comparison when overflow cannot occur. -** The compiler should be able to optimize the real test by itself, but -** when it does it, it may give a warning about "comparison is always -** false due to limited range of data type"; the +1 tricks the compiler, -** avoiding this warning but also this optimization.) -*/ -#define luaM_reallocv(L,b,on,n,e) \ - (((sizeof(n) >= sizeof(size_t) && cast(size_t, (n)) + 1 > MAX_SIZET/(e)) \ - ? luaM_toobig(L) : cast_void(0)) , \ - luaM_realloc_(L, (b), (on)*(e), (n)*(e))) - -/* -** Arrays of chars do not need any test -*/ -#define luaM_reallocvchar(L,b,on,n) \ - cast(char *, luaM_realloc_(L, (b), (on)*sizeof(char), (n)*sizeof(char))) - -#define luaM_freemem(L, b, s) luaM_realloc_(L, (b), (s), 0) -#define luaM_free(L, b) luaM_realloc_(L, (b), sizeof(*(b)), 0) -#define luaM_freearray(L, b, n) luaM_realloc_(L, (b), (n)*sizeof(*(b)), 0) - -#define luaM_malloc(L,s) luaM_realloc_(L, NULL, 0, (s)) -#define luaM_new(L,t) cast(t *, luaM_malloc(L, sizeof(t))) -#define luaM_newvector(L,n,t) \ - cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t))) - -#define luaM_newobject(L,tag,s) luaM_realloc_(L, NULL, tag, (s)) - -#define luaM_growvector(L,v,nelems,size,t,limit,e) \ - if ((nelems)+1 > (size)) \ - ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e))) - -#define luaM_reallocvector(L, v,oldn,n,t) \ - ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t)))) - -LUAI_FUNC l_noret luaM_toobig (lua_State *L); - -/* not to be called directly */ -LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize, - size_t size); -LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size, - size_t size_elem, int limit, - const char *what); - -#endif - diff --git a/3rd/lua/src/loadlib.c b/3rd/lua/src/loadlib.c deleted file mode 100644 index 7f8d990..0000000 --- a/3rd/lua/src/loadlib.c +++ /dev/null @@ -1,786 +0,0 @@ -/* -** $Id: loadlib.c,v 1.124 2015/01/05 13:51:39 roberto Exp $ -** Dynamic library loader for Lua -** See Copyright Notice in lua.h -** -** This module contains an implementation of loadlib for Unix systems -** that have dlfcn, an implementation for Windows, and a stub for other -** systems. -*/ - -#define loadlib_c -#define LUA_LIB - -#include "lprefix.h" - - -#include -#include - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -/* -** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment -** variables that Lua check to set its paths. -*/ -#if !defined(LUA_PATH_VAR) -#define LUA_PATH_VAR "LUA_PATH" -#endif - -#if !defined(LUA_CPATH_VAR) -#define LUA_CPATH_VAR "LUA_CPATH" -#endif - -#define LUA_PATHSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR - -#define LUA_PATHVARVERSION LUA_PATH_VAR LUA_PATHSUFFIX -#define LUA_CPATHVARVERSION LUA_CPATH_VAR LUA_PATHSUFFIX - -/* -** LUA_PATH_SEP is the character that separates templates in a path. -** LUA_PATH_MARK is the string that marks the substitution points in a -** template. -** LUA_EXEC_DIR in a Windows path is replaced by the executable's -** directory. -** LUA_IGMARK is a mark to ignore all before it when building the -** luaopen_ function name. -*/ -#if !defined (LUA_PATH_SEP) -#define LUA_PATH_SEP ";" -#endif -#if !defined (LUA_PATH_MARK) -#define LUA_PATH_MARK "?" -#endif -#if !defined (LUA_EXEC_DIR) -#define LUA_EXEC_DIR "!" -#endif -#if !defined (LUA_IGMARK) -#define LUA_IGMARK "-" -#endif - - -/* -** LUA_CSUBSEP is the character that replaces dots in submodule names -** when searching for a C loader. -** LUA_LSUBSEP is the character that replaces dots in submodule names -** when searching for a Lua loader. -*/ -#if !defined(LUA_CSUBSEP) -#define LUA_CSUBSEP LUA_DIRSEP -#endif - -#if !defined(LUA_LSUBSEP) -#define LUA_LSUBSEP LUA_DIRSEP -#endif - - -/* prefix for open functions in C libraries */ -#define LUA_POF "luaopen_" - -/* separator for open functions in C libraries */ -#define LUA_OFSEP "_" - - -/* -** unique key for table in the registry that keeps handles -** for all loaded C libraries -*/ -static const int CLIBS = 0; - -#define LIB_FAIL "open" - -#define setprogdir(L) ((void)0) - - -/* -** system-dependent functions -*/ - -/* -** unload library 'lib' -*/ -static void lsys_unloadlib (void *lib); - -/* -** load C library in file 'path'. If 'seeglb', load with all names in -** the library global. -** Returns the library; in case of error, returns NULL plus an -** error string in the stack. -*/ -static void *lsys_load (lua_State *L, const char *path, int seeglb); - -/* -** Try to find a function named 'sym' in library 'lib'. -** Returns the function; in case of error, returns NULL plus an -** error string in the stack. -*/ -static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym); - - - - -#if defined(LUA_USE_DLOPEN) /* { */ -/* -** {======================================================================== -** This is an implementation of loadlib based on the dlfcn interface. -** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD, -** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least -** as an emulation layer on top of native functions. -** ========================================================================= -*/ - -#include - -/* -** Macro to covert pointer to void* to pointer to function. This cast -** is undefined according to ISO C, but POSIX assumes that it must work. -** (The '__extension__' in gnu compilers is only to avoid warnings.) -*/ -#if defined(__GNUC__) -#define cast_func(p) (__extension__ (lua_CFunction)(p)) -#else -#define cast_func(p) ((lua_CFunction)(p)) -#endif - - -static void lsys_unloadlib (void *lib) { - dlclose(lib); -} - - -static void *lsys_load (lua_State *L, const char *path, int seeglb) { - void *lib = dlopen(path, RTLD_NOW | (seeglb ? RTLD_GLOBAL : RTLD_LOCAL)); - if (lib == NULL) lua_pushstring(L, dlerror()); - return lib; -} - - -static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { - lua_CFunction f = cast_func(dlsym(lib, sym)); - if (f == NULL) lua_pushstring(L, dlerror()); - return f; -} - -/* }====================================================== */ - - - -#elif defined(LUA_DL_DLL) /* }{ */ -/* -** {====================================================================== -** This is an implementation of loadlib for Windows using native functions. -** ======================================================================= -*/ - -#include - -#undef setprogdir - -/* -** optional flags for LoadLibraryEx -*/ -#if !defined(LUA_LLE_FLAGS) -#define LUA_LLE_FLAGS 0 -#endif - - -static void setprogdir (lua_State *L) { - char buff[MAX_PATH + 1]; - char *lb; - DWORD nsize = sizeof(buff)/sizeof(char); - DWORD n = GetModuleFileNameA(NULL, buff, nsize); - if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) - luaL_error(L, "unable to get ModuleFileName"); - else { - *lb = '\0'; - luaL_gsub(L, lua_tostring(L, -1), LUA_EXEC_DIR, buff); - lua_remove(L, -2); /* remove original string */ - } -} - - -static void pusherror (lua_State *L) { - int error = GetLastError(); - char buffer[128]; - if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, error, 0, buffer, sizeof(buffer)/sizeof(char), NULL)) - lua_pushstring(L, buffer); - else - lua_pushfstring(L, "system error %d\n", error); -} - -static void lsys_unloadlib (void *lib) { - FreeLibrary((HMODULE)lib); -} - - -static void *lsys_load (lua_State *L, const char *path, int seeglb) { - HMODULE lib = LoadLibraryExA(path, NULL, LUA_LLE_FLAGS); - (void)(seeglb); /* not used: symbols are 'global' by default */ - if (lib == NULL) pusherror(L); - return lib; -} - - -static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { - lua_CFunction f = (lua_CFunction)GetProcAddress((HMODULE)lib, sym); - if (f == NULL) pusherror(L); - return f; -} - -/* }====================================================== */ - - -#else /* }{ */ -/* -** {====================================================== -** Fallback for other systems -** ======================================================= -*/ - -#undef LIB_FAIL -#define LIB_FAIL "absent" - - -#define DLMSG "dynamic libraries not enabled; check your Lua installation" - - -static void lsys_unloadlib (void *lib) { - (void)(lib); /* not used */ -} - - -static void *lsys_load (lua_State *L, const char *path, int seeglb) { - (void)(path); (void)(seeglb); /* not used */ - lua_pushliteral(L, DLMSG); - return NULL; -} - - -static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { - (void)(lib); (void)(sym); /* not used */ - lua_pushliteral(L, DLMSG); - return NULL; -} - -/* }====================================================== */ -#endif /* } */ - - -/* -** return registry.CLIBS[path] -*/ -static void *checkclib (lua_State *L, const char *path) { - void *plib; - lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS); - lua_getfield(L, -1, path); - plib = lua_touserdata(L, -1); /* plib = CLIBS[path] */ - lua_pop(L, 2); /* pop CLIBS table and 'plib' */ - return plib; -} - - -/* -** registry.CLIBS[path] = plib -- for queries -** registry.CLIBS[#CLIBS + 1] = plib -- also keep a list of all libraries -*/ -static void addtoclib (lua_State *L, const char *path, void *plib) { - lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS); - lua_pushlightuserdata(L, plib); - lua_pushvalue(L, -1); - lua_setfield(L, -3, path); /* CLIBS[path] = plib */ - lua_rawseti(L, -2, luaL_len(L, -2) + 1); /* CLIBS[#CLIBS + 1] = plib */ - lua_pop(L, 1); /* pop CLIBS table */ -} - - -/* -** __gc tag method for CLIBS table: calls 'lsys_unloadlib' for all lib -** handles in list CLIBS -*/ -static int gctm (lua_State *L) { - lua_Integer n = luaL_len(L, 1); - for (; n >= 1; n--) { /* for each handle, in reverse order */ - lua_rawgeti(L, 1, n); /* get handle CLIBS[n] */ - lsys_unloadlib(lua_touserdata(L, -1)); - lua_pop(L, 1); /* pop handle */ - } - return 0; -} - - - -/* error codes for 'lookforfunc' */ -#define ERRLIB 1 -#define ERRFUNC 2 - -/* -** Look for a C function named 'sym' in a dynamically loaded library -** 'path'. -** First, check whether the library is already loaded; if not, try -** to load it. -** Then, if 'sym' is '*', return true (as library has been loaded). -** Otherwise, look for symbol 'sym' in the library and push a -** C function with that symbol. -** Return 0 and 'true' or a function in the stack; in case of -** errors, return an error code and an error message in the stack. -*/ -static int lookforfunc (lua_State *L, const char *path, const char *sym) { - void *reg = checkclib(L, path); /* check loaded C libraries */ - if (reg == NULL) { /* must load library? */ - reg = lsys_load(L, path, *sym == '*'); /* global symbols if 'sym'=='*' */ - if (reg == NULL) return ERRLIB; /* unable to load library */ - addtoclib(L, path, reg); - } - if (*sym == '*') { /* loading only library (no function)? */ - lua_pushboolean(L, 1); /* return 'true' */ - return 0; /* no errors */ - } - else { - lua_CFunction f = lsys_sym(L, reg, sym); - if (f == NULL) - return ERRFUNC; /* unable to find function */ - lua_pushcfunction(L, f); /* else create new function */ - return 0; /* no errors */ - } -} - - -static int ll_loadlib (lua_State *L) { - const char *path = luaL_checkstring(L, 1); - const char *init = luaL_checkstring(L, 2); - int stat = lookforfunc(L, path, init); - if (stat == 0) /* no errors? */ - return 1; /* return the loaded function */ - else { /* error; error message is on stack top */ - lua_pushnil(L); - lua_insert(L, -2); - lua_pushstring(L, (stat == ERRLIB) ? LIB_FAIL : "init"); - return 3; /* return nil, error message, and where */ - } -} - - - -/* -** {====================================================== -** 'require' function -** ======================================================= -*/ - - -static int readable (const char *filename) { - FILE *f = fopen(filename, "r"); /* try to open file */ - if (f == NULL) return 0; /* open failed */ - fclose(f); - return 1; -} - - -static const char *pushnexttemplate (lua_State *L, const char *path) { - const char *l; - while (*path == *LUA_PATH_SEP) path++; /* skip separators */ - if (*path == '\0') return NULL; /* no more templates */ - l = strchr(path, *LUA_PATH_SEP); /* find next separator */ - if (l == NULL) l = path + strlen(path); - lua_pushlstring(L, path, l - path); /* template */ - return l; -} - - -static const char *searchpath (lua_State *L, const char *name, - const char *path, - const char *sep, - const char *dirsep) { - luaL_Buffer msg; /* to build error message */ - luaL_buffinit(L, &msg); - if (*sep != '\0') /* non-empty separator? */ - name = luaL_gsub(L, name, sep, dirsep); /* replace it by 'dirsep' */ - while ((path = pushnexttemplate(L, path)) != NULL) { - const char *filename = luaL_gsub(L, lua_tostring(L, -1), - LUA_PATH_MARK, name); - lua_remove(L, -2); /* remove path template */ - if (readable(filename)) /* does file exist and is readable? */ - return filename; /* return that file name */ - lua_pushfstring(L, "\n\tno file '%s'", filename); - lua_remove(L, -2); /* remove file name */ - luaL_addvalue(&msg); /* concatenate error msg. entry */ - } - luaL_pushresult(&msg); /* create error message */ - return NULL; /* not found */ -} - - -static int ll_searchpath (lua_State *L) { - const char *f = searchpath(L, luaL_checkstring(L, 1), - luaL_checkstring(L, 2), - luaL_optstring(L, 3, "."), - luaL_optstring(L, 4, LUA_DIRSEP)); - if (f != NULL) return 1; - else { /* error message is on top of the stack */ - lua_pushnil(L); - lua_insert(L, -2); - return 2; /* return nil + error message */ - } -} - - -static const char *findfile (lua_State *L, const char *name, - const char *pname, - const char *dirsep) { - const char *path; - lua_getfield(L, lua_upvalueindex(1), pname); - path = lua_tostring(L, -1); - if (path == NULL) - luaL_error(L, "'package.%s' must be a string", pname); - return searchpath(L, name, path, ".", dirsep); -} - - -static int checkload (lua_State *L, int stat, const char *filename) { - if (stat) { /* module loaded successfully? */ - lua_pushstring(L, filename); /* will be 2nd argument to module */ - return 2; /* return open function and file name */ - } - else - return luaL_error(L, "error loading module '%s' from file '%s':\n\t%s", - lua_tostring(L, 1), filename, lua_tostring(L, -1)); -} - - -static int searcher_Lua (lua_State *L) { - const char *filename; - const char *name = luaL_checkstring(L, 1); - filename = findfile(L, name, "path", LUA_LSUBSEP); - if (filename == NULL) return 1; /* module not found in this path */ - return checkload(L, (luaL_loadfile(L, filename) == LUA_OK), filename); -} - - -/* -** Try to find a load function for module 'modname' at file 'filename'. -** First, change '.' to '_' in 'modname'; then, if 'modname' has -** the form X-Y (that is, it has an "ignore mark"), build a function -** name "luaopen_X" and look for it. (For compatibility, if that -** fails, it also tries "luaopen_Y".) If there is no ignore mark, -** look for a function named "luaopen_modname". -*/ -static int loadfunc (lua_State *L, const char *filename, const char *modname) { - const char *openfunc; - const char *mark; - modname = luaL_gsub(L, modname, ".", LUA_OFSEP); - mark = strchr(modname, *LUA_IGMARK); - if (mark) { - int stat; - openfunc = lua_pushlstring(L, modname, mark - modname); - openfunc = lua_pushfstring(L, LUA_POF"%s", openfunc); - stat = lookforfunc(L, filename, openfunc); - if (stat != ERRFUNC) return stat; - modname = mark + 1; /* else go ahead and try old-style name */ - } - openfunc = lua_pushfstring(L, LUA_POF"%s", modname); - return lookforfunc(L, filename, openfunc); -} - - -static int searcher_C (lua_State *L) { - const char *name = luaL_checkstring(L, 1); - const char *filename = findfile(L, name, "cpath", LUA_CSUBSEP); - if (filename == NULL) return 1; /* module not found in this path */ - return checkload(L, (loadfunc(L, filename, name) == 0), filename); -} - - -static int searcher_Croot (lua_State *L) { - const char *filename; - const char *name = luaL_checkstring(L, 1); - const char *p = strchr(name, '.'); - int stat; - if (p == NULL) return 0; /* is root */ - lua_pushlstring(L, name, p - name); - filename = findfile(L, lua_tostring(L, -1), "cpath", LUA_CSUBSEP); - if (filename == NULL) return 1; /* root not found */ - if ((stat = loadfunc(L, filename, name)) != 0) { - if (stat != ERRFUNC) - return checkload(L, 0, filename); /* real error */ - else { /* open function not found */ - lua_pushfstring(L, "\n\tno module '%s' in file '%s'", name, filename); - return 1; - } - } - lua_pushstring(L, filename); /* will be 2nd argument to module */ - return 2; -} - - -static int searcher_preload (lua_State *L) { - const char *name = luaL_checkstring(L, 1); - lua_getfield(L, LUA_REGISTRYINDEX, "_PRELOAD"); - if (lua_getfield(L, -1, name) == LUA_TNIL) /* not found? */ - lua_pushfstring(L, "\n\tno field package.preload['%s']", name); - return 1; -} - - -static void findloader (lua_State *L, const char *name) { - int i; - luaL_Buffer msg; /* to build error message */ - luaL_buffinit(L, &msg); - /* push 'package.searchers' to index 3 in the stack */ - if (lua_getfield(L, lua_upvalueindex(1), "searchers") != LUA_TTABLE) - luaL_error(L, "'package.searchers' must be a table"); - /* iterate over available searchers to find a loader */ - for (i = 1; ; i++) { - if (lua_rawgeti(L, 3, i) == LUA_TNIL) { /* no more searchers? */ - lua_pop(L, 1); /* remove nil */ - luaL_pushresult(&msg); /* create error message */ - luaL_error(L, "module '%s' not found:%s", name, lua_tostring(L, -1)); - } - lua_pushstring(L, name); - lua_call(L, 1, 2); /* call it */ - if (lua_isfunction(L, -2)) /* did it find a loader? */ - return; /* module loader found */ - else if (lua_isstring(L, -2)) { /* searcher returned error message? */ - lua_pop(L, 1); /* remove extra return */ - luaL_addvalue(&msg); /* concatenate error message */ - } - else - lua_pop(L, 2); /* remove both returns */ - } -} - - -static int ll_require (lua_State *L) { - const char *name = luaL_checkstring(L, 1); - lua_settop(L, 1); /* _LOADED table will be at index 2 */ - lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); - lua_getfield(L, 2, name); /* _LOADED[name] */ - if (lua_toboolean(L, -1)) /* is it there? */ - return 1; /* package is already loaded */ - /* else must load package */ - lua_pop(L, 1); /* remove 'getfield' result */ - findloader(L, name); - lua_pushstring(L, name); /* pass name as argument to module loader */ - lua_insert(L, -2); /* name is 1st argument (before search data) */ - lua_call(L, 2, 1); /* run loader to load module */ - if (!lua_isnil(L, -1)) /* non-nil return? */ - lua_setfield(L, 2, name); /* _LOADED[name] = returned value */ - if (lua_getfield(L, 2, name) == LUA_TNIL) { /* module set no value? */ - lua_pushboolean(L, 1); /* use true as result */ - lua_pushvalue(L, -1); /* extra copy to be returned */ - lua_setfield(L, 2, name); /* _LOADED[name] = true */ - } - return 1; -} - -/* }====================================================== */ - - - -/* -** {====================================================== -** 'module' function -** ======================================================= -*/ -#if defined(LUA_COMPAT_MODULE) - -/* -** changes the environment variable of calling function -*/ -static void set_env (lua_State *L) { - lua_Debug ar; - if (lua_getstack(L, 1, &ar) == 0 || - lua_getinfo(L, "f", &ar) == 0 || /* get calling function */ - lua_iscfunction(L, -1)) - luaL_error(L, "'module' not called from a Lua function"); - lua_pushvalue(L, -2); /* copy new environment table to top */ - lua_setupvalue(L, -2, 1); - lua_pop(L, 1); /* remove function */ -} - - -static void dooptions (lua_State *L, int n) { - int i; - for (i = 2; i <= n; i++) { - if (lua_isfunction(L, i)) { /* avoid 'calling' extra info. */ - lua_pushvalue(L, i); /* get option (a function) */ - lua_pushvalue(L, -2); /* module */ - lua_call(L, 1, 0); - } - } -} - - -static void modinit (lua_State *L, const char *modname) { - const char *dot; - lua_pushvalue(L, -1); - lua_setfield(L, -2, "_M"); /* module._M = module */ - lua_pushstring(L, modname); - lua_setfield(L, -2, "_NAME"); - dot = strrchr(modname, '.'); /* look for last dot in module name */ - if (dot == NULL) dot = modname; - else dot++; - /* set _PACKAGE as package name (full module name minus last part) */ - lua_pushlstring(L, modname, dot - modname); - lua_setfield(L, -2, "_PACKAGE"); -} - - -static int ll_module (lua_State *L) { - const char *modname = luaL_checkstring(L, 1); - int lastarg = lua_gettop(L); /* last parameter */ - luaL_pushmodule(L, modname, 1); /* get/create module table */ - /* check whether table already has a _NAME field */ - if (lua_getfield(L, -1, "_NAME") != LUA_TNIL) - lua_pop(L, 1); /* table is an initialized module */ - else { /* no; initialize it */ - lua_pop(L, 1); - modinit(L, modname); - } - lua_pushvalue(L, -1); - set_env(L); - dooptions(L, lastarg); - return 1; -} - - -static int ll_seeall (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - if (!lua_getmetatable(L, 1)) { - lua_createtable(L, 0, 1); /* create new metatable */ - lua_pushvalue(L, -1); - lua_setmetatable(L, 1); - } - lua_pushglobaltable(L); - lua_setfield(L, -2, "__index"); /* mt.__index = _G */ - return 0; -} - -#endif -/* }====================================================== */ - - - -/* auxiliary mark (for internal use) */ -#define AUXMARK "\1" - - -/* -** return registry.LUA_NOENV as a boolean -*/ -static int noenv (lua_State *L) { - int b; - lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); - b = lua_toboolean(L, -1); - lua_pop(L, 1); /* remove value */ - return b; -} - - -static void setpath (lua_State *L, const char *fieldname, const char *envname1, - const char *envname2, const char *def) { - const char *path = getenv(envname1); - if (path == NULL) /* no environment variable? */ - path = getenv(envname2); /* try alternative name */ - if (path == NULL || noenv(L)) /* no environment variable? */ - lua_pushstring(L, def); /* use default */ - else { - /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */ - path = luaL_gsub(L, path, LUA_PATH_SEP LUA_PATH_SEP, - LUA_PATH_SEP AUXMARK LUA_PATH_SEP); - luaL_gsub(L, path, AUXMARK, def); - lua_remove(L, -2); - } - setprogdir(L); - lua_setfield(L, -2, fieldname); -} - - -static const luaL_Reg pk_funcs[] = { - {"loadlib", ll_loadlib}, - {"searchpath", ll_searchpath}, -#if defined(LUA_COMPAT_MODULE) - {"seeall", ll_seeall}, -#endif - /* placeholders */ - {"preload", NULL}, - {"cpath", NULL}, - {"path", NULL}, - {"searchers", NULL}, - {"loaded", NULL}, - {NULL, NULL} -}; - - -static const luaL_Reg ll_funcs[] = { -#if defined(LUA_COMPAT_MODULE) - {"module", ll_module}, -#endif - {"require", ll_require}, - {NULL, NULL} -}; - - -static void createsearcherstable (lua_State *L) { - static const lua_CFunction searchers[] = - {searcher_preload, searcher_Lua, searcher_C, searcher_Croot, NULL}; - int i; - /* create 'searchers' table */ - lua_createtable(L, sizeof(searchers)/sizeof(searchers[0]) - 1, 0); - /* fill it with pre-defined searchers */ - for (i=0; searchers[i] != NULL; i++) { - lua_pushvalue(L, -2); /* set 'package' as upvalue for all searchers */ - lua_pushcclosure(L, searchers[i], 1); - lua_rawseti(L, -2, i+1); - } -#if defined(LUA_COMPAT_LOADERS) - lua_pushvalue(L, -1); /* make a copy of 'searchers' table */ - lua_setfield(L, -3, "loaders"); /* put it in field 'loaders' */ -#endif - lua_setfield(L, -2, "searchers"); /* put it in field 'searchers' */ -} - - -/* -** create table CLIBS to keep track of loaded C libraries, -** setting a finalizer to close all libraries when closing state. -*/ -static void createclibstable (lua_State *L) { - lua_newtable(L); /* create CLIBS table */ - lua_createtable(L, 0, 1); /* create metatable for CLIBS */ - lua_pushcfunction(L, gctm); - lua_setfield(L, -2, "__gc"); /* set finalizer for CLIBS table */ - lua_setmetatable(L, -2); - lua_rawsetp(L, LUA_REGISTRYINDEX, &CLIBS); /* set CLIBS table in registry */ -} - - -LUAMOD_API int luaopen_package (lua_State *L) { - createclibstable(L); - luaL_newlib(L, pk_funcs); /* create 'package' table */ - createsearcherstable(L); - /* set field 'path' */ - setpath(L, "path", LUA_PATHVARVERSION, LUA_PATH_VAR, LUA_PATH_DEFAULT); - /* set field 'cpath' */ - setpath(L, "cpath", LUA_CPATHVARVERSION, LUA_CPATH_VAR, LUA_CPATH_DEFAULT); - /* store config information */ - lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n" - LUA_EXEC_DIR "\n" LUA_IGMARK "\n"); - lua_setfield(L, -2, "config"); - /* set field 'loaded' */ - luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED"); - lua_setfield(L, -2, "loaded"); - /* set field 'preload' */ - luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD"); - lua_setfield(L, -2, "preload"); - lua_pushglobaltable(L); - lua_pushvalue(L, -2); /* set 'package' as upvalue for next lib */ - luaL_setfuncs(L, ll_funcs, 1); /* open lib into global table */ - lua_pop(L, 1); /* pop global table */ - return 1; /* return 'package' table */ -} - diff --git a/3rd/lua/src/lobject.c b/3rd/lua/src/lobject.c deleted file mode 100644 index 6a24aff..0000000 --- a/3rd/lua/src/lobject.c +++ /dev/null @@ -1,470 +0,0 @@ -/* -** $Id: lobject.c,v 2.101 2014/12/26 14:43:45 roberto Exp $ -** Some generic functions over Lua objects -** See Copyright Notice in lua.h -*/ - -#define lobject_c -#define LUA_CORE - -#include "lprefix.h" - - -#include -#include -#include -#include - -#include "lua.h" - -#include "lctype.h" -#include "ldebug.h" -#include "ldo.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "lvm.h" - - - -LUAI_DDEF const TValue luaO_nilobject_ = {NILCONSTANT}; - - -/* -** converts an integer to a "floating point byte", represented as -** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if -** eeeee != 0 and (xxx) otherwise. -*/ -int luaO_int2fb (unsigned int x) { - int e = 0; /* exponent */ - if (x < 8) return x; - while (x >= 0x10) { - x = (x+1) >> 1; - e++; - } - return ((e+1) << 3) | (cast_int(x) - 8); -} - - -/* converts back */ -int luaO_fb2int (int x) { - int e = (x >> 3) & 0x1f; - if (e == 0) return x; - else return ((x & 7) + 8) << (e - 1); -} - - -int luaO_ceillog2 (unsigned int x) { - static const lu_byte log_2[256] = { - 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 - }; - int l = 0; - x--; - while (x >= 256) { l += 8; x >>= 8; } - return l + log_2[x]; -} - - -static lua_Integer intarith (lua_State *L, int op, lua_Integer v1, - lua_Integer v2) { - switch (op) { - case LUA_OPADD: return intop(+, v1, v2); - case LUA_OPSUB:return intop(-, v1, v2); - case LUA_OPMUL:return intop(*, v1, v2); - case LUA_OPMOD: return luaV_mod(L, v1, v2); - case LUA_OPIDIV: return luaV_div(L, v1, v2); - case LUA_OPBAND: return intop(&, v1, v2); - case LUA_OPBOR: return intop(|, v1, v2); - case LUA_OPBXOR: return intop(^, v1, v2); - case LUA_OPSHL: return luaV_shiftl(v1, v2); - case LUA_OPSHR: return luaV_shiftl(v1, -v2); - case LUA_OPUNM: return intop(-, 0, v1); - case LUA_OPBNOT: return intop(^, ~l_castS2U(0), v1); - default: lua_assert(0); return 0; - } -} - - -static lua_Number numarith (lua_State *L, int op, lua_Number v1, - lua_Number v2) { - switch (op) { - case LUA_OPADD: return luai_numadd(L, v1, v2); - case LUA_OPSUB: return luai_numsub(L, v1, v2); - case LUA_OPMUL: return luai_nummul(L, v1, v2); - case LUA_OPDIV: return luai_numdiv(L, v1, v2); - case LUA_OPPOW: return luai_numpow(L, v1, v2); - case LUA_OPIDIV: return luai_numidiv(L, v1, v2); - case LUA_OPUNM: return luai_numunm(L, v1); - case LUA_OPMOD: { - lua_Number m; - luai_nummod(L, v1, v2, m); - return m; - } - default: lua_assert(0); return 0; - } -} - - -void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2, - TValue *res) { - switch (op) { - case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR: - case LUA_OPSHL: case LUA_OPSHR: - case LUA_OPBNOT: { /* operate only on integers */ - lua_Integer i1; lua_Integer i2; - if (tointeger(p1, &i1) && tointeger(p2, &i2)) { - setivalue(res, intarith(L, op, i1, i2)); - return; - } - else break; /* go to the end */ - } - case LUA_OPDIV: case LUA_OPPOW: { /* operate only on floats */ - lua_Number n1; lua_Number n2; - if (tonumber(p1, &n1) && tonumber(p2, &n2)) { - setfltvalue(res, numarith(L, op, n1, n2)); - return; - } - else break; /* go to the end */ - } - default: { /* other operations */ - lua_Number n1; lua_Number n2; - if (ttisinteger(p1) && ttisinteger(p2)) { - setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2))); - return; - } - else if (tonumber(p1, &n1) && tonumber(p2, &n2)) { - setfltvalue(res, numarith(L, op, n1, n2)); - return; - } - else break; /* go to the end */ - } - } - /* could not perform raw operation; try metamethod */ - lua_assert(L != NULL); /* should not fail when folding (compile time) */ - luaT_trybinTM(L, p1, p2, res, cast(TMS, op - LUA_OPADD + TM_ADD)); -} - - -int luaO_hexavalue (int c) { - if (lisdigit(c)) return c - '0'; - else return ltolower(c) - 'a' + 10; -} - - -static int isneg (const char **s) { - if (**s == '-') { (*s)++; return 1; } - else if (**s == '+') (*s)++; - return 0; -} - - - -/* -** {================================================================== -** Lua's implementation for 'lua_strx2number' -** =================================================================== -*/ -#if !defined(lua_strx2number) - -#include - -/* maximum number of significant digits to read (to avoid overflows - even with single floats) */ -#define MAXSIGDIG 30 - -/* -** convert an hexadecimal numeric string to a number, following -** C99 specification for 'strtod' -*/ -static lua_Number lua_strx2number (const char *s, char **endptr) { - lua_Number r = 0.0; /* result (accumulator) */ - int sigdig = 0; /* number of significant digits */ - int nosigdig = 0; /* number of non-significant digits */ - int e = 0; /* exponent correction */ - int neg; /* 1 if number is negative */ - int dot = 0; /* true after seen a dot */ - *endptr = cast(char *, s); /* nothing is valid yet */ - while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ - neg = isneg(&s); /* check signal */ - if (!(*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X'))) /* check '0x' */ - return 0.0; /* invalid format (no '0x') */ - for (s += 2; ; s++) { /* skip '0x' and read numeral */ - if (*s == '.') { - if (dot) break; /* second dot? stop loop */ - else dot = 1; - } - else if (lisxdigit(cast_uchar(*s))) { - if (sigdig == 0 && *s == '0') /* non-significant digit (zero)? */ - nosigdig++; - else if (++sigdig <= MAXSIGDIG) /* can read it without overflow? */ - r = (r * cast_num(16.0)) + luaO_hexavalue(*s); - else e++; /* too many digits; ignore, but still count for exponent */ - if (dot) e--; /* decimal digit? correct exponent */ - } - else break; /* neither a dot nor a digit */ - } - if (nosigdig + sigdig == 0) /* no digits? */ - return 0.0; /* invalid format */ - *endptr = cast(char *, s); /* valid up to here */ - e *= 4; /* each digit multiplies/divides value by 2^4 */ - if (*s == 'p' || *s == 'P') { /* exponent part? */ - int exp1 = 0; /* exponent value */ - int neg1; /* exponent signal */ - s++; /* skip 'p' */ - neg1 = isneg(&s); /* signal */ - if (!lisdigit(cast_uchar(*s))) - return 0.0; /* invalid; must have at least one digit */ - while (lisdigit(cast_uchar(*s))) /* read exponent */ - exp1 = exp1 * 10 + *(s++) - '0'; - if (neg1) exp1 = -exp1; - e += exp1; - *endptr = cast(char *, s); /* valid up to here */ - } - if (neg) r = -r; - return l_mathop(ldexp)(r, e); -} - -#endif -/* }====================================================== */ - - -static const char *l_str2d (const char *s, lua_Number *result) { - char *endptr; - if (strpbrk(s, "nN")) /* reject 'inf' and 'nan' */ - return NULL; - else if (strpbrk(s, "xX")) /* hex? */ - *result = lua_strx2number(s, &endptr); - else - *result = lua_str2number(s, &endptr); - if (endptr == s) return 0; /* nothing recognized */ - while (lisspace(cast_uchar(*endptr))) endptr++; - return (*endptr == '\0' ? endptr : NULL); /* OK if no trailing characters */ -} - - -static const char *l_str2int (const char *s, lua_Integer *result) { - lua_Unsigned a = 0; - int empty = 1; - int neg; - while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ - neg = isneg(&s); - if (s[0] == '0' && - (s[1] == 'x' || s[1] == 'X')) { /* hex? */ - s += 2; /* skip '0x' */ - for (; lisxdigit(cast_uchar(*s)); s++) { - a = a * 16 + luaO_hexavalue(*s); - empty = 0; - } - } - else { /* decimal */ - for (; lisdigit(cast_uchar(*s)); s++) { - a = a * 10 + *s - '0'; - empty = 0; - } - } - while (lisspace(cast_uchar(*s))) s++; /* skip trailing spaces */ - if (empty || *s != '\0') return NULL; /* something wrong in the numeral */ - else { - *result = l_castU2S((neg) ? 0u - a : a); - return s; - } -} - - -size_t luaO_str2num (const char *s, TValue *o) { - lua_Integer i; lua_Number n; - const char *e; - if ((e = l_str2int(s, &i)) != NULL) { /* try as an integer */ - setivalue(o, i); - } - else if ((e = l_str2d(s, &n)) != NULL) { /* else try as a float */ - setfltvalue(o, n); - } - else - return 0; /* conversion failed */ - return (e - s + 1); /* success; return string size */ -} - - -int luaO_utf8esc (char *buff, unsigned long x) { - int n = 1; /* number of bytes put in buffer (backwards) */ - lua_assert(x <= 0x10FFFF); - if (x < 0x80) /* ascii? */ - buff[UTF8BUFFSZ - 1] = cast(char, x); - else { /* need continuation bytes */ - unsigned int mfb = 0x3f; /* maximum that fits in first byte */ - do { /* add continuation bytes */ - buff[UTF8BUFFSZ - (n++)] = cast(char, 0x80 | (x & 0x3f)); - x >>= 6; /* remove added bits */ - mfb >>= 1; /* now there is one less bit available in first byte */ - } while (x > mfb); /* still needs continuation byte? */ - buff[UTF8BUFFSZ - n] = cast(char, (~mfb << 1) | x); /* add first byte */ - } - return n; -} - - -/* maximum length of the conversion of a number to a string */ -#define MAXNUMBER2STR 50 - - -/* -** Convert a number object to a string -*/ -void luaO_tostring (lua_State *L, StkId obj) { - char buff[MAXNUMBER2STR]; - size_t len; - lua_assert(ttisnumber(obj)); - if (ttisinteger(obj)) - len = lua_integer2str(buff, ivalue(obj)); - else { - len = lua_number2str(buff, fltvalue(obj)); -#if !defined(LUA_COMPAT_FLOATSTRING) - if (buff[strspn(buff, "-0123456789")] == '\0') { /* looks like an int? */ - buff[len++] = '.'; - buff[len++] = '0'; /* adds '.0' to result */ - } -#endif - } - setsvalue2s(L, obj, luaS_newlstr(L, buff, len)); -} - - -static void pushstr (lua_State *L, const char *str, size_t l) { - setsvalue2s(L, L->top++, luaS_newlstr(L, str, l)); -} - - -/* this function handles only '%d', '%c', '%f', '%p', and '%s' - conventional formats, plus Lua-specific '%I' and '%U' */ -const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { - int n = 0; - for (;;) { - const char *e = strchr(fmt, '%'); - if (e == NULL) break; - luaD_checkstack(L, 2); /* fmt + item */ - pushstr(L, fmt, e - fmt); - switch (*(e+1)) { - case 's': { - const char *s = va_arg(argp, char *); - if (s == NULL) s = "(null)"; - pushstr(L, s, strlen(s)); - break; - } - case 'c': { - char buff = cast(char, va_arg(argp, int)); - if (lisprint(cast_uchar(buff))) - pushstr(L, &buff, 1); - else /* non-printable character; print its code */ - luaO_pushfstring(L, "<\\%d>", cast_uchar(buff)); - break; - } - case 'd': { - setivalue(L->top++, va_arg(argp, int)); - luaO_tostring(L, L->top - 1); - break; - } - case 'I': { - setivalue(L->top++, cast(lua_Integer, va_arg(argp, l_uacInt))); - luaO_tostring(L, L->top - 1); - break; - } - case 'f': { - setfltvalue(L->top++, cast_num(va_arg(argp, l_uacNumber))); - luaO_tostring(L, L->top - 1); - break; - } - case 'p': { - char buff[4*sizeof(void *) + 8]; /* should be enough space for a '%p' */ - int l = sprintf(buff, "%p", va_arg(argp, void *)); - pushstr(L, buff, l); - break; - } - case 'U': { - char buff[UTF8BUFFSZ]; - int l = luaO_utf8esc(buff, cast(long, va_arg(argp, long))); - pushstr(L, buff + UTF8BUFFSZ - l, l); - break; - } - case '%': { - pushstr(L, "%", 1); - break; - } - default: { - luaG_runerror(L, "invalid option '%%%c' to 'lua_pushfstring'", - *(e + 1)); - } - } - n += 2; - fmt = e+2; - } - luaD_checkstack(L, 1); - pushstr(L, fmt, strlen(fmt)); - if (n > 0) luaV_concat(L, n + 1); - return svalue(L->top - 1); -} - - -const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) { - const char *msg; - va_list argp; - va_start(argp, fmt); - msg = luaO_pushvfstring(L, fmt, argp); - va_end(argp); - return msg; -} - - -/* number of chars of a literal string without the ending \0 */ -#define LL(x) (sizeof(x)/sizeof(char) - 1) - -#define RETS "..." -#define PRE "[string \"" -#define POS "\"]" - -#define addstr(a,b,l) ( memcpy(a,b,(l) * sizeof(char)), a += (l) ) - -void luaO_chunkid (char *out, const char *source, size_t bufflen) { - size_t l = strlen(source); - if (*source == '=') { /* 'literal' source */ - if (l <= bufflen) /* small enough? */ - memcpy(out, source + 1, l * sizeof(char)); - else { /* truncate it */ - addstr(out, source + 1, bufflen - 1); - *out = '\0'; - } - } - else if (*source == '@') { /* file name */ - if (l <= bufflen) /* small enough? */ - memcpy(out, source + 1, l * sizeof(char)); - else { /* add '...' before rest of name */ - addstr(out, RETS, LL(RETS)); - bufflen -= LL(RETS); - memcpy(out, source + 1 + l - bufflen, bufflen * sizeof(char)); - } - } - else { /* string; format as [string "source"] */ - const char *nl = strchr(source, '\n'); /* find first new line (if any) */ - addstr(out, PRE, LL(PRE)); /* add prefix */ - bufflen -= LL(PRE RETS POS) + 1; /* save space for prefix+suffix+'\0' */ - if (l < bufflen && nl == NULL) { /* small one-line source? */ - addstr(out, source, l); /* keep it */ - } - else { - if (nl != NULL) l = nl - source; /* stop at first newline */ - if (l > bufflen) l = bufflen; - addstr(out, source, l); - addstr(out, RETS, LL(RETS)); - } - memcpy(out, POS, (LL(POS) + 1) * sizeof(char)); - } -} - diff --git a/3rd/lua/src/lobject.h b/3rd/lua/src/lobject.h deleted file mode 100644 index d7d0ebf..0000000 --- a/3rd/lua/src/lobject.h +++ /dev/null @@ -1,540 +0,0 @@ -/* -** $Id: lobject.h,v 2.106 2015/01/05 13:52:37 roberto Exp $ -** Type definitions for Lua objects -** See Copyright Notice in lua.h -*/ - - -#ifndef lobject_h -#define lobject_h - - -#include - - -#include "llimits.h" -#include "lua.h" - - -/* -** Extra tags for non-values -*/ -#define LUA_TPROTO LUA_NUMTAGS -#define LUA_TDEADKEY (LUA_NUMTAGS+1) - -/* -** number of all possible tags (including LUA_TNONE but excluding DEADKEY) -*/ -#define LUA_TOTALTAGS (LUA_TPROTO + 2) - - -/* -** tags for Tagged Values have the following use of bits: -** bits 0-3: actual tag (a LUA_T* value) -** bits 4-5: variant bits -** bit 6: whether value is collectable -*/ - -#define VARBITS (3 << 4) - - -/* -** LUA_TFUNCTION variants: -** 0 - Lua function -** 1 - light C function -** 2 - regular C function (closure) -*/ - -/* Variant tags for functions */ -#define LUA_TLCL (LUA_TFUNCTION | (0 << 4)) /* Lua closure */ -#define LUA_TLCF (LUA_TFUNCTION | (1 << 4)) /* light C function */ -#define LUA_TCCL (LUA_TFUNCTION | (2 << 4)) /* C closure */ - - -/* Variant tags for strings */ -#define LUA_TSHRSTR (LUA_TSTRING | (0 << 4)) /* short strings */ -#define LUA_TLNGSTR (LUA_TSTRING | (1 << 4)) /* long strings */ - - -/* Variant tags for numbers */ -#define LUA_TNUMFLT (LUA_TNUMBER | (0 << 4)) /* float numbers */ -#define LUA_TNUMINT (LUA_TNUMBER | (1 << 4)) /* integer numbers */ - - -/* Bit mark for collectable types */ -#define BIT_ISCOLLECTABLE (1 << 6) - -/* mark a tag as collectable */ -#define ctb(t) ((t) | BIT_ISCOLLECTABLE) - - -/* -** Common type for all collectable objects -*/ -typedef struct GCObject GCObject; - - -/* -** Common Header for all collectable objects (in macro form, to be -** included in other objects) -*/ -#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked - - -/* -** Common type has only the common header -*/ -struct GCObject { - CommonHeader; -}; - - - -/* -** Union of all Lua values -*/ -typedef union Value Value; - - - - -/* -** Tagged Values. This is the basic representation of values in Lua, -** an actual value plus a tag with its type. -*/ - -#define TValuefields Value value_; int tt_ - -typedef struct lua_TValue TValue; - - -/* macro defining a nil value */ -#define NILCONSTANT {NULL}, LUA_TNIL - - -#define val_(o) ((o)->value_) - - -/* raw type tag of a TValue */ -#define rttype(o) ((o)->tt_) - -/* tag with no variants (bits 0-3) */ -#define novariant(x) ((x) & 0x0F) - -/* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */ -#define ttype(o) (rttype(o) & 0x3F) - -/* type tag of a TValue with no variants (bits 0-3) */ -#define ttnov(o) (novariant(rttype(o))) - - -/* Macros to test type */ -#define checktag(o,t) (rttype(o) == (t)) -#define checktype(o,t) (ttnov(o) == (t)) -#define ttisnumber(o) checktype((o), LUA_TNUMBER) -#define ttisfloat(o) checktag((o), LUA_TNUMFLT) -#define ttisinteger(o) checktag((o), LUA_TNUMINT) -#define ttisnil(o) checktag((o), LUA_TNIL) -#define ttisboolean(o) checktag((o), LUA_TBOOLEAN) -#define ttislightuserdata(o) checktag((o), LUA_TLIGHTUSERDATA) -#define ttisstring(o) checktype((o), LUA_TSTRING) -#define ttisshrstring(o) checktag((o), ctb(LUA_TSHRSTR)) -#define ttislngstring(o) checktag((o), ctb(LUA_TLNGSTR)) -#define ttistable(o) checktag((o), ctb(LUA_TTABLE)) -#define ttisfunction(o) checktype(o, LUA_TFUNCTION) -#define ttisclosure(o) ((rttype(o) & 0x1F) == LUA_TFUNCTION) -#define ttisCclosure(o) checktag((o), ctb(LUA_TCCL)) -#define ttisLclosure(o) checktag((o), ctb(LUA_TLCL)) -#define ttislcf(o) checktag((o), LUA_TLCF) -#define ttisfulluserdata(o) checktag((o), ctb(LUA_TUSERDATA)) -#define ttisthread(o) checktag((o), ctb(LUA_TTHREAD)) -#define ttisdeadkey(o) checktag((o), LUA_TDEADKEY) - - -/* Macros to access values */ -#define ivalue(o) check_exp(ttisinteger(o), val_(o).i) -#define fltvalue(o) check_exp(ttisfloat(o), val_(o).n) -#define nvalue(o) check_exp(ttisnumber(o), \ - (ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o))) -#define gcvalue(o) check_exp(iscollectable(o), val_(o).gc) -#define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p) -#define tsvalue(o) check_exp(ttisstring(o), gco2ts(val_(o).gc)) -#define uvalue(o) check_exp(ttisfulluserdata(o), gco2u(val_(o).gc)) -#define clvalue(o) check_exp(ttisclosure(o), gco2cl(val_(o).gc)) -#define clLvalue(o) check_exp(ttisLclosure(o), gco2lcl(val_(o).gc)) -#define clCvalue(o) check_exp(ttisCclosure(o), gco2ccl(val_(o).gc)) -#define fvalue(o) check_exp(ttislcf(o), val_(o).f) -#define hvalue(o) check_exp(ttistable(o), gco2t(val_(o).gc)) -#define bvalue(o) check_exp(ttisboolean(o), val_(o).b) -#define thvalue(o) check_exp(ttisthread(o), gco2th(val_(o).gc)) -/* a dead value may get the 'gc' field, but cannot access its contents */ -#define deadvalue(o) check_exp(ttisdeadkey(o), cast(void *, val_(o).gc)) - -#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) - - -#define iscollectable(o) (rttype(o) & BIT_ISCOLLECTABLE) - - -/* Macros for internal tests */ -#define righttt(obj) (ttype(obj) == gcvalue(obj)->tt) - -#define checkliveness(g,obj) \ - lua_longassert(!iscollectable(obj) || \ - (righttt(obj) && !isdead(g,gcvalue(obj)))) - - -/* Macros to set values */ -#define settt_(o,t) ((o)->tt_=(t)) - -#define setfltvalue(obj,x) \ - { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMFLT); } - -#define setivalue(obj,x) \ - { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_TNUMINT); } - -#define setnilvalue(obj) settt_(obj, LUA_TNIL) - -#define setfvalue(obj,x) \ - { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); } - -#define setpvalue(obj,x) \ - { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); } - -#define setbvalue(obj,x) \ - { TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); } - -#define setgcovalue(L,obj,x) \ - { TValue *io = (obj); GCObject *i_g=(x); \ - val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); } - -#define setsvalue(L,obj,x) \ - { TValue *io = (obj); TString *x_ = (x); \ - val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \ - checkliveness(G(L),io); } - -#define setuvalue(L,obj,x) \ - { TValue *io = (obj); Udata *x_ = (x); \ - val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TUSERDATA)); \ - checkliveness(G(L),io); } - -#define setthvalue(L,obj,x) \ - { TValue *io = (obj); lua_State *x_ = (x); \ - val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTHREAD)); \ - checkliveness(G(L),io); } - -#define setclLvalue(L,obj,x) \ - { TValue *io = (obj); LClosure *x_ = (x); \ - val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TLCL)); \ - checkliveness(G(L),io); } - -#define setclCvalue(L,obj,x) \ - { TValue *io = (obj); CClosure *x_ = (x); \ - val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TCCL)); \ - checkliveness(G(L),io); } - -#define sethvalue(L,obj,x) \ - { TValue *io = (obj); Table *x_ = (x); \ - val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTABLE)); \ - checkliveness(G(L),io); } - -#define setdeadvalue(obj) settt_(obj, LUA_TDEADKEY) - - - -#define setobj(L,obj1,obj2) \ - { TValue *io1=(obj1); *io1 = *(obj2); \ - (void)L; checkliveness(G(L),io1); } - - -/* -** different types of assignments, according to destination -*/ - -/* from stack to (same) stack */ -#define setobjs2s setobj -/* to stack (not from same stack) */ -#define setobj2s setobj -#define setsvalue2s setsvalue -#define sethvalue2s sethvalue -#define setptvalue2s setptvalue -/* from table to same table */ -#define setobjt2t setobj -/* to table */ -#define setobj2t setobj -/* to new object */ -#define setobj2n setobj -#define setsvalue2n setsvalue - - - - -/* -** {====================================================== -** types and prototypes -** ======================================================= -*/ - - -union Value { - GCObject *gc; /* collectable objects */ - void *p; /* light userdata */ - int b; /* booleans */ - lua_CFunction f; /* light C functions */ - lua_Integer i; /* integer numbers */ - lua_Number n; /* float numbers */ -}; - - -struct lua_TValue { - TValuefields; -}; - - -typedef TValue *StkId; /* index to stack elements */ - - - - -/* -** Header for string value; string bytes follow the end of this structure -** (aligned according to 'UTString'; see next). -*/ -typedef struct TString { - CommonHeader; - lu_byte extra; /* reserved words for short strings; "has hash" for longs */ - unsigned int hash; - size_t len; /* number of characters in string */ - struct TString *hnext; /* linked list for hash table */ -} TString; - - -/* -** Ensures that address after this type is always fully aligned. -*/ -typedef union UTString { - L_Umaxalign dummy; /* ensures maximum alignment for strings */ - TString tsv; -} UTString; - - -/* -** Get the actual string (array of bytes) from a 'TString'. -** (Access to 'extra' ensures that value is really a 'TString'.) -*/ -#define getaddrstr(ts) (cast(char *, (ts)) + sizeof(UTString)) -#define getstr(ts) \ - check_exp(sizeof((ts)->extra), cast(const char*, getaddrstr(ts))) - -/* get the actual string (array of bytes) from a Lua value */ -#define svalue(o) getstr(tsvalue(o)) - - -/* -** Header for userdata; memory area follows the end of this structure -** (aligned according to 'UUdata'; see next). -*/ -typedef struct Udata { - CommonHeader; - lu_byte ttuv_; /* user value's tag */ - struct Table *metatable; - size_t len; /* number of bytes */ - union Value user_; /* user value */ -} Udata; - - -/* -** Ensures that address after this type is always fully aligned. -*/ -typedef union UUdata { - L_Umaxalign dummy; /* ensures maximum alignment for 'local' udata */ - Udata uv; -} UUdata; - - -/* -** Get the address of memory block inside 'Udata'. -** (Access to 'ttuv_' ensures that value is really a 'Udata'.) -*/ -#define getudatamem(u) \ - check_exp(sizeof((u)->ttuv_), (cast(char*, (u)) + sizeof(UUdata))) - -#define setuservalue(L,u,o) \ - { const TValue *io=(o); Udata *iu = (u); \ - iu->user_ = io->value_; iu->ttuv_ = io->tt_; \ - checkliveness(G(L),io); } - - -#define getuservalue(L,u,o) \ - { TValue *io=(o); const Udata *iu = (u); \ - io->value_ = iu->user_; io->tt_ = iu->ttuv_; \ - checkliveness(G(L),io); } - - -/* -** Description of an upvalue for function prototypes -*/ -typedef struct Upvaldesc { - TString *name; /* upvalue name (for debug information) */ - lu_byte instack; /* whether it is in stack */ - lu_byte idx; /* index of upvalue (in stack or in outer function's list) */ -} Upvaldesc; - - -/* -** Description of a local variable for function prototypes -** (used for debug information) -*/ -typedef struct LocVar { - TString *varname; - int startpc; /* first point where variable is active */ - int endpc; /* first point where variable is dead */ -} LocVar; - - -/* -** Function Prototypes -*/ -typedef struct Proto { - CommonHeader; - lu_byte numparams; /* number of fixed parameters */ - lu_byte is_vararg; - lu_byte maxstacksize; /* maximum stack used by this function */ - int sizeupvalues; /* size of 'upvalues' */ - int sizek; /* size of 'k' */ - int sizecode; - int sizelineinfo; - int sizep; /* size of 'p' */ - int sizelocvars; - int linedefined; - int lastlinedefined; - TValue *k; /* constants used by the function */ - Instruction *code; - struct Proto **p; /* functions defined inside the function */ - int *lineinfo; /* map from opcodes to source lines (debug information) */ - LocVar *locvars; /* information about local variables (debug information) */ - Upvaldesc *upvalues; /* upvalue information */ - struct LClosure *cache; /* last created closure with this prototype */ - TString *source; /* used for debug information */ - GCObject *gclist; -} Proto; - - - -/* -** Lua Upvalues -*/ -typedef struct UpVal UpVal; - - -/* -** Closures -*/ - -#define ClosureHeader \ - CommonHeader; lu_byte nupvalues; GCObject *gclist - -typedef struct CClosure { - ClosureHeader; - lua_CFunction f; - TValue upvalue[1]; /* list of upvalues */ -} CClosure; - - -typedef struct LClosure { - ClosureHeader; - struct Proto *p; - UpVal *upvals[1]; /* list of upvalues */ -} LClosure; - - -typedef union Closure { - CClosure c; - LClosure l; -} Closure; - - -#define isLfunction(o) ttisLclosure(o) - -#define getproto(o) (clLvalue(o)->p) - - -/* -** Tables -*/ - -typedef union TKey { - struct { - TValuefields; - int next; /* for chaining (offset for next node) */ - } nk; - TValue tvk; -} TKey; - - -/* copy a value into a key without messing up field 'next' */ -#define setnodekey(L,key,obj) \ - { TKey *k_=(key); const TValue *io_=(obj); \ - k_->nk.value_ = io_->value_; k_->nk.tt_ = io_->tt_; \ - (void)L; checkliveness(G(L),io_); } - - -typedef struct Node { - TValue i_val; - TKey i_key; -} Node; - - -typedef struct Table { - CommonHeader; - lu_byte flags; /* 1<

lsizenode)) - - -/* -** (address of) a fixed nil value -*/ -#define luaO_nilobject (&luaO_nilobject_) - - -LUAI_DDEC const TValue luaO_nilobject_; - -/* size of buffer for 'luaO_utf8esc' function */ -#define UTF8BUFFSZ 8 - -LUAI_FUNC int luaO_int2fb (unsigned int x); -LUAI_FUNC int luaO_fb2int (int x); -LUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x); -LUAI_FUNC int luaO_ceillog2 (unsigned int x); -LUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1, - const TValue *p2, TValue *res); -LUAI_FUNC size_t luaO_str2num (const char *s, TValue *o); -LUAI_FUNC int luaO_hexavalue (int c); -LUAI_FUNC void luaO_tostring (lua_State *L, StkId obj); -LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, - va_list argp); -LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); -LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); - - -#endif - diff --git a/3rd/lua/src/lopcodes.c b/3rd/lua/src/lopcodes.c deleted file mode 100644 index a1cbef8..0000000 --- a/3rd/lua/src/lopcodes.c +++ /dev/null @@ -1,124 +0,0 @@ -/* -** $Id: lopcodes.c,v 1.55 2015/01/05 13:48:33 roberto Exp $ -** Opcodes for Lua virtual machine -** See Copyright Notice in lua.h -*/ - -#define lopcodes_c -#define LUA_CORE - -#include "lprefix.h" - - -#include - -#include "lopcodes.h" - - -/* ORDER OP */ - -LUAI_DDEF const char *const luaP_opnames[NUM_OPCODES+1] = { - "MOVE", - "LOADK", - "LOADKX", - "LOADBOOL", - "LOADNIL", - "GETUPVAL", - "GETTABUP", - "GETTABLE", - "SETTABUP", - "SETUPVAL", - "SETTABLE", - "NEWTABLE", - "SELF", - "ADD", - "SUB", - "MUL", - "MOD", - "POW", - "DIV", - "IDIV", - "BAND", - "BOR", - "BXOR", - "SHL", - "SHR", - "UNM", - "BNOT", - "NOT", - "LEN", - "CONCAT", - "JMP", - "EQ", - "LT", - "LE", - "TEST", - "TESTSET", - "CALL", - "TAILCALL", - "RETURN", - "FORLOOP", - "FORPREP", - "TFORCALL", - "TFORLOOP", - "SETLIST", - "CLOSURE", - "VARARG", - "EXTRAARG", - NULL -}; - - -#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m)) - -LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = { -/* T A B C mode opcode */ - opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_MOVE */ - ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_LOADK */ - ,opmode(0, 1, OpArgN, OpArgN, iABx) /* OP_LOADKX */ - ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_LOADBOOL */ - ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_LOADNIL */ - ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_GETUPVAL */ - ,opmode(0, 1, OpArgU, OpArgK, iABC) /* OP_GETTABUP */ - ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_GETTABLE */ - ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETTABUP */ - ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_SETUPVAL */ - ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETTABLE */ - ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_NEWTABLE */ - ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_SELF */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_ADD */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SUB */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MUL */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MOD */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_POW */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_DIV */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_IDIV */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_BAND */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_BOR */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_BXOR */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SHL */ - ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SHR */ - ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_UNM */ - ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_BNOT */ - ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_NOT */ - ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LEN */ - ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_CONCAT */ - ,opmode(0, 0, OpArgR, OpArgN, iAsBx) /* OP_JMP */ - ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_EQ */ - ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_LT */ - ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_LE */ - ,opmode(1, 0, OpArgN, OpArgU, iABC) /* OP_TEST */ - ,opmode(1, 1, OpArgR, OpArgU, iABC) /* OP_TESTSET */ - ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_CALL */ - ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_TAILCALL */ - ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_RETURN */ - ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_FORLOOP */ - ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_FORPREP */ - ,opmode(0, 0, OpArgN, OpArgU, iABC) /* OP_TFORCALL */ - ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_TFORLOOP */ - ,opmode(0, 0, OpArgU, OpArgU, iABC) /* OP_SETLIST */ - ,opmode(0, 1, OpArgU, OpArgN, iABx) /* OP_CLOSURE */ - ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_VARARG */ - ,opmode(0, 0, OpArgU, OpArgU, iAx) /* OP_EXTRAARG */ -}; - diff --git a/3rd/lua/src/lopcodes.h b/3rd/lua/src/lopcodes.h deleted file mode 100644 index 864b8e4..0000000 --- a/3rd/lua/src/lopcodes.h +++ /dev/null @@ -1,295 +0,0 @@ -/* -** $Id: lopcodes.h,v 1.148 2014/10/25 11:50:46 roberto Exp $ -** Opcodes for Lua virtual machine -** See Copyright Notice in lua.h -*/ - -#ifndef lopcodes_h -#define lopcodes_h - -#include "llimits.h" - - -/*=========================================================================== - We assume that instructions are unsigned numbers. - All instructions have an opcode in the first 6 bits. - Instructions can have the following fields: - 'A' : 8 bits - 'B' : 9 bits - 'C' : 9 bits - 'Ax' : 26 bits ('A', 'B', and 'C' together) - 'Bx' : 18 bits ('B' and 'C' together) - 'sBx' : signed Bx - - A signed argument is represented in excess K; that is, the number - value is the unsigned value minus K. K is exactly the maximum value - for that argument (so that -max is represented by 0, and +max is - represented by 2*max), which is half the maximum for the corresponding - unsigned argument. -===========================================================================*/ - - -enum OpMode {iABC, iABx, iAsBx, iAx}; /* basic instruction format */ - - -/* -** size and position of opcode arguments. -*/ -#define SIZE_C 9 -#define SIZE_B 9 -#define SIZE_Bx (SIZE_C + SIZE_B) -#define SIZE_A 8 -#define SIZE_Ax (SIZE_C + SIZE_B + SIZE_A) - -#define SIZE_OP 6 - -#define POS_OP 0 -#define POS_A (POS_OP + SIZE_OP) -#define POS_C (POS_A + SIZE_A) -#define POS_B (POS_C + SIZE_C) -#define POS_Bx POS_C -#define POS_Ax POS_A - - -/* -** limits for opcode arguments. -** we use (signed) int to manipulate most arguments, -** so they must fit in LUAI_BITSINT-1 bits (-1 for sign) -*/ -#if SIZE_Bx < LUAI_BITSINT-1 -#define MAXARG_Bx ((1<>1) /* 'sBx' is signed */ -#else -#define MAXARG_Bx MAX_INT -#define MAXARG_sBx MAX_INT -#endif - -#if SIZE_Ax < LUAI_BITSINT-1 -#define MAXARG_Ax ((1<>POS_OP) & MASK1(SIZE_OP,0))) -#define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \ - ((cast(Instruction, o)<>pos) & MASK1(size,0))) -#define setarg(i,v,pos,size) ((i) = (((i)&MASK0(size,pos)) | \ - ((cast(Instruction, v)<> RK(C) */ -OP_UNM,/* A B R(A) := -R(B) */ -OP_BNOT,/* A B R(A) := ~R(B) */ -OP_NOT,/* A B R(A) := not R(B) */ -OP_LEN,/* A B R(A) := length of R(B) */ - -OP_CONCAT,/* A B C R(A) := R(B).. ... ..R(C) */ - -OP_JMP,/* A sBx pc+=sBx; if (A) close all upvalues >= R(A - 1) */ -OP_EQ,/* A B C if ((RK(B) == RK(C)) ~= A) then pc++ */ -OP_LT,/* A B C if ((RK(B) < RK(C)) ~= A) then pc++ */ -OP_LE,/* A B C if ((RK(B) <= RK(C)) ~= A) then pc++ */ - -OP_TEST,/* A C if not (R(A) <=> C) then pc++ */ -OP_TESTSET,/* A B C if (R(B) <=> C) then R(A) := R(B) else pc++ */ - -OP_CALL,/* A B C R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */ -OP_TAILCALL,/* A B C return R(A)(R(A+1), ... ,R(A+B-1)) */ -OP_RETURN,/* A B return R(A), ... ,R(A+B-2) (see note) */ - -OP_FORLOOP,/* A sBx R(A)+=R(A+2); - if R(A) > 4) & 3)) -#define getCMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3)) -#define testAMode(m) (luaP_opmodes[m] & (1 << 6)) -#define testTMode(m) (luaP_opmodes[m] & (1 << 7)) - - -LUAI_DDEC const char *const luaP_opnames[NUM_OPCODES+1]; /* opcode names */ - - -/* number of list items to accumulate before a SETLIST instruction */ -#define LFIELDS_PER_FLUSH 50 - - -#endif diff --git a/3rd/lua/src/loslib.c b/3rd/lua/src/loslib.c deleted file mode 100644 index 20359b2..0000000 --- a/3rd/lua/src/loslib.c +++ /dev/null @@ -1,356 +0,0 @@ -/* -** $Id: loslib.c,v 1.54 2014/12/26 14:46:07 roberto Exp $ -** Standard Operating System library -** See Copyright Notice in lua.h -*/ - -#define loslib_c -#define LUA_LIB - -#include "lprefix.h" - - -#include -#include -#include -#include -#include - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -#if !defined(LUA_STRFTIMEOPTIONS) /* { */ -/* -** list of valid conversion specifiers for the 'strftime' function -*/ - -#if defined(LUA_USE_C89) -#define LUA_STRFTIMEOPTIONS { "aAbBcdHIjmMpSUwWxXyYz%", "" } -#else /* C99 specification */ -#define LUA_STRFTIMEOPTIONS \ - { "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%", "", \ - "E", "cCxXyY", \ - "O", "deHImMSuUVwWy" } -#endif - -#endif /* } */ - - - -#if !defined(l_time_t) /* { */ -/* -** type to represent time_t in Lua -*/ -#define l_timet lua_Integer -#define l_pushtime(L,t) lua_pushinteger(L,(lua_Integer)(t)) -#define l_checktime(L,a) ((time_t)luaL_checkinteger(L,a)) - -#endif /* } */ - - - -#if !defined(lua_tmpnam) /* { */ -/* -** By default, Lua uses tmpnam except when POSIX is available, where it -** uses mkstemp. -*/ - -#if defined(LUA_USE_POSIX) /* { */ - -#include - -#define LUA_TMPNAMBUFSIZE 32 - -#if !defined(LUA_TMPNAMTEMPLATE) -#define LUA_TMPNAMTEMPLATE "/tmp/lua_XXXXXX" -#endif - -#define lua_tmpnam(b,e) { \ - strcpy(b, LUA_TMPNAMTEMPLATE); \ - e = mkstemp(b); \ - if (e != -1) close(e); \ - e = (e == -1); } - -#else /* }{ */ - -/* ISO C definitions */ -#define LUA_TMPNAMBUFSIZE L_tmpnam -#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); } - -#endif /* } */ - -#endif /* } */ - - - -#if !defined(l_gmtime) /* { */ -/* -** By default, Lua uses gmtime/localtime, except when POSIX is available, -** where it uses gmtime_r/localtime_r -*/ - -#if defined(LUA_USE_POSIX) /* { */ - -#define l_gmtime(t,r) gmtime_r(t,r) -#define l_localtime(t,r) localtime_r(t,r) - -#else /* }{ */ - -/* ISO C definitions */ -#define l_gmtime(t,r) ((void)(r)->tm_sec, gmtime(t)) -#define l_localtime(t,r) ((void)(r)->tm_sec, localtime(t)) - -#endif /* } */ - -#endif /* } */ - - - -static int os_execute (lua_State *L) { - const char *cmd = luaL_optstring(L, 1, NULL); - int stat = system(cmd); - if (cmd != NULL) - return luaL_execresult(L, stat); - else { - lua_pushboolean(L, stat); /* true if there is a shell */ - return 1; - } -} - - -static int os_remove (lua_State *L) { - const char *filename = luaL_checkstring(L, 1); - return luaL_fileresult(L, remove(filename) == 0, filename); -} - - -static int os_rename (lua_State *L) { - const char *fromname = luaL_checkstring(L, 1); - const char *toname = luaL_checkstring(L, 2); - return luaL_fileresult(L, rename(fromname, toname) == 0, NULL); -} - - -static int os_tmpname (lua_State *L) { - char buff[LUA_TMPNAMBUFSIZE]; - int err; - lua_tmpnam(buff, err); - if (err) - return luaL_error(L, "unable to generate a unique filename"); - lua_pushstring(L, buff); - return 1; -} - - -static int os_getenv (lua_State *L) { - lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ - return 1; -} - - -static int os_clock (lua_State *L) { - lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); - return 1; -} - - -/* -** {====================================================== -** Time/Date operations -** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S, -** wday=%w+1, yday=%j, isdst=? } -** ======================================================= -*/ - -static void setfield (lua_State *L, const char *key, int value) { - lua_pushinteger(L, value); - lua_setfield(L, -2, key); -} - -static void setboolfield (lua_State *L, const char *key, int value) { - if (value < 0) /* undefined? */ - return; /* does not set field */ - lua_pushboolean(L, value); - lua_setfield(L, -2, key); -} - -static int getboolfield (lua_State *L, const char *key) { - int res; - res = (lua_getfield(L, -1, key) == LUA_TNIL) ? -1 : lua_toboolean(L, -1); - lua_pop(L, 1); - return res; -} - - -static int getfield (lua_State *L, const char *key, int d) { - int res, isnum; - lua_getfield(L, -1, key); - res = (int)lua_tointegerx(L, -1, &isnum); - if (!isnum) { - if (d < 0) - return luaL_error(L, "field '%s' missing in date table", key); - res = d; - } - lua_pop(L, 1); - return res; -} - - -static const char *checkoption (lua_State *L, const char *conv, char *buff) { - static const char *const options[] = LUA_STRFTIMEOPTIONS; - unsigned int i; - for (i = 0; i < sizeof(options)/sizeof(options[0]); i += 2) { - if (*conv != '\0' && strchr(options[i], *conv) != NULL) { - buff[1] = *conv; - if (*options[i + 1] == '\0') { /* one-char conversion specifier? */ - buff[2] = '\0'; /* end buffer */ - return conv + 1; - } - else if (*(conv + 1) != '\0' && - strchr(options[i + 1], *(conv + 1)) != NULL) { - buff[2] = *(conv + 1); /* valid two-char conversion specifier */ - buff[3] = '\0'; /* end buffer */ - return conv + 2; - } - } - } - luaL_argerror(L, 1, - lua_pushfstring(L, "invalid conversion specifier '%%%s'", conv)); - return conv; /* to avoid warnings */ -} - - -static int os_date (lua_State *L) { - const char *s = luaL_optstring(L, 1, "%c"); - time_t t = luaL_opt(L, l_checktime, 2, time(NULL)); - struct tm tmr, *stm; - if (*s == '!') { /* UTC? */ - stm = l_gmtime(&t, &tmr); - s++; /* skip '!' */ - } - else - stm = l_localtime(&t, &tmr); - if (stm == NULL) /* invalid date? */ - lua_pushnil(L); - else if (strcmp(s, "*t") == 0) { - lua_createtable(L, 0, 9); /* 9 = number of fields */ - setfield(L, "sec", stm->tm_sec); - setfield(L, "min", stm->tm_min); - setfield(L, "hour", stm->tm_hour); - setfield(L, "day", stm->tm_mday); - setfield(L, "month", stm->tm_mon+1); - setfield(L, "year", stm->tm_year+1900); - setfield(L, "wday", stm->tm_wday+1); - setfield(L, "yday", stm->tm_yday+1); - setboolfield(L, "isdst", stm->tm_isdst); - } - else { - char cc[4]; - luaL_Buffer b; - cc[0] = '%'; - luaL_buffinit(L, &b); - while (*s) { - if (*s != '%') /* no conversion specifier? */ - luaL_addchar(&b, *s++); - else { - size_t reslen; - char buff[200]; /* should be big enough for any conversion result */ - s = checkoption(L, s + 1, cc); - reslen = strftime(buff, sizeof(buff), cc, stm); - luaL_addlstring(&b, buff, reslen); - } - } - luaL_pushresult(&b); - } - return 1; -} - - -static int os_time (lua_State *L) { - time_t t; - if (lua_isnoneornil(L, 1)) /* called without args? */ - t = time(NULL); /* get current time */ - else { - struct tm ts; - luaL_checktype(L, 1, LUA_TTABLE); - lua_settop(L, 1); /* make sure table is at the top */ - ts.tm_sec = getfield(L, "sec", 0); - ts.tm_min = getfield(L, "min", 0); - ts.tm_hour = getfield(L, "hour", 12); - ts.tm_mday = getfield(L, "day", -1); - ts.tm_mon = getfield(L, "month", -1) - 1; - ts.tm_year = getfield(L, "year", -1) - 1900; - ts.tm_isdst = getboolfield(L, "isdst"); - t = mktime(&ts); - } - if (t != (time_t)(l_timet)t) - luaL_error(L, "time result cannot be represented in this Lua instalation"); - else if (t == (time_t)(-1)) - lua_pushnil(L); - else - l_pushtime(L, t); - return 1; -} - - -static int os_difftime (lua_State *L) { - double res = difftime((l_checktime(L, 1)), (l_checktime(L, 2))); - lua_pushnumber(L, (lua_Number)res); - return 1; -} - -/* }====================================================== */ - - -static int os_setlocale (lua_State *L) { - static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, - LC_NUMERIC, LC_TIME}; - static const char *const catnames[] = {"all", "collate", "ctype", "monetary", - "numeric", "time", NULL}; - const char *l = luaL_optstring(L, 1, NULL); - int op = luaL_checkoption(L, 2, "all", catnames); - lua_pushstring(L, setlocale(cat[op], l)); - return 1; -} - - -static int os_exit (lua_State *L) { - int status; - if (lua_isboolean(L, 1)) - status = (lua_toboolean(L, 1) ? EXIT_SUCCESS : EXIT_FAILURE); - else - status = (int)luaL_optinteger(L, 1, EXIT_SUCCESS); - if (lua_toboolean(L, 2)) - lua_close(L); - if (L) exit(status); /* 'if' to avoid warnings for unreachable 'return' */ - return 0; -} - - -static const luaL_Reg syslib[] = { - {"clock", os_clock}, - {"date", os_date}, - {"difftime", os_difftime}, - {"execute", os_execute}, - {"exit", os_exit}, - {"getenv", os_getenv}, - {"remove", os_remove}, - {"rename", os_rename}, - {"setlocale", os_setlocale}, - {"time", os_time}, - {"tmpname", os_tmpname}, - {NULL, NULL} -}; - -/* }====================================================== */ - - - -LUAMOD_API int luaopen_os (lua_State *L) { - luaL_newlib(L, syslib); - return 1; -} - diff --git a/3rd/lua/src/lparser.c b/3rd/lua/src/lparser.c deleted file mode 100644 index 9a54dfc..0000000 --- a/3rd/lua/src/lparser.c +++ /dev/null @@ -1,1647 +0,0 @@ -/* -** $Id: lparser.c,v 2.147 2014/12/27 20:31:43 roberto Exp $ -** Lua Parser -** See Copyright Notice in lua.h -*/ - -#define lparser_c -#define LUA_CORE - -#include "lprefix.h" - - -#include - -#include "lua.h" - -#include "lcode.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "llex.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" - - - -/* maximum number of local variables per function (must be smaller - than 250, due to the bytecode format) */ -#define MAXVARS 200 - - -#define hasmultret(k) ((k) == VCALL || (k) == VVARARG) - - -/* because all strings are unified by the scanner, the parser - can use pointer equality for string equality */ -#define eqstr(a,b) ((a) == (b)) - - -/* -** nodes for block list (list of active blocks) -*/ -typedef struct BlockCnt { - struct BlockCnt *previous; /* chain */ - int firstlabel; /* index of first label in this block */ - int firstgoto; /* index of first pending goto in this block */ - lu_byte nactvar; /* # active locals outside the block */ - lu_byte upval; /* true if some variable in the block is an upvalue */ - lu_byte isloop; /* true if 'block' is a loop */ -} BlockCnt; - - - -/* -** prototypes for recursive non-terminal functions -*/ -static void statement (LexState *ls); -static void expr (LexState *ls, expdesc *v); - - -/* semantic error */ -static l_noret semerror (LexState *ls, const char *msg) { - ls->t.token = 0; /* remove "near " from final message */ - luaX_syntaxerror(ls, msg); -} - - -static l_noret error_expected (LexState *ls, int token) { - luaX_syntaxerror(ls, - luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token))); -} - - -static l_noret errorlimit (FuncState *fs, int limit, const char *what) { - lua_State *L = fs->ls->L; - const char *msg; - int line = fs->f->linedefined; - const char *where = (line == 0) - ? "main function" - : luaO_pushfstring(L, "function at line %d", line); - msg = luaO_pushfstring(L, "too many %s (limit is %d) in %s", - what, limit, where); - luaX_syntaxerror(fs->ls, msg); -} - - -static void checklimit (FuncState *fs, int v, int l, const char *what) { - if (v > l) errorlimit(fs, l, what); -} - - -static int testnext (LexState *ls, int c) { - if (ls->t.token == c) { - luaX_next(ls); - return 1; - } - else return 0; -} - - -static void check (LexState *ls, int c) { - if (ls->t.token != c) - error_expected(ls, c); -} - - -static void checknext (LexState *ls, int c) { - check(ls, c); - luaX_next(ls); -} - - -#define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } - - - -static void check_match (LexState *ls, int what, int who, int where) { - if (!testnext(ls, what)) { - if (where == ls->linenumber) - error_expected(ls, what); - else { - luaX_syntaxerror(ls, luaO_pushfstring(ls->L, - "%s expected (to close %s at line %d)", - luaX_token2str(ls, what), luaX_token2str(ls, who), where)); - } - } -} - - -static TString *str_checkname (LexState *ls) { - TString *ts; - check(ls, TK_NAME); - ts = ls->t.seminfo.ts; - luaX_next(ls); - return ts; -} - - -static void init_exp (expdesc *e, expkind k, int i) { - e->f = e->t = NO_JUMP; - e->k = k; - e->u.info = i; -} - - -static void codestring (LexState *ls, expdesc *e, TString *s) { - init_exp(e, VK, luaK_stringK(ls->fs, s)); -} - - -static void checkname (LexState *ls, expdesc *e) { - codestring(ls, e, str_checkname(ls)); -} - - -static int registerlocalvar (LexState *ls, TString *varname) { - FuncState *fs = ls->fs; - Proto *f = fs->f; - int oldsize = f->sizelocvars; - luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, - LocVar, SHRT_MAX, "local variables"); - while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL; - f->locvars[fs->nlocvars].varname = varname; - luaC_objbarrier(ls->L, f, varname); - return fs->nlocvars++; -} - - -static void new_localvar (LexState *ls, TString *name) { - FuncState *fs = ls->fs; - Dyndata *dyd = ls->dyd; - int reg = registerlocalvar(ls, name); - checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal, - MAXVARS, "local variables"); - luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1, - dyd->actvar.size, Vardesc, MAX_INT, "local variables"); - dyd->actvar.arr[dyd->actvar.n++].idx = cast(short, reg); -} - - -static void new_localvarliteral_ (LexState *ls, const char *name, size_t sz) { - new_localvar(ls, luaX_newstring(ls, name, sz)); -} - -#define new_localvarliteral(ls,v) \ - new_localvarliteral_(ls, "" v, (sizeof(v)/sizeof(char))-1) - - -static LocVar *getlocvar (FuncState *fs, int i) { - int idx = fs->ls->dyd->actvar.arr[fs->firstlocal + i].idx; - lua_assert(idx < fs->nlocvars); - return &fs->f->locvars[idx]; -} - - -static void adjustlocalvars (LexState *ls, int nvars) { - FuncState *fs = ls->fs; - fs->nactvar = cast_byte(fs->nactvar + nvars); - for (; nvars; nvars--) { - getlocvar(fs, fs->nactvar - nvars)->startpc = fs->pc; - } -} - - -static void removevars (FuncState *fs, int tolevel) { - fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel); - while (fs->nactvar > tolevel) - getlocvar(fs, --fs->nactvar)->endpc = fs->pc; -} - - -static int searchupvalue (FuncState *fs, TString *name) { - int i; - Upvaldesc *up = fs->f->upvalues; - for (i = 0; i < fs->nups; i++) { - if (eqstr(up[i].name, name)) return i; - } - return -1; /* not found */ -} - - -static int newupvalue (FuncState *fs, TString *name, expdesc *v) { - Proto *f = fs->f; - int oldsize = f->sizeupvalues; - checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues"); - luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, - Upvaldesc, MAXUPVAL, "upvalues"); - while (oldsize < f->sizeupvalues) f->upvalues[oldsize++].name = NULL; - f->upvalues[fs->nups].instack = (v->k == VLOCAL); - f->upvalues[fs->nups].idx = cast_byte(v->u.info); - f->upvalues[fs->nups].name = name; - luaC_objbarrier(fs->ls->L, f, name); - return fs->nups++; -} - - -static int searchvar (FuncState *fs, TString *n) { - int i; - for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) { - if (eqstr(n, getlocvar(fs, i)->varname)) - return i; - } - return -1; /* not found */ -} - - -/* - Mark block where variable at given level was defined - (to emit close instructions later). -*/ -static void markupval (FuncState *fs, int level) { - BlockCnt *bl = fs->bl; - while (bl->nactvar > level) bl = bl->previous; - bl->upval = 1; -} - - -/* - Find variable with given name 'n'. If it is an upvalue, add this - upvalue into all intermediate functions. -*/ -static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { - if (fs == NULL) /* no more levels? */ - return VVOID; /* default is global */ - else { - int v = searchvar(fs, n); /* look up locals at current level */ - if (v >= 0) { /* found? */ - init_exp(var, VLOCAL, v); /* variable is local */ - if (!base) - markupval(fs, v); /* local will be used as an upval */ - return VLOCAL; - } - else { /* not found as local at current level; try upvalues */ - int idx = searchupvalue(fs, n); /* try existing upvalues */ - if (idx < 0) { /* not found? */ - if (singlevaraux(fs->prev, n, var, 0) == VVOID) /* try upper levels */ - return VVOID; /* not found; is a global */ - /* else was LOCAL or UPVAL */ - idx = newupvalue(fs, n, var); /* will be a new upvalue */ - } - init_exp(var, VUPVAL, idx); - return VUPVAL; - } - } -} - - -static void singlevar (LexState *ls, expdesc *var) { - TString *varname = str_checkname(ls); - FuncState *fs = ls->fs; - if (singlevaraux(fs, varname, var, 1) == VVOID) { /* global name? */ - expdesc key; - singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ - lua_assert(var->k == VLOCAL || var->k == VUPVAL); - codestring(ls, &key, varname); /* key is variable name */ - luaK_indexed(fs, var, &key); /* env[varname] */ - } -} - - -static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { - FuncState *fs = ls->fs; - int extra = nvars - nexps; - if (hasmultret(e->k)) { - extra++; /* includes call itself */ - if (extra < 0) extra = 0; - luaK_setreturns(fs, e, extra); /* last exp. provides the difference */ - if (extra > 1) luaK_reserveregs(fs, extra-1); - } - else { - if (e->k != VVOID) luaK_exp2nextreg(fs, e); /* close last expression */ - if (extra > 0) { - int reg = fs->freereg; - luaK_reserveregs(fs, extra); - luaK_nil(fs, reg, extra); - } - } -} - - -static void enterlevel (LexState *ls) { - lua_State *L = ls->L; - ++L->nCcalls; - checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, "C levels"); -} - - -#define leavelevel(ls) ((ls)->L->nCcalls--) - - -static void closegoto (LexState *ls, int g, Labeldesc *label) { - int i; - FuncState *fs = ls->fs; - Labellist *gl = &ls->dyd->gt; - Labeldesc *gt = &gl->arr[g]; - lua_assert(eqstr(gt->name, label->name)); - if (gt->nactvar < label->nactvar) { - TString *vname = getlocvar(fs, gt->nactvar)->varname; - const char *msg = luaO_pushfstring(ls->L, - " at line %d jumps into the scope of local '%s'", - getstr(gt->name), gt->line, getstr(vname)); - semerror(ls, msg); - } - luaK_patchlist(fs, gt->pc, label->pc); - /* remove goto from pending list */ - for (i = g; i < gl->n - 1; i++) - gl->arr[i] = gl->arr[i + 1]; - gl->n--; -} - - -/* -** try to close a goto with existing labels; this solves backward jumps -*/ -static int findlabel (LexState *ls, int g) { - int i; - BlockCnt *bl = ls->fs->bl; - Dyndata *dyd = ls->dyd; - Labeldesc *gt = &dyd->gt.arr[g]; - /* check labels in current block for a match */ - for (i = bl->firstlabel; i < dyd->label.n; i++) { - Labeldesc *lb = &dyd->label.arr[i]; - if (eqstr(lb->name, gt->name)) { /* correct label? */ - if (gt->nactvar > lb->nactvar && - (bl->upval || dyd->label.n > bl->firstlabel)) - luaK_patchclose(ls->fs, gt->pc, lb->nactvar); - closegoto(ls, g, lb); /* close it */ - return 1; - } - } - return 0; /* label not found; cannot close goto */ -} - - -static int newlabelentry (LexState *ls, Labellist *l, TString *name, - int line, int pc) { - int n = l->n; - luaM_growvector(ls->L, l->arr, n, l->size, - Labeldesc, SHRT_MAX, "labels/gotos"); - l->arr[n].name = name; - l->arr[n].line = line; - l->arr[n].nactvar = ls->fs->nactvar; - l->arr[n].pc = pc; - l->n = n + 1; - return n; -} - - -/* -** check whether new label 'lb' matches any pending gotos in current -** block; solves forward jumps -*/ -static void findgotos (LexState *ls, Labeldesc *lb) { - Labellist *gl = &ls->dyd->gt; - int i = ls->fs->bl->firstgoto; - while (i < gl->n) { - if (eqstr(gl->arr[i].name, lb->name)) - closegoto(ls, i, lb); - else - i++; - } -} - - -/* -** export pending gotos to outer level, to check them against -** outer labels; if the block being exited has upvalues, and -** the goto exits the scope of any variable (which can be the -** upvalue), close those variables being exited. -*/ -static void movegotosout (FuncState *fs, BlockCnt *bl) { - int i = bl->firstgoto; - Labellist *gl = &fs->ls->dyd->gt; - /* correct pending gotos to current block and try to close it - with visible labels */ - while (i < gl->n) { - Labeldesc *gt = &gl->arr[i]; - if (gt->nactvar > bl->nactvar) { - if (bl->upval) - luaK_patchclose(fs, gt->pc, bl->nactvar); - gt->nactvar = bl->nactvar; - } - if (!findlabel(fs->ls, i)) - i++; /* move to next one */ - } -} - - -static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) { - bl->isloop = isloop; - bl->nactvar = fs->nactvar; - bl->firstlabel = fs->ls->dyd->label.n; - bl->firstgoto = fs->ls->dyd->gt.n; - bl->upval = 0; - bl->previous = fs->bl; - fs->bl = bl; - lua_assert(fs->freereg == fs->nactvar); -} - - -/* -** create a label named 'break' to resolve break statements -*/ -static void breaklabel (LexState *ls) { - TString *n = luaS_new(ls->L, "break"); - int l = newlabelentry(ls, &ls->dyd->label, n, 0, ls->fs->pc); - findgotos(ls, &ls->dyd->label.arr[l]); -} - -/* -** generates an error for an undefined 'goto'; choose appropriate -** message when label name is a reserved word (which can only be 'break') -*/ -static l_noret undefgoto (LexState *ls, Labeldesc *gt) { - const char *msg = isreserved(gt->name) - ? "<%s> at line %d not inside a loop" - : "no visible label '%s' for at line %d"; - msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); - semerror(ls, msg); -} - - -static void leaveblock (FuncState *fs) { - BlockCnt *bl = fs->bl; - LexState *ls = fs->ls; - if (bl->previous && bl->upval) { - /* create a 'jump to here' to close upvalues */ - int j = luaK_jump(fs); - luaK_patchclose(fs, j, bl->nactvar); - luaK_patchtohere(fs, j); - } - if (bl->isloop) - breaklabel(ls); /* close pending breaks */ - fs->bl = bl->previous; - removevars(fs, bl->nactvar); - lua_assert(bl->nactvar == fs->nactvar); - fs->freereg = fs->nactvar; /* free registers */ - ls->dyd->label.n = bl->firstlabel; /* remove local labels */ - if (bl->previous) /* inner block? */ - movegotosout(fs, bl); /* update pending gotos to outer block */ - else if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ - undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ -} - - -/* -** adds a new prototype into list of prototypes -*/ -static Proto *addprototype (LexState *ls) { - Proto *clp; - lua_State *L = ls->L; - FuncState *fs = ls->fs; - Proto *f = fs->f; /* prototype of current function */ - if (fs->np >= f->sizep) { - int oldsize = f->sizep; - luaM_growvector(L, f->p, fs->np, f->sizep, Proto *, MAXARG_Bx, "functions"); - while (oldsize < f->sizep) f->p[oldsize++] = NULL; - } - f->p[fs->np++] = clp = luaF_newproto(L); - luaC_objbarrier(L, f, clp); - return clp; -} - - -/* -** codes instruction to create new closure in parent function. -** The OP_CLOSURE instruction must use the last available register, -** so that, if it invokes the GC, the GC knows which registers -** are in use at that time. -*/ -static void codeclosure (LexState *ls, expdesc *v) { - FuncState *fs = ls->fs->prev; - init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np - 1)); - luaK_exp2nextreg(fs, v); /* fix it at the last register */ -} - - -static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { - Proto *f; - fs->prev = ls->fs; /* linked list of funcstates */ - fs->ls = ls; - ls->fs = fs; - fs->pc = 0; - fs->lasttarget = 0; - fs->jpc = NO_JUMP; - fs->freereg = 0; - fs->nk = 0; - fs->np = 0; - fs->nups = 0; - fs->nlocvars = 0; - fs->nactvar = 0; - fs->firstlocal = ls->dyd->actvar.n; - fs->bl = NULL; - f = fs->f; - f->source = ls->source; - f->maxstacksize = 2; /* registers 0/1 are always valid */ - enterblock(fs, bl, 0); -} - - -static void close_func (LexState *ls) { - lua_State *L = ls->L; - FuncState *fs = ls->fs; - Proto *f = fs->f; - luaK_ret(fs, 0, 0); /* final return */ - leaveblock(fs); - luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); - f->sizecode = fs->pc; - luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); - f->sizelineinfo = fs->pc; - luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue); - f->sizek = fs->nk; - luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); - f->sizep = fs->np; - luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); - f->sizelocvars = fs->nlocvars; - luaM_reallocvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc); - f->sizeupvalues = fs->nups; - lua_assert(fs->bl == NULL); - ls->fs = fs->prev; - luaC_checkGC(L); -} - - - -/*============================================================*/ -/* GRAMMAR RULES */ -/*============================================================*/ - - -/* -** check whether current token is in the follow set of a block. -** 'until' closes syntactical blocks, but do not close scope, -** so it is handled in separate. -*/ -static int block_follow (LexState *ls, int withuntil) { - switch (ls->t.token) { - case TK_ELSE: case TK_ELSEIF: - case TK_END: case TK_EOS: - return 1; - case TK_UNTIL: return withuntil; - default: return 0; - } -} - - -static void statlist (LexState *ls) { - /* statlist -> { stat [';'] } */ - while (!block_follow(ls, 1)) { - if (ls->t.token == TK_RETURN) { - statement(ls); - return; /* 'return' must be last statement */ - } - statement(ls); - } -} - - -static void fieldsel (LexState *ls, expdesc *v) { - /* fieldsel -> ['.' | ':'] NAME */ - FuncState *fs = ls->fs; - expdesc key; - luaK_exp2anyregup(fs, v); - luaX_next(ls); /* skip the dot or colon */ - checkname(ls, &key); - luaK_indexed(fs, v, &key); -} - - -static void yindex (LexState *ls, expdesc *v) { - /* index -> '[' expr ']' */ - luaX_next(ls); /* skip the '[' */ - expr(ls, v); - luaK_exp2val(ls->fs, v); - checknext(ls, ']'); -} - - -/* -** {====================================================================== -** Rules for Constructors -** ======================================================================= -*/ - - -struct ConsControl { - expdesc v; /* last list item read */ - expdesc *t; /* table descriptor */ - int nh; /* total number of 'record' elements */ - int na; /* total number of array elements */ - int tostore; /* number of array elements pending to be stored */ -}; - - -static void recfield (LexState *ls, struct ConsControl *cc) { - /* recfield -> (NAME | '['exp1']') = exp1 */ - FuncState *fs = ls->fs; - int reg = ls->fs->freereg; - expdesc key, val; - int rkkey; - if (ls->t.token == TK_NAME) { - checklimit(fs, cc->nh, MAX_INT, "items in a constructor"); - checkname(ls, &key); - } - else /* ls->t.token == '[' */ - yindex(ls, &key); - cc->nh++; - checknext(ls, '='); - rkkey = luaK_exp2RK(fs, &key); - expr(ls, &val); - luaK_codeABC(fs, OP_SETTABLE, cc->t->u.info, rkkey, luaK_exp2RK(fs, &val)); - fs->freereg = reg; /* free registers */ -} - - -static void closelistfield (FuncState *fs, struct ConsControl *cc) { - if (cc->v.k == VVOID) return; /* there is no list item */ - luaK_exp2nextreg(fs, &cc->v); - cc->v.k = VVOID; - if (cc->tostore == LFIELDS_PER_FLUSH) { - luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); /* flush */ - cc->tostore = 0; /* no more items pending */ - } -} - - -static void lastlistfield (FuncState *fs, struct ConsControl *cc) { - if (cc->tostore == 0) return; - if (hasmultret(cc->v.k)) { - luaK_setmultret(fs, &cc->v); - luaK_setlist(fs, cc->t->u.info, cc->na, LUA_MULTRET); - cc->na--; /* do not count last expression (unknown number of elements) */ - } - else { - if (cc->v.k != VVOID) - luaK_exp2nextreg(fs, &cc->v); - luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); - } -} - - -static void listfield (LexState *ls, struct ConsControl *cc) { - /* listfield -> exp */ - expr(ls, &cc->v); - checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); - cc->na++; - cc->tostore++; -} - - -static void field (LexState *ls, struct ConsControl *cc) { - /* field -> listfield | recfield */ - switch(ls->t.token) { - case TK_NAME: { /* may be 'listfield' or 'recfield' */ - if (luaX_lookahead(ls) != '=') /* expression? */ - listfield(ls, cc); - else - recfield(ls, cc); - break; - } - case '[': { - recfield(ls, cc); - break; - } - default: { - listfield(ls, cc); - break; - } - } -} - - -static void constructor (LexState *ls, expdesc *t) { - /* constructor -> '{' [ field { sep field } [sep] ] '}' - sep -> ',' | ';' */ - FuncState *fs = ls->fs; - int line = ls->linenumber; - int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); - struct ConsControl cc; - cc.na = cc.nh = cc.tostore = 0; - cc.t = t; - init_exp(t, VRELOCABLE, pc); - init_exp(&cc.v, VVOID, 0); /* no value (yet) */ - luaK_exp2nextreg(ls->fs, t); /* fix it at stack top */ - checknext(ls, '{'); - do { - lua_assert(cc.v.k == VVOID || cc.tostore > 0); - if (ls->t.token == '}') break; - closelistfield(fs, &cc); - field(ls, &cc); - } while (testnext(ls, ',') || testnext(ls, ';')); - check_match(ls, '}', '{', line); - lastlistfield(fs, &cc); - SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */ - SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh)); /* set initial table size */ -} - -/* }====================================================================== */ - - - -static void parlist (LexState *ls) { - /* parlist -> [ param { ',' param } ] */ - FuncState *fs = ls->fs; - Proto *f = fs->f; - int nparams = 0; - f->is_vararg = 0; - if (ls->t.token != ')') { /* is 'parlist' not empty? */ - do { - switch (ls->t.token) { - case TK_NAME: { /* param -> NAME */ - new_localvar(ls, str_checkname(ls)); - nparams++; - break; - } - case TK_DOTS: { /* param -> '...' */ - luaX_next(ls); - f->is_vararg = 1; - break; - } - default: luaX_syntaxerror(ls, " or '...' expected"); - } - } while (!f->is_vararg && testnext(ls, ',')); - } - adjustlocalvars(ls, nparams); - f->numparams = cast_byte(fs->nactvar); - luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */ -} - - -static void body (LexState *ls, expdesc *e, int ismethod, int line) { - /* body -> '(' parlist ')' block END */ - FuncState new_fs; - BlockCnt bl; - new_fs.f = addprototype(ls); - new_fs.f->linedefined = line; - open_func(ls, &new_fs, &bl); - checknext(ls, '('); - if (ismethod) { - new_localvarliteral(ls, "self"); /* create 'self' parameter */ - adjustlocalvars(ls, 1); - } - parlist(ls); - checknext(ls, ')'); - statlist(ls); - new_fs.f->lastlinedefined = ls->linenumber; - check_match(ls, TK_END, TK_FUNCTION, line); - codeclosure(ls, e); - close_func(ls); -} - - -static int explist (LexState *ls, expdesc *v) { - /* explist -> expr { ',' expr } */ - int n = 1; /* at least one expression */ - expr(ls, v); - while (testnext(ls, ',')) { - luaK_exp2nextreg(ls->fs, v); - expr(ls, v); - n++; - } - return n; -} - - -static void funcargs (LexState *ls, expdesc *f, int line) { - FuncState *fs = ls->fs; - expdesc args; - int base, nparams; - switch (ls->t.token) { - case '(': { /* funcargs -> '(' [ explist ] ')' */ - luaX_next(ls); - if (ls->t.token == ')') /* arg list is empty? */ - args.k = VVOID; - else { - explist(ls, &args); - luaK_setmultret(fs, &args); - } - check_match(ls, ')', '(', line); - break; - } - case '{': { /* funcargs -> constructor */ - constructor(ls, &args); - break; - } - case TK_STRING: { /* funcargs -> STRING */ - codestring(ls, &args, ls->t.seminfo.ts); - luaX_next(ls); /* must use 'seminfo' before 'next' */ - break; - } - default: { - luaX_syntaxerror(ls, "function arguments expected"); - } - } - lua_assert(f->k == VNONRELOC); - base = f->u.info; /* base register for call */ - if (hasmultret(args.k)) - nparams = LUA_MULTRET; /* open call */ - else { - if (args.k != VVOID) - luaK_exp2nextreg(fs, &args); /* close last argument */ - nparams = fs->freereg - (base+1); - } - init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2)); - luaK_fixline(fs, line); - fs->freereg = base+1; /* call remove function and arguments and leaves - (unless changed) one result */ -} - - - - -/* -** {====================================================================== -** Expression parsing -** ======================================================================= -*/ - - -static void primaryexp (LexState *ls, expdesc *v) { - /* primaryexp -> NAME | '(' expr ')' */ - switch (ls->t.token) { - case '(': { - int line = ls->linenumber; - luaX_next(ls); - expr(ls, v); - check_match(ls, ')', '(', line); - luaK_dischargevars(ls->fs, v); - return; - } - case TK_NAME: { - singlevar(ls, v); - return; - } - default: { - luaX_syntaxerror(ls, "unexpected symbol"); - } - } -} - - -static void suffixedexp (LexState *ls, expdesc *v) { - /* suffixedexp -> - primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */ - FuncState *fs = ls->fs; - int line = ls->linenumber; - primaryexp(ls, v); - for (;;) { - switch (ls->t.token) { - case '.': { /* fieldsel */ - fieldsel(ls, v); - break; - } - case '[': { /* '[' exp1 ']' */ - expdesc key; - luaK_exp2anyregup(fs, v); - yindex(ls, &key); - luaK_indexed(fs, v, &key); - break; - } - case ':': { /* ':' NAME funcargs */ - expdesc key; - luaX_next(ls); - checkname(ls, &key); - luaK_self(fs, v, &key); - funcargs(ls, v, line); - break; - } - case '(': case TK_STRING: case '{': { /* funcargs */ - luaK_exp2nextreg(fs, v); - funcargs(ls, v, line); - break; - } - default: return; - } - } -} - - -static void simpleexp (LexState *ls, expdesc *v) { - /* simpleexp -> FLT | INT | STRING | NIL | TRUE | FALSE | ... | - constructor | FUNCTION body | suffixedexp */ - switch (ls->t.token) { - case TK_FLT: { - init_exp(v, VKFLT, 0); - v->u.nval = ls->t.seminfo.r; - break; - } - case TK_INT: { - init_exp(v, VKINT, 0); - v->u.ival = ls->t.seminfo.i; - break; - } - case TK_STRING: { - codestring(ls, v, ls->t.seminfo.ts); - break; - } - case TK_NIL: { - init_exp(v, VNIL, 0); - break; - } - case TK_TRUE: { - init_exp(v, VTRUE, 0); - break; - } - case TK_FALSE: { - init_exp(v, VFALSE, 0); - break; - } - case TK_DOTS: { /* vararg */ - FuncState *fs = ls->fs; - check_condition(ls, fs->f->is_vararg, - "cannot use '...' outside a vararg function"); - init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0)); - break; - } - case '{': { /* constructor */ - constructor(ls, v); - return; - } - case TK_FUNCTION: { - luaX_next(ls); - body(ls, v, 0, ls->linenumber); - return; - } - default: { - suffixedexp(ls, v); - return; - } - } - luaX_next(ls); -} - - -static UnOpr getunopr (int op) { - switch (op) { - case TK_NOT: return OPR_NOT; - case '-': return OPR_MINUS; - case '~': return OPR_BNOT; - case '#': return OPR_LEN; - default: return OPR_NOUNOPR; - } -} - - -static BinOpr getbinopr (int op) { - switch (op) { - case '+': return OPR_ADD; - case '-': return OPR_SUB; - case '*': return OPR_MUL; - case '%': return OPR_MOD; - case '^': return OPR_POW; - case '/': return OPR_DIV; - case TK_IDIV: return OPR_IDIV; - case '&': return OPR_BAND; - case '|': return OPR_BOR; - case '~': return OPR_BXOR; - case TK_SHL: return OPR_SHL; - case TK_SHR: return OPR_SHR; - case TK_CONCAT: return OPR_CONCAT; - case TK_NE: return OPR_NE; - case TK_EQ: return OPR_EQ; - case '<': return OPR_LT; - case TK_LE: return OPR_LE; - case '>': return OPR_GT; - case TK_GE: return OPR_GE; - case TK_AND: return OPR_AND; - case TK_OR: return OPR_OR; - default: return OPR_NOBINOPR; - } -} - - -static const struct { - lu_byte left; /* left priority for each binary operator */ - lu_byte right; /* right priority */ -} priority[] = { /* ORDER OPR */ - {10, 10}, {10, 10}, /* '+' '-' */ - {11, 11}, {11, 11}, /* '*' '%' */ - {14, 13}, /* '^' (right associative) */ - {11, 11}, {11, 11}, /* '/' '//' */ - {6, 6}, {4, 4}, {5, 5}, /* '&' '|' '~' */ - {7, 7}, {7, 7}, /* '<<' '>>' */ - {9, 8}, /* '..' (right associative) */ - {3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */ - {3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */ - {2, 2}, {1, 1} /* and, or */ -}; - -#define UNARY_PRIORITY 12 /* priority for unary operators */ - - -/* -** subexpr -> (simpleexp | unop subexpr) { binop subexpr } -** where 'binop' is any binary operator with a priority higher than 'limit' -*/ -static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { - BinOpr op; - UnOpr uop; - enterlevel(ls); - uop = getunopr(ls->t.token); - if (uop != OPR_NOUNOPR) { - int line = ls->linenumber; - luaX_next(ls); - subexpr(ls, v, UNARY_PRIORITY); - luaK_prefix(ls->fs, uop, v, line); - } - else simpleexp(ls, v); - /* expand while operators have priorities higher than 'limit' */ - op = getbinopr(ls->t.token); - while (op != OPR_NOBINOPR && priority[op].left > limit) { - expdesc v2; - BinOpr nextop; - int line = ls->linenumber; - luaX_next(ls); - luaK_infix(ls->fs, op, v); - /* read sub-expression with higher priority */ - nextop = subexpr(ls, &v2, priority[op].right); - luaK_posfix(ls->fs, op, v, &v2, line); - op = nextop; - } - leavelevel(ls); - return op; /* return first untreated operator */ -} - - -static void expr (LexState *ls, expdesc *v) { - subexpr(ls, v, 0); -} - -/* }==================================================================== */ - - - -/* -** {====================================================================== -** Rules for Statements -** ======================================================================= -*/ - - -static void block (LexState *ls) { - /* block -> statlist */ - FuncState *fs = ls->fs; - BlockCnt bl; - enterblock(fs, &bl, 0); - statlist(ls); - leaveblock(fs); -} - - -/* -** structure to chain all variables in the left-hand side of an -** assignment -*/ -struct LHS_assign { - struct LHS_assign *prev; - expdesc v; /* variable (global, local, upvalue, or indexed) */ -}; - - -/* -** check whether, in an assignment to an upvalue/local variable, the -** upvalue/local variable is begin used in a previous assignment to a -** table. If so, save original upvalue/local value in a safe place and -** use this safe copy in the previous assignment. -*/ -static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { - FuncState *fs = ls->fs; - int extra = fs->freereg; /* eventual position to save local variable */ - int conflict = 0; - for (; lh; lh = lh->prev) { /* check all previous assignments */ - if (lh->v.k == VINDEXED) { /* assigning to a table? */ - /* table is the upvalue/local being assigned now? */ - if (lh->v.u.ind.vt == v->k && lh->v.u.ind.t == v->u.info) { - conflict = 1; - lh->v.u.ind.vt = VLOCAL; - lh->v.u.ind.t = extra; /* previous assignment will use safe copy */ - } - /* index is the local being assigned? (index cannot be upvalue) */ - if (v->k == VLOCAL && lh->v.u.ind.idx == v->u.info) { - conflict = 1; - lh->v.u.ind.idx = extra; /* previous assignment will use safe copy */ - } - } - } - if (conflict) { - /* copy upvalue/local value to a temporary (in position 'extra') */ - OpCode op = (v->k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; - luaK_codeABC(fs, op, extra, v->u.info, 0); - luaK_reserveregs(fs, 1); - } -} - - -static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { - expdesc e; - check_condition(ls, vkisvar(lh->v.k), "syntax error"); - if (testnext(ls, ',')) { /* assignment -> ',' suffixedexp assignment */ - struct LHS_assign nv; - nv.prev = lh; - suffixedexp(ls, &nv.v); - if (nv.v.k != VINDEXED) - check_conflict(ls, lh, &nv.v); - checklimit(ls->fs, nvars + ls->L->nCcalls, LUAI_MAXCCALLS, - "C levels"); - assignment(ls, &nv, nvars+1); - } - else { /* assignment -> '=' explist */ - int nexps; - checknext(ls, '='); - nexps = explist(ls, &e); - if (nexps != nvars) { - adjust_assign(ls, nvars, nexps, &e); - if (nexps > nvars) - ls->fs->freereg -= nexps - nvars; /* remove extra values */ - } - else { - luaK_setoneret(ls->fs, &e); /* close last expression */ - luaK_storevar(ls->fs, &lh->v, &e); - return; /* avoid default */ - } - } - init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ - luaK_storevar(ls->fs, &lh->v, &e); -} - - -static int cond (LexState *ls) { - /* cond -> exp */ - expdesc v; - expr(ls, &v); /* read condition */ - if (v.k == VNIL) v.k = VFALSE; /* 'falses' are all equal here */ - luaK_goiftrue(ls->fs, &v); - return v.f; -} - - -static void gotostat (LexState *ls, int pc) { - int line = ls->linenumber; - TString *label; - int g; - if (testnext(ls, TK_GOTO)) - label = str_checkname(ls); - else { - luaX_next(ls); /* skip break */ - label = luaS_new(ls->L, "break"); - } - g = newlabelentry(ls, &ls->dyd->gt, label, line, pc); - findlabel(ls, g); /* close it if label already defined */ -} - - -/* check for repeated labels on the same block */ -static void checkrepeated (FuncState *fs, Labellist *ll, TString *label) { - int i; - for (i = fs->bl->firstlabel; i < ll->n; i++) { - if (eqstr(label, ll->arr[i].name)) { - const char *msg = luaO_pushfstring(fs->ls->L, - "label '%s' already defined on line %d", - getstr(label), ll->arr[i].line); - semerror(fs->ls, msg); - } - } -} - - -/* skip no-op statements */ -static void skipnoopstat (LexState *ls) { - while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) - statement(ls); -} - - -static void labelstat (LexState *ls, TString *label, int line) { - /* label -> '::' NAME '::' */ - FuncState *fs = ls->fs; - Labellist *ll = &ls->dyd->label; - int l; /* index of new label being created */ - checkrepeated(fs, ll, label); /* check for repeated labels */ - checknext(ls, TK_DBCOLON); /* skip double colon */ - /* create new entry for this label */ - l = newlabelentry(ls, ll, label, line, fs->pc); - skipnoopstat(ls); /* skip other no-op statements */ - if (block_follow(ls, 0)) { /* label is last no-op statement in the block? */ - /* assume that locals are already out of scope */ - ll->arr[l].nactvar = fs->bl->nactvar; - } - findgotos(ls, &ll->arr[l]); -} - - -static void whilestat (LexState *ls, int line) { - /* whilestat -> WHILE cond DO block END */ - FuncState *fs = ls->fs; - int whileinit; - int condexit; - BlockCnt bl; - luaX_next(ls); /* skip WHILE */ - whileinit = luaK_getlabel(fs); - condexit = cond(ls); - enterblock(fs, &bl, 1); - checknext(ls, TK_DO); - block(ls); - luaK_jumpto(fs, whileinit); - check_match(ls, TK_END, TK_WHILE, line); - leaveblock(fs); - luaK_patchtohere(fs, condexit); /* false conditions finish the loop */ -} - - -static void repeatstat (LexState *ls, int line) { - /* repeatstat -> REPEAT block UNTIL cond */ - int condexit; - FuncState *fs = ls->fs; - int repeat_init = luaK_getlabel(fs); - BlockCnt bl1, bl2; - enterblock(fs, &bl1, 1); /* loop block */ - enterblock(fs, &bl2, 0); /* scope block */ - luaX_next(ls); /* skip REPEAT */ - statlist(ls); - check_match(ls, TK_UNTIL, TK_REPEAT, line); - condexit = cond(ls); /* read condition (inside scope block) */ - if (bl2.upval) /* upvalues? */ - luaK_patchclose(fs, condexit, bl2.nactvar); - leaveblock(fs); /* finish scope */ - luaK_patchlist(fs, condexit, repeat_init); /* close the loop */ - leaveblock(fs); /* finish loop */ -} - - -static int exp1 (LexState *ls) { - expdesc e; - int reg; - expr(ls, &e); - luaK_exp2nextreg(ls->fs, &e); - lua_assert(e.k == VNONRELOC); - reg = e.u.info; - return reg; -} - - -static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { - /* forbody -> DO block */ - BlockCnt bl; - FuncState *fs = ls->fs; - int prep, endfor; - adjustlocalvars(ls, 3); /* control variables */ - checknext(ls, TK_DO); - prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs); - enterblock(fs, &bl, 0); /* scope for declared variables */ - adjustlocalvars(ls, nvars); - luaK_reserveregs(fs, nvars); - block(ls); - leaveblock(fs); /* end of scope for declared variables */ - luaK_patchtohere(fs, prep); - if (isnum) /* numeric for? */ - endfor = luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP); - else { /* generic for */ - luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars); - luaK_fixline(fs, line); - endfor = luaK_codeAsBx(fs, OP_TFORLOOP, base + 2, NO_JUMP); - } - luaK_patchlist(fs, endfor, prep + 1); - luaK_fixline(fs, line); -} - - -static void fornum (LexState *ls, TString *varname, int line) { - /* fornum -> NAME = exp1,exp1[,exp1] forbody */ - FuncState *fs = ls->fs; - int base = fs->freereg; - new_localvarliteral(ls, "(for index)"); - new_localvarliteral(ls, "(for limit)"); - new_localvarliteral(ls, "(for step)"); - new_localvar(ls, varname); - checknext(ls, '='); - exp1(ls); /* initial value */ - checknext(ls, ','); - exp1(ls); /* limit */ - if (testnext(ls, ',')) - exp1(ls); /* optional step */ - else { /* default step = 1 */ - luaK_codek(fs, fs->freereg, luaK_intK(fs, 1)); - luaK_reserveregs(fs, 1); - } - forbody(ls, base, line, 1, 1); -} - - -static void forlist (LexState *ls, TString *indexname) { - /* forlist -> NAME {,NAME} IN explist forbody */ - FuncState *fs = ls->fs; - expdesc e; - int nvars = 4; /* gen, state, control, plus at least one declared var */ - int line; - int base = fs->freereg; - /* create control variables */ - new_localvarliteral(ls, "(for generator)"); - new_localvarliteral(ls, "(for state)"); - new_localvarliteral(ls, "(for control)"); - /* create declared variables */ - new_localvar(ls, indexname); - while (testnext(ls, ',')) { - new_localvar(ls, str_checkname(ls)); - nvars++; - } - checknext(ls, TK_IN); - line = ls->linenumber; - adjust_assign(ls, 3, explist(ls, &e), &e); - luaK_checkstack(fs, 3); /* extra space to call generator */ - forbody(ls, base, line, nvars - 3, 0); -} - - -static void forstat (LexState *ls, int line) { - /* forstat -> FOR (fornum | forlist) END */ - FuncState *fs = ls->fs; - TString *varname; - BlockCnt bl; - enterblock(fs, &bl, 1); /* scope for loop and control variables */ - luaX_next(ls); /* skip 'for' */ - varname = str_checkname(ls); /* first variable name */ - switch (ls->t.token) { - case '=': fornum(ls, varname, line); break; - case ',': case TK_IN: forlist(ls, varname); break; - default: luaX_syntaxerror(ls, "'=' or 'in' expected"); - } - check_match(ls, TK_END, TK_FOR, line); - leaveblock(fs); /* loop scope ('break' jumps to this point) */ -} - - -static void test_then_block (LexState *ls, int *escapelist) { - /* test_then_block -> [IF | ELSEIF] cond THEN block */ - BlockCnt bl; - FuncState *fs = ls->fs; - expdesc v; - int jf; /* instruction to skip 'then' code (if condition is false) */ - luaX_next(ls); /* skip IF or ELSEIF */ - expr(ls, &v); /* read condition */ - checknext(ls, TK_THEN); - if (ls->t.token == TK_GOTO || ls->t.token == TK_BREAK) { - luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */ - enterblock(fs, &bl, 0); /* must enter block before 'goto' */ - gotostat(ls, v.t); /* handle goto/break */ - skipnoopstat(ls); /* skip other no-op statements */ - if (block_follow(ls, 0)) { /* 'goto' is the entire block? */ - leaveblock(fs); - return; /* and that is it */ - } - else /* must skip over 'then' part if condition is false */ - jf = luaK_jump(fs); - } - else { /* regular case (not goto/break) */ - luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ - enterblock(fs, &bl, 0); - jf = v.f; - } - statlist(ls); /* 'then' part */ - leaveblock(fs); - if (ls->t.token == TK_ELSE || - ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ - luaK_concat(fs, escapelist, luaK_jump(fs)); /* must jump over it */ - luaK_patchtohere(fs, jf); -} - - -static void ifstat (LexState *ls, int line) { - /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ - FuncState *fs = ls->fs; - int escapelist = NO_JUMP; /* exit list for finished parts */ - test_then_block(ls, &escapelist); /* IF cond THEN block */ - while (ls->t.token == TK_ELSEIF) - test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ - if (testnext(ls, TK_ELSE)) - block(ls); /* 'else' part */ - check_match(ls, TK_END, TK_IF, line); - luaK_patchtohere(fs, escapelist); /* patch escape list to 'if' end */ -} - - -static void localfunc (LexState *ls) { - expdesc b; - FuncState *fs = ls->fs; - new_localvar(ls, str_checkname(ls)); /* new local variable */ - adjustlocalvars(ls, 1); /* enter its scope */ - body(ls, &b, 0, ls->linenumber); /* function created in next register */ - /* debug information will only see the variable after this point! */ - getlocvar(fs, b.u.info)->startpc = fs->pc; -} - - -static void localstat (LexState *ls) { - /* stat -> LOCAL NAME {',' NAME} ['=' explist] */ - int nvars = 0; - int nexps; - expdesc e; - do { - new_localvar(ls, str_checkname(ls)); - nvars++; - } while (testnext(ls, ',')); - if (testnext(ls, '=')) - nexps = explist(ls, &e); - else { - e.k = VVOID; - nexps = 0; - } - adjust_assign(ls, nvars, nexps, &e); - adjustlocalvars(ls, nvars); -} - - -static int funcname (LexState *ls, expdesc *v) { - /* funcname -> NAME {fieldsel} [':' NAME] */ - int ismethod = 0; - singlevar(ls, v); - while (ls->t.token == '.') - fieldsel(ls, v); - if (ls->t.token == ':') { - ismethod = 1; - fieldsel(ls, v); - } - return ismethod; -} - - -static void funcstat (LexState *ls, int line) { - /* funcstat -> FUNCTION funcname body */ - int ismethod; - expdesc v, b; - luaX_next(ls); /* skip FUNCTION */ - ismethod = funcname(ls, &v); - body(ls, &b, ismethod, line); - luaK_storevar(ls->fs, &v, &b); - luaK_fixline(ls->fs, line); /* definition "happens" in the first line */ -} - - -static void exprstat (LexState *ls) { - /* stat -> func | assignment */ - FuncState *fs = ls->fs; - struct LHS_assign v; - suffixedexp(ls, &v.v); - if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ - v.prev = NULL; - assignment(ls, &v, 1); - } - else { /* stat -> func */ - check_condition(ls, v.v.k == VCALL, "syntax error"); - SETARG_C(getcode(fs, &v.v), 1); /* call statement uses no results */ - } -} - - -static void retstat (LexState *ls) { - /* stat -> RETURN [explist] [';'] */ - FuncState *fs = ls->fs; - expdesc e; - int first, nret; /* registers with returned values */ - if (block_follow(ls, 1) || ls->t.token == ';') - first = nret = 0; /* return no values */ - else { - nret = explist(ls, &e); /* optional return values */ - if (hasmultret(e.k)) { - luaK_setmultret(fs, &e); - if (e.k == VCALL && nret == 1) { /* tail call? */ - SET_OPCODE(getcode(fs,&e), OP_TAILCALL); - lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar); - } - first = fs->nactvar; - nret = LUA_MULTRET; /* return all values */ - } - else { - if (nret == 1) /* only one single value? */ - first = luaK_exp2anyreg(fs, &e); - else { - luaK_exp2nextreg(fs, &e); /* values must go to the stack */ - first = fs->nactvar; /* return all active values */ - lua_assert(nret == fs->freereg - first); - } - } - } - luaK_ret(fs, first, nret); - testnext(ls, ';'); /* skip optional semicolon */ -} - - -static void statement (LexState *ls) { - int line = ls->linenumber; /* may be needed for error messages */ - enterlevel(ls); - switch (ls->t.token) { - case ';': { /* stat -> ';' (empty statement) */ - luaX_next(ls); /* skip ';' */ - break; - } - case TK_IF: { /* stat -> ifstat */ - ifstat(ls, line); - break; - } - case TK_WHILE: { /* stat -> whilestat */ - whilestat(ls, line); - break; - } - case TK_DO: { /* stat -> DO block END */ - luaX_next(ls); /* skip DO */ - block(ls); - check_match(ls, TK_END, TK_DO, line); - break; - } - case TK_FOR: { /* stat -> forstat */ - forstat(ls, line); - break; - } - case TK_REPEAT: { /* stat -> repeatstat */ - repeatstat(ls, line); - break; - } - case TK_FUNCTION: { /* stat -> funcstat */ - funcstat(ls, line); - break; - } - case TK_LOCAL: { /* stat -> localstat */ - luaX_next(ls); /* skip LOCAL */ - if (testnext(ls, TK_FUNCTION)) /* local function? */ - localfunc(ls); - else - localstat(ls); - break; - } - case TK_DBCOLON: { /* stat -> label */ - luaX_next(ls); /* skip double colon */ - labelstat(ls, str_checkname(ls), line); - break; - } - case TK_RETURN: { /* stat -> retstat */ - luaX_next(ls); /* skip RETURN */ - retstat(ls); - break; - } - case TK_BREAK: /* stat -> breakstat */ - case TK_GOTO: { /* stat -> 'goto' NAME */ - gotostat(ls, luaK_jump(ls->fs)); - break; - } - default: { /* stat -> func | assignment */ - exprstat(ls); - break; - } - } - lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && - ls->fs->freereg >= ls->fs->nactvar); - ls->fs->freereg = ls->fs->nactvar; /* free registers */ - leavelevel(ls); -} - -/* }====================================================================== */ - - -/* -** compiles the main function, which is a regular vararg function with an -** upvalue named LUA_ENV -*/ -static void mainfunc (LexState *ls, FuncState *fs) { - BlockCnt bl; - expdesc v; - open_func(ls, fs, &bl); - fs->f->is_vararg = 1; /* main function is always vararg */ - init_exp(&v, VLOCAL, 0); /* create and... */ - newupvalue(fs, ls->envn, &v); /* ...set environment upvalue */ - luaX_next(ls); /* read first token */ - statlist(ls); /* parse main body */ - check(ls, TK_EOS); - close_func(ls); -} - - -LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, - Dyndata *dyd, const char *name, int firstchar) { - LexState lexstate; - FuncState funcstate; - LClosure *cl = luaF_newLclosure(L, 1); /* create main closure */ - setclLvalue(L, L->top, cl); /* anchor it (to avoid being collected) */ - incr_top(L); - lexstate.h = luaH_new(L); /* create table for scanner */ - sethvalue(L, L->top, lexstate.h); /* anchor it */ - incr_top(L); - funcstate.f = cl->p = luaF_newproto(L); - funcstate.f->source = luaS_new(L, name); /* create and anchor TString */ - lua_assert(iswhite(funcstate.f)); /* do not need barrier here */ - lexstate.buff = buff; - lexstate.dyd = dyd; - dyd->actvar.n = dyd->gt.n = dyd->label.n = 0; - luaX_setinput(L, &lexstate, z, funcstate.f->source, firstchar); - mainfunc(&lexstate, &funcstate); - lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs); - /* all scopes should be correctly finished */ - lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0); - L->top--; /* remove scanner's table */ - return cl; /* closure is on the stack, too */ -} - diff --git a/3rd/lua/src/lparser.h b/3rd/lua/src/lparser.h deleted file mode 100644 index 62c50ca..0000000 --- a/3rd/lua/src/lparser.h +++ /dev/null @@ -1,120 +0,0 @@ -/* -** $Id: lparser.h,v 1.74 2014/10/25 11:50:46 roberto Exp $ -** Lua Parser -** See Copyright Notice in lua.h -*/ - -#ifndef lparser_h -#define lparser_h - -#include "llimits.h" -#include "lobject.h" -#include "lzio.h" - - -/* -** Expression descriptor -*/ - -typedef enum { - VVOID, /* no value */ - VNIL, - VTRUE, - VFALSE, - VK, /* info = index of constant in 'k' */ - VKFLT, /* nval = numerical float value */ - VKINT, /* nval = numerical integer value */ - VNONRELOC, /* info = result register */ - VLOCAL, /* info = local register */ - VUPVAL, /* info = index of upvalue in 'upvalues' */ - VINDEXED, /* t = table register/upvalue; idx = index R/K */ - VJMP, /* info = instruction pc */ - VRELOCABLE, /* info = instruction pc */ - VCALL, /* info = instruction pc */ - VVARARG /* info = instruction pc */ -} expkind; - - -#define vkisvar(k) (VLOCAL <= (k) && (k) <= VINDEXED) -#define vkisinreg(k) ((k) == VNONRELOC || (k) == VLOCAL) - -typedef struct expdesc { - expkind k; - union { - struct { /* for indexed variables (VINDEXED) */ - short idx; /* index (R/K) */ - lu_byte t; /* table (register or upvalue) */ - lu_byte vt; /* whether 't' is register (VLOCAL) or upvalue (VUPVAL) */ - } ind; - int info; /* for generic use */ - lua_Number nval; /* for VKFLT */ - lua_Integer ival; /* for VKINT */ - } u; - int t; /* patch list of 'exit when true' */ - int f; /* patch list of 'exit when false' */ -} expdesc; - - -/* description of active local variable */ -typedef struct Vardesc { - short idx; /* variable index in stack */ -} Vardesc; - - -/* description of pending goto statements and label statements */ -typedef struct Labeldesc { - TString *name; /* label identifier */ - int pc; /* position in code */ - int line; /* line where it appeared */ - lu_byte nactvar; /* local level where it appears in current block */ -} Labeldesc; - - -/* list of labels or gotos */ -typedef struct Labellist { - Labeldesc *arr; /* array */ - int n; /* number of entries in use */ - int size; /* array size */ -} Labellist; - - -/* dynamic structures used by the parser */ -typedef struct Dyndata { - struct { /* list of active local variables */ - Vardesc *arr; - int n; - int size; - } actvar; - Labellist gt; /* list of pending gotos */ - Labellist label; /* list of active labels */ -} Dyndata; - - -/* control of blocks */ -struct BlockCnt; /* defined in lparser.c */ - - -/* state needed to generate code for a given function */ -typedef struct FuncState { - Proto *f; /* current function header */ - struct FuncState *prev; /* enclosing function */ - struct LexState *ls; /* lexical state */ - struct BlockCnt *bl; /* chain of current blocks */ - int pc; /* next position to code (equivalent to 'ncode') */ - int lasttarget; /* 'label' of last 'jump label' */ - int jpc; /* list of pending jumps to 'pc' */ - int nk; /* number of elements in 'k' */ - int np; /* number of elements in 'p' */ - int firstlocal; /* index of first local var (in Dyndata array) */ - short nlocvars; /* number of elements in 'f->locvars' */ - lu_byte nactvar; /* number of active local variables */ - lu_byte nups; /* number of upvalues */ - lu_byte freereg; /* first free register */ -} FuncState; - - -LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, - Dyndata *dyd, const char *name, int firstchar); - - -#endif diff --git a/3rd/lua/src/lprefix.h b/3rd/lua/src/lprefix.h deleted file mode 100644 index 02daa83..0000000 --- a/3rd/lua/src/lprefix.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -** $Id: lprefix.h,v 1.2 2014/12/29 16:54:13 roberto Exp $ -** Definitions for Lua code that must come before any other header file -** See Copyright Notice in lua.h -*/ - -#ifndef lprefix_h -#define lprefix_h - - -/* -** Allows POSIX/XSI stuff -*/ -#if !defined(LUA_USE_C89) /* { */ - -#if !defined(_XOPEN_SOURCE) -#define _XOPEN_SOURCE 600 -#elif _XOPEN_SOURCE == 0 -#undef _XOPEN_SOURCE /* use -D_XOPEN_SOURCE=0 to undefine it */ -#endif - -/* -** Allows manipulation of large files in gcc and some other compilers -*/ -#if !defined(LUA_32BITS) && !defined(_FILE_OFFSET_BITS) -#define _LARGEFILE_SOURCE 1 -#define _FILE_OFFSET_BITS 64 -#endif - -#endif /* } */ - - -/* -** Windows stuff -*/ -#if defined(_WIN32) /* { */ - -#if !defined(_CRT_SECURE_NO_WARNINGS) -#define _CRT_SECURE_NO_WARNINGS /* avoid warnings about ISO C functions */ -#endif - -#endif /* } */ - -#endif - diff --git a/3rd/lua/src/lstate.c b/3rd/lua/src/lstate.c deleted file mode 100644 index ff6b02d..0000000 --- a/3rd/lua/src/lstate.c +++ /dev/null @@ -1,346 +0,0 @@ -/* -** $Id: lstate.c,v 2.127 2014/11/02 19:33:33 roberto Exp $ -** Global State -** See Copyright Notice in lua.h -*/ - -#define lstate_c -#define LUA_CORE - -#include "lprefix.h" - - -#include -#include - -#include "lua.h" - -#include "lapi.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "llex.h" -#include "lmem.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" - - -#if !defined(LUAI_GCPAUSE) -#define LUAI_GCPAUSE 200 /* 200% */ -#endif - -#if !defined(LUAI_GCMUL) -#define LUAI_GCMUL 200 /* GC runs 'twice the speed' of memory allocation */ -#endif - - -#define MEMERRMSG "not enough memory" - - -/* -** a macro to help the creation of a unique random seed when a state is -** created; the seed is used to randomize hashes. -*/ -#if !defined(luai_makeseed) -#include -#define luai_makeseed() cast(unsigned int, time(NULL)) -#endif - - - -/* -** thread state + extra space -*/ -typedef struct LX { - lu_byte extra_[LUA_EXTRASPACE]; - lua_State l; -} LX; - - -/* -** Main thread combines a thread state and the global state -*/ -typedef struct LG { - LX l; - global_State g; -} LG; - - - -#define fromstate(L) (cast(LX *, cast(lu_byte *, (L)) - offsetof(LX, l))) - - -/* -** Compute an initial seed as random as possible. Rely on Address Space -** Layout Randomization (if present) to increase randomness.. -*/ -#define addbuff(b,p,e) \ - { size_t t = cast(size_t, e); \ - memcpy(buff + p, &t, sizeof(t)); p += sizeof(t); } - -static unsigned int makeseed (lua_State *L) { - char buff[4 * sizeof(size_t)]; - unsigned int h = luai_makeseed(); - int p = 0; - addbuff(buff, p, L); /* heap variable */ - addbuff(buff, p, &h); /* local variable */ - addbuff(buff, p, luaO_nilobject); /* global variable */ - addbuff(buff, p, &lua_newstate); /* public function */ - lua_assert(p == sizeof(buff)); - return luaS_hash(buff, p, h); -} - - -/* -** set GCdebt to a new value keeping the value (totalbytes + GCdebt) -** invariant -*/ -void luaE_setdebt (global_State *g, l_mem debt) { - g->totalbytes -= (debt - g->GCdebt); - g->GCdebt = debt; -} - - -CallInfo *luaE_extendCI (lua_State *L) { - CallInfo *ci = luaM_new(L, CallInfo); - lua_assert(L->ci->next == NULL); - L->ci->next = ci; - ci->previous = L->ci; - ci->next = NULL; - return ci; -} - - -/* -** free all CallInfo structures not in use by a thread -*/ -void luaE_freeCI (lua_State *L) { - CallInfo *ci = L->ci; - CallInfo *next = ci->next; - ci->next = NULL; - while ((ci = next) != NULL) { - next = ci->next; - luaM_free(L, ci); - } -} - - -/* -** free half of the CallInfo structures not in use by a thread -*/ -void luaE_shrinkCI (lua_State *L) { - CallInfo *ci = L->ci; - while (ci->next != NULL) { /* while there is 'next' */ - CallInfo *next2 = ci->next->next; /* next's next */ - if (next2 == NULL) break; - luaM_free(L, ci->next); /* remove next */ - ci->next = next2; /* remove 'next' from the list */ - next2->previous = ci; - ci = next2; - } -} - - -static void stack_init (lua_State *L1, lua_State *L) { - int i; CallInfo *ci; - /* initialize stack array */ - L1->stack = luaM_newvector(L, BASIC_STACK_SIZE, TValue); - L1->stacksize = BASIC_STACK_SIZE; - for (i = 0; i < BASIC_STACK_SIZE; i++) - setnilvalue(L1->stack + i); /* erase new stack */ - L1->top = L1->stack; - L1->stack_last = L1->stack + L1->stacksize - EXTRA_STACK; - /* initialize first ci */ - ci = &L1->base_ci; - ci->next = ci->previous = NULL; - ci->callstatus = 0; - ci->func = L1->top; - setnilvalue(L1->top++); /* 'function' entry for this 'ci' */ - ci->top = L1->top + LUA_MINSTACK; - L1->ci = ci; -} - - -static void freestack (lua_State *L) { - if (L->stack == NULL) - return; /* stack not completely built yet */ - L->ci = &L->base_ci; /* free the entire 'ci' list */ - luaE_freeCI(L); - luaM_freearray(L, L->stack, L->stacksize); /* free stack array */ -} - - -/* -** Create registry table and its predefined values -*/ -static void init_registry (lua_State *L, global_State *g) { - TValue temp; - /* create registry */ - Table *registry = luaH_new(L); - sethvalue(L, &g->l_registry, registry); - luaH_resize(L, registry, LUA_RIDX_LAST, 0); - /* registry[LUA_RIDX_MAINTHREAD] = L */ - setthvalue(L, &temp, L); /* temp = L */ - luaH_setint(L, registry, LUA_RIDX_MAINTHREAD, &temp); - /* registry[LUA_RIDX_GLOBALS] = table of globals */ - sethvalue(L, &temp, luaH_new(L)); /* temp = new table (global table) */ - luaH_setint(L, registry, LUA_RIDX_GLOBALS, &temp); -} - - -/* -** open parts of the state that may cause memory-allocation errors. -** ('g->version' != NULL flags that the state was completely build) -*/ -static void f_luaopen (lua_State *L, void *ud) { - global_State *g = G(L); - UNUSED(ud); - stack_init(L, L); /* init stack */ - init_registry(L, g); - luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ - luaT_init(L); - luaX_init(L); - /* pre-create memory-error message */ - g->memerrmsg = luaS_newliteral(L, MEMERRMSG); - luaC_fix(L, obj2gco(g->memerrmsg)); /* it should never be collected */ - g->gcrunning = 1; /* allow gc */ - g->version = lua_version(NULL); - luai_userstateopen(L); -} - - -/* -** preinitialize a thread with consistent values without allocating -** any memory (to avoid errors) -*/ -static void preinit_thread (lua_State *L, global_State *g) { - G(L) = g; - L->stack = NULL; - L->ci = NULL; - L->stacksize = 0; - L->twups = L; /* thread has no upvalues */ - L->errorJmp = NULL; - L->nCcalls = 0; - L->hook = NULL; - L->hookmask = 0; - L->basehookcount = 0; - L->allowhook = 1; - resethookcount(L); - L->openupval = NULL; - L->nny = 1; - L->status = LUA_OK; - L->errfunc = 0; -} - - -static void close_state (lua_State *L) { - global_State *g = G(L); - luaF_close(L, L->stack); /* close all upvalues for this thread */ - luaC_freeallobjects(L); /* collect all objects */ - if (g->version) /* closing a fully built state? */ - luai_userstateclose(L); - luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size); - luaZ_freebuffer(L, &g->buff); - freestack(L); - lua_assert(gettotalbytes(g) == sizeof(LG)); - (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */ -} - - -LUA_API lua_State *lua_newthread (lua_State *L) { - global_State *g = G(L); - lua_State *L1; - lua_lock(L); - luaC_checkGC(L); - /* create new thread */ - L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l; - L1->marked = luaC_white(g); - L1->tt = LUA_TTHREAD; - /* link it on list 'allgc' */ - L1->next = g->allgc; - g->allgc = obj2gco(L1); - /* anchor it on L stack */ - setthvalue(L, L->top, L1); - api_incr_top(L); - preinit_thread(L1, g); - L1->hookmask = L->hookmask; - L1->basehookcount = L->basehookcount; - L1->hook = L->hook; - resethookcount(L1); - /* initialize L1 extra space */ - memcpy(lua_getextraspace(L1), lua_getextraspace(g->mainthread), - LUA_EXTRASPACE); - luai_userstatethread(L, L1); - stack_init(L1, L); /* init stack */ - lua_unlock(L); - return L1; -} - - -void luaE_freethread (lua_State *L, lua_State *L1) { - LX *l = fromstate(L1); - luaF_close(L1, L1->stack); /* close all upvalues for this thread */ - lua_assert(L1->openupval == NULL); - luai_userstatefree(L, L1); - freestack(L1); - luaM_free(L, l); -} - - -LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { - int i; - lua_State *L; - global_State *g; - LG *l = cast(LG *, (*f)(ud, NULL, LUA_TTHREAD, sizeof(LG))); - if (l == NULL) return NULL; - L = &l->l.l; - g = &l->g; - L->next = NULL; - L->tt = LUA_TTHREAD; - g->currentwhite = bitmask(WHITE0BIT); - L->marked = luaC_white(g); - preinit_thread(L, g); - g->frealloc = f; - g->ud = ud; - g->mainthread = L; - g->seed = makeseed(L); - g->gcrunning = 0; /* no GC while building state */ - g->GCestimate = 0; - g->strt.size = g->strt.nuse = 0; - g->strt.hash = NULL; - setnilvalue(&g->l_registry); - luaZ_initbuffer(L, &g->buff); - g->panic = NULL; - g->version = NULL; - g->gcstate = GCSpause; - g->gckind = KGC_NORMAL; - g->allgc = g->finobj = g->tobefnz = g->fixedgc = NULL; - g->sweepgc = NULL; - g->gray = g->grayagain = NULL; - g->weak = g->ephemeron = g->allweak = NULL; - g->twups = NULL; - g->totalbytes = sizeof(LG); - g->GCdebt = 0; - g->gcfinnum = 0; - g->gcpause = LUAI_GCPAUSE; - g->gcstepmul = LUAI_GCMUL; - for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL; - if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) { - /* memory allocation error: free partial state */ - close_state(L); - L = NULL; - } - return L; -} - - -LUA_API void lua_close (lua_State *L) { - L = G(L)->mainthread; /* only the main thread can be closed */ - lua_lock(L); - close_state(L); -} - - diff --git a/3rd/lua/src/lstate.h b/3rd/lua/src/lstate.h deleted file mode 100644 index 81e12c4..0000000 --- a/3rd/lua/src/lstate.h +++ /dev/null @@ -1,223 +0,0 @@ -/* -** $Id: lstate.h,v 2.119 2014/10/30 18:53:28 roberto Exp $ -** Global State -** See Copyright Notice in lua.h -*/ - -#ifndef lstate_h -#define lstate_h - -#include "lua.h" - -#include "lobject.h" -#include "ltm.h" -#include "lzio.h" - - -/* - -** Some notes about garbage-collected objects: All objects in Lua must -** be kept somehow accessible until being freed, so all objects always -** belong to one (and only one) of these lists, using field 'next' of -** the 'CommonHeader' for the link: -** -** 'allgc': all objects not marked for finalization; -** 'finobj': all objects marked for finalization; -** 'tobefnz': all objects ready to be finalized; -** 'fixedgc': all objects that are not to be collected (currently -** only small strings, such as reserved words). - -*/ - - -struct lua_longjmp; /* defined in ldo.c */ - - - -/* extra stack space to handle TM calls and some other extras */ -#define EXTRA_STACK 5 - - -#define BASIC_STACK_SIZE (2*LUA_MINSTACK) - - -/* kinds of Garbage Collection */ -#define KGC_NORMAL 0 -#define KGC_EMERGENCY 1 /* gc was forced by an allocation failure */ - - -typedef struct stringtable { - TString **hash; - int nuse; /* number of elements */ - int size; -} stringtable; - - -/* -** Information about a call. -** When a thread yields, 'func' is adjusted to pretend that the -** top function has only the yielded values in its stack; in that -** case, the actual 'func' value is saved in field 'extra'. -** When a function calls another with a continuation, 'extra' keeps -** the function index so that, in case of errors, the continuation -** function can be called with the correct top. -*/ -typedef struct CallInfo { - StkId func; /* function index in the stack */ - StkId top; /* top for this function */ - struct CallInfo *previous, *next; /* dynamic call link */ - union { - struct { /* only for Lua functions */ - StkId base; /* base for this function */ - const Instruction *savedpc; - } l; - struct { /* only for C functions */ - lua_KFunction k; /* continuation in case of yields */ - ptrdiff_t old_errfunc; - lua_KContext ctx; /* context info. in case of yields */ - } c; - } u; - ptrdiff_t extra; - short nresults; /* expected number of results from this function */ - lu_byte callstatus; -} CallInfo; - - -/* -** Bits in CallInfo status -*/ -#define CIST_OAH (1<<0) /* original value of 'allowhook' */ -#define CIST_LUA (1<<1) /* call is running a Lua function */ -#define CIST_HOOKED (1<<2) /* call is running a debug hook */ -#define CIST_REENTRY (1<<3) /* call is running on same invocation of - luaV_execute of previous call */ -#define CIST_YPCALL (1<<4) /* call is a yieldable protected call */ -#define CIST_TAIL (1<<5) /* call was tail called */ -#define CIST_HOOKYIELD (1<<6) /* last hook called yielded */ - -#define isLua(ci) ((ci)->callstatus & CIST_LUA) - -/* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */ -#define setoah(st,v) ((st) = ((st) & ~CIST_OAH) | (v)) -#define getoah(st) ((st) & CIST_OAH) - - -/* -** 'global state', shared by all threads of this state -*/ -typedef struct global_State { - lua_Alloc frealloc; /* function to reallocate memory */ - void *ud; /* auxiliary data to 'frealloc' */ - lu_mem totalbytes; /* number of bytes currently allocated - GCdebt */ - l_mem GCdebt; /* bytes allocated not yet compensated by the collector */ - lu_mem GCmemtrav; /* memory traversed by the GC */ - lu_mem GCestimate; /* an estimate of the non-garbage memory in use */ - stringtable strt; /* hash table for strings */ - TValue l_registry; - unsigned int seed; /* randomized seed for hashes */ - lu_byte currentwhite; - lu_byte gcstate; /* state of garbage collector */ - lu_byte gckind; /* kind of GC running */ - lu_byte gcrunning; /* true if GC is running */ - GCObject *allgc; /* list of all collectable objects */ - GCObject **sweepgc; /* current position of sweep in list */ - GCObject *finobj; /* list of collectable objects with finalizers */ - GCObject *gray; /* list of gray objects */ - GCObject *grayagain; /* list of objects to be traversed atomically */ - GCObject *weak; /* list of tables with weak values */ - GCObject *ephemeron; /* list of ephemeron tables (weak keys) */ - GCObject *allweak; /* list of all-weak tables */ - GCObject *tobefnz; /* list of userdata to be GC */ - GCObject *fixedgc; /* list of objects not to be collected */ - struct lua_State *twups; /* list of threads with open upvalues */ - Mbuffer buff; /* temporary buffer for string concatenation */ - unsigned int gcfinnum; /* number of finalizers to call in each GC step */ - int gcpause; /* size of pause between successive GCs */ - int gcstepmul; /* GC 'granularity' */ - lua_CFunction panic; /* to be called in unprotected errors */ - struct lua_State *mainthread; - const lua_Number *version; /* pointer to version number */ - TString *memerrmsg; /* memory-error message */ - TString *tmname[TM_N]; /* array with tag-method names */ - struct Table *mt[LUA_NUMTAGS]; /* metatables for basic types */ -} global_State; - - -/* -** 'per thread' state -*/ -struct lua_State { - CommonHeader; - lu_byte status; - StkId top; /* first free slot in the stack */ - global_State *l_G; - CallInfo *ci; /* call info for current function */ - const Instruction *oldpc; /* last pc traced */ - StkId stack_last; /* last free slot in the stack */ - StkId stack; /* stack base */ - UpVal *openupval; /* list of open upvalues in this stack */ - GCObject *gclist; - struct lua_State *twups; /* list of threads with open upvalues */ - struct lua_longjmp *errorJmp; /* current error recover point */ - CallInfo base_ci; /* CallInfo for first level (C calling Lua) */ - lua_Hook hook; - ptrdiff_t errfunc; /* current error handling function (stack index) */ - int stacksize; - int basehookcount; - int hookcount; - unsigned short nny; /* number of non-yieldable calls in stack */ - unsigned short nCcalls; /* number of nested C calls */ - lu_byte hookmask; - lu_byte allowhook; -}; - - -#define G(L) (L->l_G) - - -/* -** Union of all collectable objects (only for conversions) -*/ -union GCUnion { - GCObject gc; /* common header */ - struct TString ts; - struct Udata u; - union Closure cl; - struct Table h; - struct Proto p; - struct lua_State th; /* thread */ -}; - - -#define cast_u(o) cast(union GCUnion *, (o)) - -/* macros to convert a GCObject into a specific value */ -#define gco2ts(o) \ - check_exp(novariant((o)->tt) == LUA_TSTRING, &((cast_u(o))->ts)) -#define gco2u(o) check_exp((o)->tt == LUA_TUSERDATA, &((cast_u(o))->u)) -#define gco2lcl(o) check_exp((o)->tt == LUA_TLCL, &((cast_u(o))->cl.l)) -#define gco2ccl(o) check_exp((o)->tt == LUA_TCCL, &((cast_u(o))->cl.c)) -#define gco2cl(o) \ - check_exp(novariant((o)->tt) == LUA_TFUNCTION, &((cast_u(o))->cl)) -#define gco2t(o) check_exp((o)->tt == LUA_TTABLE, &((cast_u(o))->h)) -#define gco2p(o) check_exp((o)->tt == LUA_TPROTO, &((cast_u(o))->p)) -#define gco2th(o) check_exp((o)->tt == LUA_TTHREAD, &((cast_u(o))->th)) - - -/* macro to convert a Lua object into a GCObject */ -#define obj2gco(v) \ - check_exp(novariant((v)->tt) < LUA_TDEADKEY, (&(cast_u(v)->gc))) - - -/* actual number of total bytes allocated */ -#define gettotalbytes(g) ((g)->totalbytes + (g)->GCdebt) - -LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt); -LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); -LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L); -LUAI_FUNC void luaE_freeCI (lua_State *L); -LUAI_FUNC void luaE_shrinkCI (lua_State *L); - - -#endif - diff --git a/3rd/lua/src/lstring.c b/3rd/lua/src/lstring.c deleted file mode 100644 index 2947113..0000000 --- a/3rd/lua/src/lstring.c +++ /dev/null @@ -1,182 +0,0 @@ -/* -** $Id: lstring.c,v 2.45 2014/11/02 19:19:04 roberto Exp $ -** String table (keeps all strings handled by Lua) -** See Copyright Notice in lua.h -*/ - -#define lstring_c -#define LUA_CORE - -#include "lprefix.h" - - -#include - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" - - - -/* -** Lua will use at most ~(2^LUAI_HASHLIMIT) bytes from a string to -** compute its hash -*/ -#if !defined(LUAI_HASHLIMIT) -#define LUAI_HASHLIMIT 5 -#endif - - -/* -** equality for long strings -*/ -int luaS_eqlngstr (TString *a, TString *b) { - size_t len = a->len; - lua_assert(a->tt == LUA_TLNGSTR && b->tt == LUA_TLNGSTR); - return (a == b) || /* same instance or... */ - ((len == b->len) && /* equal length and ... */ - (memcmp(getstr(a), getstr(b), len) == 0)); /* equal contents */ -} - - -unsigned int luaS_hash (const char *str, size_t l, unsigned int seed) { - unsigned int h = seed ^ cast(unsigned int, l); - size_t l1; - size_t step = (l >> LUAI_HASHLIMIT) + 1; - for (l1 = l; l1 >= step; l1 -= step) - h = h ^ ((h<<5) + (h>>2) + cast_byte(str[l1 - 1])); - return h; -} - - -/* -** resizes the string table -*/ -void luaS_resize (lua_State *L, int newsize) { - int i; - stringtable *tb = &G(L)->strt; - if (newsize > tb->size) { /* grow table if needed */ - luaM_reallocvector(L, tb->hash, tb->size, newsize, TString *); - for (i = tb->size; i < newsize; i++) - tb->hash[i] = NULL; - } - for (i = 0; i < tb->size; i++) { /* rehash */ - TString *p = tb->hash[i]; - tb->hash[i] = NULL; - while (p) { /* for each node in the list */ - TString *hnext = p->hnext; /* save next */ - unsigned int h = lmod(p->hash, newsize); /* new position */ - p->hnext = tb->hash[h]; /* chain it */ - tb->hash[h] = p; - p = hnext; - } - } - if (newsize < tb->size) { /* shrink table if needed */ - /* vanishing slice should be empty */ - lua_assert(tb->hash[newsize] == NULL && tb->hash[tb->size - 1] == NULL); - luaM_reallocvector(L, tb->hash, tb->size, newsize, TString *); - } - tb->size = newsize; -} - - - -/* -** creates a new string object -*/ -static TString *createstrobj (lua_State *L, const char *str, size_t l, - int tag, unsigned int h) { - TString *ts; - GCObject *o; - size_t totalsize; /* total size of TString object */ - totalsize = sizelstring(l); - o = luaC_newobj(L, tag, totalsize); - ts = gco2ts(o); - ts->len = l; - ts->hash = h; - ts->extra = 0; - memcpy(getaddrstr(ts), str, l * sizeof(char)); - getaddrstr(ts)[l] = '\0'; /* ending 0 */ - return ts; -} - - -void luaS_remove (lua_State *L, TString *ts) { - stringtable *tb = &G(L)->strt; - TString **p = &tb->hash[lmod(ts->hash, tb->size)]; - while (*p != ts) /* find previous element */ - p = &(*p)->hnext; - *p = (*p)->hnext; /* remove element from its list */ - tb->nuse--; -} - - -/* -** checks whether short string exists and reuses it or creates a new one -*/ -static TString *internshrstr (lua_State *L, const char *str, size_t l) { - TString *ts; - global_State *g = G(L); - unsigned int h = luaS_hash(str, l, g->seed); - TString **list = &g->strt.hash[lmod(h, g->strt.size)]; - for (ts = *list; ts != NULL; ts = ts->hnext) { - if (l == ts->len && - (memcmp(str, getstr(ts), l * sizeof(char)) == 0)) { - /* found! */ - if (isdead(g, ts)) /* dead (but not collected yet)? */ - changewhite(ts); /* resurrect it */ - return ts; - } - } - if (g->strt.nuse >= g->strt.size && g->strt.size <= MAX_INT/2) { - luaS_resize(L, g->strt.size * 2); - list = &g->strt.hash[lmod(h, g->strt.size)]; /* recompute with new size */ - } - ts = createstrobj(L, str, l, LUA_TSHRSTR, h); - ts->hnext = *list; - *list = ts; - g->strt.nuse++; - return ts; -} - - -/* -** new string (with explicit length) -*/ -TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { - if (l <= LUAI_MAXSHORTLEN) /* short string? */ - return internshrstr(L, str, l); - else { - if (l + 1 > (MAX_SIZE - sizeof(TString))/sizeof(char)) - luaM_toobig(L); - return createstrobj(L, str, l, LUA_TLNGSTR, G(L)->seed); - } -} - - -/* -** new zero-terminated string -*/ -TString *luaS_new (lua_State *L, const char *str) { - return luaS_newlstr(L, str, strlen(str)); -} - - -Udata *luaS_newudata (lua_State *L, size_t s) { - Udata *u; - GCObject *o; - if (s > MAX_SIZE - sizeof(Udata)) - luaM_toobig(L); - o = luaC_newobj(L, LUA_TUSERDATA, sizeludata(s)); - u = gco2u(o); - u->len = s; - u->metatable = NULL; - setuservalue(L, u, luaO_nilobject); - return u; -} - diff --git a/3rd/lua/src/lstring.h b/3rd/lua/src/lstring.h deleted file mode 100644 index d3f04ca..0000000 --- a/3rd/lua/src/lstring.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -** $Id: lstring.h,v 1.56 2014/07/18 14:46:47 roberto Exp $ -** String table (keep all strings handled by Lua) -** See Copyright Notice in lua.h -*/ - -#ifndef lstring_h -#define lstring_h - -#include "lgc.h" -#include "lobject.h" -#include "lstate.h" - - -#define sizelstring(l) (sizeof(union UTString) + ((l) + 1) * sizeof(char)) -#define sizestring(s) sizelstring((s)->len) - -#define sizeludata(l) (sizeof(union UUdata) + (l)) -#define sizeudata(u) sizeludata((u)->len) - -#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \ - (sizeof(s)/sizeof(char))-1)) - - -/* -** test whether a string is a reserved word -*/ -#define isreserved(s) ((s)->tt == LUA_TSHRSTR && (s)->extra > 0) - - -/* -** equality for short strings, which are always internalized -*/ -#define eqshrstr(a,b) check_exp((a)->tt == LUA_TSHRSTR, (a) == (b)) - - -LUAI_FUNC unsigned int luaS_hash (const char *str, size_t l, unsigned int seed); -LUAI_FUNC int luaS_eqlngstr (TString *a, TString *b); -LUAI_FUNC void luaS_resize (lua_State *L, int newsize); -LUAI_FUNC void luaS_remove (lua_State *L, TString *ts); -LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s); -LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); -LUAI_FUNC TString *luaS_new (lua_State *L, const char *str); - - -#endif diff --git a/3rd/lua/src/lstrlib.c b/3rd/lua/src/lstrlib.c deleted file mode 100644 index a650b76..0000000 --- a/3rd/lua/src/lstrlib.c +++ /dev/null @@ -1,1430 +0,0 @@ -/* -** $Id: lstrlib.c,v 1.221 2014/12/11 14:03:07 roberto Exp $ -** Standard library for string operations and pattern-matching -** See Copyright Notice in lua.h -*/ - -#define lstrlib_c -#define LUA_LIB - -#include "lprefix.h" - - -#include -#include -#include -#include -#include -#include - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -/* -** maximum number of captures that a pattern can do during -** pattern-matching. This limit is arbitrary. -*/ -#if !defined(LUA_MAXCAPTURES) -#define LUA_MAXCAPTURES 32 -#endif - - -/* macro to 'unsign' a character */ -#define uchar(c) ((unsigned char)(c)) - - -/* -** Some sizes are better limited to fit in 'int', but must also fit in -** 'size_t'. (We assume that 'lua_Integer' cannot be smaller than 'int'.) -*/ -#define MAXSIZE \ - (sizeof(size_t) < sizeof(int) ? (~(size_t)0) : (size_t)(INT_MAX)) - - - - -static int str_len (lua_State *L) { - size_t l; - luaL_checklstring(L, 1, &l); - lua_pushinteger(L, (lua_Integer)l); - return 1; -} - - -/* translate a relative string position: negative means back from end */ -static lua_Integer posrelat (lua_Integer pos, size_t len) { - if (pos >= 0) return pos; - else if (0u - (size_t)pos > len) return 0; - else return (lua_Integer)len + pos + 1; -} - - -static int str_sub (lua_State *L) { - size_t l; - const char *s = luaL_checklstring(L, 1, &l); - lua_Integer start = posrelat(luaL_checkinteger(L, 2), l); - lua_Integer end = posrelat(luaL_optinteger(L, 3, -1), l); - if (start < 1) start = 1; - if (end > (lua_Integer)l) end = l; - if (start <= end) - lua_pushlstring(L, s + start - 1, (size_t)(end - start + 1)); - else lua_pushliteral(L, ""); - return 1; -} - - -static int str_reverse (lua_State *L) { - size_t l, i; - luaL_Buffer b; - const char *s = luaL_checklstring(L, 1, &l); - char *p = luaL_buffinitsize(L, &b, l); - for (i = 0; i < l; i++) - p[i] = s[l - i - 1]; - luaL_pushresultsize(&b, l); - return 1; -} - - -static int str_lower (lua_State *L) { - size_t l; - size_t i; - luaL_Buffer b; - const char *s = luaL_checklstring(L, 1, &l); - char *p = luaL_buffinitsize(L, &b, l); - for (i=0; i MAXSIZE / n) /* may overflow? */ - return luaL_error(L, "resulting string too large"); - else { - size_t totallen = (size_t)n * l + (size_t)(n - 1) * lsep; - luaL_Buffer b; - char *p = luaL_buffinitsize(L, &b, totallen); - while (n-- > 1) { /* first n-1 copies (followed by separator) */ - memcpy(p, s, l * sizeof(char)); p += l; - if (lsep > 0) { /* empty 'memcpy' is not that cheap */ - memcpy(p, sep, lsep * sizeof(char)); - p += lsep; - } - } - memcpy(p, s, l * sizeof(char)); /* last copy (not followed by separator) */ - luaL_pushresultsize(&b, totallen); - } - return 1; -} - - -static int str_byte (lua_State *L) { - size_t l; - const char *s = luaL_checklstring(L, 1, &l); - lua_Integer posi = posrelat(luaL_optinteger(L, 2, 1), l); - lua_Integer pose = posrelat(luaL_optinteger(L, 3, posi), l); - int n, i; - if (posi < 1) posi = 1; - if (pose > (lua_Integer)l) pose = l; - if (posi > pose) return 0; /* empty interval; return no values */ - n = (int)(pose - posi + 1); - if (posi + n <= pose) /* arithmetic overflow? */ - return luaL_error(L, "string slice too long"); - luaL_checkstack(L, n, "string slice too long"); - for (i=0; i= ms->level || ms->capture[l].len == CAP_UNFINISHED) - return luaL_error(ms->L, "invalid capture index %%%d", l + 1); - return l; -} - - -static int capture_to_close (MatchState *ms) { - int level = ms->level; - for (level--; level>=0; level--) - if (ms->capture[level].len == CAP_UNFINISHED) return level; - return luaL_error(ms->L, "invalid pattern capture"); -} - - -static const char *classend (MatchState *ms, const char *p) { - switch (*p++) { - case L_ESC: { - if (p == ms->p_end) - luaL_error(ms->L, "malformed pattern (ends with '%%')"); - return p+1; - } - case '[': { - if (*p == '^') p++; - do { /* look for a ']' */ - if (p == ms->p_end) - luaL_error(ms->L, "malformed pattern (missing ']')"); - if (*(p++) == L_ESC && p < ms->p_end) - p++; /* skip escapes (e.g. '%]') */ - } while (*p != ']'); - return p+1; - } - default: { - return p; - } - } -} - - -static int match_class (int c, int cl) { - int res; - switch (tolower(cl)) { - case 'a' : res = isalpha(c); break; - case 'c' : res = iscntrl(c); break; - case 'd' : res = isdigit(c); break; - case 'g' : res = isgraph(c); break; - case 'l' : res = islower(c); break; - case 'p' : res = ispunct(c); break; - case 's' : res = isspace(c); break; - case 'u' : res = isupper(c); break; - case 'w' : res = isalnum(c); break; - case 'x' : res = isxdigit(c); break; - case 'z' : res = (c == 0); break; /* deprecated option */ - default: return (cl == c); - } - return (islower(cl) ? res : !res); -} - - -static int matchbracketclass (int c, const char *p, const char *ec) { - int sig = 1; - if (*(p+1) == '^') { - sig = 0; - p++; /* skip the '^' */ - } - while (++p < ec) { - if (*p == L_ESC) { - p++; - if (match_class(c, uchar(*p))) - return sig; - } - else if ((*(p+1) == '-') && (p+2 < ec)) { - p+=2; - if (uchar(*(p-2)) <= c && c <= uchar(*p)) - return sig; - } - else if (uchar(*p) == c) return sig; - } - return !sig; -} - - -static int singlematch (MatchState *ms, const char *s, const char *p, - const char *ep) { - if (s >= ms->src_end) - return 0; - else { - int c = uchar(*s); - switch (*p) { - case '.': return 1; /* matches any char */ - case L_ESC: return match_class(c, uchar(*(p+1))); - case '[': return matchbracketclass(c, p, ep-1); - default: return (uchar(*p) == c); - } - } -} - - -static const char *matchbalance (MatchState *ms, const char *s, - const char *p) { - if (p >= ms->p_end - 1) - luaL_error(ms->L, "malformed pattern (missing arguments to '%%b')"); - if (*s != *p) return NULL; - else { - int b = *p; - int e = *(p+1); - int cont = 1; - while (++s < ms->src_end) { - if (*s == e) { - if (--cont == 0) return s+1; - } - else if (*s == b) cont++; - } - } - return NULL; /* string ends out of balance */ -} - - -static const char *max_expand (MatchState *ms, const char *s, - const char *p, const char *ep) { - ptrdiff_t i = 0; /* counts maximum expand for item */ - while (singlematch(ms, s + i, p, ep)) - i++; - /* keeps trying to match with the maximum repetitions */ - while (i>=0) { - const char *res = match(ms, (s+i), ep+1); - if (res) return res; - i--; /* else didn't match; reduce 1 repetition to try again */ - } - return NULL; -} - - -static const char *min_expand (MatchState *ms, const char *s, - const char *p, const char *ep) { - for (;;) { - const char *res = match(ms, s, ep+1); - if (res != NULL) - return res; - else if (singlematch(ms, s, p, ep)) - s++; /* try with one more repetition */ - else return NULL; - } -} - - -static const char *start_capture (MatchState *ms, const char *s, - const char *p, int what) { - const char *res; - int level = ms->level; - if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures"); - ms->capture[level].init = s; - ms->capture[level].len = what; - ms->level = level+1; - if ((res=match(ms, s, p)) == NULL) /* match failed? */ - ms->level--; /* undo capture */ - return res; -} - - -static const char *end_capture (MatchState *ms, const char *s, - const char *p) { - int l = capture_to_close(ms); - const char *res; - ms->capture[l].len = s - ms->capture[l].init; /* close capture */ - if ((res = match(ms, s, p)) == NULL) /* match failed? */ - ms->capture[l].len = CAP_UNFINISHED; /* undo capture */ - return res; -} - - -static const char *match_capture (MatchState *ms, const char *s, int l) { - size_t len; - l = check_capture(ms, l); - len = ms->capture[l].len; - if ((size_t)(ms->src_end-s) >= len && - memcmp(ms->capture[l].init, s, len) == 0) - return s+len; - else return NULL; -} - - -static const char *match (MatchState *ms, const char *s, const char *p) { - if (ms->matchdepth-- == 0) - luaL_error(ms->L, "pattern too complex"); - init: /* using goto's to optimize tail recursion */ - if (p != ms->p_end) { /* end of pattern? */ - switch (*p) { - case '(': { /* start capture */ - if (*(p + 1) == ')') /* position capture? */ - s = start_capture(ms, s, p + 2, CAP_POSITION); - else - s = start_capture(ms, s, p + 1, CAP_UNFINISHED); - break; - } - case ')': { /* end capture */ - s = end_capture(ms, s, p + 1); - break; - } - case '$': { - if ((p + 1) != ms->p_end) /* is the '$' the last char in pattern? */ - goto dflt; /* no; go to default */ - s = (s == ms->src_end) ? s : NULL; /* check end of string */ - break; - } - case L_ESC: { /* escaped sequences not in the format class[*+?-]? */ - switch (*(p + 1)) { - case 'b': { /* balanced string? */ - s = matchbalance(ms, s, p + 2); - if (s != NULL) { - p += 4; goto init; /* return match(ms, s, p + 4); */ - } /* else fail (s == NULL) */ - break; - } - case 'f': { /* frontier? */ - const char *ep; char previous; - p += 2; - if (*p != '[') - luaL_error(ms->L, "missing '[' after '%%f' in pattern"); - ep = classend(ms, p); /* points to what is next */ - previous = (s == ms->src_init) ? '\0' : *(s - 1); - if (!matchbracketclass(uchar(previous), p, ep - 1) && - matchbracketclass(uchar(*s), p, ep - 1)) { - p = ep; goto init; /* return match(ms, s, ep); */ - } - s = NULL; /* match failed */ - break; - } - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - case '8': case '9': { /* capture results (%0-%9)? */ - s = match_capture(ms, s, uchar(*(p + 1))); - if (s != NULL) { - p += 2; goto init; /* return match(ms, s, p + 2) */ - } - break; - } - default: goto dflt; - } - break; - } - default: dflt: { /* pattern class plus optional suffix */ - const char *ep = classend(ms, p); /* points to optional suffix */ - /* does not match at least once? */ - if (!singlematch(ms, s, p, ep)) { - if (*ep == '*' || *ep == '?' || *ep == '-') { /* accept empty? */ - p = ep + 1; goto init; /* return match(ms, s, ep + 1); */ - } - else /* '+' or no suffix */ - s = NULL; /* fail */ - } - else { /* matched once */ - switch (*ep) { /* handle optional suffix */ - case '?': { /* optional */ - const char *res; - if ((res = match(ms, s + 1, ep + 1)) != NULL) - s = res; - else { - p = ep + 1; goto init; /* else return match(ms, s, ep + 1); */ - } - break; - } - case '+': /* 1 or more repetitions */ - s++; /* 1 match already done */ - /* go through */ - case '*': /* 0 or more repetitions */ - s = max_expand(ms, s, p, ep); - break; - case '-': /* 0 or more repetitions (minimum) */ - s = min_expand(ms, s, p, ep); - break; - default: /* no suffix */ - s++; p = ep; goto init; /* return match(ms, s + 1, ep); */ - } - } - break; - } - } - } - ms->matchdepth++; - return s; -} - - - -static const char *lmemfind (const char *s1, size_t l1, - const char *s2, size_t l2) { - if (l2 == 0) return s1; /* empty strings are everywhere */ - else if (l2 > l1) return NULL; /* avoids a negative 'l1' */ - else { - const char *init; /* to search for a '*s2' inside 's1' */ - l2--; /* 1st char will be checked by 'memchr' */ - l1 = l1-l2; /* 's2' cannot be found after that */ - while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { - init++; /* 1st char is already checked */ - if (memcmp(init, s2+1, l2) == 0) - return init-1; - else { /* correct 'l1' and 's1' to try again */ - l1 -= init-s1; - s1 = init; - } - } - return NULL; /* not found */ - } -} - - -static void push_onecapture (MatchState *ms, int i, const char *s, - const char *e) { - if (i >= ms->level) { - if (i == 0) /* ms->level == 0, too */ - lua_pushlstring(ms->L, s, e - s); /* add whole match */ - else - luaL_error(ms->L, "invalid capture index %%%d", i + 1); - } - else { - ptrdiff_t l = ms->capture[i].len; - if (l == CAP_UNFINISHED) luaL_error(ms->L, "unfinished capture"); - if (l == CAP_POSITION) - lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1); - else - lua_pushlstring(ms->L, ms->capture[i].init, l); - } -} - - -static int push_captures (MatchState *ms, const char *s, const char *e) { - int i; - int nlevels = (ms->level == 0 && s) ? 1 : ms->level; - luaL_checkstack(ms->L, nlevels, "too many captures"); - for (i = 0; i < nlevels; i++) - push_onecapture(ms, i, s, e); - return nlevels; /* number of strings pushed */ -} - - -/* check whether pattern has no special characters */ -static int nospecials (const char *p, size_t l) { - size_t upto = 0; - do { - if (strpbrk(p + upto, SPECIALS)) - return 0; /* pattern has a special character */ - upto += strlen(p + upto) + 1; /* may have more after \0 */ - } while (upto <= l); - return 1; /* no special chars found */ -} - - -static int str_find_aux (lua_State *L, int find) { - size_t ls, lp; - const char *s = luaL_checklstring(L, 1, &ls); - const char *p = luaL_checklstring(L, 2, &lp); - lua_Integer init = posrelat(luaL_optinteger(L, 3, 1), ls); - if (init < 1) init = 1; - else if (init > (lua_Integer)ls + 1) { /* start after string's end? */ - lua_pushnil(L); /* cannot find anything */ - return 1; - } - /* explicit request or no special characters? */ - if (find && (lua_toboolean(L, 4) || nospecials(p, lp))) { - /* do a plain search */ - const char *s2 = lmemfind(s + init - 1, ls - (size_t)init + 1, p, lp); - if (s2) { - lua_pushinteger(L, s2 - s + 1); - lua_pushinteger(L, s2 - s + lp); - return 2; - } - } - else { - MatchState ms; - const char *s1 = s + init - 1; - int anchor = (*p == '^'); - if (anchor) { - p++; lp--; /* skip anchor character */ - } - ms.L = L; - ms.matchdepth = MAXCCALLS; - ms.src_init = s; - ms.src_end = s + ls; - ms.p_end = p + lp; - do { - const char *res; - ms.level = 0; - lua_assert(ms.matchdepth == MAXCCALLS); - if ((res=match(&ms, s1, p)) != NULL) { - if (find) { - lua_pushinteger(L, s1 - s + 1); /* start */ - lua_pushinteger(L, res - s); /* end */ - return push_captures(&ms, NULL, 0) + 2; - } - else - return push_captures(&ms, s1, res); - } - } while (s1++ < ms.src_end && !anchor); - } - lua_pushnil(L); /* not found */ - return 1; -} - - -static int str_find (lua_State *L) { - return str_find_aux(L, 1); -} - - -static int str_match (lua_State *L) { - return str_find_aux(L, 0); -} - - -static int gmatch_aux (lua_State *L) { - MatchState ms; - size_t ls, lp; - const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls); - const char *p = lua_tolstring(L, lua_upvalueindex(2), &lp); - const char *src; - ms.L = L; - ms.matchdepth = MAXCCALLS; - ms.src_init = s; - ms.src_end = s+ls; - ms.p_end = p + lp; - for (src = s + (size_t)lua_tointeger(L, lua_upvalueindex(3)); - src <= ms.src_end; - src++) { - const char *e; - ms.level = 0; - lua_assert(ms.matchdepth == MAXCCALLS); - if ((e = match(&ms, src, p)) != NULL) { - lua_Integer newstart = e-s; - if (e == src) newstart++; /* empty match? go at least one position */ - lua_pushinteger(L, newstart); - lua_replace(L, lua_upvalueindex(3)); - return push_captures(&ms, src, e); - } - } - return 0; /* not found */ -} - - -static int gmatch (lua_State *L) { - luaL_checkstring(L, 1); - luaL_checkstring(L, 2); - lua_settop(L, 2); - lua_pushinteger(L, 0); - lua_pushcclosure(L, gmatch_aux, 3); - return 1; -} - - -static void add_s (MatchState *ms, luaL_Buffer *b, const char *s, - const char *e) { - size_t l, i; - lua_State *L = ms->L; - const char *news = lua_tolstring(L, 3, &l); - for (i = 0; i < l; i++) { - if (news[i] != L_ESC) - luaL_addchar(b, news[i]); - else { - i++; /* skip ESC */ - if (!isdigit(uchar(news[i]))) { - if (news[i] != L_ESC) - luaL_error(L, "invalid use of '%c' in replacement string", L_ESC); - luaL_addchar(b, news[i]); - } - else if (news[i] == '0') - luaL_addlstring(b, s, e - s); - else { - push_onecapture(ms, news[i] - '1', s, e); - luaL_tolstring(L, -1, NULL); /* if number, convert it to string */ - lua_remove(L, -2); /* remove original value */ - luaL_addvalue(b); /* add capture to accumulated result */ - } - } - } -} - - -static void add_value (MatchState *ms, luaL_Buffer *b, const char *s, - const char *e, int tr) { - lua_State *L = ms->L; - switch (tr) { - case LUA_TFUNCTION: { - int n; - lua_pushvalue(L, 3); - n = push_captures(ms, s, e); - lua_call(L, n, 1); - break; - } - case LUA_TTABLE: { - push_onecapture(ms, 0, s, e); - lua_gettable(L, 3); - break; - } - default: { /* LUA_TNUMBER or LUA_TSTRING */ - add_s(ms, b, s, e); - return; - } - } - if (!lua_toboolean(L, -1)) { /* nil or false? */ - lua_pop(L, 1); - lua_pushlstring(L, s, e - s); /* keep original text */ - } - else if (!lua_isstring(L, -1)) - luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1)); - luaL_addvalue(b); /* add result to accumulator */ -} - - -static int str_gsub (lua_State *L) { - size_t srcl, lp; - const char *src = luaL_checklstring(L, 1, &srcl); - const char *p = luaL_checklstring(L, 2, &lp); - int tr = lua_type(L, 3); - lua_Integer max_s = luaL_optinteger(L, 4, srcl + 1); - int anchor = (*p == '^'); - lua_Integer n = 0; - MatchState ms; - luaL_Buffer b; - luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING || - tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3, - "string/function/table expected"); - luaL_buffinit(L, &b); - if (anchor) { - p++; lp--; /* skip anchor character */ - } - ms.L = L; - ms.matchdepth = MAXCCALLS; - ms.src_init = src; - ms.src_end = src+srcl; - ms.p_end = p + lp; - while (n < max_s) { - const char *e; - ms.level = 0; - lua_assert(ms.matchdepth == MAXCCALLS); - e = match(&ms, src, p); - if (e) { - n++; - add_value(&ms, &b, src, e, tr); - } - if (e && e>src) /* non empty match? */ - src = e; /* skip it */ - else if (src < ms.src_end) - luaL_addchar(&b, *src++); - else break; - if (anchor) break; - } - luaL_addlstring(&b, src, ms.src_end-src); - luaL_pushresult(&b); - lua_pushinteger(L, n); /* number of substitutions */ - return 2; -} - -/* }====================================================== */ - - - -/* -** {====================================================== -** STRING FORMAT -** ======================================================= -*/ - -/* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ -#define MAX_ITEM 512 - -/* valid flags in a format specification */ -#define FLAGS "-+ #0" - -/* -** maximum size of each format specification (such as "%-099.99d") -** (+2 for length modifiers; +10 accounts for %99.99x plus margin of error) -*/ -#define MAX_FORMAT (sizeof(FLAGS) + 2 + 10) - - -static void addquoted (lua_State *L, luaL_Buffer *b, int arg) { - size_t l; - const char *s = luaL_checklstring(L, arg, &l); - luaL_addchar(b, '"'); - while (l--) { - if (*s == '"' || *s == '\\' || *s == '\n') { - luaL_addchar(b, '\\'); - luaL_addchar(b, *s); - } - else if (*s == '\0' || iscntrl(uchar(*s))) { - char buff[10]; - if (!isdigit(uchar(*(s+1)))) - sprintf(buff, "\\%d", (int)uchar(*s)); - else - sprintf(buff, "\\%03d", (int)uchar(*s)); - luaL_addstring(b, buff); - } - else - luaL_addchar(b, *s); - s++; - } - luaL_addchar(b, '"'); -} - -static const char *scanformat (lua_State *L, const char *strfrmt, char *form) { - const char *p = strfrmt; - while (*p != '\0' && strchr(FLAGS, *p) != NULL) p++; /* skip flags */ - if ((size_t)(p - strfrmt) >= sizeof(FLAGS)/sizeof(char)) - luaL_error(L, "invalid format (repeated flags)"); - if (isdigit(uchar(*p))) p++; /* skip width */ - if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ - if (*p == '.') { - p++; - if (isdigit(uchar(*p))) p++; /* skip precision */ - if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ - } - if (isdigit(uchar(*p))) - luaL_error(L, "invalid format (width or precision too long)"); - *(form++) = '%'; - memcpy(form, strfrmt, (p - strfrmt + 1) * sizeof(char)); - form += p - strfrmt + 1; - *form = '\0'; - return p; -} - - -/* -** add length modifier into formats -*/ -static void addlenmod (char *form, const char *lenmod) { - size_t l = strlen(form); - size_t lm = strlen(lenmod); - char spec = form[l - 1]; - strcpy(form + l - 1, lenmod); - form[l + lm - 1] = spec; - form[l + lm] = '\0'; -} - - -static int str_format (lua_State *L) { - int top = lua_gettop(L); - int arg = 1; - size_t sfl; - const char *strfrmt = luaL_checklstring(L, arg, &sfl); - const char *strfrmt_end = strfrmt+sfl; - luaL_Buffer b; - luaL_buffinit(L, &b); - while (strfrmt < strfrmt_end) { - if (*strfrmt != L_ESC) - luaL_addchar(&b, *strfrmt++); - else if (*++strfrmt == L_ESC) - luaL_addchar(&b, *strfrmt++); /* %% */ - else { /* format item */ - char form[MAX_FORMAT]; /* to store the format ('%...') */ - char *buff = luaL_prepbuffsize(&b, MAX_ITEM); /* to put formatted item */ - int nb = 0; /* number of bytes in added item */ - if (++arg > top) - luaL_argerror(L, arg, "no value"); - strfrmt = scanformat(L, strfrmt, form); - switch (*strfrmt++) { - case 'c': { - nb = sprintf(buff, form, (int)luaL_checkinteger(L, arg)); - break; - } - case 'd': case 'i': - case 'o': case 'u': case 'x': case 'X': { - lua_Integer n = luaL_checkinteger(L, arg); - addlenmod(form, LUA_INTEGER_FRMLEN); - nb = sprintf(buff, form, n); - break; - } -#if defined(LUA_USE_AFORMAT) - case 'a': case 'A': -#endif - case 'e': case 'E': case 'f': - case 'g': case 'G': { - addlenmod(form, LUA_NUMBER_FRMLEN); - nb = sprintf(buff, form, luaL_checknumber(L, arg)); - break; - } - case 'q': { - addquoted(L, &b, arg); - break; - } - case 's': { - size_t l; - const char *s = luaL_tolstring(L, arg, &l); - if (!strchr(form, '.') && l >= 100) { - /* no precision and string is too long to be formatted; - keep original string */ - luaL_addvalue(&b); - break; - } - else { - nb = sprintf(buff, form, s); - lua_pop(L, 1); /* remove result from 'luaL_tolstring' */ - break; - } - } - default: { /* also treat cases 'pnLlh' */ - return luaL_error(L, "invalid option '%%%c' to 'format'", - *(strfrmt - 1)); - } - } - luaL_addsize(&b, nb); - } - } - luaL_pushresult(&b); - return 1; -} - -/* }====================================================== */ - - -/* -** {====================================================== -** PACK/UNPACK -** ======================================================= -*/ - - -/* value used for padding */ -#if !defined(LUA_PACKPADBYTE) -#define LUA_PACKPADBYTE 0x00 -#endif - -/* maximum size for the binary representation of an integer */ -#define MAXINTSIZE 16 - -/* number of bits in a character */ -#define NB CHAR_BIT - -/* mask for one character (NB 1's) */ -#define MC ((1 << NB) - 1) - -/* size of a lua_Integer */ -#define SZINT ((int)sizeof(lua_Integer)) - - -/* dummy union to get native endianness */ -static const union { - int dummy; - char little; /* true iff machine is little endian */ -} nativeendian = {1}; - - -/* dummy structure to get native alignment requirements */ -struct cD { - char c; - union { double d; void *p; lua_Integer i; lua_Number n; } u; -}; - -#define MAXALIGN (offsetof(struct cD, u)) - - -/* -** Union for serializing floats -*/ -typedef union Ftypes { - float f; - double d; - lua_Number n; - char buff[5 * sizeof(lua_Number)]; /* enough for any float type */ -} Ftypes; - - -/* -** information to pack/unpack stuff -*/ -typedef struct Header { - lua_State *L; - int islittle; - int maxalign; -} Header; - - -/* -** options for pack/unpack -*/ -typedef enum KOption { - Kint, /* signed integers */ - Kuint, /* unsigned integers */ - Kfloat, /* floating-point numbers */ - Kchar, /* fixed-length strings */ - Kstring, /* strings with prefixed length */ - Kzstr, /* zero-terminated strings */ - Kpadding, /* padding */ - Kpaddalign, /* padding for alignment */ - Knop /* no-op (configuration or spaces) */ -} KOption; - - -/* -** Read an integer numeral from string 'fmt' or return 'df' if -** there is no numeral -*/ -static int digit (int c) { return '0' <= c && c <= '9'; } - -static int getnum (const char **fmt, int df) { - if (!digit(**fmt)) /* no number? */ - return df; /* return default value */ - else { - int a = 0; - do { - a = a*10 + (*((*fmt)++) - '0'); - } while (digit(**fmt) && a <= ((int)MAXSIZE - 9)/10); - return a; - } -} - - -/* -** Read an integer numeral and raises an error if it is larger -** than the maximum size for integers. -*/ -static int getnumlimit (Header *h, const char **fmt, int df) { - int sz = getnum(fmt, df); - if (sz > MAXINTSIZE || sz <= 0) - luaL_error(h->L, "integral size (%d) out of limits [1,%d]", - sz, MAXINTSIZE); - return sz; -} - - -/* -** Initialize Header -*/ -static void initheader (lua_State *L, Header *h) { - h->L = L; - h->islittle = nativeendian.little; - h->maxalign = 1; -} - - -/* -** Read and classify next option. 'size' is filled with option's size. -*/ -static KOption getoption (Header *h, const char **fmt, int *size) { - int opt = *((*fmt)++); - *size = 0; /* default */ - switch (opt) { - case 'b': *size = sizeof(char); return Kint; - case 'B': *size = sizeof(char); return Kuint; - case 'h': *size = sizeof(short); return Kint; - case 'H': *size = sizeof(short); return Kuint; - case 'l': *size = sizeof(long); return Kint; - case 'L': *size = sizeof(long); return Kuint; - case 'j': *size = sizeof(lua_Integer); return Kint; - case 'J': *size = sizeof(lua_Integer); return Kuint; - case 'T': *size = sizeof(size_t); return Kuint; - case 'f': *size = sizeof(float); return Kfloat; - case 'd': *size = sizeof(double); return Kfloat; - case 'n': *size = sizeof(lua_Number); return Kfloat; - case 'i': *size = getnumlimit(h, fmt, sizeof(int)); return Kint; - case 'I': *size = getnumlimit(h, fmt, sizeof(int)); return Kuint; - case 's': *size = getnumlimit(h, fmt, sizeof(size_t)); return Kstring; - case 'c': - *size = getnum(fmt, -1); - if (*size == -1) - luaL_error(h->L, "missing size for format option 'c'"); - return Kchar; - case 'z': return Kzstr; - case 'x': *size = 1; return Kpadding; - case 'X': return Kpaddalign; - case ' ': break; - case '<': h->islittle = 1; break; - case '>': h->islittle = 0; break; - case '=': h->islittle = nativeendian.little; break; - case '!': h->maxalign = getnumlimit(h, fmt, MAXALIGN); break; - default: luaL_error(h->L, "invalid format option '%c'", opt); - } - return Knop; -} - - -/* -** Read, classify, and fill other details about the next option. -** 'psize' is filled with option's size, 'notoalign' with its -** alignment requirements. -** Local variable 'size' gets the size to be aligned. (Kpadal option -** always gets its full alignment, other options are limited by -** the maximum alignment ('maxalign'). Kchar option needs no alignment -** despite its size. -*/ -static KOption getdetails (Header *h, size_t totalsize, - const char **fmt, int *psize, int *ntoalign) { - KOption opt = getoption(h, fmt, psize); - int align = *psize; /* usually, alignment follows size */ - if (opt == Kpaddalign) { /* 'X' gets alignment from following option */ - if (**fmt == '\0' || getoption(h, fmt, &align) == Kchar || align == 0) - luaL_argerror(h->L, 1, "invalid next option for option 'X'"); - } - if (align <= 1 || opt == Kchar) /* need no alignment? */ - *ntoalign = 0; - else { - if (align > h->maxalign) /* enforce maximum alignment */ - align = h->maxalign; - if ((align & (align - 1)) != 0) /* is 'align' not a power of 2? */ - luaL_argerror(h->L, 1, "format asks for alignment not power of 2"); - *ntoalign = (align - (int)(totalsize & (align - 1))) & (align - 1); - } - return opt; -} - - -/* -** Pack integer 'n' with 'size' bytes and 'islittle' endianness. -** The final 'if' handles the case when 'size' is larger than -** the size of a Lua integer, correcting the extra sign-extension -** bytes if necessary (by default they would be zeros). -*/ -static void packint (luaL_Buffer *b, lua_Unsigned n, - int islittle, int size, int neg) { - char *buff = luaL_prepbuffsize(b, size); - int i; - buff[islittle ? 0 : size - 1] = (char)(n & MC); /* first byte */ - for (i = 1; i < size; i++) { - n >>= NB; - buff[islittle ? i : size - 1 - i] = (char)(n & MC); - } - if (neg && size > SZINT) { /* negative number need sign extension? */ - for (i = SZINT; i < size; i++) /* correct extra bytes */ - buff[islittle ? i : size - 1 - i] = (char)MC; - } - luaL_addsize(b, size); /* add result to buffer */ -} - - -/* -** Copy 'size' bytes from 'src' to 'dest', correcting endianness if -** given 'islittle' is different from native endianness. -*/ -static void copywithendian (volatile char *dest, volatile const char *src, - int size, int islittle) { - if (islittle == nativeendian.little) { - while (size-- != 0) - *(dest++) = *(src++); - } - else { - dest += size - 1; - while (size-- != 0) - *(dest--) = *(src++); - } -} - - -static int str_pack (lua_State *L) { - luaL_Buffer b; - Header h; - const char *fmt = luaL_checkstring(L, 1); /* format string */ - int arg = 1; /* current argument to pack */ - size_t totalsize = 0; /* accumulate total size of result */ - initheader(L, &h); - lua_pushnil(L); /* mark to separate arguments from string buffer */ - luaL_buffinit(L, &b); - while (*fmt != '\0') { - int size, ntoalign; - KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); - totalsize += ntoalign + size; - while (ntoalign-- > 0) - luaL_addchar(&b, LUA_PACKPADBYTE); /* fill alignment */ - arg++; - switch (opt) { - case Kint: { /* signed integers */ - lua_Integer n = luaL_checkinteger(L, arg); - if (size < SZINT) { /* need overflow check? */ - lua_Integer lim = (lua_Integer)1 << ((size * NB) - 1); - luaL_argcheck(L, -lim <= n && n < lim, arg, "integer overflow"); - } - packint(&b, (lua_Unsigned)n, h.islittle, size, (n < 0)); - break; - } - case Kuint: { /* unsigned integers */ - lua_Integer n = luaL_checkinteger(L, arg); - if (size < SZINT) /* need overflow check? */ - luaL_argcheck(L, (lua_Unsigned)n < ((lua_Unsigned)1 << (size * NB)), - arg, "unsigned overflow"); - packint(&b, (lua_Unsigned)n, h.islittle, size, 0); - break; - } - case Kfloat: { /* floating-point options */ - volatile Ftypes u; - char *buff = luaL_prepbuffsize(&b, size); - lua_Number n = luaL_checknumber(L, arg); /* get argument */ - if (size == sizeof(u.f)) u.f = (float)n; /* copy it into 'u' */ - else if (size == sizeof(u.d)) u.d = (double)n; - else u.n = n; - /* move 'u' to final result, correcting endianness if needed */ - copywithendian(buff, u.buff, size, h.islittle); - luaL_addsize(&b, size); - break; - } - case Kchar: { /* fixed-size string */ - size_t len; - const char *s = luaL_checklstring(L, arg, &len); - luaL_argcheck(L, len == (size_t)size, arg, "wrong length"); - luaL_addlstring(&b, s, size); - break; - } - case Kstring: { /* strings with length count */ - size_t len; - const char *s = luaL_checklstring(L, arg, &len); - luaL_argcheck(L, size >= (int)sizeof(size_t) || - len < ((size_t)1 << (size * NB)), - arg, "string length does not fit in given size"); - packint(&b, (lua_Unsigned)len, h.islittle, size, 0); /* pack length */ - luaL_addlstring(&b, s, len); - totalsize += len; - break; - } - case Kzstr: { /* zero-terminated string */ - size_t len; - const char *s = luaL_checklstring(L, arg, &len); - luaL_argcheck(L, strlen(s) == len, arg, "string contains zeros"); - luaL_addlstring(&b, s, len); - luaL_addchar(&b, '\0'); /* add zero at the end */ - totalsize += len + 1; - break; - } - case Kpadding: luaL_addchar(&b, LUA_PACKPADBYTE); /* go through */ - case Kpaddalign: case Knop: - arg--; /* undo increment */ - break; - } - } - luaL_pushresult(&b); - return 1; -} - - -static int str_packsize (lua_State *L) { - Header h; - const char *fmt = luaL_checkstring(L, 1); /* format string */ - size_t totalsize = 0; /* accumulate total size of result */ - initheader(L, &h); - while (*fmt != '\0') { - int size, ntoalign; - KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); - size += ntoalign; /* total space used by option */ - luaL_argcheck(L, totalsize <= MAXSIZE - size, 1, - "format result too large"); - totalsize += size; - switch (opt) { - case Kstring: /* strings with length count */ - case Kzstr: /* zero-terminated string */ - luaL_argerror(L, 1, "variable-length format"); - break; - default: break; - } - } - lua_pushinteger(L, (lua_Integer)totalsize); - return 1; -} - - -/* -** Unpack an integer with 'size' bytes and 'islittle' endianness. -** If size is smaller than the size of a Lua integer and integer -** is signed, must do sign extension (propagating the sign to the -** higher bits); if size is larger than the size of a Lua integer, -** it must check the unread bytes to see whether they do not cause an -** overflow. -*/ -static lua_Integer unpackint (lua_State *L, const char *str, - int islittle, int size, int issigned) { - lua_Unsigned res = 0; - int i; - int limit = (size <= SZINT) ? size : SZINT; - for (i = limit - 1; i >= 0; i--) { - res <<= NB; - res |= (lua_Unsigned)(unsigned char)str[islittle ? i : size - 1 - i]; - } - if (size < SZINT) { /* real size smaller than lua_Integer? */ - if (issigned) { /* needs sign extension? */ - lua_Unsigned mask = (lua_Unsigned)1 << (size*NB - 1); - res = ((res ^ mask) - mask); /* do sign extension */ - } - } - else if (size > SZINT) { /* must check unread bytes */ - int mask = (!issigned || (lua_Integer)res >= 0) ? 0 : MC; - for (i = limit; i < size; i++) { - if ((unsigned char)str[islittle ? i : size - 1 - i] != mask) - luaL_error(L, "%d-byte integer does not fit into Lua Integer", size); - } - } - return (lua_Integer)res; -} - - -static int str_unpack (lua_State *L) { - Header h; - const char *fmt = luaL_checkstring(L, 1); - size_t ld; - const char *data = luaL_checklstring(L, 2, &ld); - size_t pos = (size_t)posrelat(luaL_optinteger(L, 3, 1), ld) - 1; - int n = 0; /* number of results */ - luaL_argcheck(L, pos <= ld, 3, "initial position out of string"); - initheader(L, &h); - while (*fmt != '\0') { - int size, ntoalign; - KOption opt = getdetails(&h, pos, &fmt, &size, &ntoalign); - if ((size_t)ntoalign + size > ~pos || pos + ntoalign + size > ld) - luaL_argerror(L, 2, "data string too short"); - pos += ntoalign; /* skip alignment */ - /* stack space for item + next position */ - luaL_checkstack(L, 2, "too many results"); - n++; - switch (opt) { - case Kint: - case Kuint: { - lua_Integer res = unpackint(L, data + pos, h.islittle, size, - (opt == Kint)); - lua_pushinteger(L, res); - break; - } - case Kfloat: { - volatile Ftypes u; - lua_Number num; - copywithendian(u.buff, data + pos, size, h.islittle); - if (size == sizeof(u.f)) num = (lua_Number)u.f; - else if (size == sizeof(u.d)) num = (lua_Number)u.d; - else num = u.n; - lua_pushnumber(L, num); - break; - } - case Kchar: { - lua_pushlstring(L, data + pos, size); - break; - } - case Kstring: { - size_t len = (size_t)unpackint(L, data + pos, h.islittle, size, 0); - luaL_argcheck(L, pos + len + size <= ld, 2, "data string too short"); - lua_pushlstring(L, data + pos + size, len); - pos += len; /* skip string */ - break; - } - case Kzstr: { - size_t len = (int)strlen(data + pos); - lua_pushlstring(L, data + pos, len); - pos += len + 1; /* skip string plus final '\0' */ - break; - } - case Kpaddalign: case Kpadding: case Knop: - n--; /* undo increment */ - break; - } - pos += size; - } - lua_pushinteger(L, pos + 1); /* next position */ - return n + 1; -} - -/* }====================================================== */ - - -static const luaL_Reg strlib[] = { - {"byte", str_byte}, - {"char", str_char}, - {"dump", str_dump}, - {"find", str_find}, - {"format", str_format}, - {"gmatch", gmatch}, - {"gsub", str_gsub}, - {"len", str_len}, - {"lower", str_lower}, - {"match", str_match}, - {"rep", str_rep}, - {"reverse", str_reverse}, - {"sub", str_sub}, - {"upper", str_upper}, - {"pack", str_pack}, - {"packsize", str_packsize}, - {"unpack", str_unpack}, - {NULL, NULL} -}; - - -static void createmetatable (lua_State *L) { - lua_createtable(L, 0, 1); /* table to be metatable for strings */ - lua_pushliteral(L, ""); /* dummy string */ - lua_pushvalue(L, -2); /* copy table */ - lua_setmetatable(L, -2); /* set table as metatable for strings */ - lua_pop(L, 1); /* pop dummy string */ - lua_pushvalue(L, -2); /* get string library */ - lua_setfield(L, -2, "__index"); /* metatable.__index = string */ - lua_pop(L, 1); /* pop metatable */ -} - - -/* -** Open string library -*/ -LUAMOD_API int luaopen_string (lua_State *L) { - luaL_newlib(L, strlib); - createmetatable(L); - return 1; -} - diff --git a/3rd/lua/src/ltable.c b/3rd/lua/src/ltable.c deleted file mode 100644 index 38be005..0000000 --- a/3rd/lua/src/ltable.c +++ /dev/null @@ -1,650 +0,0 @@ -/* -** $Id: ltable.c,v 2.100 2015/01/05 13:52:37 roberto Exp $ -** Lua tables (hash) -** See Copyright Notice in lua.h -*/ - -#define ltable_c -#define LUA_CORE - -#include "lprefix.h" - - -/* -** Implementation of tables (aka arrays, objects, or hash tables). -** Tables keep its elements in two parts: an array part and a hash part. -** Non-negative integer keys are all candidates to be kept in the array -** part. The actual size of the array is the largest 'n' such that at -** least half the slots between 0 and n are in use. -** Hash uses a mix of chained scatter table with Brent's variation. -** A main invariant of these tables is that, if an element is not -** in its main position (i.e. the 'original' position that its hash gives -** to it), then the colliding element is in its own main position. -** Hence even when the load factor reaches 100%, performance remains good. -*/ - -#include -#include -#include -#include - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "lvm.h" - - -/* -** Maximum size of array part (MAXASIZE) is 2^MAXABITS. MAXABITS is -** the largest integer such that MAXASIZE fits in an unsigned int. -*/ -#define MAXABITS cast_int(sizeof(int) * CHAR_BIT - 1) -#define MAXASIZE (1u << MAXABITS) - -/* -** Maximum size of hash part is 2^MAXHBITS. MAXHBITS is the largest -** integer such that 2^MAXHBITS fits in a signed int. (Note that the -** maximum number of elements in a table, 2^MAXABITS + 2^MAXHBITS, still -** fits comfortably in an unsigned int.) -*/ -#define MAXHBITS (MAXABITS - 1) - - -#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) - -#define hashstr(t,str) hashpow2(t, (str)->hash) -#define hashboolean(t,p) hashpow2(t, p) -#define hashint(t,i) hashpow2(t, i) - - -/* -** for some types, it is better to avoid modulus by power of 2, as -** they tend to have many 2 factors. -*/ -#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1)))) - - -#define hashpointer(t,p) hashmod(t, point2int(p)) - - -#define dummynode (&dummynode_) - -#define isdummy(n) ((n) == dummynode) - -static const Node dummynode_ = { - {NILCONSTANT}, /* value */ - {{NILCONSTANT, 0}} /* key */ -}; - - -/* -** Checks whether a float has a value representable as a lua_Integer -** (and does the conversion if so) -*/ -static int numisinteger (lua_Number x, lua_Integer *p) { - if ((x) == l_floor(x)) /* integral value? */ - return lua_numbertointeger(x, p); /* try as an integer */ - else return 0; -} - - -/* -** hash for floating-point numbers -*/ -static Node *hashfloat (const Table *t, lua_Number n) { - int i; - n = l_mathop(frexp)(n, &i) * cast_num(INT_MAX - DBL_MAX_EXP); - i += cast_int(n); - if (i < 0) { - if (cast(unsigned int, i) == 0u - i) /* use unsigned to avoid overflows */ - i = 0; /* handle INT_MIN */ - i = -i; /* must be a positive value */ - } - return hashmod(t, i); -} - - - -/* -** returns the 'main' position of an element in a table (that is, the index -** of its hash value) -*/ -static Node *mainposition (const Table *t, const TValue *key) { - switch (ttype(key)) { - case LUA_TNUMINT: - return hashint(t, ivalue(key)); - case LUA_TNUMFLT: - return hashfloat(t, fltvalue(key)); - case LUA_TSHRSTR: - return hashstr(t, tsvalue(key)); - case LUA_TLNGSTR: { - TString *s = tsvalue(key); - if (s->extra == 0) { /* no hash? */ - s->hash = luaS_hash(getstr(s), s->len, s->hash); - s->extra = 1; /* now it has its hash */ - } - return hashstr(t, tsvalue(key)); - } - case LUA_TBOOLEAN: - return hashboolean(t, bvalue(key)); - case LUA_TLIGHTUSERDATA: - return hashpointer(t, pvalue(key)); - case LUA_TLCF: - return hashpointer(t, fvalue(key)); - default: - return hashpointer(t, gcvalue(key)); - } -} - - -/* -** returns the index for 'key' if 'key' is an appropriate key to live in -** the array part of the table, 0 otherwise. -*/ -static unsigned int arrayindex (const TValue *key) { - if (ttisinteger(key)) { - lua_Integer k = ivalue(key); - if (0 < k && (lua_Unsigned)k <= MAXASIZE) - return cast(unsigned int, k); /* 'key' is an appropriate array index */ - } - return 0; /* 'key' did not match some condition */ -} - - -/* -** returns the index of a 'key' for table traversals. First goes all -** elements in the array part, then elements in the hash part. The -** beginning of a traversal is signaled by 0. -*/ -static unsigned int findindex (lua_State *L, Table *t, StkId key) { - unsigned int i; - if (ttisnil(key)) return 0; /* first iteration */ - i = arrayindex(key); - if (i != 0 && i <= t->sizearray) /* is 'key' inside array part? */ - return i; /* yes; that's the index */ - else { - int nx; - Node *n = mainposition(t, key); - for (;;) { /* check whether 'key' is somewhere in the chain */ - /* key may be dead already, but it is ok to use it in 'next' */ - if (luaV_rawequalobj(gkey(n), key) || - (ttisdeadkey(gkey(n)) && iscollectable(key) && - deadvalue(gkey(n)) == gcvalue(key))) { - i = cast_int(n - gnode(t, 0)); /* key index in hash table */ - /* hash elements are numbered after array ones */ - return (i + 1) + t->sizearray; - } - nx = gnext(n); - if (nx == 0) - luaG_runerror(L, "invalid key to 'next'"); /* key not found */ - else n += nx; - } - } -} - - -int luaH_next (lua_State *L, Table *t, StkId key) { - unsigned int i = findindex(L, t, key); /* find original element */ - for (; i < t->sizearray; i++) { /* try first array part */ - if (!ttisnil(&t->array[i])) { /* a non-nil value? */ - setivalue(key, i + 1); - setobj2s(L, key+1, &t->array[i]); - return 1; - } - } - for (i -= t->sizearray; cast_int(i) < sizenode(t); i++) { /* hash part */ - if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */ - setobj2s(L, key, gkey(gnode(t, i))); - setobj2s(L, key+1, gval(gnode(t, i))); - return 1; - } - } - return 0; /* no more elements */ -} - - -/* -** {============================================================= -** Rehash -** ============================================================== -*/ - -/* -** Compute the optimal size for the array part of table 't'. 'nums' is a -** "count array" where 'nums[i]' is the number of integers in the table -** between 2^(i - 1) + 1 and 2^i. Put in '*narray' the optimal size, and -** return the number of elements that will go to that part. -*/ -static unsigned int computesizes (unsigned int nums[], unsigned int *narray) { - int i; - unsigned int twotoi; /* 2^i */ - unsigned int a = 0; /* number of elements smaller than 2^i */ - unsigned int na = 0; /* number of elements to go to array part */ - unsigned int n = 0; /* optimal size for array part */ - for (i = 0, twotoi = 1; twotoi/2 < *narray; i++, twotoi *= 2) { - if (nums[i] > 0) { - a += nums[i]; - if (a > twotoi/2) { /* more than half elements present? */ - n = twotoi; /* optimal size (till now) */ - na = a; /* all elements up to 'n' will go to array part */ - } - } - if (a == *narray) break; /* all elements already counted */ - } - *narray = n; - lua_assert(*narray/2 <= na && na <= *narray); - return na; -} - - -static int countint (const TValue *key, unsigned int *nums) { - unsigned int k = arrayindex(key); - if (k != 0) { /* is 'key' an appropriate array index? */ - nums[luaO_ceillog2(k)]++; /* count as such */ - return 1; - } - else - return 0; -} - - -static unsigned int numusearray (const Table *t, unsigned int *nums) { - int lg; - unsigned int ttlg; /* 2^lg */ - unsigned int ause = 0; /* summation of 'nums' */ - unsigned int i = 1; /* count to traverse all array keys */ - /* traverse each slice */ - for (lg = 0, ttlg = 1; lg <= MAXABITS; lg++, ttlg *= 2) { - unsigned int lc = 0; /* counter */ - unsigned int lim = ttlg; - if (lim > t->sizearray) { - lim = t->sizearray; /* adjust upper limit */ - if (i > lim) - break; /* no more elements to count */ - } - /* count elements in range (2^(lg - 1), 2^lg] */ - for (; i <= lim; i++) { - if (!ttisnil(&t->array[i-1])) - lc++; - } - nums[lg] += lc; - ause += lc; - } - return ause; -} - - -static int numusehash (const Table *t, unsigned int *nums, - unsigned int *pnasize) { - int totaluse = 0; /* total number of elements */ - int ause = 0; /* elements added to 'nums' (can go to array part) */ - int i = sizenode(t); - while (i--) { - Node *n = &t->node[i]; - if (!ttisnil(gval(n))) { - ause += countint(gkey(n), nums); - totaluse++; - } - } - *pnasize += ause; - return totaluse; -} - - -static void setarrayvector (lua_State *L, Table *t, unsigned int size) { - unsigned int i; - luaM_reallocvector(L, t->array, t->sizearray, size, TValue); - for (i=t->sizearray; iarray[i]); - t->sizearray = size; -} - - -static void setnodevector (lua_State *L, Table *t, unsigned int size) { - int lsize; - if (size == 0) { /* no elements to hash part? */ - t->node = cast(Node *, dummynode); /* use common 'dummynode' */ - lsize = 0; - } - else { - int i; - lsize = luaO_ceillog2(size); - if (lsize > MAXHBITS) - luaG_runerror(L, "table overflow"); - size = twoto(lsize); - t->node = luaM_newvector(L, size, Node); - for (i = 0; i < (int)size; i++) { - Node *n = gnode(t, i); - gnext(n) = 0; - setnilvalue(wgkey(n)); - setnilvalue(gval(n)); - } - } - t->lsizenode = cast_byte(lsize); - t->lastfree = gnode(t, size); /* all positions are free */ -} - - -void luaH_resize (lua_State *L, Table *t, unsigned int nasize, - unsigned int nhsize) { - unsigned int i; - int j; - unsigned int oldasize = t->sizearray; - int oldhsize = t->lsizenode; - Node *nold = t->node; /* save old hash ... */ - if (nasize > oldasize) /* array part must grow? */ - setarrayvector(L, t, nasize); - /* create new hash part with appropriate size */ - setnodevector(L, t, nhsize); - if (nasize < oldasize) { /* array part must shrink? */ - t->sizearray = nasize; - /* re-insert elements from vanishing slice */ - for (i=nasize; iarray[i])) - luaH_setint(L, t, i + 1, &t->array[i]); - } - /* shrink array */ - luaM_reallocvector(L, t->array, oldasize, nasize, TValue); - } - /* re-insert elements from hash part */ - for (j = twoto(oldhsize) - 1; j >= 0; j--) { - Node *old = nold + j; - if (!ttisnil(gval(old))) { - /* doesn't need barrier/invalidate cache, as entry was - already present in the table */ - setobjt2t(L, luaH_set(L, t, gkey(old)), gval(old)); - } - } - if (!isdummy(nold)) - luaM_freearray(L, nold, cast(size_t, twoto(oldhsize))); /* free old array */ -} - - -void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) { - int nsize = isdummy(t->node) ? 0 : sizenode(t); - luaH_resize(L, t, nasize, nsize); -} - -/* -** nums[i] = number of keys 'k' where 2^(i - 1) < k <= 2^i -*/ -static void rehash (lua_State *L, Table *t, const TValue *ek) { - unsigned int nasize, na; - unsigned int nums[MAXABITS + 1]; - int i; - int totaluse; - for (i = 0; i <= MAXABITS; i++) nums[i] = 0; /* reset counts */ - nasize = numusearray(t, nums); /* count keys in array part */ - totaluse = nasize; /* all those keys are integer keys */ - totaluse += numusehash(t, nums, &nasize); /* count keys in hash part */ - /* count extra key */ - nasize += countint(ek, nums); - totaluse++; - /* compute new size for array part */ - na = computesizes(nums, &nasize); - /* resize the table to new computed sizes */ - luaH_resize(L, t, nasize, totaluse - na); -} - - - -/* -** }============================================================= -*/ - - -Table *luaH_new (lua_State *L) { - GCObject *o = luaC_newobj(L, LUA_TTABLE, sizeof(Table)); - Table *t = gco2t(o); - t->metatable = NULL; - t->flags = cast_byte(~0); - t->array = NULL; - t->sizearray = 0; - setnodevector(L, t, 0); - return t; -} - - -void luaH_free (lua_State *L, Table *t) { - if (!isdummy(t->node)) - luaM_freearray(L, t->node, cast(size_t, sizenode(t))); - luaM_freearray(L, t->array, t->sizearray); - luaM_free(L, t); -} - - -static Node *getfreepos (Table *t) { - while (t->lastfree > t->node) { - t->lastfree--; - if (ttisnil(gkey(t->lastfree))) - return t->lastfree; - } - return NULL; /* could not find a free place */ -} - - - -/* -** inserts a new key into a hash table; first, check whether key's main -** position is free. If not, check whether colliding node is in its main -** position or not: if it is not, move colliding node to an empty place and -** put new key in its main position; otherwise (colliding node is in its main -** position), new key goes to an empty position. -*/ -TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) { - Node *mp; - TValue aux; - if (ttisnil(key)) luaG_runerror(L, "table index is nil"); - else if (ttisfloat(key)) { - lua_Number n = fltvalue(key); - lua_Integer k; - if (luai_numisnan(n)) - luaG_runerror(L, "table index is NaN"); - if (numisinteger(n, &k)) { /* index is int? */ - setivalue(&aux, k); - key = &aux; /* insert it as an integer */ - } - } - mp = mainposition(t, key); - if (!ttisnil(gval(mp)) || isdummy(mp)) { /* main position is taken? */ - Node *othern; - Node *f = getfreepos(t); /* get a free place */ - if (f == NULL) { /* cannot find a free place? */ - rehash(L, t, key); /* grow table */ - /* whatever called 'newkey' takes care of TM cache and GC barrier */ - return luaH_set(L, t, key); /* insert key into grown table */ - } - lua_assert(!isdummy(f)); - othern = mainposition(t, gkey(mp)); - if (othern != mp) { /* is colliding node out of its main position? */ - /* yes; move colliding node into free position */ - while (othern + gnext(othern) != mp) /* find previous */ - othern += gnext(othern); - gnext(othern) = cast_int(f - othern); /* rechain to point to 'f' */ - *f = *mp; /* copy colliding node into free pos. (mp->next also goes) */ - if (gnext(mp) != 0) { - gnext(f) += cast_int(mp - f); /* correct 'next' */ - gnext(mp) = 0; /* now 'mp' is free */ - } - setnilvalue(gval(mp)); - } - else { /* colliding node is in its own main position */ - /* new node will go into free position */ - if (gnext(mp) != 0) - gnext(f) = cast_int((mp + gnext(mp)) - f); /* chain new position */ - else lua_assert(gnext(f) == 0); - gnext(mp) = cast_int(f - mp); - mp = f; - } - } - setnodekey(L, &mp->i_key, key); - luaC_barrierback(L, t, key); - lua_assert(ttisnil(gval(mp))); - return gval(mp); -} - - -/* -** search function for integers -*/ -const TValue *luaH_getint (Table *t, lua_Integer key) { - /* (1 <= key && key <= t->sizearray) */ - if (l_castS2U(key - 1) < t->sizearray) - return &t->array[key - 1]; - else { - Node *n = hashint(t, key); - for (;;) { /* check whether 'key' is somewhere in the chain */ - if (ttisinteger(gkey(n)) && ivalue(gkey(n)) == key) - return gval(n); /* that's it */ - else { - int nx = gnext(n); - if (nx == 0) break; - n += nx; - } - }; - return luaO_nilobject; - } -} - - -/* -** search function for short strings -*/ -const TValue *luaH_getstr (Table *t, TString *key) { - Node *n = hashstr(t, key); - lua_assert(key->tt == LUA_TSHRSTR); - for (;;) { /* check whether 'key' is somewhere in the chain */ - const TValue *k = gkey(n); - if (ttisshrstring(k) && eqshrstr(tsvalue(k), key)) - return gval(n); /* that's it */ - else { - int nx = gnext(n); - if (nx == 0) break; - n += nx; - } - }; - return luaO_nilobject; -} - - -/* -** main search function -*/ -const TValue *luaH_get (Table *t, const TValue *key) { - switch (ttype(key)) { - case LUA_TSHRSTR: return luaH_getstr(t, tsvalue(key)); - case LUA_TNUMINT: return luaH_getint(t, ivalue(key)); - case LUA_TNIL: return luaO_nilobject; - case LUA_TNUMFLT: { - lua_Integer k; - if (numisinteger(fltvalue(key), &k)) /* index is int? */ - return luaH_getint(t, k); /* use specialized version */ - /* else go through */ - } - default: { - Node *n = mainposition(t, key); - for (;;) { /* check whether 'key' is somewhere in the chain */ - if (luaV_rawequalobj(gkey(n), key)) - return gval(n); /* that's it */ - else { - int nx = gnext(n); - if (nx == 0) break; - n += nx; - } - }; - return luaO_nilobject; - } - } -} - - -/* -** beware: when using this function you probably need to check a GC -** barrier and invalidate the TM cache. -*/ -TValue *luaH_set (lua_State *L, Table *t, const TValue *key) { - const TValue *p = luaH_get(t, key); - if (p != luaO_nilobject) - return cast(TValue *, p); - else return luaH_newkey(L, t, key); -} - - -void luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) { - const TValue *p = luaH_getint(t, key); - TValue *cell; - if (p != luaO_nilobject) - cell = cast(TValue *, p); - else { - TValue k; - setivalue(&k, key); - cell = luaH_newkey(L, t, &k); - } - setobj2t(L, cell, value); -} - - -static int unbound_search (Table *t, unsigned int j) { - unsigned int i = j; /* i is zero or a present index */ - j++; - /* find 'i' and 'j' such that i is present and j is not */ - while (!ttisnil(luaH_getint(t, j))) { - i = j; - if (j > cast(unsigned int, MAX_INT)/2) { /* overflow? */ - /* table was built with bad purposes: resort to linear search */ - i = 1; - while (!ttisnil(luaH_getint(t, i))) i++; - return i - 1; - } - j *= 2; - } - /* now do a binary search between them */ - while (j - i > 1) { - unsigned int m = (i+j)/2; - if (ttisnil(luaH_getint(t, m))) j = m; - else i = m; - } - return i; -} - - -/* -** Try to find a boundary in table 't'. A 'boundary' is an integer index -** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil). -*/ -int luaH_getn (Table *t) { - unsigned int j = t->sizearray; - if (j > 0 && ttisnil(&t->array[j - 1])) { - /* there is a boundary in the array part: (binary) search for it */ - unsigned int i = 0; - while (j - i > 1) { - unsigned int m = (i+j)/2; - if (ttisnil(&t->array[m - 1])) j = m; - else i = m; - } - return i; - } - /* else must find a boundary in hash part */ - else if (isdummy(t->node)) /* hash part is empty? */ - return j; /* that is easy... */ - else return unbound_search(t, j); -} - - - -#if defined(LUA_DEBUG) - -Node *luaH_mainposition (const Table *t, const TValue *key) { - return mainposition(t, key); -} - -int luaH_isdummy (Node *n) { return isdummy(n); } - -#endif diff --git a/3rd/lua/src/ltable.h b/3rd/lua/src/ltable.h deleted file mode 100644 index 53d2551..0000000 --- a/3rd/lua/src/ltable.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -** $Id: ltable.h,v 2.20 2014/09/04 18:15:29 roberto Exp $ -** Lua tables (hash) -** See Copyright Notice in lua.h -*/ - -#ifndef ltable_h -#define ltable_h - -#include "lobject.h" - - -#define gnode(t,i) (&(t)->node[i]) -#define gval(n) (&(n)->i_val) -#define gnext(n) ((n)->i_key.nk.next) - - -/* 'const' to avoid wrong writings that can mess up field 'next' */ -#define gkey(n) cast(const TValue*, (&(n)->i_key.tvk)) - -#define wgkey(n) (&(n)->i_key.nk) - -#define invalidateTMcache(t) ((t)->flags = 0) - - -/* returns the key, given the value of a table entry */ -#define keyfromval(v) \ - (gkey(cast(Node *, cast(char *, (v)) - offsetof(Node, i_val)))) - - -LUAI_FUNC const TValue *luaH_getint (Table *t, lua_Integer key); -LUAI_FUNC void luaH_setint (lua_State *L, Table *t, lua_Integer key, - TValue *value); -LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key); -LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key); -LUAI_FUNC TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key); -LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key); -LUAI_FUNC Table *luaH_new (lua_State *L); -LUAI_FUNC void luaH_resize (lua_State *L, Table *t, unsigned int nasize, - unsigned int nhsize); -LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize); -LUAI_FUNC void luaH_free (lua_State *L, Table *t); -LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key); -LUAI_FUNC int luaH_getn (Table *t); - - -#if defined(LUA_DEBUG) -LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key); -LUAI_FUNC int luaH_isdummy (Node *n); -#endif - - -#endif diff --git a/3rd/lua/src/ltablib.c b/3rd/lua/src/ltablib.c deleted file mode 100644 index 8f78afb..0000000 --- a/3rd/lua/src/ltablib.c +++ /dev/null @@ -1,357 +0,0 @@ -/* -** $Id: ltablib.c,v 1.79 2014/11/02 19:19:04 roberto Exp $ -** Library for Table Manipulation -** See Copyright Notice in lua.h -*/ - -#define ltablib_c -#define LUA_LIB - -#include "lprefix.h" - - -#include -#include - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - - -/* -** Structure with table-access functions -*/ -typedef struct { - int (*geti) (lua_State *L, int idx, lua_Integer n); - void (*seti) (lua_State *L, int idx, lua_Integer n); -} TabA; - - -/* -** Check that 'arg' has a table and set access functions in 'ta' to raw -** or non-raw according to the presence of corresponding metamethods. -*/ -static void checktab (lua_State *L, int arg, TabA *ta) { - ta->geti = NULL; ta->seti = NULL; - if (lua_getmetatable(L, arg)) { - lua_pushliteral(L, "__index"); /* 'index' metamethod */ - if (lua_rawget(L, -2) != LUA_TNIL) - ta->geti = lua_geti; - lua_pushliteral(L, "__newindex"); /* 'newindex' metamethod */ - if (lua_rawget(L, -3) != LUA_TNIL) - ta->seti = lua_seti; - lua_pop(L, 3); /* pop metatable plus both metamethods */ - } - if (ta->geti == NULL || ta->seti == NULL) { - luaL_checktype(L, arg, LUA_TTABLE); /* must be table for raw methods */ - if (ta->geti == NULL) ta->geti = lua_rawgeti; - if (ta->seti == NULL) ta->seti = lua_rawseti; - } -} - - -#define aux_getn(L,n,ta) (checktab(L, n, ta), luaL_len(L, n)) - - -#if defined(LUA_COMPAT_MAXN) -static int maxn (lua_State *L) { - lua_Number max = 0; - luaL_checktype(L, 1, LUA_TTABLE); - lua_pushnil(L); /* first key */ - while (lua_next(L, 1)) { - lua_pop(L, 1); /* remove value */ - if (lua_type(L, -1) == LUA_TNUMBER) { - lua_Number v = lua_tonumber(L, -1); - if (v > max) max = v; - } - } - lua_pushnumber(L, max); - return 1; -} -#endif - - -static int tinsert (lua_State *L) { - TabA ta; - lua_Integer e = aux_getn(L, 1, &ta) + 1; /* first empty element */ - lua_Integer pos; /* where to insert new element */ - switch (lua_gettop(L)) { - case 2: { /* called with only 2 arguments */ - pos = e; /* insert new element at the end */ - break; - } - case 3: { - lua_Integer i; - pos = luaL_checkinteger(L, 2); /* 2nd argument is the position */ - luaL_argcheck(L, 1 <= pos && pos <= e, 2, "position out of bounds"); - for (i = e; i > pos; i--) { /* move up elements */ - (*ta.geti)(L, 1, i - 1); - (*ta.seti)(L, 1, i); /* t[i] = t[i - 1] */ - } - break; - } - default: { - return luaL_error(L, "wrong number of arguments to 'insert'"); - } - } - (*ta.seti)(L, 1, pos); /* t[pos] = v */ - return 0; -} - - -static int tremove (lua_State *L) { - TabA ta; - lua_Integer size = aux_getn(L, 1, &ta); - lua_Integer pos = luaL_optinteger(L, 2, size); - if (pos != size) /* validate 'pos' if given */ - luaL_argcheck(L, 1 <= pos && pos <= size + 1, 1, "position out of bounds"); - (*ta.geti)(L, 1, pos); /* result = t[pos] */ - for ( ; pos < size; pos++) { - (*ta.geti)(L, 1, pos + 1); - (*ta.seti)(L, 1, pos); /* t[pos] = t[pos + 1] */ - } - lua_pushnil(L); - (*ta.seti)(L, 1, pos); /* t[pos] = nil */ - return 1; -} - - -static int tmove (lua_State *L) { - TabA ta; - lua_Integer f = luaL_checkinteger(L, 2); - lua_Integer e = luaL_checkinteger(L, 3); - lua_Integer t = luaL_checkinteger(L, 4); - int tt = !lua_isnoneornil(L, 5) ? 5 : 1; /* destination table */ - /* the following restriction avoids several problems with overflows */ - luaL_argcheck(L, f > 0, 2, "initial position must be positive"); - if (e >= f) { /* otherwise, nothing to move */ - lua_Integer n, i; - ta.geti = (luaL_getmetafield(L, 1, "__index") == LUA_TNIL) - ? (luaL_checktype(L, 1, LUA_TTABLE), lua_rawgeti) - : lua_geti; - ta.seti = (luaL_getmetafield(L, tt, "__newindex") == LUA_TNIL) - ? (luaL_checktype(L, tt, LUA_TTABLE), lua_rawseti) - : lua_seti; - n = e - f + 1; /* number of elements to move */ - if (t > f) { - for (i = n - 1; i >= 0; i--) { - (*ta.geti)(L, 1, f + i); - (*ta.seti)(L, tt, t + i); - } - } - else { - for (i = 0; i < n; i++) { - (*ta.geti)(L, 1, f + i); - (*ta.seti)(L, tt, t + i); - } - } - } - lua_pushvalue(L, tt); /* return "to table" */ - return 1; -} - - -static void addfield (lua_State *L, luaL_Buffer *b, TabA *ta, lua_Integer i) { - (*ta->geti)(L, 1, i); - if (!lua_isstring(L, -1)) - luaL_error(L, "invalid value (%s) at index %d in table for 'concat'", - luaL_typename(L, -1), i); - luaL_addvalue(b); -} - - -static int tconcat (lua_State *L) { - TabA ta; - luaL_Buffer b; - size_t lsep; - lua_Integer i, last; - const char *sep = luaL_optlstring(L, 2, "", &lsep); - checktab(L, 1, &ta); - i = luaL_optinteger(L, 3, 1); - last = luaL_opt(L, luaL_checkinteger, 4, luaL_len(L, 1)); - luaL_buffinit(L, &b); - for (; i < last; i++) { - addfield(L, &b, &ta, i); - luaL_addlstring(&b, sep, lsep); - } - if (i == last) /* add last value (if interval was not empty) */ - addfield(L, &b, &ta, i); - luaL_pushresult(&b); - return 1; -} - - -/* -** {====================================================== -** Pack/unpack -** ======================================================= -*/ - -static int pack (lua_State *L) { - int i; - int n = lua_gettop(L); /* number of elements to pack */ - lua_createtable(L, n, 1); /* create result table */ - lua_insert(L, 1); /* put it at index 1 */ - for (i = n; i >= 1; i--) /* assign elements */ - lua_rawseti(L, 1, i); - lua_pushinteger(L, n); - lua_setfield(L, 1, "n"); /* t.n = number of elements */ - return 1; /* return table */ -} - - -static int unpack (lua_State *L) { - TabA ta; - lua_Integer i, e; - lua_Unsigned n; - checktab(L, 1, &ta); - i = luaL_optinteger(L, 2, 1); - e = luaL_opt(L, luaL_checkinteger, 3, luaL_len(L, 1)); - if (i > e) return 0; /* empty range */ - n = (lua_Unsigned)e - i; /* number of elements minus 1 (avoid overflows) */ - if (n >= (unsigned int)INT_MAX || !lua_checkstack(L, (int)(++n))) - return luaL_error(L, "too many results to unpack"); - do { /* must have at least one element */ - (*ta.geti)(L, 1, i); /* push arg[i..e] */ - } while (i++ < e); - - return (int)n; -} - -/* }====================================================== */ - - - -/* -** {====================================================== -** Quicksort -** (based on 'Algorithms in MODULA-3', Robert Sedgewick; -** Addison-Wesley, 1993.) -** ======================================================= -*/ - - -static void set2 (lua_State *L, TabA *ta, int i, int j) { - (*ta->seti)(L, 1, i); - (*ta->seti)(L, 1, j); -} - -static int sort_comp (lua_State *L, int a, int b) { - if (!lua_isnil(L, 2)) { /* function? */ - int res; - lua_pushvalue(L, 2); - lua_pushvalue(L, a-1); /* -1 to compensate function */ - lua_pushvalue(L, b-2); /* -2 to compensate function and 'a' */ - lua_call(L, 2, 1); - res = lua_toboolean(L, -1); - lua_pop(L, 1); - return res; - } - else /* a < b? */ - return lua_compare(L, a, b, LUA_OPLT); -} - -static void auxsort (lua_State *L, TabA *ta, int l, int u) { - while (l < u) { /* for tail recursion */ - int i, j; - /* sort elements a[l], a[(l+u)/2] and a[u] */ - (*ta->geti)(L, 1, l); - (*ta->geti)(L, 1, u); - if (sort_comp(L, -1, -2)) /* a[u] < a[l]? */ - set2(L, ta, l, u); /* swap a[l] - a[u] */ - else - lua_pop(L, 2); - if (u-l == 1) break; /* only 2 elements */ - i = (l+u)/2; - (*ta->geti)(L, 1, i); - (*ta->geti)(L, 1, l); - if (sort_comp(L, -2, -1)) /* a[i]geti)(L, 1, u); - if (sort_comp(L, -1, -2)) /* a[u]geti)(L, 1, i); /* Pivot */ - lua_pushvalue(L, -1); - (*ta->geti)(L, 1, u-1); - set2(L, ta, i, u-1); - /* a[l] <= P == a[u-1] <= a[u], only need to sort from l+1 to u-2 */ - i = l; j = u-1; - for (;;) { /* invariant: a[l..i] <= P <= a[j..u] */ - /* repeat ++i until a[i] >= P */ - while ((*ta->geti)(L, 1, ++i), sort_comp(L, -1, -2)) { - if (i>=u) luaL_error(L, "invalid order function for sorting"); - lua_pop(L, 1); /* remove a[i] */ - } - /* repeat --j until a[j] <= P */ - while ((*ta->geti)(L, 1, --j), sort_comp(L, -3, -1)) { - if (j<=l) luaL_error(L, "invalid order function for sorting"); - lua_pop(L, 1); /* remove a[j] */ - } - if (jgeti)(L, 1, u-1); - (*ta->geti)(L, 1, i); - set2(L, ta, u-1, i); /* swap pivot (a[u-1]) with a[i] */ - /* a[l..i-1] <= a[i] == P <= a[i+1..u] */ - /* adjust so that smaller half is in [j..i] and larger one in [l..u] */ - if (i-l < u-i) { - j=l; i=i-1; l=i+2; - } - else { - j=i+1; i=u; u=j-2; - } - auxsort(L, ta, j, i); /* call recursively the smaller one */ - } /* repeat the routine for the larger one */ -} - -static int sort (lua_State *L) { - TabA ta; - int n = (int)aux_getn(L, 1, &ta); - luaL_checkstack(L, 50, ""); /* assume array is smaller than 2^50 */ - if (!lua_isnoneornil(L, 2)) /* is there a 2nd argument? */ - luaL_checktype(L, 2, LUA_TFUNCTION); - lua_settop(L, 2); /* make sure there are two arguments */ - auxsort(L, &ta, 1, n); - return 0; -} - -/* }====================================================== */ - - -static const luaL_Reg tab_funcs[] = { - {"concat", tconcat}, -#if defined(LUA_COMPAT_MAXN) - {"maxn", maxn}, -#endif - {"insert", tinsert}, - {"pack", pack}, - {"unpack", unpack}, - {"remove", tremove}, - {"move", tmove}, - {"sort", sort}, - {NULL, NULL} -}; - - -LUAMOD_API int luaopen_table (lua_State *L) { - luaL_newlib(L, tab_funcs); -#if defined(LUA_COMPAT_UNPACK) - /* _G.unpack = table.unpack */ - lua_getfield(L, -1, "unpack"); - lua_setglobal(L, "unpack"); -#endif - return 1; -} - diff --git a/3rd/lua/src/ltm.c b/3rd/lua/src/ltm.c deleted file mode 100644 index 25b46b1..0000000 --- a/3rd/lua/src/ltm.c +++ /dev/null @@ -1,143 +0,0 @@ -/* -** $Id: ltm.c,v 2.33 2014/11/21 12:15:57 roberto Exp $ -** Tag methods -** See Copyright Notice in lua.h -*/ - -#define ltm_c -#define LUA_CORE - -#include "lprefix.h" - - -#include - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lvm.h" - - -static const char udatatypename[] = "userdata"; - -LUAI_DDEF const char *const luaT_typenames_[LUA_TOTALTAGS] = { - "no value", - "nil", "boolean", udatatypename, "number", - "string", "table", "function", udatatypename, "thread", - "proto" /* this last case is used for tests only */ -}; - - -void luaT_init (lua_State *L) { - static const char *const luaT_eventname[] = { /* ORDER TM */ - "__index", "__newindex", - "__gc", "__mode", "__len", "__eq", - "__add", "__sub", "__mul", "__mod", "__pow", - "__div", "__idiv", - "__band", "__bor", "__bxor", "__shl", "__shr", - "__unm", "__bnot", "__lt", "__le", - "__concat", "__call" - }; - int i; - for (i=0; itmname[i] = luaS_new(L, luaT_eventname[i]); - luaC_fix(L, obj2gco(G(L)->tmname[i])); /* never collect these names */ - } -} - - -/* -** function to be used with macro "fasttm": optimized for absence of -** tag methods -*/ -const TValue *luaT_gettm (Table *events, TMS event, TString *ename) { - const TValue *tm = luaH_getstr(events, ename); - lua_assert(event <= TM_EQ); - if (ttisnil(tm)) { /* no tag method? */ - events->flags |= cast_byte(1u<metatable; - break; - case LUA_TUSERDATA: - mt = uvalue(o)->metatable; - break; - default: - mt = G(L)->mt[ttnov(o)]; - } - return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject); -} - - -void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, - const TValue *p2, TValue *p3, int hasres) { - ptrdiff_t result = savestack(L, p3); - setobj2s(L, L->top++, f); /* push function (assume EXTRA_STACK) */ - setobj2s(L, L->top++, p1); /* 1st argument */ - setobj2s(L, L->top++, p2); /* 2nd argument */ - if (!hasres) /* no result? 'p3' is third argument */ - setobj2s(L, L->top++, p3); /* 3rd argument */ - /* metamethod may yield only when called from Lua code */ - luaD_call(L, L->top - (4 - hasres), hasres, isLua(L->ci)); - if (hasres) { /* if has result, move it to its place */ - p3 = restorestack(L, result); - setobjs2s(L, p3, --L->top); - } -} - - -int luaT_callbinTM (lua_State *L, const TValue *p1, const TValue *p2, - StkId res, TMS event) { - const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ - if (ttisnil(tm)) - tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ - if (ttisnil(tm)) return 0; - luaT_callTM(L, tm, p1, p2, res, 1); - return 1; -} - - -void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, - StkId res, TMS event) { - if (!luaT_callbinTM(L, p1, p2, res, event)) { - switch (event) { - case TM_CONCAT: - luaG_concaterror(L, p1, p2); - case TM_BAND: case TM_BOR: case TM_BXOR: - case TM_SHL: case TM_SHR: case TM_BNOT: { - lua_Number dummy; - if (tonumber(p1, &dummy) && tonumber(p2, &dummy)) - luaG_tointerror(L, p1, p2); - else - luaG_opinterror(L, p1, p2, "perform bitwise operation on"); - /* else go through */ - } - default: - luaG_opinterror(L, p1, p2, "perform arithmetic on"); - } - } -} - - -int luaT_callorderTM (lua_State *L, const TValue *p1, const TValue *p2, - TMS event) { - if (!luaT_callbinTM(L, p1, p2, L->top, event)) - return -1; /* no metamethod */ - else - return !l_isfalse(L->top); -} - diff --git a/3rd/lua/src/ltm.h b/3rd/lua/src/ltm.h deleted file mode 100644 index 180179c..0000000 --- a/3rd/lua/src/ltm.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -** $Id: ltm.h,v 2.21 2014/10/25 11:50:46 roberto Exp $ -** Tag methods -** See Copyright Notice in lua.h -*/ - -#ifndef ltm_h -#define ltm_h - - -#include "lobject.h" - - -/* -* WARNING: if you change the order of this enumeration, -* grep "ORDER TM" and "ORDER OP" -*/ -typedef enum { - TM_INDEX, - TM_NEWINDEX, - TM_GC, - TM_MODE, - TM_LEN, - TM_EQ, /* last tag method with fast access */ - TM_ADD, - TM_SUB, - TM_MUL, - TM_MOD, - TM_POW, - TM_DIV, - TM_IDIV, - TM_BAND, - TM_BOR, - TM_BXOR, - TM_SHL, - TM_SHR, - TM_UNM, - TM_BNOT, - TM_LT, - TM_LE, - TM_CONCAT, - TM_CALL, - TM_N /* number of elements in the enum */ -} TMS; - - - -#define gfasttm(g,et,e) ((et) == NULL ? NULL : \ - ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) - -#define fasttm(l,et,e) gfasttm(G(l), et, e) - -#define ttypename(x) luaT_typenames_[(x) + 1] -#define objtypename(x) ttypename(ttnov(x)) - -LUAI_DDEC const char *const luaT_typenames_[LUA_TOTALTAGS]; - - -LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename); -LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, - TMS event); -LUAI_FUNC void luaT_init (lua_State *L); - -LUAI_FUNC void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, - const TValue *p2, TValue *p3, int hasres); -LUAI_FUNC int luaT_callbinTM (lua_State *L, const TValue *p1, const TValue *p2, - StkId res, TMS event); -LUAI_FUNC void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, - StkId res, TMS event); -LUAI_FUNC int luaT_callorderTM (lua_State *L, const TValue *p1, - const TValue *p2, TMS event); - - - -#endif diff --git a/3rd/lua/src/lua b/3rd/lua/src/lua deleted file mode 100755 index e41c01c98d1ff609dcf9bac8776be69031d6a92a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 913268 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

h)5%&9Z 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≠T3B%%xpr~p-)=wa1TRidbJ0<9VI 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

*PvADIy;rR25agXqNyugQ`bMO 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 }n<;#%18Dac(@&+FflV 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

wcBX_-n@o@uH8oa-){Bl+D)|o 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 z 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 -#include -#include -#include - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -#if !defined(LUA_PROMPT) -#define LUA_PROMPT "> " -#define LUA_PROMPT2 ">> " -#endif - -#if !defined(LUA_PROGNAME) -#define LUA_PROGNAME "lua" -#endif - -#if !defined(LUA_MAXINPUT) -#define LUA_MAXINPUT 512 -#endif - -#if !defined(LUA_INIT_VAR) -#define LUA_INIT_VAR "LUA_INIT" -#endif - -#define LUA_INITVARVERSION \ - LUA_INIT_VAR "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR - - -/* -** lua_stdin_is_tty detects whether the standard input is a 'tty' (that -** is, whether we're running lua interactively). -*/ -#if !defined(lua_stdin_is_tty) /* { */ - -#if defined(LUA_USE_POSIX) /* { */ - -#include -#define lua_stdin_is_tty() isatty(0) - -#elif defined(LUA_USE_WINDOWS) /* }{ */ - -#include -#define lua_stdin_is_tty() _isatty(_fileno(stdin)) - -#else /* }{ */ - -/* ISO C definition */ -#define lua_stdin_is_tty() 1 /* assume stdin is a tty */ - -#endif /* } */ - -#endif /* } */ - - -/* -** lua_readline defines how to show a prompt and then read a line from -** the standard input. -** lua_saveline defines how to "save" a read line in a "history". -** lua_freeline defines how to free a line read by lua_readline. -*/ -#if !defined(lua_readline) /* { */ - -#if defined(LUA_USE_READLINE) /* { */ - -#include -#include -#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL) -#define lua_saveline(L,idx) \ - if (lua_rawlen(L,idx) > 0) /* non-empty line? */ \ - add_history(lua_tostring(L, idx)); /* add it to history */ -#define lua_freeline(L,b) ((void)L, free(b)) - -#else /* }{ */ - -#define lua_readline(L,b,p) \ - ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ - fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ -#define lua_saveline(L,idx) { (void)L; (void)idx; } -#define lua_freeline(L,b) { (void)L; (void)b; } - -#endif /* } */ - -#endif /* } */ - - - - -static lua_State *globalL = NULL; - -static const char *progname = LUA_PROGNAME; - - -/* -** Hook set by signal function to stop the interpreter. -*/ -static void lstop (lua_State *L, lua_Debug *ar) { - (void)ar; /* unused arg. */ - lua_sethook(L, NULL, 0, 0); /* reset hook */ - luaL_error(L, "interrupted!"); -} - - -/* -** Function to be called at a C signal. Because a C signal cannot -** just change a Lua state (as there is no proper synchronization), -** this function only sets a hook that, when called, will stop the -** interpreter. -*/ -static void laction (int i) { - signal(i, SIG_DFL); /* if another SIGINT happens, terminate process */ - lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); -} - - -static void print_usage (const char *badoption) { - lua_writestringerror("%s: ", progname); - if (badoption[1] == 'e' || badoption[1] == 'l') - lua_writestringerror("'%s' needs argument\n", badoption); - else - lua_writestringerror("unrecognized option '%s'\n", badoption); - lua_writestringerror( - "usage: %s [options] [script [args]]\n" - "Available options are:\n" - " -e stat execute string 'stat'\n" - " -i enter interactive mode after executing 'script'\n" - " -l name require library 'name'\n" - " -v show version information\n" - " -E ignore environment variables\n" - " -- stop handling options\n" - " - stop handling options and execute stdin\n" - , - progname); -} - - -/* -** Prints an error message, adding the program name in front of it -** (if present) -*/ -static void l_message (const char *pname, const char *msg) { - if (pname) lua_writestringerror("%s: ", pname); - lua_writestringerror("%s\n", msg); -} - - -/* -** Check whether 'status' is not OK and, if so, prints the error -** message on the top of the stack. It assumes that the error object -** is a string, as it was either generated by Lua or by 'msghandler'. -*/ -static int report (lua_State *L, int status) { - if (status != LUA_OK) { - const char *msg = lua_tostring(L, -1); - l_message(progname, msg); - lua_pop(L, 1); /* remove message */ - } - return status; -} - - -/* -** Message handler used to run all chunks -*/ -static int msghandler (lua_State *L) { - const char *msg = lua_tostring(L, 1); - if (msg == NULL) { /* is error object not a string? */ - if (luaL_callmeta(L, 1, "__tostring") && /* does it have a metamethod */ - lua_type(L, -1) == LUA_TSTRING) /* that produces a string? */ - return 1; /* that is the message */ - else - msg = lua_pushfstring(L, "(error object is a %s value)", - luaL_typename(L, 1)); - } - luaL_traceback(L, L, msg, 1); /* append a standard traceback */ - return 1; /* return the traceback */ -} - - -/* -** Interface to 'lua_pcall', which sets appropriate message function -** and C-signal handler. Used to run all chunks. -*/ -static int docall (lua_State *L, int narg, int nres) { - int status; - int base = lua_gettop(L) - narg; /* function index */ - lua_pushcfunction(L, msghandler); /* push message handler */ - lua_insert(L, base); /* put it under function and args */ - globalL = L; /* to be available to 'laction' */ - signal(SIGINT, laction); /* set C-signal handler */ - status = lua_pcall(L, narg, nres, base); - signal(SIGINT, SIG_DFL); /* reset C-signal handler */ - lua_remove(L, base); /* remove message handler from the stack */ - return status; -} - - -static void print_version (void) { - lua_writestring(LUA_COPYRIGHT, strlen(LUA_COPYRIGHT)); - lua_writeline(); -} - - -/* -** Create the 'arg' table, which stores all arguments from the -** command line ('argv'). It should be aligned so that, at index 0, -** it has 'argv[script]', which is the script name. The arguments -** to the script (everything after 'script') go to positive indices; -** other arguments (before the script name) go to negative indices. -** If there is no script name, assume interpreter's name as base. -*/ -static void createargtable (lua_State *L, char **argv, int argc, int script) { - int i, narg; - if (script == argc) script = 0; /* no script name? */ - narg = argc - (script + 1); /* number of positive indices */ - lua_createtable(L, narg, script + 1); - for (i = 0; i < argc; i++) { - lua_pushstring(L, argv[i]); - lua_rawseti(L, -2, i - script); - } - lua_setglobal(L, "arg"); -} - - -static int dochunk (lua_State *L, int status) { - if (status == LUA_OK) status = docall(L, 0, 0); - return report(L, status); -} - - -static int dofile (lua_State *L, const char *name) { - return dochunk(L, luaL_loadfile(L, name)); -} - - -static int dostring (lua_State *L, const char *s, const char *name) { - return dochunk(L, luaL_loadbuffer(L, s, strlen(s), name)); -} - - -/* -** Calls 'require(name)' and stores the result in a global variable -** with the given name. -*/ -static int dolibrary (lua_State *L, const char *name) { - int status; - lua_getglobal(L, "require"); - lua_pushstring(L, name); - status = docall(L, 1, 1); /* call 'require(name)' */ - if (status == LUA_OK) - lua_setglobal(L, name); /* global[name] = require return */ - return report(L, status); -} - - -/* -** Returns the string to be used as a prompt by the interpreter. -*/ -static const char *get_prompt (lua_State *L, int firstline) { - const char *p; - lua_getglobal(L, firstline ? "_PROMPT" : "_PROMPT2"); - p = lua_tostring(L, -1); - if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2); - return p; -} - -/* mark in error messages for incomplete statements */ -#define EOFMARK "" -#define marklen (sizeof(EOFMARK)/sizeof(char) - 1) - - -/* -** Check whether 'status' signals a syntax error and the error -** message at the top of the stack ends with the above mark for -** incomplete statements. -*/ -static int incomplete (lua_State *L, int status) { - if (status == LUA_ERRSYNTAX) { - size_t lmsg; - const char *msg = lua_tolstring(L, -1, &lmsg); - if (lmsg >= marklen && strcmp(msg + lmsg - marklen, EOFMARK) == 0) { - lua_pop(L, 1); - return 1; - } - } - return 0; /* else... */ -} - - -/* -** Prompt the user, read a line, and push it into the Lua stack. -*/ -static int pushline (lua_State *L, int firstline) { - char buffer[LUA_MAXINPUT]; - char *b = buffer; - size_t l; - const char *prmt = get_prompt(L, firstline); - int readstatus = lua_readline(L, b, prmt); - if (readstatus == 0) - return 0; /* no input (prompt will be popped by caller) */ - lua_pop(L, 1); /* remove prompt */ - l = strlen(b); - if (l > 0 && b[l-1] == '\n') /* line ends with newline? */ - b[l-1] = '\0'; /* remove it */ - if (firstline && b[0] == '=') /* for compatibility with 5.2, ... */ - lua_pushfstring(L, "return %s", b + 1); /* change '=' to 'return' */ - else - lua_pushstring(L, b); - lua_freeline(L, b); - return 1; -} - - -/* -** Try to compile line on the stack as 'return '; on return, stack -** has either compiled chunk or original line (if compilation failed). -*/ -static int addreturn (lua_State *L) { - int status; - size_t len; const char *line; - lua_pushliteral(L, "return "); - lua_pushvalue(L, -2); /* duplicate line */ - lua_concat(L, 2); /* new line is "return ..." */ - line = lua_tolstring(L, -1, &len); - if ((status = luaL_loadbuffer(L, line, len, "=stdin")) == LUA_OK) - lua_remove(L, -3); /* remove original line */ - else - lua_pop(L, 2); /* remove result from 'luaL_loadbuffer' and new line */ - return status; -} - - -/* -** Read multiple lines until a complete Lua statement -*/ -static int multiline (lua_State *L) { - for (;;) { /* repeat until gets a complete statement */ - size_t len; - const char *line = lua_tolstring(L, 1, &len); /* get what it has */ - int status = luaL_loadbuffer(L, line, len, "=stdin"); /* try it */ - if (!incomplete(L, status) || !pushline(L, 0)) - return status; /* cannot or should not try to add continuation line */ - lua_pushliteral(L, "\n"); /* add newline... */ - lua_insert(L, -2); /* ...between the two lines */ - lua_concat(L, 3); /* join them */ - } -} - - -/* -** Read a line and try to load (compile) it first as an expression (by -** adding "return " in front of it) and second as a statement. Return -** the final status of load/call with the resulting function (if any) -** in the top of the stack. -*/ -static int loadline (lua_State *L) { - int status; - lua_settop(L, 0); - if (!pushline(L, 1)) - return -1; /* no input */ - if ((status = addreturn(L)) != LUA_OK) /* 'return ...' did not work? */ - status = multiline(L); /* try as command, maybe with continuation lines */ - lua_saveline(L, 1); /* keep history */ - lua_remove(L, 1); /* remove line from the stack */ - lua_assert(lua_gettop(L) == 1); - return status; -} - - -/* -** Prints (calling the Lua 'print' function) any values on the stack -*/ -static void l_print (lua_State *L) { - int n = lua_gettop(L); - if (n > 0) { /* any result to be printed? */ - luaL_checkstack(L, LUA_MINSTACK, "too many results to print"); - lua_getglobal(L, "print"); - lua_insert(L, 1); - if (lua_pcall(L, n, 0, 0) != LUA_OK) - l_message(progname, lua_pushfstring(L, "error calling 'print' (%s)", - lua_tostring(L, -1))); - } -} - - -/* -** Do the REPL: repeatedly read (load) a line, evaluate (call) it, and -** print any results. -*/ -static void doREPL (lua_State *L) { - int status; - const char *oldprogname = progname; - progname = NULL; /* no 'progname' on errors in interactive mode */ - while ((status = loadline(L)) != -1) { - if (status == LUA_OK) - status = docall(L, 0, LUA_MULTRET); - if (status == LUA_OK) l_print(L); - else report(L, status); - } - lua_settop(L, 0); /* clear stack */ - lua_writeline(); - progname = oldprogname; -} - - -/* -** Push on the stack the contents of table 'arg' from 1 to #arg -*/ -static int pushargs (lua_State *L) { - int i, n; - if (lua_getglobal(L, "arg") != LUA_TTABLE) - luaL_error(L, "'arg' is not a table"); - n = (int)luaL_len(L, -1); - luaL_checkstack(L, n + 3, "too many arguments to script"); - for (i = 1; i <= n; i++) - lua_rawgeti(L, -i, i); - lua_remove(L, -i); /* remove table from the stack */ - return n; -} - - -static int handle_script (lua_State *L, char **argv) { - int status; - const char *fname = argv[0]; - if (strcmp(fname, "-") == 0 && strcmp(argv[-1], "--") != 0) - fname = NULL; /* stdin */ - status = luaL_loadfile(L, fname); - if (status == LUA_OK) { - int n = pushargs(L); /* push arguments to script */ - status = docall(L, n, LUA_MULTRET); - } - return report(L, status); -} - - - -/* bits of various argument indicators in 'args' */ -#define has_error 1 /* bad option */ -#define has_i 2 /* -i */ -#define has_v 4 /* -v */ -#define has_e 8 /* -e */ -#define has_E 16 /* -E */ - -/* -** Traverses all arguments from 'argv', returning a mask with those -** needed before running any Lua code (or an error code if it finds -** any invalid argument). 'first' returns the first not-handled argument -** (either the script name or a bad argument in case of error). -*/ -static int collectargs (char **argv, int *first) { - int args = 0; - int i; - for (i = 1; argv[i] != NULL; i++) { - *first = i; - if (argv[i][0] != '-') /* not an option? */ - return args; /* stop handling options */ - switch (argv[i][1]) { /* else check option */ - case '-': /* '--' */ - if (argv[i][2] != '\0') /* extra characters after '--'? */ - return has_error; /* invalid option */ - *first = i + 1; - return args; - case '\0': /* '-' */ - return args; /* script "name" is '-' */ - case 'E': - if (argv[i][2] != '\0') /* extra characters after 1st? */ - return has_error; /* invalid option */ - args |= has_E; - break; - case 'i': - args |= has_i; /* goes through (-i implies -v) */ - case 'v': - if (argv[i][2] != '\0') /* extra characters after 1st? */ - return has_error; /* invalid option */ - args |= has_v; - break; - case 'e': - args |= has_e; /* go through */ - case 'l': /* both options need an argument */ - if (argv[i][2] == '\0') { /* no concatenated argument? */ - i++; /* try next 'argv' */ - if (argv[i] == NULL || argv[i][0] == '-') - return has_error; /* no next argument or it is another option */ - } - break; - default: /* invalid option */ - return has_error; - } - } - *first = i; /* no script name */ - return args; -} - - -/* -** Processes options 'e' and 'l', which involve running Lua code. -** Returns 0 if some code raises an error. -*/ -static int runargs (lua_State *L, char **argv, int n) { - int i; - for (i = 1; i < n; i++) { - int status; - int option = argv[i][1]; - lua_assert(argv[i][0] == '-'); /* already checked */ - if (option == 'e' || option == 'l') { - const char *extra = argv[i] + 2; /* both options need an argument */ - if (*extra == '\0') extra = argv[++i]; - lua_assert(extra != NULL); - if (option == 'e') - status = dostring(L, extra, "=(command line)"); - else - status = dolibrary(L, extra); - if (status != LUA_OK) return 0; - } - } - return 1; -} - - -static int handle_luainit (lua_State *L) { - const char *name = "=" LUA_INITVARVERSION; - const char *init = getenv(name + 1); - if (init == NULL) { - name = "=" LUA_INIT_VAR; - init = getenv(name + 1); /* try alternative name */ - } - if (init == NULL) return LUA_OK; - else if (init[0] == '@') - return dofile(L, init+1); - else - return dostring(L, init, name); -} - - -/* -** Main body of stand-alone interpreter (to be called in protected mode). -** Reads the options and handles them all. -*/ -static int pmain (lua_State *L) { - int argc = (int)lua_tointeger(L, 1); - char **argv = (char **)lua_touserdata(L, 2); - int script; - int args = collectargs(argv, &script); - luaL_checkversion(L); /* check that interpreter has correct version */ - if (argv[0] && argv[0][0]) progname = argv[0]; - if (args == has_error) { /* bad arg? */ - print_usage(argv[script]); /* 'script' has index of bad arg. */ - return 0; - } - if (args & has_v) /* option '-v'? */ - print_version(); - if (args & has_E) { /* option '-E'? */ - lua_pushboolean(L, 1); /* signal for libraries to ignore env. vars. */ - lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); - } - luaL_openlibs(L); /* open standard libraries */ - createargtable(L, argv, argc, script); /* create table 'arg' */ - if (!(args & has_E)) { /* no option '-E'? */ - if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */ - return 0; /* error running LUA_INIT */ - } - if (!runargs(L, argv, script)) /* execute arguments -e and -l */ - return 0; /* something failed */ - if (script < argc && /* execute main script (if there is one) */ - handle_script(L, argv + script) != LUA_OK) - return 0; - if (args & has_i) /* -i option? */ - doREPL(L); /* do read-eval-print loop */ - else if (script == argc && !(args & (has_e | has_v))) { /* no arguments? */ - if (lua_stdin_is_tty()) { /* running in interactive mode? */ - print_version(); - doREPL(L); /* do read-eval-print loop */ - } - else dofile(L, NULL); /* executes stdin as a file */ - } - lua_pushboolean(L, 1); /* signal no errors */ - return 1; -} - - -int main (int argc, char **argv) { - int status, result; - lua_State *L = luaL_newstate(); /* create state */ - if (L == NULL) { - l_message(argv[0], "cannot create state: not enough memory"); - return EXIT_FAILURE; - } - lua_pushcfunction(L, &pmain); /* to call 'pmain' in protected mode */ - lua_pushinteger(L, argc); /* 1st argument */ - lua_pushlightuserdata(L, argv); /* 2nd argument */ - status = lua_pcall(L, 2, 1, 0); /* do the call */ - result = lua_toboolean(L, -1); /* get result */ - report(L, status); - lua_close(L); - return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE; -} - diff --git a/3rd/lua/src/lua.h b/3rd/lua/src/lua.h deleted file mode 100644 index 09a4cca..0000000 --- a/3rd/lua/src/lua.h +++ /dev/null @@ -1,485 +0,0 @@ -/* -** $Id: lua.h,v 1.325 2014/12/26 17:24:27 roberto Exp $ -** Lua - A Scripting Language -** Lua.org, PUC-Rio, Brazil (http://www.lua.org) -** See Copyright Notice at the end of this file -*/ - - -#ifndef lua_h -#define lua_h - -#include -#include - - -#include "luaconf.h" - - -#define LUA_VERSION_MAJOR "5" -#define LUA_VERSION_MINOR "3" -#define LUA_VERSION_NUM 503 -#define LUA_VERSION_RELEASE "0" - -#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR -#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE -#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2015 Lua.org, PUC-Rio" -#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes" - - -/* mark for precompiled code ('Lua') */ -#define LUA_SIGNATURE "\x1bLua" - -/* option for multiple returns in 'lua_pcall' and 'lua_call' */ -#define LUA_MULTRET (-1) - - -/* -** pseudo-indices -*/ -#define LUA_REGISTRYINDEX LUAI_FIRSTPSEUDOIDX -#define lua_upvalueindex(i) (LUA_REGISTRYINDEX - (i)) - - -/* thread status */ -#define LUA_OK 0 -#define LUA_YIELD 1 -#define LUA_ERRRUN 2 -#define LUA_ERRSYNTAX 3 -#define LUA_ERRMEM 4 -#define LUA_ERRGCMM 5 -#define LUA_ERRERR 6 - - -typedef struct lua_State lua_State; - - -/* -** basic types -*/ -#define LUA_TNONE (-1) - -#define LUA_TNIL 0 -#define LUA_TBOOLEAN 1 -#define LUA_TLIGHTUSERDATA 2 -#define LUA_TNUMBER 3 -#define LUA_TSTRING 4 -#define LUA_TTABLE 5 -#define LUA_TFUNCTION 6 -#define LUA_TUSERDATA 7 -#define LUA_TTHREAD 8 - -#define LUA_NUMTAGS 9 - - - -/* minimum Lua stack available to a C function */ -#define LUA_MINSTACK 20 - - -/* predefined values in the registry */ -#define LUA_RIDX_MAINTHREAD 1 -#define LUA_RIDX_GLOBALS 2 -#define LUA_RIDX_LAST LUA_RIDX_GLOBALS - - -/* type of numbers in Lua */ -typedef LUA_NUMBER lua_Number; - - -/* type for integer functions */ -typedef LUA_INTEGER lua_Integer; - -/* unsigned integer type */ -typedef LUA_UNSIGNED lua_Unsigned; - -/* type for continuation-function contexts */ -typedef LUA_KCONTEXT lua_KContext; - - -/* -** Type for C functions registered with Lua -*/ -typedef int (*lua_CFunction) (lua_State *L); - -/* -** Type for continuation functions -*/ -typedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx); - - -/* -** Type for functions that read/write blocks when loading/dumping Lua chunks -*/ -typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); - -typedef int (*lua_Writer) (lua_State *L, const void *p, size_t sz, void *ud); - - -/* -** Type for memory-allocation functions -*/ -typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); - - - -/* -** generic extra include file -*/ -#if defined(LUA_USER_H) -#include LUA_USER_H -#endif - - -/* -** RCS ident string -*/ -extern const char lua_ident[]; - - -/* -** state manipulation -*/ -LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); -LUA_API void (lua_close) (lua_State *L); -LUA_API lua_State *(lua_newthread) (lua_State *L); - -LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); - - -LUA_API const lua_Number *(lua_version) (lua_State *L); - - -/* -** basic stack manipulation -*/ -LUA_API int (lua_absindex) (lua_State *L, int idx); -LUA_API int (lua_gettop) (lua_State *L); -LUA_API void (lua_settop) (lua_State *L, int idx); -LUA_API void (lua_pushvalue) (lua_State *L, int idx); -LUA_API void (lua_rotate) (lua_State *L, int idx, int n); -LUA_API void (lua_copy) (lua_State *L, int fromidx, int toidx); -LUA_API int (lua_checkstack) (lua_State *L, int n); - -LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); - - -/* -** access functions (stack -> C) -*/ - -LUA_API int (lua_isnumber) (lua_State *L, int idx); -LUA_API int (lua_isstring) (lua_State *L, int idx); -LUA_API int (lua_iscfunction) (lua_State *L, int idx); -LUA_API int (lua_isinteger) (lua_State *L, int idx); -LUA_API int (lua_isuserdata) (lua_State *L, int idx); -LUA_API int (lua_type) (lua_State *L, int idx); -LUA_API const char *(lua_typename) (lua_State *L, int tp); - -LUA_API lua_Number (lua_tonumberx) (lua_State *L, int idx, int *isnum); -LUA_API lua_Integer (lua_tointegerx) (lua_State *L, int idx, int *isnum); -LUA_API int (lua_toboolean) (lua_State *L, int idx); -LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); -LUA_API size_t (lua_rawlen) (lua_State *L, int idx); -LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); -LUA_API void *(lua_touserdata) (lua_State *L, int idx); -LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); -LUA_API const void *(lua_topointer) (lua_State *L, int idx); - - -/* -** Comparison and arithmetic functions -*/ - -#define LUA_OPADD 0 /* ORDER TM, ORDER OP */ -#define LUA_OPSUB 1 -#define LUA_OPMUL 2 -#define LUA_OPMOD 3 -#define LUA_OPPOW 4 -#define LUA_OPDIV 5 -#define LUA_OPIDIV 6 -#define LUA_OPBAND 7 -#define LUA_OPBOR 8 -#define LUA_OPBXOR 9 -#define LUA_OPSHL 10 -#define LUA_OPSHR 11 -#define LUA_OPUNM 12 -#define LUA_OPBNOT 13 - -LUA_API void (lua_arith) (lua_State *L, int op); - -#define LUA_OPEQ 0 -#define LUA_OPLT 1 -#define LUA_OPLE 2 - -LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); -LUA_API int (lua_compare) (lua_State *L, int idx1, int idx2, int op); - - -/* -** push functions (C -> stack) -*/ -LUA_API void (lua_pushnil) (lua_State *L); -LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); -LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); -LUA_API const char *(lua_pushlstring) (lua_State *L, const char *s, size_t len); -LUA_API const char *(lua_pushstring) (lua_State *L, const char *s); -LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, - va_list argp); -LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...); -LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); -LUA_API void (lua_pushboolean) (lua_State *L, int b); -LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); -LUA_API int (lua_pushthread) (lua_State *L); - - -/* -** get functions (Lua -> stack) -*/ -LUA_API int (lua_getglobal) (lua_State *L, const char *name); -LUA_API int (lua_gettable) (lua_State *L, int idx); -LUA_API int (lua_getfield) (lua_State *L, int idx, const char *k); -LUA_API int (lua_geti) (lua_State *L, int idx, lua_Integer n); -LUA_API int (lua_rawget) (lua_State *L, int idx); -LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n); -LUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p); - -LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); -LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz); -LUA_API int (lua_getmetatable) (lua_State *L, int objindex); -LUA_API int (lua_getuservalue) (lua_State *L, int idx); - - -/* -** set functions (stack -> Lua) -*/ -LUA_API void (lua_setglobal) (lua_State *L, const char *name); -LUA_API void (lua_settable) (lua_State *L, int idx); -LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); -LUA_API void (lua_seti) (lua_State *L, int idx, lua_Integer n); -LUA_API void (lua_rawset) (lua_State *L, int idx); -LUA_API void (lua_rawseti) (lua_State *L, int idx, lua_Integer n); -LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p); -LUA_API int (lua_setmetatable) (lua_State *L, int objindex); -LUA_API void (lua_setuservalue) (lua_State *L, int idx); - - -/* -** 'load' and 'call' functions (load and run Lua code) -*/ -LUA_API void (lua_callk) (lua_State *L, int nargs, int nresults, - lua_KContext ctx, lua_KFunction k); -#define lua_call(L,n,r) lua_callk(L, (n), (r), 0, NULL) - -LUA_API int (lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc, - lua_KContext ctx, lua_KFunction k); -#define lua_pcall(L,n,r,f) lua_pcallk(L, (n), (r), (f), 0, NULL) - -LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, - const char *chunkname, const char *mode); - -LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data, int strip); - - -/* -** coroutine functions -*/ -LUA_API int (lua_yieldk) (lua_State *L, int nresults, lua_KContext ctx, - lua_KFunction k); -LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg); -LUA_API int (lua_status) (lua_State *L); -LUA_API int (lua_isyieldable) (lua_State *L); - -#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL) - - -/* -** garbage-collection function and options -*/ - -#define LUA_GCSTOP 0 -#define LUA_GCRESTART 1 -#define LUA_GCCOLLECT 2 -#define LUA_GCCOUNT 3 -#define LUA_GCCOUNTB 4 -#define LUA_GCSTEP 5 -#define LUA_GCSETPAUSE 6 -#define LUA_GCSETSTEPMUL 7 -#define LUA_GCISRUNNING 9 - -LUA_API int (lua_gc) (lua_State *L, int what, int data); - - -/* -** miscellaneous functions -*/ - -LUA_API int (lua_error) (lua_State *L); - -LUA_API int (lua_next) (lua_State *L, int idx); - -LUA_API void (lua_concat) (lua_State *L, int n); -LUA_API void (lua_len) (lua_State *L, int idx); - -LUA_API size_t (lua_stringtonumber) (lua_State *L, const char *s); - -LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); -LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); - - - -/* -** {============================================================== -** some useful macros -** =============================================================== -*/ - -#define lua_getextraspace(L) ((void *)((char *)(L) - LUA_EXTRASPACE)) - -#define lua_tonumber(L,i) lua_tonumberx(L,(i),NULL) -#define lua_tointeger(L,i) lua_tointegerx(L,(i),NULL) - -#define lua_pop(L,n) lua_settop(L, -(n)-1) - -#define lua_newtable(L) lua_createtable(L, 0, 0) - -#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) - -#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) - -#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) -#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) -#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) -#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) -#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) -#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) -#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) -#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) - -#define lua_pushliteral(L, s) \ - lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) - -#define lua_pushglobaltable(L) \ - lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS) - -#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) - - -#define lua_insert(L,idx) lua_rotate(L, (idx), 1) - -#define lua_remove(L,idx) (lua_rotate(L, (idx), -1), lua_pop(L, 1)) - -#define lua_replace(L,idx) (lua_copy(L, -1, (idx)), lua_pop(L, 1)) - -/* }============================================================== */ - - -/* -** {============================================================== -** compatibility macros for unsigned conversions -** =============================================================== -*/ -#if defined(LUA_COMPAT_APIINTCASTS) - -#define lua_pushunsigned(L,n) lua_pushinteger(L, (lua_Integer)(n)) -#define lua_tounsignedx(L,i,is) ((lua_Unsigned)lua_tointegerx(L,i,is)) -#define lua_tounsigned(L,i) lua_tounsignedx(L,(i),NULL) - -#endif -/* }============================================================== */ - -/* -** {====================================================================== -** Debug API -** ======================================================================= -*/ - - -/* -** Event codes -*/ -#define LUA_HOOKCALL 0 -#define LUA_HOOKRET 1 -#define LUA_HOOKLINE 2 -#define LUA_HOOKCOUNT 3 -#define LUA_HOOKTAILCALL 4 - - -/* -** Event masks -*/ -#define LUA_MASKCALL (1 << LUA_HOOKCALL) -#define LUA_MASKRET (1 << LUA_HOOKRET) -#define LUA_MASKLINE (1 << LUA_HOOKLINE) -#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) - -typedef struct lua_Debug lua_Debug; /* activation record */ - - -/* Functions to be called by the debugger in specific events */ -typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); - - -LUA_API int (lua_getstack) (lua_State *L, int level, lua_Debug *ar); -LUA_API int (lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar); -LUA_API const char *(lua_getlocal) (lua_State *L, const lua_Debug *ar, int n); -LUA_API const char *(lua_setlocal) (lua_State *L, const lua_Debug *ar, int n); -LUA_API const char *(lua_getupvalue) (lua_State *L, int funcindex, int n); -LUA_API const char *(lua_setupvalue) (lua_State *L, int funcindex, int n); - -LUA_API void *(lua_upvalueid) (lua_State *L, int fidx, int n); -LUA_API void (lua_upvaluejoin) (lua_State *L, int fidx1, int n1, - int fidx2, int n2); - -LUA_API void (lua_sethook) (lua_State *L, lua_Hook func, int mask, int count); -LUA_API lua_Hook (lua_gethook) (lua_State *L); -LUA_API int (lua_gethookmask) (lua_State *L); -LUA_API int (lua_gethookcount) (lua_State *L); - - -struct lua_Debug { - int event; - const char *name; /* (n) */ - const char *namewhat; /* (n) 'global', 'local', 'field', 'method' */ - const char *what; /* (S) 'Lua', 'C', 'main', 'tail' */ - const char *source; /* (S) */ - int currentline; /* (l) */ - int linedefined; /* (S) */ - int lastlinedefined; /* (S) */ - unsigned char nups; /* (u) number of upvalues */ - unsigned char nparams;/* (u) number of parameters */ - char isvararg; /* (u) */ - char istailcall; /* (t) */ - char short_src[LUA_IDSIZE]; /* (S) */ - /* private part */ - struct CallInfo *i_ci; /* active function */ -}; - -/* }====================================================================== */ - - -/****************************************************************************** -* Copyright (C) 1994-2015 Lua.org, PUC-Rio. -* -* Permission is hereby granted, free of charge, to any person obtaining -* a copy of this software and associated documentation files (the -* "Software"), to deal in the Software without restriction, including -* without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Software, and to -* permit persons to whom the Software is furnished to do so, subject to -* the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -******************************************************************************/ - - -#endif diff --git a/3rd/lua/src/lua.hpp b/3rd/lua/src/lua.hpp deleted file mode 100644 index ec417f5..0000000 --- a/3rd/lua/src/lua.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// lua.hpp -// Lua header files for C++ -// <> not supplied automatically because Lua also compiles as C++ - -extern "C" { -#include "lua.h" -#include "lualib.h" -#include "lauxlib.h" -} diff --git a/3rd/lua/src/luac b/3rd/lua/src/luac deleted file mode 100755 index 648a439040ba6d47da9b7f5c8bb2a55b6dbca94f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651478 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%0A?_o)3C%7+-g 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 diff --git a/3rd/lua/src/luac.c b/3rd/lua/src/luac.c deleted file mode 100644 index c565f46..0000000 --- a/3rd/lua/src/luac.c +++ /dev/null @@ -1,449 +0,0 @@ -/* -** $Id: luac.c,v 1.72 2015/01/06 03:09:13 lhf Exp $ -** Lua compiler (saves bytecodes to files; also lists bytecodes) -** See Copyright Notice in lua.h -*/ - -#define luac_c -#define LUA_CORE - -#include "lprefix.h" - -#include -#include -#include -#include -#include - -#include "lua.h" -#include "lauxlib.h" - -#include "lobject.h" -#include "lstate.h" -#include "lundump.h" - -static void PrintFunction(const Proto* f, int full); -#define luaU_print PrintFunction - -#define PROGNAME "luac" /* default program name */ -#define OUTPUT PROGNAME ".out" /* default output file */ - -static int listing=0; /* list bytecodes? */ -static int dumping=1; /* dump bytecodes? */ -static int stripping=0; /* strip debug information? */ -static char Output[]={ OUTPUT }; /* default output file name */ -static const char* output=Output; /* actual output file name */ -static const char* progname=PROGNAME; /* actual program name */ - -static void fatal(const char* message) -{ - fprintf(stderr,"%s: %s\n",progname,message); - exit(EXIT_FAILURE); -} - -static void cannot(const char* what) -{ - fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno)); - exit(EXIT_FAILURE); -} - -static void usage(const char* message) -{ - if (*message=='-') - fprintf(stderr,"%s: unrecognized option '%s'\n",progname,message); - else - fprintf(stderr,"%s: %s\n",progname,message); - fprintf(stderr, - "usage: %s [options] [filenames]\n" - "Available options are:\n" - " -l list (use -l -l for full listing)\n" - " -o name output to file 'name' (default is \"%s\")\n" - " -p parse only\n" - " -s strip debug information\n" - " -v show version information\n" - " -- stop handling options\n" - " - stop handling options and process stdin\n" - ,progname,Output); - exit(EXIT_FAILURE); -} - -#define IS(s) (strcmp(argv[i],s)==0) - -static int doargs(int argc, char* argv[]) -{ - int i; - int version=0; - if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0]; - for (i=1; itop+(i)) - -static const Proto* combine(lua_State* L, int n) -{ - if (n==1) - return toproto(L,-1); - else - { - Proto* f; - int i=n; - if (lua_load(L,reader,&i,"=(" PROGNAME ")",NULL)!=LUA_OK) fatal(lua_tostring(L,-1)); - f=toproto(L,-1); - for (i=0; ip[i]=toproto(L,i-n-1); - if (f->p[i]->sizeupvalues>0) f->p[i]->upvalues[0].instack=0; - } - f->sizelineinfo=0; - return f; - } -} - -static int writer(lua_State* L, const void* p, size_t size, void* u) -{ - UNUSED(L); - return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0); -} - -static int pmain(lua_State* L) -{ - int argc=(int)lua_tointeger(L,1); - char** argv=(char**)lua_touserdata(L,2); - const Proto* f; - int i; - if (!lua_checkstack(L,argc)) fatal("too many input files"); - for (i=0; i1); - if (dumping) - { - FILE* D= (output==NULL) ? stdout : fopen(output,"wb"); - if (D==NULL) cannot("open"); - lua_lock(L); - luaU_dump(L,f,writer,D,stripping); - lua_unlock(L); - if (ferror(D)) cannot("write"); - if (fclose(D)) cannot("close"); - } - return 0; -} - -int main(int argc, char* argv[]) -{ - lua_State* L; - int i=doargs(argc,argv); - argc-=i; argv+=i; - if (argc<=0) usage("no input files given"); - L=luaL_newstate(); - if (L==NULL) fatal("cannot create state: not enough memory"); - lua_pushcfunction(L,&pmain); - lua_pushinteger(L,argc); - lua_pushlightuserdata(L,argv); - if (lua_pcall(L,2,0,0)!=LUA_OK) fatal(lua_tostring(L,-1)); - lua_close(L); - return EXIT_SUCCESS; -} - -/* -** $Id: print.c,v 1.76 2015/01/05 16:12:50 lhf Exp $ -** print bytecodes -** See Copyright Notice in lua.h -*/ - -#include -#include - -#define luac_c -#define LUA_CORE - -#include "ldebug.h" -#include "lobject.h" -#include "lopcodes.h" - -#define VOID(p) ((const void*)(p)) - -static void PrintString(const TString* ts) -{ - const char* s=getstr(ts); - size_t i,n=ts->len; - printf("%c",'"'); - for (i=0; ik[i]; - switch (ttype(o)) - { - case LUA_TNIL: - printf("nil"); - break; - case LUA_TBOOLEAN: - printf(bvalue(o) ? "true" : "false"); - break; - case LUA_TNUMFLT: - { - char buff[100]; - sprintf(buff,LUA_NUMBER_FMT,fltvalue(o)); - printf("%s",buff); - if (buff[strspn(buff,"-0123456789")]=='\0') printf(".0"); - break; - } - case LUA_TNUMINT: - printf(LUA_INTEGER_FMT,ivalue(o)); - break; - case LUA_TSHRSTR: case LUA_TLNGSTR: - PrintString(tsvalue(o)); - break; - default: /* cannot happen */ - printf("? type=%d",ttype(o)); - break; - } -} - -#define UPVALNAME(x) ((f->upvalues[x].name) ? getstr(f->upvalues[x].name) : "-") -#define MYK(x) (-1-(x)) - -static void PrintCode(const Proto* f) -{ - const Instruction* code=f->code; - int pc,n=f->sizecode; - for (pc=0; pc0) printf("[%d]\t",line); else printf("[-]\t"); - printf("%-9s\t",luaP_opnames[o]); - switch (getOpMode(o)) - { - case iABC: - printf("%d",a); - if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (MYK(INDEXK(b))) : b); - if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (MYK(INDEXK(c))) : c); - break; - case iABx: - printf("%d",a); - if (getBMode(o)==OpArgK) printf(" %d",MYK(bx)); - if (getBMode(o)==OpArgU) printf(" %d",bx); - break; - case iAsBx: - printf("%d %d",a,sbx); - break; - case iAx: - printf("%d",MYK(ax)); - break; - } - switch (o) - { - case OP_LOADK: - printf("\t; "); PrintConstant(f,bx); - break; - case OP_GETUPVAL: - case OP_SETUPVAL: - printf("\t; %s",UPVALNAME(b)); - break; - case OP_GETTABUP: - printf("\t; %s",UPVALNAME(b)); - if (ISK(c)) { printf(" "); PrintConstant(f,INDEXK(c)); } - break; - case OP_SETTABUP: - printf("\t; %s",UPVALNAME(a)); - if (ISK(b)) { printf(" "); PrintConstant(f,INDEXK(b)); } - if (ISK(c)) { printf(" "); PrintConstant(f,INDEXK(c)); } - break; - case OP_GETTABLE: - case OP_SELF: - if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); } - break; - case OP_SETTABLE: - case OP_ADD: - case OP_SUB: - case OP_MUL: - case OP_POW: - case OP_DIV: - case OP_IDIV: - case OP_BAND: - case OP_BOR: - case OP_BXOR: - case OP_SHL: - case OP_SHR: - case OP_EQ: - case OP_LT: - case OP_LE: - if (ISK(b) || ISK(c)) - { - printf("\t; "); - if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-"); - printf(" "); - if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-"); - } - break; - case OP_JMP: - case OP_FORLOOP: - case OP_FORPREP: - case OP_TFORLOOP: - printf("\t; to %d",sbx+pc+2); - break; - case OP_CLOSURE: - printf("\t; %p",VOID(f->p[bx])); - break; - case OP_SETLIST: - if (c==0) printf("\t; %d",(int)code[++pc]); else printf("\t; %d",c); - break; - case OP_EXTRAARG: - printf("\t; "); PrintConstant(f,ax); - break; - default: - break; - } - printf("\n"); - } -} - -#define SS(x) ((x==1)?"":"s") -#define S(x) (int)(x),SS(x) - -static void PrintHeader(const Proto* f) -{ - const char* s=f->source ? getstr(f->source) : "=?"; - if (*s=='@' || *s=='=') - s++; - else if (*s==LUA_SIGNATURE[0]) - s="(bstring)"; - else - s="(string)"; - printf("\n%s <%s:%d,%d> (%d instruction%s at %p)\n", - (f->linedefined==0)?"main":"function",s, - f->linedefined,f->lastlinedefined, - S(f->sizecode),VOID(f)); - printf("%d%s param%s, %d slot%s, %d upvalue%s, ", - (int)(f->numparams),f->is_vararg?"+":"",SS(f->numparams), - S(f->maxstacksize),S(f->sizeupvalues)); - printf("%d local%s, %d constant%s, %d function%s\n", - S(f->sizelocvars),S(f->sizek),S(f->sizep)); -} - -static void PrintDebug(const Proto* f) -{ - int i,n; - n=f->sizek; - printf("constants (%d) for %p:\n",n,VOID(f)); - for (i=0; isizelocvars; - printf("locals (%d) for %p:\n",n,VOID(f)); - for (i=0; ilocvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1); - } - n=f->sizeupvalues; - printf("upvalues (%d) for %p:\n",n,VOID(f)); - for (i=0; iupvalues[i].instack,f->upvalues[i].idx); - } -} - -static void PrintFunction(const Proto* f, int full) -{ - int i,n=f->sizep; - PrintHeader(f); - PrintCode(f); - if (full) PrintDebug(f); - for (i=0; ip[i],full); -} diff --git a/3rd/lua/src/luaconf.h b/3rd/lua/src/luaconf.h deleted file mode 100644 index fd28d21..0000000 --- a/3rd/lua/src/luaconf.h +++ /dev/null @@ -1,735 +0,0 @@ -/* -** $Id: luaconf.h,v 1.238 2014/12/29 13:27:55 roberto Exp $ -** Configuration file for Lua -** See Copyright Notice in lua.h -*/ - - -#ifndef luaconf_h -#define luaconf_h - -#include -#include - - -/* -** =================================================================== -** Search for "@@" to find all configurable definitions. -** =================================================================== -*/ - - -/* -** {==================================================================== -** System Configuration: macros to adapt (if needed) Lua to some -** particular platform, for instance compiling it with 32-bit numbers or -** restricting it to C89. -** ===================================================================== -*/ - -/* -@@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. You -** can also define LUA_32BITS in the make file, but changing here you -** ensure that all software connected to Lua will be compiled with the -** same configuration. -*/ -/* #define LUA_32BITS */ - - -/* -@@ LUA_USE_C89 controls the use of non-ISO-C89 features. -** Define it if you want Lua to avoid the use of a few C99 features -** or Windows-specific features on Windows. -*/ -/* #define LUA_USE_C89 */ - - -/* -** By default, Lua on Windows use (some) specific Windows features -*/ -#if !defined(LUA_USE_C89) && defined(_WIN32) && !defined(_WIN32_WCE) -#define LUA_USE_WINDOWS /* enable goodies for regular Windows */ -#endif - - -#if defined(LUA_USE_WINDOWS) -#define LUA_DL_DLL /* enable support for DLL */ -#define LUA_USE_C89 /* broadly, Windows is C89 */ -#endif - - -#if defined(LUA_USE_LINUX) -#define LUA_USE_POSIX -#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ -#define LUA_USE_READLINE /* needs some extra libraries */ -#endif - - -#if defined(LUA_USE_MACOSX) -#define LUA_USE_POSIX -#define LUA_USE_DLOPEN /* MacOS does not need -ldl */ -#define LUA_USE_READLINE /* needs an extra library: -lreadline */ -#endif - - -/* -@@ LUA_C89_NUMBERS ensures that Lua uses the largest types available for -** C89 ('long' and 'double'); Windows always has '__int64', so it does -** not need to use this case. -*/ -#if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS) -#define LUA_C89_NUMBERS -#endif - - - -/* -@@ LUAI_BITSINT defines the (minimum) number of bits in an 'int'. -*/ -/* avoid undefined shifts */ -#if ((INT_MAX >> 15) >> 15) >= 1 -#define LUAI_BITSINT 32 -#else -/* 'int' always must have at least 16 bits */ -#define LUAI_BITSINT 16 -#endif - - -/* -@@ LUA_INT_INT / LUA_INT_LONG / LUA_INT_LONGLONG defines the type for -** Lua integers. -@@ LUA_REAL_FLOAT / LUA_REAL_DOUBLE / LUA_REAL_LONGDOUBLE defines -** the type for Lua floats. -** Lua should work fine with any mix of these options (if supported -** by your C compiler). The usual configurations are 64-bit integers -** and 'double' (the default), 32-bit integers and 'float' (for -** restricted platforms), and 'long'/'double' (for C compilers not -** compliant with C99, which may not have support for 'long long'). -*/ - -#if defined(LUA_32BITS) /* { */ -/* -** 32-bit integers and 'float' -*/ -#if LUAI_BITSINT >= 32 /* use 'int' if big enough */ -#define LUA_INT_INT -#else /* otherwise use 'long' */ -#define LUA_INT_LONG -#endif -#define LUA_REAL_FLOAT - -#elif defined(LUA_C89_NUMBERS) /* }{ */ -/* -** largest types available for C89 ('long' and 'double') -*/ -#define LUA_INT_LONG -#define LUA_REAL_DOUBLE - -#else /* }{ */ -/* -** default configuration for 64-bit Lua ('long long' and 'double') -*/ -#define LUA_INT_LONGLONG -#define LUA_REAL_DOUBLE - -#endif /* } */ - -/* }================================================================== */ - - - - -/* -** {================================================================== -** Configuration for Paths. -** =================================================================== -*/ - -/* -@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for -** Lua libraries. -@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for -** C libraries. -** CHANGE them if your machine has a non-conventional directory -** hierarchy or if you want to install your libraries in -** non-conventional directories. -*/ -#define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR -#if defined(_WIN32) /* { */ -/* -** In Windows, any exclamation mark ('!') in the path is replaced by the -** path of the directory of the executable file of the current process. -*/ -#define LUA_LDIR "!\\lua\\" -#define LUA_CDIR "!\\" -#define LUA_SHRDIR "!\\..\\share\\lua\\" LUA_VDIR "\\" -#define LUA_PATH_DEFAULT \ - LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" \ - LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \ - ".\\?.lua;" ".\\?\\init.lua" -#define LUA_CPATH_DEFAULT \ - LUA_CDIR"?.dll;" \ - LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \ - LUA_CDIR"loadall.dll;" ".\\?.dll" - -#else /* }{ */ - -#define LUA_ROOT "/usr/local/" -#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/" -#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/" -#define LUA_PATH_DEFAULT \ - LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \ - "./?.lua;" "./?/init.lua" -#define LUA_CPATH_DEFAULT \ - LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so" -#endif /* } */ - - -/* -@@ LUA_DIRSEP is the directory separator (for submodules). -** CHANGE it if your machine does not use "/" as the directory separator -** and is not Windows. (On Windows Lua automatically uses "\".) -*/ -#if defined(_WIN32) -#define LUA_DIRSEP "\\" -#else -#define LUA_DIRSEP "/" -#endif - -/* }================================================================== */ - - -/* -** {================================================================== -** Marks for exported symbols in the C code -** =================================================================== -*/ - -/* -@@ LUA_API is a mark for all core API functions. -@@ LUALIB_API is a mark for all auxiliary library functions. -@@ LUAMOD_API is a mark for all standard library opening functions. -** CHANGE them if you need to define those functions in some special way. -** For instance, if you want to create one Windows DLL with the core and -** the libraries, you may want to use the following definition (define -** LUA_BUILD_AS_DLL to get it). -*/ -#if defined(LUA_BUILD_AS_DLL) /* { */ - -#if defined(LUA_CORE) || defined(LUA_LIB) /* { */ -#define LUA_API __declspec(dllexport) -#else /* }{ */ -#define LUA_API __declspec(dllimport) -#endif /* } */ - -#else /* }{ */ - -#define LUA_API extern - -#endif /* } */ - - -/* more often than not the libs go together with the core */ -#define LUALIB_API LUA_API -#define LUAMOD_API LUALIB_API - - -/* -@@ LUAI_FUNC is a mark for all extern functions that are not to be -** exported to outside modules. -@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables -** that are not to be exported to outside modules (LUAI_DDEF for -** definitions and LUAI_DDEC for declarations). -** CHANGE them if you need to mark them in some special way. Elf/gcc -** (versions 3.2 and later) mark them as "hidden" to optimize access -** when Lua is compiled as a shared library. Not all elf targets support -** this attribute. Unfortunately, gcc does not offer a way to check -** whether the target offers that support, and those without support -** give a warning about it. To avoid these warnings, change to the -** default definition. -*/ -#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ - defined(__ELF__) /* { */ -#define LUAI_FUNC __attribute__((visibility("hidden"))) extern -#else /* }{ */ -#define LUAI_FUNC extern -#endif /* } */ - -#define LUAI_DDEC LUAI_FUNC -#define LUAI_DDEF /* empty */ - -/* }================================================================== */ - - -/* -** {================================================================== -** Compatibility with previous versions -** =================================================================== -*/ - -/* -@@ LUA_COMPAT_5_2 controls other macros for compatibility with Lua 5.2. -@@ LUA_COMPAT_5_1 controls other macros for compatibility with Lua 5.1. -** You can define it to get all options, or change specific options -** to fit your specific needs. -*/ -#if defined(LUA_COMPAT_5_2) /* { */ - -/* -@@ LUA_COMPAT_MATHLIB controls the presence of several deprecated -** functions in the mathematical library. -*/ -#define LUA_COMPAT_MATHLIB - -/* -@@ LUA_COMPAT_BITLIB controls the presence of library 'bit32'. -*/ -#define LUA_COMPAT_BITLIB - -/* -@@ LUA_COMPAT_IPAIRS controls the effectiveness of the __ipairs metamethod. -*/ -#define LUA_COMPAT_IPAIRS - -/* -@@ LUA_COMPAT_APIINTCASTS controls the presence of macros for -** manipulating other integer types (lua_pushunsigned, lua_tounsigned, -** luaL_checkint, luaL_checklong, etc.) -*/ -#define LUA_COMPAT_APIINTCASTS - - -/* -@@ LUA_COMPAT_FLOATSTRING makes Lua format integral floats without a -@@ a float mark ('.0'). -** This macro is not on by default even in compatibility mode, -** because this is not really an incompatibility. -*/ -/* #define LUA_COMPAT_FLOATSTRING */ - -#endif /* } */ - - -#if defined(LUA_COMPAT_5_1) /* { */ - -/* -@@ LUA_COMPAT_UNPACK controls the presence of global 'unpack'. -** You can replace it with 'table.unpack'. -*/ -#define LUA_COMPAT_UNPACK - -/* -@@ LUA_COMPAT_LOADERS controls the presence of table 'package.loaders'. -** You can replace it with 'package.searchers'. -*/ -#define LUA_COMPAT_LOADERS - -/* -@@ macro 'lua_cpcall' emulates deprecated function lua_cpcall. -** You can call your C function directly (with light C functions). -*/ -#define lua_cpcall(L,f,u) \ - (lua_pushcfunction(L, (f)), \ - lua_pushlightuserdata(L,(u)), \ - lua_pcall(L,1,0,0)) - - -/* -@@ LUA_COMPAT_LOG10 defines the function 'log10' in the math library. -** You can rewrite 'log10(x)' as 'log(x, 10)'. -*/ -#define LUA_COMPAT_LOG10 - -/* -@@ LUA_COMPAT_LOADSTRING defines the function 'loadstring' in the base -** library. You can rewrite 'loadstring(s)' as 'load(s)'. -*/ -#define LUA_COMPAT_LOADSTRING - -/* -@@ LUA_COMPAT_MAXN defines the function 'maxn' in the table library. -*/ -#define LUA_COMPAT_MAXN - -/* -@@ The following macros supply trivial compatibility for some -** changes in the API. The macros themselves document how to -** change your code to avoid using them. -*/ -#define lua_strlen(L,i) lua_rawlen(L, (i)) - -#define lua_objlen(L,i) lua_rawlen(L, (i)) - -#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) -#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) - -/* -@@ LUA_COMPAT_MODULE controls compatibility with previous -** module functions 'module' (Lua) and 'luaL_register' (C). -*/ -#define LUA_COMPAT_MODULE - -#endif /* } */ - -/* }================================================================== */ - - - -/* -** {================================================================== -** Configuration for Numbers. -** Change these definitions if no predefined LUA_REAL_* / LUA_INT_* -** satisfy your needs. -** =================================================================== -*/ - -/* -@@ LUA_NUMBER is the floating-point type used by Lua. -** -@@ LUAI_UACNUMBER is the result of an 'usual argument conversion' -@@ over a floating number. -** -@@ LUA_NUMBER_FRMLEN is the length modifier for writing floats. -@@ LUA_NUMBER_FMT is the format for writing floats. -@@ lua_number2str converts a float to a string. -** -@@ l_mathop allows the addition of an 'l' or 'f' to all math operations. -** -@@ lua_str2number converts a decimal numeric string to a number. -*/ - -#if defined(LUA_REAL_FLOAT) /* { single float */ - -#define LUA_NUMBER float - -#define LUAI_UACNUMBER double - -#define LUA_NUMBER_FRMLEN "" -#define LUA_NUMBER_FMT "%.7g" - -#define l_mathop(op) op##f - -#define lua_str2number(s,p) strtof((s), (p)) - - -#elif defined(LUA_REAL_LONGDOUBLE) /* }{ long double */ - -#define LUA_NUMBER long double - -#define LUAI_UACNUMBER long double - -#define LUA_NUMBER_FRMLEN "L" -#define LUA_NUMBER_FMT "%.19Lg" - -#define l_mathop(op) op##l - -#define lua_str2number(s,p) strtold((s), (p)) - -#elif defined(LUA_REAL_DOUBLE) /* }{ double */ - -#define LUA_NUMBER double - -#define LUAI_UACNUMBER double - -#define LUA_NUMBER_FRMLEN "" -#define LUA_NUMBER_FMT "%.14g" - -#define l_mathop(op) op - -#define lua_str2number(s,p) strtod((s), (p)) - -#else /* }{ */ - -#error "numeric real type not defined" - -#endif /* } */ - - -#define l_floor(x) (l_mathop(floor)(x)) - -#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) - - -/* -@@ lua_numbertointeger converts a float number to an integer, or -** returns 0 if float is not within the range of a lua_Integer. -** (The range comparisons are tricky because of rounding. The tests -** here assume a two-complement representation, where MININTEGER always -** has an exact representation as a float; MAXINTEGER may not have one, -** and therefore its conversion to float may have an ill-defined value.) -*/ -#define lua_numbertointeger(n,p) \ - ((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \ - (n) < -(LUA_NUMBER)(LUA_MININTEGER) && \ - (*(p) = (LUA_INTEGER)(n), 1)) - - -/* -@@ The luai_num* macros define the primitive operations over numbers. -** They should work for any size of floating numbers. -*/ - -/* the following operations need the math library */ -#if defined(lobject_c) || defined(lvm_c) -#include - -/* floor division (defined as 'floor(a/b)') */ -#define luai_numidiv(L,a,b) ((void)L, l_mathop(floor)(luai_numdiv(L,a,b))) - -/* -** module: defined as 'a - floor(a/b)*b'; the previous definition gives -** NaN when 'b' is huge, but the result should be 'a'. 'fmod' gives the -** result of 'a - trunc(a/b)*b', and therefore must be corrected when -** 'trunc(a/b) ~= floor(a/b)'. That happens when the division has a -** non-integer negative result, which is equivalent to the test below -*/ -#define luai_nummod(L,a,b,m) \ - { (m) = l_mathop(fmod)(a,b); if ((m)*(b) < 0) (m) += (b); } - -/* exponentiation */ -#define luai_numpow(L,a,b) ((void)L, l_mathop(pow)(a,b)) - -#endif - -/* these are quite standard operations */ -#if defined(LUA_CORE) -#define luai_numadd(L,a,b) ((a)+(b)) -#define luai_numsub(L,a,b) ((a)-(b)) -#define luai_nummul(L,a,b) ((a)*(b)) -#define luai_numdiv(L,a,b) ((a)/(b)) -#define luai_numunm(L,a) (-(a)) -#define luai_numeq(a,b) ((a)==(b)) -#define luai_numlt(a,b) ((a)<(b)) -#define luai_numle(a,b) ((a)<=(b)) -#define luai_numisnan(a) (!luai_numeq((a), (a))) -#endif - - -/* -@@ LUA_INTEGER is the integer type used by Lua. -** -@@ LUA_UNSIGNED is the unsigned version of LUA_INTEGER. -** -@@ LUAI_UACINT is the result of an 'usual argument conversion' -@@ over a lUA_INTEGER. -@@ LUA_INTEGER_FRMLEN is the length modifier for reading/writing integers. -@@ LUA_INTEGER_FMT is the format for writing integers. -@@ LUA_MAXINTEGER is the maximum value for a LUA_INTEGER. -@@ LUA_MININTEGER is the minimum value for a LUA_INTEGER. -@@ lua_integer2str converts an integer to a string. -*/ - - -/* The following definitions are good for most cases here */ - -#define LUA_INTEGER_FMT "%" LUA_INTEGER_FRMLEN "d" -#define lua_integer2str(s,n) sprintf((s), LUA_INTEGER_FMT, (n)) - -#define LUAI_UACINT LUA_INTEGER - -/* -** use LUAI_UACINT here to avoid problems with promotions (which -** can turn a comparison between unsigneds into a signed comparison) -*/ -#define LUA_UNSIGNED unsigned LUAI_UACINT - - -/* now the variable definitions */ - -#if defined(LUA_INT_INT) /* { int */ - -#define LUA_INTEGER int -#define LUA_INTEGER_FRMLEN "" - -#define LUA_MAXINTEGER INT_MAX -#define LUA_MININTEGER INT_MIN - -#elif defined(LUA_INT_LONG) /* }{ long */ - -#define LUA_INTEGER long -#define LUA_INTEGER_FRMLEN "l" - -#define LUA_MAXINTEGER LONG_MAX -#define LUA_MININTEGER LONG_MIN - -#elif defined(LUA_INT_LONGLONG) /* }{ long long */ - -#if defined(LLONG_MAX) /* { */ -/* use ISO C99 stuff */ - -#define LUA_INTEGER long long -#define LUA_INTEGER_FRMLEN "ll" - -#define LUA_MAXINTEGER LLONG_MAX -#define LUA_MININTEGER LLONG_MIN - -#elif defined(LUA_USE_WINDOWS) /* }{ */ -/* in Windows, can use specific Windows types */ - -#define LUA_INTEGER __int64 -#define LUA_INTEGER_FRMLEN "I64" - -#define LUA_MAXINTEGER _I64_MAX -#define LUA_MININTEGER _I64_MIN - -#else /* }{ */ - -#error "Compiler does not support 'long long'. Use option '-DLUA_32BITS' \ - or '-DLUA_C89_NUMBERS' (see file 'luaconf.h' for details)" - -#endif /* } */ - -#else /* }{ */ - -#error "numeric integer type not defined" - -#endif /* } */ - -/* }================================================================== */ - - -/* -** {================================================================== -** Dependencies with C99 -** =================================================================== -*/ - -/* -@@ lua_strx2number converts an hexadecimal numeric string to a number. -** In C99, 'strtod' does both conversions. Otherwise, you can -** leave 'lua_strx2number' undefined and Lua will provide its own -** implementation. -*/ -#if !defined(LUA_USE_C89) -#define lua_strx2number(s,p) lua_str2number(s,p) -#endif - - -/* -@@ LUA_USE_AFORMAT allows '%a'/'%A' specifiers in 'string.format' -** Enable it if the C function 'printf' supports these specifiers. -** (C99 demands it and Windows also supports it.) -*/ -#if !defined(LUA_USE_C89) || defined(LUA_USE_WINDOWS) -#define LUA_USE_AFORMAT -#endif - - -/* -** 'strtof' and 'opf' variants for math functions are not valid in -** C89. Otherwise, the macro 'HUGE_VALF' is a good proxy for testing the -** availability of these variants. ('math.h' is already included in -** all files that use these macros.) -*/ -#if defined(LUA_USE_C89) || (defined(HUGE_VAL) && !defined(HUGE_VALF)) -#undef l_mathop /* variants not available */ -#undef lua_str2number -#define l_mathop(op) (lua_Number)op /* no variant */ -#define lua_str2number(s,p) ((lua_Number)strtod((s), (p))) -#endif - - -/* -@@ LUA_KCONTEXT is the type of the context ('ctx') for continuation -** functions. It must be a numerical type; Lua will use 'intptr_t' if -** available, otherwise it will use 'ptrdiff_t' (the nearest thing to -** 'intptr_t' in C89) -*/ -#define LUA_KCONTEXT ptrdiff_t - -#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \ - __STDC_VERSION__ >= 199901L -#include -#if defined (INTPTR_MAX) /* even in C99 this type is optional */ -#undef LUA_KCONTEXT -#define LUA_KCONTEXT intptr_t -#endif -#endif - -/* }================================================================== */ - - -/* -** {================================================================== -** Macros that affect the API and must be stable (that is, must be the -** same when you compile Lua and when you compile code that links to -** Lua). You probably do not want/need to change them. -** ===================================================================== -*/ - -/* -@@ LUAI_MAXSTACK limits the size of the Lua stack. -** CHANGE it if you need a different limit. This limit is arbitrary; -** its only purpose is to stop Lua from consuming unlimited stack -** space (and to reserve some numbers for pseudo-indices). -*/ -#if LUAI_BITSINT >= 32 -#define LUAI_MAXSTACK 1000000 -#else -#define LUAI_MAXSTACK 15000 -#endif - -/* reserve some space for error handling */ -#define LUAI_FIRSTPSEUDOIDX (-LUAI_MAXSTACK - 1000) - - -/* -@@ LUA_EXTRASPACE defines the size of a raw memory area associated with -** a Lua state with very fast access. -** CHANGE it if you need a different size. -*/ -#define LUA_EXTRASPACE (sizeof(void *)) - - -/* -@@ LUA_IDSIZE gives the maximum size for the description of the source -@@ of a function in debug information. -** CHANGE it if you want a different size. -*/ -#define LUA_IDSIZE 60 - - -/* -@@ LUAI_MAXSHORTLEN is the maximum length for short strings, that is, -** strings that are internalized. (Cannot be smaller than reserved words -** or tags for metamethods, as these strings must be internalized; -** #("function") = 8, #("__newindex") = 10.) -*/ -#define LUAI_MAXSHORTLEN 40 - - -/* -@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. -** CHANGE it if it uses too much C-stack space. -*/ -#define LUAL_BUFFERSIZE ((int)(0x80 * sizeof(void*) * sizeof(lua_Integer))) - -/* }================================================================== */ - - -/* -@@ LUA_QL describes how error messages quote program elements. -** Lua does not use these macros anymore; they are here for -** compatibility only. -*/ -#define LUA_QL(x) "'" x "'" -#define LUA_QS LUA_QL("%s") - - - - -/* =================================================================== */ - -/* -** Local configuration. You can use this space to add your redefinitions -** without modifying the main part of the file. -*/ - - - - - -#endif - diff --git a/3rd/lua/src/lualib.h b/3rd/lua/src/lualib.h deleted file mode 100644 index 5165c0f..0000000 --- a/3rd/lua/src/lualib.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -** $Id: lualib.h,v 1.44 2014/02/06 17:32:33 roberto Exp $ -** Lua standard libraries -** See Copyright Notice in lua.h -*/ - - -#ifndef lualib_h -#define lualib_h - -#include "lua.h" - - - -LUAMOD_API int (luaopen_base) (lua_State *L); - -#define LUA_COLIBNAME "coroutine" -LUAMOD_API int (luaopen_coroutine) (lua_State *L); - -#define LUA_TABLIBNAME "table" -LUAMOD_API int (luaopen_table) (lua_State *L); - -#define LUA_IOLIBNAME "io" -LUAMOD_API int (luaopen_io) (lua_State *L); - -#define LUA_OSLIBNAME "os" -LUAMOD_API int (luaopen_os) (lua_State *L); - -#define LUA_STRLIBNAME "string" -LUAMOD_API int (luaopen_string) (lua_State *L); - -#define LUA_UTF8LIBNAME "utf8" -LUAMOD_API int (luaopen_utf8) (lua_State *L); - -#define LUA_BITLIBNAME "bit32" -LUAMOD_API int (luaopen_bit32) (lua_State *L); - -#define LUA_MATHLIBNAME "math" -LUAMOD_API int (luaopen_math) (lua_State *L); - -#define LUA_DBLIBNAME "debug" -LUAMOD_API int (luaopen_debug) (lua_State *L); - -#define LUA_LOADLIBNAME "package" -LUAMOD_API int (luaopen_package) (lua_State *L); - - -/* open all previous libraries */ -LUALIB_API void (luaL_openlibs) (lua_State *L); - - - -#if !defined(lua_assert) -#define lua_assert(x) ((void)0) -#endif - - -#endif diff --git a/3rd/lua/src/lundump.c b/3rd/lua/src/lundump.c deleted file mode 100644 index 510f325..0000000 --- a/3rd/lua/src/lundump.c +++ /dev/null @@ -1,277 +0,0 @@ -/* -** $Id: lundump.c,v 2.41 2014/11/02 19:19:04 roberto Exp $ -** load precompiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#define lundump_c -#define LUA_CORE - -#include "lprefix.h" - - -#include - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstring.h" -#include "lundump.h" -#include "lzio.h" - - -#if !defined(luai_verifycode) -#define luai_verifycode(L,b,f) /* empty */ -#endif - - -typedef struct { - lua_State *L; - ZIO *Z; - Mbuffer *b; - const char *name; -} LoadState; - - -static l_noret error(LoadState *S, const char *why) { - luaO_pushfstring(S->L, "%s: %s precompiled chunk", S->name, why); - luaD_throw(S->L, LUA_ERRSYNTAX); -} - - -/* -** All high-level loads go through LoadVector; you can change it to -** adapt to the endianness of the input -*/ -#define LoadVector(S,b,n) LoadBlock(S,b,(n)*sizeof((b)[0])) - -static void LoadBlock (LoadState *S, void *b, size_t size) { - if (luaZ_read(S->Z, b, size) != 0) - error(S, "truncated"); -} - - -#define LoadVar(S,x) LoadVector(S,&x,1) - - -static lu_byte LoadByte (LoadState *S) { - lu_byte x; - LoadVar(S, x); - return x; -} - - -static int LoadInt (LoadState *S) { - int x; - LoadVar(S, x); - return x; -} - - -static lua_Number LoadNumber (LoadState *S) { - lua_Number x; - LoadVar(S, x); - return x; -} - - -static lua_Integer LoadInteger (LoadState *S) { - lua_Integer x; - LoadVar(S, x); - return x; -} - - -static TString *LoadString (LoadState *S) { - size_t size = LoadByte(S); - if (size == 0xFF) - LoadVar(S, size); - if (size == 0) - return NULL; - else { - char *s = luaZ_openspace(S->L, S->b, --size); - LoadVector(S, s, size); - return luaS_newlstr(S->L, s, size); - } -} - - -static void LoadCode (LoadState *S, Proto *f) { - int n = LoadInt(S); - f->code = luaM_newvector(S->L, n, Instruction); - f->sizecode = n; - LoadVector(S, f->code, n); -} - - -static void LoadFunction(LoadState *S, Proto *f, TString *psource); - - -static void LoadConstants (LoadState *S, Proto *f) { - int i; - int n = LoadInt(S); - f->k = luaM_newvector(S->L, n, TValue); - f->sizek = n; - for (i = 0; i < n; i++) - setnilvalue(&f->k[i]); - for (i = 0; i < n; i++) { - TValue *o = &f->k[i]; - int t = LoadByte(S); - switch (t) { - case LUA_TNIL: - setnilvalue(o); - break; - case LUA_TBOOLEAN: - setbvalue(o, LoadByte(S)); - break; - case LUA_TNUMFLT: - setfltvalue(o, LoadNumber(S)); - break; - case LUA_TNUMINT: - setivalue(o, LoadInteger(S)); - break; - case LUA_TSHRSTR: - case LUA_TLNGSTR: - setsvalue2n(S->L, o, LoadString(S)); - break; - default: - lua_assert(0); - } - } -} - - -static void LoadProtos (LoadState *S, Proto *f) { - int i; - int n = LoadInt(S); - f->p = luaM_newvector(S->L, n, Proto *); - f->sizep = n; - for (i = 0; i < n; i++) - f->p[i] = NULL; - for (i = 0; i < n; i++) { - f->p[i] = luaF_newproto(S->L); - LoadFunction(S, f->p[i], f->source); - } -} - - -static void LoadUpvalues (LoadState *S, Proto *f) { - int i, n; - n = LoadInt(S); - f->upvalues = luaM_newvector(S->L, n, Upvaldesc); - f->sizeupvalues = n; - for (i = 0; i < n; i++) - f->upvalues[i].name = NULL; - for (i = 0; i < n; i++) { - f->upvalues[i].instack = LoadByte(S); - f->upvalues[i].idx = LoadByte(S); - } -} - - -static void LoadDebug (LoadState *S, Proto *f) { - int i, n; - n = LoadInt(S); - f->lineinfo = luaM_newvector(S->L, n, int); - f->sizelineinfo = n; - LoadVector(S, f->lineinfo, n); - n = LoadInt(S); - f->locvars = luaM_newvector(S->L, n, LocVar); - f->sizelocvars = n; - for (i = 0; i < n; i++) - f->locvars[i].varname = NULL; - for (i = 0; i < n; i++) { - f->locvars[i].varname = LoadString(S); - f->locvars[i].startpc = LoadInt(S); - f->locvars[i].endpc = LoadInt(S); - } - n = LoadInt(S); - for (i = 0; i < n; i++) - f->upvalues[i].name = LoadString(S); -} - - -static void LoadFunction (LoadState *S, Proto *f, TString *psource) { - f->source = LoadString(S); - if (f->source == NULL) /* no source in dump? */ - f->source = psource; /* reuse parent's source */ - f->linedefined = LoadInt(S); - f->lastlinedefined = LoadInt(S); - f->numparams = LoadByte(S); - f->is_vararg = LoadByte(S); - f->maxstacksize = LoadByte(S); - LoadCode(S, f); - LoadConstants(S, f); - LoadUpvalues(S, f); - LoadProtos(S, f); - LoadDebug(S, f); -} - - -static void checkliteral (LoadState *S, const char *s, const char *msg) { - char buff[sizeof(LUA_SIGNATURE) + sizeof(LUAC_DATA)]; /* larger than both */ - size_t len = strlen(s); - LoadVector(S, buff, len); - if (memcmp(s, buff, len) != 0) - error(S, msg); -} - - -static void fchecksize (LoadState *S, size_t size, const char *tname) { - if (LoadByte(S) != size) - error(S, luaO_pushfstring(S->L, "%s size mismatch in", tname)); -} - - -#define checksize(S,t) fchecksize(S,sizeof(t),#t) - -static void checkHeader (LoadState *S) { - checkliteral(S, LUA_SIGNATURE + 1, "not a"); /* 1st char already checked */ - if (LoadByte(S) != LUAC_VERSION) - error(S, "version mismatch in"); - if (LoadByte(S) != LUAC_FORMAT) - error(S, "format mismatch in"); - checkliteral(S, LUAC_DATA, "corrupted"); - checksize(S, int); - checksize(S, size_t); - checksize(S, Instruction); - checksize(S, lua_Integer); - checksize(S, lua_Number); - if (LoadInteger(S) != LUAC_INT) - error(S, "endianness mismatch in"); - if (LoadNumber(S) != LUAC_NUM) - error(S, "float format mismatch in"); -} - - -/* -** load precompiled chunk -*/ -LClosure *luaU_undump(lua_State *L, ZIO *Z, Mbuffer *buff, - const char *name) { - LoadState S; - LClosure *cl; - if (*name == '@' || *name == '=') - S.name = name + 1; - else if (*name == LUA_SIGNATURE[0]) - S.name = "binary string"; - else - S.name = name; - S.L = L; - S.Z = Z; - S.b = buff; - checkHeader(&S); - cl = luaF_newLclosure(L, LoadByte(&S)); - setclLvalue(L, L->top, cl); - incr_top(L); - cl->p = luaF_newproto(L); - LoadFunction(&S, cl->p, NULL); - lua_assert(cl->nupvalues == cl->p->sizeupvalues); - luai_verifycode(L, buff, cl->p); - return cl; -} - diff --git a/3rd/lua/src/lundump.h b/3rd/lua/src/lundump.h deleted file mode 100644 index ef43d51..0000000 --- a/3rd/lua/src/lundump.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -** $Id: lundump.h,v 1.44 2014/06/19 18:27:20 roberto Exp $ -** load precompiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#ifndef lundump_h -#define lundump_h - -#include "llimits.h" -#include "lobject.h" -#include "lzio.h" - - -/* data to catch conversion errors */ -#define LUAC_DATA "\x19\x93\r\n\x1a\n" - -#define LUAC_INT 0x5678 -#define LUAC_NUM cast_num(370.5) - -#define MYINT(s) (s[0]-'0') -#define LUAC_VERSION (MYINT(LUA_VERSION_MAJOR)*16+MYINT(LUA_VERSION_MINOR)) -#define LUAC_FORMAT 0 /* this is the official format */ - -/* load one chunk; from lundump.c */ -LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, - const char* name); - -/* dump one chunk; from ldump.c */ -LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, - void* data, int strip); - -#endif diff --git a/3rd/lua/src/lutf8lib.c b/3rd/lua/src/lutf8lib.c deleted file mode 100644 index be4f087..0000000 --- a/3rd/lua/src/lutf8lib.c +++ /dev/null @@ -1,255 +0,0 @@ -/* -** $Id: lutf8lib.c,v 1.13 2014/11/02 19:19:04 roberto Exp $ -** Standard library for UTF-8 manipulation -** See Copyright Notice in lua.h -*/ - -#define lutf8lib_c -#define LUA_LIB - -#include "lprefix.h" - - -#include -#include -#include - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - -#define MAXUNICODE 0x10FFFF - -#define iscont(p) ((*(p) & 0xC0) == 0x80) - - -/* from strlib */ -/* translate a relative string position: negative means back from end */ -static lua_Integer u_posrelat (lua_Integer pos, size_t len) { - if (pos >= 0) return pos; - else if (0u - (size_t)pos > len) return 0; - else return (lua_Integer)len + pos + 1; -} - - -/* -** Decode one UTF-8 sequence, returning NULL if byte sequence is invalid. -*/ -static const char *utf8_decode (const char *o, int *val) { - static unsigned int limits[] = {0xFF, 0x7F, 0x7FF, 0xFFFF}; - const unsigned char *s = (const unsigned char *)o; - unsigned int c = s[0]; - unsigned int res = 0; /* final result */ - if (c < 0x80) /* ascii? */ - res = c; - else { - int count = 0; /* to count number of continuation bytes */ - while (c & 0x40) { /* still have continuation bytes? */ - int cc = s[++count]; /* read next byte */ - if ((cc & 0xC0) != 0x80) /* not a continuation byte? */ - return NULL; /* invalid byte sequence */ - res = (res << 6) | (cc & 0x3F); /* add lower 6 bits from cont. byte */ - c <<= 1; /* to test next bit */ - } - res |= ((c & 0x7F) << (count * 5)); /* add first byte */ - if (count > 3 || res > MAXUNICODE || res <= limits[count]) - return NULL; /* invalid byte sequence */ - s += count; /* skip continuation bytes read */ - } - if (val) *val = res; - return (const char *)s + 1; /* +1 to include first byte */ -} - - -/* -** utf8len(s [, i [, j]]) --> number of characters that start in the -** range [i,j], or nil + current position if 's' is not well formed in -** that interval -*/ -static int utflen (lua_State *L) { - int n = 0; - size_t len; - const char *s = luaL_checklstring(L, 1, &len); - lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len); - lua_Integer posj = u_posrelat(luaL_optinteger(L, 3, -1), len); - luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 2, - "initial position out of string"); - luaL_argcheck(L, --posj < (lua_Integer)len, 3, - "final position out of string"); - while (posi <= posj) { - const char *s1 = utf8_decode(s + posi, NULL); - if (s1 == NULL) { /* conversion error? */ - lua_pushnil(L); /* return nil ... */ - lua_pushinteger(L, posi + 1); /* ... and current position */ - return 2; - } - posi = s1 - s; - n++; - } - lua_pushinteger(L, n); - return 1; -} - - -/* -** codepoint(s, [i, [j]]) -> returns codepoints for all characters -** that start in the range [i,j] -*/ -static int codepoint (lua_State *L) { - size_t len; - const char *s = luaL_checklstring(L, 1, &len); - lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len); - lua_Integer pose = u_posrelat(luaL_optinteger(L, 3, posi), len); - int n; - const char *se; - luaL_argcheck(L, posi >= 1, 2, "out of range"); - luaL_argcheck(L, pose <= (lua_Integer)len, 3, "out of range"); - if (posi > pose) return 0; /* empty interval; return no values */ - n = (int)(pose - posi + 1); - if (posi + n <= pose) /* (lua_Integer -> int) overflow? */ - return luaL_error(L, "string slice too long"); - luaL_checkstack(L, n, "string slice too long"); - n = 0; - se = s + pose; - for (s += posi - 1; s < se;) { - int code; - s = utf8_decode(s, &code); - if (s == NULL) - return luaL_error(L, "invalid UTF-8 code"); - lua_pushinteger(L, code); - n++; - } - return n; -} - - -static void pushutfchar (lua_State *L, int arg) { - lua_Integer code = luaL_checkinteger(L, arg); - luaL_argcheck(L, 0 <= code && code <= MAXUNICODE, arg, "value out of range"); - lua_pushfstring(L, "%U", (long)code); -} - - -/* -** utfchar(n1, n2, ...) -> char(n1)..char(n2)... -*/ -static int utfchar (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - if (n == 1) /* optimize common case of single char */ - pushutfchar(L, 1); - else { - int i; - luaL_Buffer b; - luaL_buffinit(L, &b); - for (i = 1; i <= n; i++) { - pushutfchar(L, i); - luaL_addvalue(&b); - } - luaL_pushresult(&b); - } - return 1; -} - - -/* -** offset(s, n, [i]) -> index where n-th character counting from -** position 'i' starts; 0 means character at 'i'. -*/ -static int byteoffset (lua_State *L) { - size_t len; - const char *s = luaL_checklstring(L, 1, &len); - lua_Integer n = luaL_checkinteger(L, 2); - lua_Integer posi = (n >= 0) ? 1 : len + 1; - posi = u_posrelat(luaL_optinteger(L, 3, posi), len); - luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 3, - "position out of range"); - if (n == 0) { - /* find beginning of current byte sequence */ - while (posi > 0 && iscont(s + posi)) posi--; - } - else { - if (iscont(s + posi)) - luaL_error(L, "initial position is a continuation byte"); - if (n < 0) { - while (n < 0 && posi > 0) { /* move back */ - do { /* find beginning of previous character */ - posi--; - } while (posi > 0 && iscont(s + posi)); - n++; - } - } - else { - n--; /* do not move for 1st character */ - while (n > 0 && posi < (lua_Integer)len) { - do { /* find beginning of next character */ - posi++; - } while (iscont(s + posi)); /* (cannot pass final '\0') */ - n--; - } - } - } - if (n == 0) /* did it find given character? */ - lua_pushinteger(L, posi + 1); - else /* no such character */ - lua_pushnil(L); - return 1; -} - - -static int iter_aux (lua_State *L) { - size_t len; - const char *s = luaL_checklstring(L, 1, &len); - lua_Integer n = lua_tointeger(L, 2) - 1; - if (n < 0) /* first iteration? */ - n = 0; /* start from here */ - else if (n < (lua_Integer)len) { - n++; /* skip current byte */ - while (iscont(s + n)) n++; /* and its continuations */ - } - if (n >= (lua_Integer)len) - return 0; /* no more codepoints */ - else { - int code; - const char *next = utf8_decode(s + n, &code); - if (next == NULL || iscont(next)) - return luaL_error(L, "invalid UTF-8 code"); - lua_pushinteger(L, n + 1); - lua_pushinteger(L, code); - return 2; - } -} - - -static int iter_codes (lua_State *L) { - luaL_checkstring(L, 1); - lua_pushcfunction(L, iter_aux); - lua_pushvalue(L, 1); - lua_pushinteger(L, 0); - return 3; -} - - -/* pattern to match a single UTF-8 character */ -#define UTF8PATT "[\0-\x7F\xC2-\xF4][\x80-\xBF]*" - - -static struct luaL_Reg funcs[] = { - {"offset", byteoffset}, - {"codepoint", codepoint}, - {"char", utfchar}, - {"len", utflen}, - {"codes", iter_codes}, - /* placeholders */ - {"charpattern", NULL}, - {NULL, NULL} -}; - - -LUAMOD_API int luaopen_utf8 (lua_State *L) { - luaL_newlib(L, funcs); - lua_pushliteral(L, UTF8PATT); - lua_setfield(L, -2, "charpattern"); - return 1; -} - diff --git a/3rd/lua/src/lvm.c b/3rd/lua/src/lvm.c deleted file mode 100644 index 2ac1b02..0000000 --- a/3rd/lua/src/lvm.c +++ /dev/null @@ -1,1182 +0,0 @@ -/* -** $Id: lvm.c,v 2.232 2014/12/27 20:30:38 roberto Exp $ -** Lua virtual machine -** See Copyright Notice in lua.h -*/ - -#define lvm_c -#define LUA_CORE - -#include "lprefix.h" - - -#include -#include -#include -#include - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lvm.h" - - -/* -** You can define LUA_FLOORN2I if you want to convert floats to integers -** by flooring them (instead of raising an error if they are not -** integral values) -*/ -#if !defined(LUA_FLOORN2I) -#define LUA_FLOORN2I 0 -#endif - - -/* limit for table tag-method chains (to avoid loops) */ -#define MAXTAGLOOP 2000 - - -/* -** Similar to 'tonumber', but does not attempt to convert strings and -** ensure correct precision (no extra bits). Used in comparisons. -*/ -static int tofloat (const TValue *obj, lua_Number *n) { - if (ttisfloat(obj)) *n = fltvalue(obj); - else if (ttisinteger(obj)) { - volatile lua_Number x = cast_num(ivalue(obj)); /* avoid extra precision */ - *n = x; - } - else { - *n = 0; /* to avoid warnings */ - return 0; - } - return 1; -} - - -/* -** Try to convert a value to a float. The float case is already handled -** by the macro 'tonumber'. -*/ -int luaV_tonumber_ (const TValue *obj, lua_Number *n) { - TValue v; - if (ttisinteger(obj)) { - *n = cast_num(ivalue(obj)); - return 1; - } - else if (cvt2num(obj) && /* string convertible to number? */ - luaO_str2num(svalue(obj), &v) == tsvalue(obj)->len + 1) { - *n = nvalue(&v); /* convert result of 'luaO_str2num' to a float */ - return 1; - } - else - return 0; /* conversion failed */ -} - - -/* -** try to convert a value to an integer, rounding according to 'mode': -** mode == 0: accepts only integral values -** mode == 1: takes the floor of the number -** mode == 2: takes the ceil of the number -*/ -static int tointeger_aux (const TValue *obj, lua_Integer *p, int mode) { - TValue v; - again: - if (ttisfloat(obj)) { - lua_Number n = fltvalue(obj); - lua_Number f = l_floor(n); - if (n != f) { /* not an integral value? */ - if (mode == 0) return 0; /* fails if mode demands integral value */ - else if (mode > 1) /* needs ceil? */ - f += 1; /* convert floor to ceil (remember: n != f) */ - } - return lua_numbertointeger(f, p); - } - else if (ttisinteger(obj)) { - *p = ivalue(obj); - return 1; - } - else if (cvt2num(obj) && - luaO_str2num(svalue(obj), &v) == tsvalue(obj)->len + 1) { - obj = &v; - goto again; /* convert result from 'luaO_str2num' to an integer */ - } - return 0; /* conversion failed */ -} - - -/* -** try to convert a value to an integer -*/ -int luaV_tointeger_ (const TValue *obj, lua_Integer *p) { - return tointeger_aux(obj, p, LUA_FLOORN2I); -} - - -/* -** Try to convert a 'for' limit to an integer, preserving the -** semantics of the loop. -** (The following explanation assumes a non-negative step; it is valid -** for negative steps mutatis mutandis.) -** If the limit can be converted to an integer, rounding down, that is -** it. -** Otherwise, check whether the limit can be converted to a number. If -** the number is too large, it is OK to set the limit as LUA_MAXINTEGER, -** which means no limit. If the number is too negative, the loop -** should not run, because any initial integer value is larger than the -** limit. So, it sets the limit to LUA_MININTEGER. 'stopnow' corrects -** the extreme case when the initial value is LUA_MININTEGER, in which -** case the LUA_MININTEGER limit would still run the loop once. -*/ -static int forlimit (const TValue *obj, lua_Integer *p, lua_Integer step, - int *stopnow) { - *stopnow = 0; /* usually, let loops run */ - if (!tointeger_aux(obj, p, (step < 0 ? 2 : 1))) { /* not fit in integer? */ - lua_Number n; /* try to convert to float */ - if (!tonumber(obj, &n)) /* cannot convert to float? */ - return 0; /* not a number */ - if (n > 0) { /* if true, float is larger than max integer */ - *p = LUA_MAXINTEGER; - if (step < 0) *stopnow = 1; - } - else { /* float is smaller than min integer */ - *p = LUA_MININTEGER; - if (step >= 0) *stopnow = 1; - } - } - return 1; -} - - -/* -** Main function for table access (invoking metamethods if needed). -** Compute 'val = t[key]' -*/ -void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { - int loop; /* counter to avoid infinite loops */ - for (loop = 0; loop < MAXTAGLOOP; loop++) { - const TValue *tm; - if (ttistable(t)) { /* 't' is a table? */ - Table *h = hvalue(t); - const TValue *res = luaH_get(h, key); /* do a primitive get */ - if (!ttisnil(res) || /* result is not nil? */ - (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */ - setobj2s(L, val, res); /* result is the raw get */ - return; - } - /* else will try metamethod */ - } - else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))) - luaG_typeerror(L, t, "index"); /* no metamethod */ - if (ttisfunction(tm)) { /* metamethod is a function */ - luaT_callTM(L, tm, t, key, val, 1); - return; - } - t = tm; /* else repeat access over 'tm' */ - } - luaG_runerror(L, "gettable chain too long; possible loop"); -} - - -/* -** Main function for table assignment (invoking metamethods if needed). -** Compute 't[key] = val' -*/ -void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) { - int loop; /* counter to avoid infinite loops */ - for (loop = 0; loop < MAXTAGLOOP; loop++) { - const TValue *tm; - if (ttistable(t)) { /* 't' is a table? */ - Table *h = hvalue(t); - TValue *oldval = cast(TValue *, luaH_get(h, key)); - /* if previous value is not nil, there must be a previous entry - in the table; a metamethod has no relevance */ - if (!ttisnil(oldval) || - /* previous value is nil; must check the metamethod */ - ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL && - /* no metamethod; is there a previous entry in the table? */ - (oldval != luaO_nilobject || - /* no previous entry; must create one. (The next test is - always true; we only need the assignment.) */ - (oldval = luaH_newkey(L, h, key), 1)))) { - /* no metamethod and (now) there is an entry with given key */ - setobj2t(L, oldval, val); /* assign new value to that entry */ - invalidateTMcache(h); - luaC_barrierback(L, h, val); - return; - } - /* else will try the metamethod */ - } - else /* not a table; check metamethod */ - if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))) - luaG_typeerror(L, t, "index"); - /* try the metamethod */ - if (ttisfunction(tm)) { - luaT_callTM(L, tm, t, key, val, 0); - return; - } - t = tm; /* else repeat assignment over 'tm' */ - } - luaG_runerror(L, "settable chain too long; possible loop"); -} - - -/* -** Compare two strings 'ls' x 'rs', returning an integer smaller-equal- -** -larger than zero if 'ls' is smaller-equal-larger than 'rs'. -** The code is a little tricky because it allows '\0' in the strings -** and it uses 'strcoll' (to respect locales) for each segments -** of the strings. -*/ -static int l_strcmp (const TString *ls, const TString *rs) { - const char *l = getstr(ls); - size_t ll = ls->len; - const char *r = getstr(rs); - size_t lr = rs->len; - for (;;) { /* for each segment */ - int temp = strcoll(l, r); - if (temp != 0) /* not equal? */ - return temp; /* done */ - else { /* strings are equal up to a '\0' */ - size_t len = strlen(l); /* index of first '\0' in both strings */ - if (len == lr) /* 'rs' is finished? */ - return (len == ll) ? 0 : 1; /* check 'ls' */ - else if (len == ll) /* 'ls' is finished? */ - return -1; /* 'ls' is smaller than 'rs' ('rs' is not finished) */ - /* both strings longer than 'len'; go on comparing after the '\0' */ - len++; - l += len; ll -= len; r += len; lr -= len; - } - } -} - - -/* -** Main operation less than; return 'l < r'. -*/ -int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { - int res; - lua_Number nl, nr; - if (ttisinteger(l) && ttisinteger(r)) /* both operands are integers? */ - return (ivalue(l) < ivalue(r)); - else if (tofloat(l, &nl) && tofloat(r, &nr)) /* both are numbers? */ - return luai_numlt(nl, nr); - else if (ttisstring(l) && ttisstring(r)) /* both are strings? */ - return l_strcmp(tsvalue(l), tsvalue(r)) < 0; - else if ((res = luaT_callorderTM(L, l, r, TM_LT)) < 0) /* no metamethod? */ - luaG_ordererror(L, l, r); /* error */ - return res; -} - - -/* -** Main operation less than or equal to; return 'l <= r'. -*/ -int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) { - int res; - lua_Number nl, nr; - if (ttisinteger(l) && ttisinteger(r)) /* both operands are integers? */ - return (ivalue(l) <= ivalue(r)); - else if (tofloat(l, &nl) && tofloat(r, &nr)) /* both are numbers? */ - return luai_numle(nl, nr); - else if (ttisstring(l) && ttisstring(r)) /* both are strings? */ - return l_strcmp(tsvalue(l), tsvalue(r)) <= 0; - else if ((res = luaT_callorderTM(L, l, r, TM_LE)) >= 0) /* first try 'le' */ - return res; - else if ((res = luaT_callorderTM(L, r, l, TM_LT)) < 0) /* else try 'lt' */ - luaG_ordererror(L, l, r); - return !res; -} - - -/* -** Main operation for equality of Lua values; return 't1 == t2'. -** L == NULL means raw equality (no metamethods) -*/ -int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) { - const TValue *tm; - if (ttype(t1) != ttype(t2)) { /* not the same variant? */ - if (ttnov(t1) != ttnov(t2) || ttnov(t1) != LUA_TNUMBER) - return 0; /* only numbers can be equal with different variants */ - else { /* two numbers with different variants */ - lua_Number n1, n2; /* compare them as floats */ - lua_assert(ttisnumber(t1) && ttisnumber(t2)); - cast_void(tofloat(t1, &n1)); cast_void(tofloat(t2, &n2)); - return luai_numeq(n1, n2); - } - } - /* values have same type and same variant */ - switch (ttype(t1)) { - case LUA_TNIL: return 1; - case LUA_TNUMINT: return (ivalue(t1) == ivalue(t2)); - case LUA_TNUMFLT: return luai_numeq(fltvalue(t1), fltvalue(t2)); - case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */ - case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); - case LUA_TLCF: return fvalue(t1) == fvalue(t2); - case LUA_TSHRSTR: return eqshrstr(tsvalue(t1), tsvalue(t2)); - case LUA_TLNGSTR: return luaS_eqlngstr(tsvalue(t1), tsvalue(t2)); - case LUA_TUSERDATA: { - if (uvalue(t1) == uvalue(t2)) return 1; - else if (L == NULL) return 0; - tm = fasttm(L, uvalue(t1)->metatable, TM_EQ); - if (tm == NULL) - tm = fasttm(L, uvalue(t2)->metatable, TM_EQ); - break; /* will try TM */ - } - case LUA_TTABLE: { - if (hvalue(t1) == hvalue(t2)) return 1; - else if (L == NULL) return 0; - tm = fasttm(L, hvalue(t1)->metatable, TM_EQ); - if (tm == NULL) - tm = fasttm(L, hvalue(t2)->metatable, TM_EQ); - break; /* will try TM */ - } - default: - return gcvalue(t1) == gcvalue(t2); - } - if (tm == NULL) /* no TM? */ - return 0; /* objects are different */ - luaT_callTM(L, tm, t1, t2, L->top, 1); /* call TM */ - return !l_isfalse(L->top); -} - - -/* macro used by 'luaV_concat' to ensure that element at 'o' is a string */ -#define tostring(L,o) \ - (ttisstring(o) || (cvt2str(o) && (luaO_tostring(L, o), 1))) - -/* -** Main operation for concatenation: concat 'total' values in the stack, -** from 'L->top - total' up to 'L->top - 1'. -*/ -void luaV_concat (lua_State *L, int total) { - lua_assert(total >= 2); - do { - StkId top = L->top; - int n = 2; /* number of elements handled in this pass (at least 2) */ - if (!(ttisstring(top-2) || cvt2str(top-2)) || !tostring(L, top-1)) - luaT_trybinTM(L, top-2, top-1, top-2, TM_CONCAT); - else if (tsvalue(top-1)->len == 0) /* second operand is empty? */ - cast_void(tostring(L, top - 2)); /* result is first operand */ - else if (ttisstring(top-2) && tsvalue(top-2)->len == 0) { - setobjs2s(L, top - 2, top - 1); /* result is second op. */ - } - else { - /* at least two non-empty string values; get as many as possible */ - size_t tl = tsvalue(top-1)->len; - char *buffer; - int i; - /* collect total length */ - for (i = 1; i < total && tostring(L, top-i-1); i++) { - size_t l = tsvalue(top-i-1)->len; - if (l >= (MAX_SIZE/sizeof(char)) - tl) - luaG_runerror(L, "string length overflow"); - tl += l; - } - buffer = luaZ_openspace(L, &G(L)->buff, tl); - tl = 0; - n = i; - do { /* copy all strings to buffer */ - size_t l = tsvalue(top-i)->len; - memcpy(buffer+tl, svalue(top-i), l * sizeof(char)); - tl += l; - } while (--i > 0); - setsvalue2s(L, top-n, luaS_newlstr(L, buffer, tl)); /* create result */ - } - total -= n-1; /* got 'n' strings to create 1 new */ - L->top -= n-1; /* popped 'n' strings and pushed one */ - } while (total > 1); /* repeat until only 1 result left */ -} - - -/* -** Main operation 'ra' = #rb'. -*/ -void luaV_objlen (lua_State *L, StkId ra, const TValue *rb) { - const TValue *tm; - switch (ttnov(rb)) { - case LUA_TTABLE: { - Table *h = hvalue(rb); - tm = fasttm(L, h->metatable, TM_LEN); - if (tm) break; /* metamethod? break switch to call it */ - setivalue(ra, luaH_getn(h)); /* else primitive len */ - return; - } - case LUA_TSTRING: { - setivalue(ra, tsvalue(rb)->len); - return; - } - default: { /* try metamethod */ - tm = luaT_gettmbyobj(L, rb, TM_LEN); - if (ttisnil(tm)) /* no metamethod? */ - luaG_typeerror(L, rb, "get length of"); - break; - } - } - luaT_callTM(L, tm, rb, rb, ra, 1); -} - - -/* -** Integer division; return 'm // n', that is, floor(m/n). -** C division truncates its result (rounds towards zero). -** 'floor(q) == trunc(q)' when 'q >= 0' or when 'q' is integer, -** otherwise 'floor(q) == trunc(q) - 1'. -*/ -lua_Integer luaV_div (lua_State *L, lua_Integer m, lua_Integer n) { - if (l_castS2U(n) + 1u <= 1u) { /* special cases: -1 or 0 */ - if (n == 0) - luaG_runerror(L, "attempt to divide by zero"); - return intop(-, 0, m); /* n==-1; avoid overflow with 0x80000...//-1 */ - } - else { - lua_Integer q = m / n; /* perform C division */ - if ((m ^ n) < 0 && m % n != 0) /* 'm/n' would be negative non-integer? */ - q -= 1; /* correct result for different rounding */ - return q; - } -} - - -/* -** Integer modulus; return 'm % n'. (Assume that C '%' with -** negative operands follows C99 behavior. See previous comment -** about luaV_div.) -*/ -lua_Integer luaV_mod (lua_State *L, lua_Integer m, lua_Integer n) { - if (l_castS2U(n) + 1u <= 1u) { /* special cases: -1 or 0 */ - if (n == 0) - luaG_runerror(L, "attempt to perform 'n%%0'"); - return 0; /* m % -1 == 0; avoid overflow with 0x80000...%-1 */ - } - else { - lua_Integer r = m % n; - if (r != 0 && (m ^ n) < 0) /* 'm/n' would be non-integer negative? */ - r += n; /* correct result for different rounding */ - return r; - } -} - - -/* number of bits in an integer */ -#define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT) - -/* -** Shift left operation. (Shift right just negates 'y'.) -*/ -lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) { - if (y < 0) { /* shift right? */ - if (y <= -NBITS) return 0; - else return intop(>>, x, -y); - } - else { /* shift left */ - if (y >= NBITS) return 0; - else return intop(<<, x, y); - } -} - - -/* -** check whether cached closure in prototype 'p' may be reused, that is, -** whether there is a cached closure with the same upvalues needed by -** new closure to be created. -*/ -static LClosure *getcached (Proto *p, UpVal **encup, StkId base) { - LClosure *c = p->cache; - if (c != NULL) { /* is there a cached closure? */ - int nup = p->sizeupvalues; - Upvaldesc *uv = p->upvalues; - int i; - for (i = 0; i < nup; i++) { /* check whether it has right upvalues */ - TValue *v = uv[i].instack ? base + uv[i].idx : encup[uv[i].idx]->v; - if (c->upvals[i]->v != v) - return NULL; /* wrong upvalue; cannot reuse closure */ - } - } - return c; /* return cached closure (or NULL if no cached closure) */ -} - - -/* -** create a new Lua closure, push it in the stack, and initialize -** its upvalues. Note that the closure is not cached if prototype is -** already black (which means that 'cache' was already cleared by the -** GC). -*/ -static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base, - StkId ra) { - int nup = p->sizeupvalues; - Upvaldesc *uv = p->upvalues; - int i; - LClosure *ncl = luaF_newLclosure(L, nup); - ncl->p = p; - setclLvalue(L, ra, ncl); /* anchor new closure in stack */ - for (i = 0; i < nup; i++) { /* fill in its upvalues */ - if (uv[i].instack) /* upvalue refers to local variable? */ - ncl->upvals[i] = luaF_findupval(L, base + uv[i].idx); - else /* get upvalue from enclosing function */ - ncl->upvals[i] = encup[uv[i].idx]; - ncl->upvals[i]->refcount++; - /* new closure is white, so we do not need a barrier here */ - } - if (!isblack(p)) /* cache will not break GC invariant? */ - p->cache = ncl; /* save it on cache for reuse */ -} - - -/* -** finish execution of an opcode interrupted by an yield -*/ -void luaV_finishOp (lua_State *L) { - CallInfo *ci = L->ci; - StkId base = ci->u.l.base; - Instruction inst = *(ci->u.l.savedpc - 1); /* interrupted instruction */ - OpCode op = GET_OPCODE(inst); - switch (op) { /* finish its execution */ - case OP_ADD: case OP_SUB: case OP_MUL: case OP_DIV: case OP_IDIV: - case OP_BAND: case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR: - case OP_MOD: case OP_POW: - case OP_UNM: case OP_BNOT: case OP_LEN: - case OP_GETTABUP: case OP_GETTABLE: case OP_SELF: { - setobjs2s(L, base + GETARG_A(inst), --L->top); - break; - } - case OP_LE: case OP_LT: case OP_EQ: { - int res = !l_isfalse(L->top - 1); - L->top--; - /* metamethod should not be called when operand is K */ - lua_assert(!ISK(GETARG_B(inst))); - if (op == OP_LE && /* "<=" using "<" instead? */ - ttisnil(luaT_gettmbyobj(L, base + GETARG_B(inst), TM_LE))) - res = !res; /* invert result */ - lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_JMP); - if (res != GETARG_A(inst)) /* condition failed? */ - ci->u.l.savedpc++; /* skip jump instruction */ - break; - } - case OP_CONCAT: { - StkId top = L->top - 1; /* top when 'luaT_trybinTM' was called */ - int b = GETARG_B(inst); /* first element to concatenate */ - int total = cast_int(top - 1 - (base + b)); /* yet to concatenate */ - setobj2s(L, top - 2, top); /* put TM result in proper position */ - if (total > 1) { /* are there elements to concat? */ - L->top = top - 1; /* top is one after last element (at top-2) */ - luaV_concat(L, total); /* concat them (may yield again) */ - } - /* move final result to final position */ - setobj2s(L, ci->u.l.base + GETARG_A(inst), L->top - 1); - L->top = ci->top; /* restore top */ - break; - } - case OP_TFORCALL: { - lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_TFORLOOP); - L->top = ci->top; /* correct top */ - break; - } - case OP_CALL: { - if (GETARG_C(inst) - 1 >= 0) /* nresults >= 0? */ - L->top = ci->top; /* adjust results */ - break; - } - case OP_TAILCALL: case OP_SETTABUP: case OP_SETTABLE: - break; - default: lua_assert(0); - } -} - - - - -/* -** {================================================================== -** Function 'luaV_execute': main interpreter loop -** =================================================================== -*/ - - -/* -** some macros for common tasks in 'luaV_execute' -*/ - -#if !defined luai_runtimecheck -#define luai_runtimecheck(L, c) /* void */ -#endif - - -#define RA(i) (base+GETARG_A(i)) -/* to be used after possible stack reallocation */ -#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i)) -#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) -#define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ - ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i)) -#define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ - ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i)) -#define KBx(i) \ - (k + (GETARG_Bx(i) != 0 ? GETARG_Bx(i) - 1 : GETARG_Ax(*ci->u.l.savedpc++))) - - -/* execute a jump instruction */ -#define dojump(ci,i,e) \ - { int a = GETARG_A(i); \ - if (a > 0) luaF_close(L, ci->u.l.base + a - 1); \ - ci->u.l.savedpc += GETARG_sBx(i) + e; } - -/* for test instructions, execute the jump instruction that follows it */ -#define donextjump(ci) { i = *ci->u.l.savedpc; dojump(ci, i, 1); } - - -#define Protect(x) { {x;}; base = ci->u.l.base; } - -#define checkGC(L,c) \ - Protect( luaC_condGC(L,{L->top = (c); /* limit of live values */ \ - luaC_step(L); \ - L->top = ci->top;}) /* restore top */ \ - luai_threadyield(L); ) - - -#define vmdispatch(o) switch(o) -#define vmcase(l) case l: -#define vmbreak break - -void luaV_execute (lua_State *L) { - CallInfo *ci = L->ci; - LClosure *cl; - TValue *k; - StkId base; - newframe: /* reentry point when frame changes (call/return) */ - lua_assert(ci == L->ci); - cl = clLvalue(ci->func); - k = cl->p->k; - base = ci->u.l.base; - /* main loop of interpreter */ - for (;;) { - Instruction i = *(ci->u.l.savedpc++); - StkId ra; - if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) && - (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { - Protect(luaG_traceexec(L)); - } - /* WARNING: several calls may realloc the stack and invalidate 'ra' */ - ra = RA(i); - lua_assert(base == ci->u.l.base); - lua_assert(base <= L->top && L->top < L->stack + L->stacksize); - vmdispatch (GET_OPCODE(i)) { - vmcase(OP_MOVE) { - setobjs2s(L, ra, RB(i)); - vmbreak; - } - vmcase(OP_LOADK) { - TValue *rb = k + GETARG_Bx(i); - setobj2s(L, ra, rb); - vmbreak; - } - vmcase(OP_LOADKX) { - TValue *rb; - lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG); - rb = k + GETARG_Ax(*ci->u.l.savedpc++); - setobj2s(L, ra, rb); - vmbreak; - } - vmcase(OP_LOADBOOL) { - setbvalue(ra, GETARG_B(i)); - if (GETARG_C(i)) ci->u.l.savedpc++; /* skip next instruction (if C) */ - vmbreak; - } - vmcase(OP_LOADNIL) { - int b = GETARG_B(i); - do { - setnilvalue(ra++); - } while (b--); - vmbreak; - } - vmcase(OP_GETUPVAL) { - int b = GETARG_B(i); - setobj2s(L, ra, cl->upvals[b]->v); - vmbreak; - } - vmcase(OP_GETTABUP) { - int b = GETARG_B(i); - Protect(luaV_gettable(L, cl->upvals[b]->v, RKC(i), ra)); - vmbreak; - } - vmcase(OP_GETTABLE) { - Protect(luaV_gettable(L, RB(i), RKC(i), ra)); - vmbreak; - } - vmcase(OP_SETTABUP) { - int a = GETARG_A(i); - Protect(luaV_settable(L, cl->upvals[a]->v, RKB(i), RKC(i))); - vmbreak; - } - vmcase(OP_SETUPVAL) { - UpVal *uv = cl->upvals[GETARG_B(i)]; - setobj(L, uv->v, ra); - luaC_upvalbarrier(L, uv); - vmbreak; - } - vmcase(OP_SETTABLE) { - Protect(luaV_settable(L, ra, RKB(i), RKC(i))); - vmbreak; - } - vmcase(OP_NEWTABLE) { - int b = GETARG_B(i); - int c = GETARG_C(i); - Table *t = luaH_new(L); - sethvalue(L, ra, t); - if (b != 0 || c != 0) - luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c)); - checkGC(L, ra + 1); - vmbreak; - } - vmcase(OP_SELF) { - StkId rb = RB(i); - setobjs2s(L, ra+1, rb); - Protect(luaV_gettable(L, rb, RKC(i), ra)); - vmbreak; - } - vmcase(OP_ADD) { - TValue *rb = RKB(i); - TValue *rc = RKC(i); - lua_Number nb; lua_Number nc; - if (ttisinteger(rb) && ttisinteger(rc)) { - lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); - setivalue(ra, intop(+, ib, ic)); - } - else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { - setfltvalue(ra, luai_numadd(L, nb, nc)); - } - else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); } - vmbreak; - } - vmcase(OP_SUB) { - TValue *rb = RKB(i); - TValue *rc = RKC(i); - lua_Number nb; lua_Number nc; - if (ttisinteger(rb) && ttisinteger(rc)) { - lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); - setivalue(ra, intop(-, ib, ic)); - } - else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { - setfltvalue(ra, luai_numsub(L, nb, nc)); - } - else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SUB)); } - vmbreak; - } - vmcase(OP_MUL) { - TValue *rb = RKB(i); - TValue *rc = RKC(i); - lua_Number nb; lua_Number nc; - if (ttisinteger(rb) && ttisinteger(rc)) { - lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); - setivalue(ra, intop(*, ib, ic)); - } - else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { - setfltvalue(ra, luai_nummul(L, nb, nc)); - } - else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MUL)); } - vmbreak; - } - vmcase(OP_DIV) { /* float division (always with floats) */ - TValue *rb = RKB(i); - TValue *rc = RKC(i); - lua_Number nb; lua_Number nc; - if (tonumber(rb, &nb) && tonumber(rc, &nc)) { - setfltvalue(ra, luai_numdiv(L, nb, nc)); - } - else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV)); } - vmbreak; - } - vmcase(OP_BAND) { - TValue *rb = RKB(i); - TValue *rc = RKC(i); - lua_Integer ib; lua_Integer ic; - if (tointeger(rb, &ib) && tointeger(rc, &ic)) { - setivalue(ra, intop(&, ib, ic)); - } - else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BAND)); } - vmbreak; - } - vmcase(OP_BOR) { - TValue *rb = RKB(i); - TValue *rc = RKC(i); - lua_Integer ib; lua_Integer ic; - if (tointeger(rb, &ib) && tointeger(rc, &ic)) { - setivalue(ra, intop(|, ib, ic)); - } - else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BOR)); } - vmbreak; - } - vmcase(OP_BXOR) { - TValue *rb = RKB(i); - TValue *rc = RKC(i); - lua_Integer ib; lua_Integer ic; - if (tointeger(rb, &ib) && tointeger(rc, &ic)) { - setivalue(ra, intop(^, ib, ic)); - } - else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BXOR)); } - vmbreak; - } - vmcase(OP_SHL) { - TValue *rb = RKB(i); - TValue *rc = RKC(i); - lua_Integer ib; lua_Integer ic; - if (tointeger(rb, &ib) && tointeger(rc, &ic)) { - setivalue(ra, luaV_shiftl(ib, ic)); - } - else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHL)); } - vmbreak; - } - vmcase(OP_SHR) { - TValue *rb = RKB(i); - TValue *rc = RKC(i); - lua_Integer ib; lua_Integer ic; - if (tointeger(rb, &ib) && tointeger(rc, &ic)) { - setivalue(ra, luaV_shiftl(ib, -ic)); - } - else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHR)); } - vmbreak; - } - vmcase(OP_MOD) { - TValue *rb = RKB(i); - TValue *rc = RKC(i); - lua_Number nb; lua_Number nc; - if (ttisinteger(rb) && ttisinteger(rc)) { - lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); - setivalue(ra, luaV_mod(L, ib, ic)); - } - else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { - lua_Number m; - luai_nummod(L, nb, nc, m); - setfltvalue(ra, m); - } - else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MOD)); } - vmbreak; - } - vmcase(OP_IDIV) { /* floor division */ - TValue *rb = RKB(i); - TValue *rc = RKC(i); - lua_Number nb; lua_Number nc; - if (ttisinteger(rb) && ttisinteger(rc)) { - lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); - setivalue(ra, luaV_div(L, ib, ic)); - } - else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { - setfltvalue(ra, luai_numidiv(L, nb, nc)); - } - else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_IDIV)); } - vmbreak; - } - vmcase(OP_POW) { - TValue *rb = RKB(i); - TValue *rc = RKC(i); - lua_Number nb; lua_Number nc; - if (tonumber(rb, &nb) && tonumber(rc, &nc)) { - setfltvalue(ra, luai_numpow(L, nb, nc)); - } - else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); } - vmbreak; - } - vmcase(OP_UNM) { - TValue *rb = RB(i); - lua_Number nb; - if (ttisinteger(rb)) { - lua_Integer ib = ivalue(rb); - setivalue(ra, intop(-, 0, ib)); - } - else if (tonumber(rb, &nb)) { - setfltvalue(ra, luai_numunm(L, nb)); - } - else { - Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM)); - } - vmbreak; - } - vmcase(OP_BNOT) { - TValue *rb = RB(i); - lua_Integer ib; - if (tointeger(rb, &ib)) { - setivalue(ra, intop(^, ~l_castS2U(0), ib)); - } - else { - Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT)); - } - vmbreak; - } - vmcase(OP_NOT) { - TValue *rb = RB(i); - int res = l_isfalse(rb); /* next assignment may change this value */ - setbvalue(ra, res); - vmbreak; - } - vmcase(OP_LEN) { - Protect(luaV_objlen(L, ra, RB(i))); - vmbreak; - } - vmcase(OP_CONCAT) { - int b = GETARG_B(i); - int c = GETARG_C(i); - StkId rb; - L->top = base + c + 1; /* mark the end of concat operands */ - Protect(luaV_concat(L, c - b + 1)); - ra = RA(i); /* 'luav_concat' may invoke TMs and move the stack */ - rb = b + base; - setobjs2s(L, ra, rb); - checkGC(L, (ra >= rb ? ra + 1 : rb)); - L->top = ci->top; /* restore top */ - vmbreak; - } - vmcase(OP_JMP) { - dojump(ci, i, 0); - vmbreak; - } - vmcase(OP_EQ) { - TValue *rb = RKB(i); - TValue *rc = RKC(i); - Protect( - if (cast_int(luaV_equalobj(L, rb, rc)) != GETARG_A(i)) - ci->u.l.savedpc++; - else - donextjump(ci); - ) - vmbreak; - } - vmcase(OP_LT) { - Protect( - if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i)) - ci->u.l.savedpc++; - else - donextjump(ci); - ) - vmbreak; - } - vmcase(OP_LE) { - Protect( - if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) - ci->u.l.savedpc++; - else - donextjump(ci); - ) - vmbreak; - } - vmcase(OP_TEST) { - if (GETARG_C(i) ? l_isfalse(ra) : !l_isfalse(ra)) - ci->u.l.savedpc++; - else - donextjump(ci); - vmbreak; - } - vmcase(OP_TESTSET) { - TValue *rb = RB(i); - if (GETARG_C(i) ? l_isfalse(rb) : !l_isfalse(rb)) - ci->u.l.savedpc++; - else { - setobjs2s(L, ra, rb); - donextjump(ci); - } - vmbreak; - } - vmcase(OP_CALL) { - int b = GETARG_B(i); - int nresults = GETARG_C(i) - 1; - if (b != 0) L->top = ra+b; /* else previous instruction set top */ - if (luaD_precall(L, ra, nresults)) { /* C function? */ - if (nresults >= 0) L->top = ci->top; /* adjust results */ - base = ci->u.l.base; - } - else { /* Lua function */ - ci = L->ci; - ci->callstatus |= CIST_REENTRY; - goto newframe; /* restart luaV_execute over new Lua function */ - } - vmbreak; - } - vmcase(OP_TAILCALL) { - int b = GETARG_B(i); - if (b != 0) L->top = ra+b; /* else previous instruction set top */ - lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); - if (luaD_precall(L, ra, LUA_MULTRET)) /* C function? */ - base = ci->u.l.base; - else { - /* tail call: put called frame (n) in place of caller one (o) */ - CallInfo *nci = L->ci; /* called frame */ - CallInfo *oci = nci->previous; /* caller frame */ - StkId nfunc = nci->func; /* called function */ - StkId ofunc = oci->func; /* caller function */ - /* last stack slot filled by 'precall' */ - StkId lim = nci->u.l.base + getproto(nfunc)->numparams; - int aux; - /* close all upvalues from previous call */ - if (cl->p->sizep > 0) luaF_close(L, oci->u.l.base); - /* move new frame into old one */ - for (aux = 0; nfunc + aux < lim; aux++) - setobjs2s(L, ofunc + aux, nfunc + aux); - oci->u.l.base = ofunc + (nci->u.l.base - nfunc); /* correct base */ - oci->top = L->top = ofunc + (L->top - nfunc); /* correct top */ - oci->u.l.savedpc = nci->u.l.savedpc; - oci->callstatus |= CIST_TAIL; /* function was tail called */ - ci = L->ci = oci; /* remove new frame */ - lua_assert(L->top == oci->u.l.base + getproto(ofunc)->maxstacksize); - goto newframe; /* restart luaV_execute over new Lua function */ - } - vmbreak; - } - vmcase(OP_RETURN) { - int b = GETARG_B(i); - if (b != 0) L->top = ra+b-1; - if (cl->p->sizep > 0) luaF_close(L, base); - b = luaD_poscall(L, ra); - if (!(ci->callstatus & CIST_REENTRY)) /* 'ci' still the called one */ - return; /* external invocation: return */ - else { /* invocation via reentry: continue execution */ - ci = L->ci; - if (b) L->top = ci->top; - lua_assert(isLua(ci)); - lua_assert(GET_OPCODE(*((ci)->u.l.savedpc - 1)) == OP_CALL); - goto newframe; /* restart luaV_execute over new Lua function */ - } - } - vmcase(OP_FORLOOP) { - if (ttisinteger(ra)) { /* integer loop? */ - lua_Integer step = ivalue(ra + 2); - lua_Integer idx = ivalue(ra) + step; /* increment index */ - lua_Integer limit = ivalue(ra + 1); - if ((0 < step) ? (idx <= limit) : (limit <= idx)) { - ci->u.l.savedpc += GETARG_sBx(i); /* jump back */ - setivalue(ra, idx); /* update internal index... */ - setivalue(ra + 3, idx); /* ...and external index */ - } - } - else { /* floating loop */ - lua_Number step = fltvalue(ra + 2); - lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */ - lua_Number limit = fltvalue(ra + 1); - if (luai_numlt(0, step) ? luai_numle(idx, limit) - : luai_numle(limit, idx)) { - ci->u.l.savedpc += GETARG_sBx(i); /* jump back */ - setfltvalue(ra, idx); /* update internal index... */ - setfltvalue(ra + 3, idx); /* ...and external index */ - } - } - vmbreak; - } - vmcase(OP_FORPREP) { - TValue *init = ra; - TValue *plimit = ra + 1; - TValue *pstep = ra + 2; - lua_Integer ilimit; - int stopnow; - if (ttisinteger(init) && ttisinteger(pstep) && - forlimit(plimit, &ilimit, ivalue(pstep), &stopnow)) { - /* all values are integer */ - lua_Integer initv = (stopnow ? 0 : ivalue(init)); - setivalue(plimit, ilimit); - setivalue(init, initv - ivalue(pstep)); - } - else { /* try making all values floats */ - lua_Number ninit; lua_Number nlimit; lua_Number nstep; - if (!tonumber(plimit, &nlimit)) - luaG_runerror(L, "'for' limit must be a number"); - setfltvalue(plimit, nlimit); - if (!tonumber(pstep, &nstep)) - luaG_runerror(L, "'for' step must be a number"); - setfltvalue(pstep, nstep); - if (!tonumber(init, &ninit)) - luaG_runerror(L, "'for' initial value must be a number"); - setfltvalue(init, luai_numsub(L, ninit, nstep)); - } - ci->u.l.savedpc += GETARG_sBx(i); - vmbreak; - } - vmcase(OP_TFORCALL) { - StkId cb = ra + 3; /* call base */ - setobjs2s(L, cb+2, ra+2); - setobjs2s(L, cb+1, ra+1); - setobjs2s(L, cb, ra); - L->top = cb + 3; /* func. + 2 args (state and index) */ - Protect(luaD_call(L, cb, GETARG_C(i), 1)); - L->top = ci->top; - i = *(ci->u.l.savedpc++); /* go to next instruction */ - ra = RA(i); - lua_assert(GET_OPCODE(i) == OP_TFORLOOP); - goto l_tforloop; - } - vmcase(OP_TFORLOOP) { - l_tforloop: - if (!ttisnil(ra + 1)) { /* continue loop? */ - setobjs2s(L, ra, ra + 1); /* save control variable */ - ci->u.l.savedpc += GETARG_sBx(i); /* jump back */ - } - vmbreak; - } - vmcase(OP_SETLIST) { - int n = GETARG_B(i); - int c = GETARG_C(i); - unsigned int last; - Table *h; - if (n == 0) n = cast_int(L->top - ra) - 1; - if (c == 0) { - lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG); - c = GETARG_Ax(*ci->u.l.savedpc++); - } - luai_runtimecheck(L, ttistable(ra)); - h = hvalue(ra); - last = ((c-1)*LFIELDS_PER_FLUSH) + n; - if (last > h->sizearray) /* needs more space? */ - luaH_resizearray(L, h, last); /* pre-allocate it at once */ - for (; n > 0; n--) { - TValue *val = ra+n; - luaH_setint(L, h, last--, val); - luaC_barrierback(L, h, val); - } - L->top = ci->top; /* correct top (in case of previous open call) */ - vmbreak; - } - vmcase(OP_CLOSURE) { - Proto *p = cl->p->p[GETARG_Bx(i)]; - LClosure *ncl = getcached(p, cl->upvals, base); /* cached closure */ - if (ncl == NULL) /* no match? */ - pushclosure(L, p, cl->upvals, base, ra); /* create a new one */ - else - setclLvalue(L, ra, ncl); /* push cashed closure */ - checkGC(L, ra + 1); - vmbreak; - } - vmcase(OP_VARARG) { - int b = GETARG_B(i) - 1; - int j; - int n = cast_int(base - ci->func) - cl->p->numparams - 1; - if (b < 0) { /* B == 0? */ - b = n; /* get all var. arguments */ - Protect(luaD_checkstack(L, n)); - ra = RA(i); /* previous call may change the stack */ - L->top = ra + n; - } - for (j = 0; j < b; j++) { - if (j < n) { - setobjs2s(L, ra + j, base - n + j); - } - else { - setnilvalue(ra + j); - } - } - vmbreak; - } - vmcase(OP_EXTRAARG) { - lua_assert(0); - vmbreak; - } - } - } -} - -/* }================================================================== */ - diff --git a/3rd/lua/src/lvm.h b/3rd/lua/src/lvm.h deleted file mode 100644 index 5c5e18c..0000000 --- a/3rd/lua/src/lvm.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -** $Id: lvm.h,v 2.34 2014/08/01 17:24:02 roberto Exp $ -** Lua virtual machine -** See Copyright Notice in lua.h -*/ - -#ifndef lvm_h -#define lvm_h - - -#include "ldo.h" -#include "lobject.h" -#include "ltm.h" - - -#if !defined(LUA_NOCVTN2S) -#define cvt2str(o) ttisnumber(o) -#else -#define cvt2str(o) 0 /* no conversion from numbers to strings */ -#endif - - -#if !defined(LUA_NOCVTS2N) -#define cvt2num(o) ttisstring(o) -#else -#define cvt2num(o) 0 /* no conversion from strings to numbers */ -#endif - - -#define tonumber(o,n) \ - (ttisfloat(o) ? (*(n) = fltvalue(o), 1) : luaV_tonumber_(o,n)) - -#define tointeger(o,i) \ - (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointeger_(o,i)) - -#define intop(op,v1,v2) l_castU2S(l_castS2U(v1) op l_castS2U(v2)) - -#define luaV_rawequalobj(t1,t2) luaV_equalobj(NULL,t1,t2) - - -LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2); -LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r); -LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r); -LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n); -LUAI_FUNC int luaV_tointeger_ (const TValue *obj, lua_Integer *p); -LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key, - StkId val); -LUAI_FUNC void luaV_settable (lua_State *L, const TValue *t, TValue *key, - StkId val); -LUAI_FUNC void luaV_finishOp (lua_State *L); -LUAI_FUNC void luaV_execute (lua_State *L); -LUAI_FUNC void luaV_concat (lua_State *L, int total); -LUAI_FUNC lua_Integer luaV_div (lua_State *L, lua_Integer x, lua_Integer y); -LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y); -LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y); -LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb); - -#endif diff --git a/3rd/lua/src/lzio.c b/3rd/lua/src/lzio.c deleted file mode 100644 index 4649392..0000000 --- a/3rd/lua/src/lzio.c +++ /dev/null @@ -1,78 +0,0 @@ -/* -** $Id: lzio.c,v 1.36 2014/11/02 19:19:04 roberto Exp $ -** Buffered streams -** See Copyright Notice in lua.h -*/ - -#define lzio_c -#define LUA_CORE - -#include "lprefix.h" - - -#include - -#include "lua.h" - -#include "llimits.h" -#include "lmem.h" -#include "lstate.h" -#include "lzio.h" - - -int luaZ_fill (ZIO *z) { - size_t size; - lua_State *L = z->L; - const char *buff; - lua_unlock(L); - buff = z->reader(L, z->data, &size); - lua_lock(L); - if (buff == NULL || size == 0) - return EOZ; - z->n = size - 1; /* discount char being returned */ - z->p = buff; - return cast_uchar(*(z->p++)); -} - - -void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) { - z->L = L; - z->reader = reader; - z->data = data; - z->n = 0; - z->p = NULL; -} - - -/* --------------------------------------------------------------- read --- */ -size_t luaZ_read (ZIO *z, void *b, size_t n) { - while (n) { - size_t m; - if (z->n == 0) { /* no bytes in buffer? */ - if (luaZ_fill(z) == EOZ) /* try to read more */ - return n; /* no more input; return number of missing bytes */ - else { - z->n++; /* luaZ_fill consumed first byte; put it back */ - z->p--; - } - } - m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ - memcpy(b, z->p, m); - z->n -= m; - z->p += m; - b = (char *)b + m; - n -= m; - } - return 0; -} - -/* ------------------------------------------------------------------------ */ -char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) { - if (n > buff->buffsize) { - if (n < LUA_MINBUFFER) n = LUA_MINBUFFER; - luaZ_resizebuffer(L, buff, n); - } - return buff->buffer; -} - - diff --git a/3rd/lua/src/lzio.h b/3rd/lua/src/lzio.h deleted file mode 100644 index b2e56bc..0000000 --- a/3rd/lua/src/lzio.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -** $Id: lzio.h,v 1.30 2014/12/19 17:26:14 roberto Exp $ -** Buffered streams -** See Copyright Notice in lua.h -*/ - - -#ifndef lzio_h -#define lzio_h - -#include "lua.h" - -#include "lmem.h" - - -#define EOZ (-1) /* end of stream */ - -typedef struct Zio ZIO; - -#define zgetc(z) (((z)->n--)>0 ? cast_uchar(*(z)->p++) : luaZ_fill(z)) - - -typedef struct Mbuffer { - char *buffer; - size_t n; - size_t buffsize; -} Mbuffer; - -#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0) - -#define luaZ_buffer(buff) ((buff)->buffer) -#define luaZ_sizebuffer(buff) ((buff)->buffsize) -#define luaZ_bufflen(buff) ((buff)->n) - -#define luaZ_buffremove(buff,i) ((buff)->n -= (i)) -#define luaZ_resetbuffer(buff) ((buff)->n = 0) - - -#define luaZ_resizebuffer(L, buff, size) \ - ((buff)->buffer = luaM_reallocvchar(L, (buff)->buffer, \ - (buff)->buffsize, size), \ - (buff)->buffsize = size) - -#define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0) - - -LUAI_FUNC char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n); -LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, - void *data); -LUAI_FUNC size_t luaZ_read (ZIO* z, void *b, size_t n); /* read next n bytes */ - - - -/* --------- Private Part ------------------ */ - -struct Zio { - size_t n; /* bytes still unread */ - const char *p; /* current position in buffer */ - lua_Reader reader; /* reader function */ - void *data; /* additional data */ - lua_State *L; /* Lua state (for reader) */ -}; - - -LUAI_FUNC int luaZ_fill (ZIO *z); - -#endif diff --git a/Makefile b/Makefile index 884111a..f702211 100644 --- a/Makefile +++ b/Makefile @@ -1,46 +1,25 @@ -.PHONY: all lua53 build_dir clean +.PHONY: all clean TOP=$(PWD) -BUILD_DIR=$(TOP)/build -BIN_DIR=$(TOP)/bin -INCLUDE_DIR=$(TOP)/include -LUA_EX_LIB=$(TOP)/lualib EXTERNAL=$(TOP)/3rd SRC=$(TOP)/src +INCLUDE_DIR=/usr/include/lua5.3 +LIB_DIR=/usr/lib CFLAGS = -g3 -O2 -rdynamic -Wall -I$(INCLUDE_DIR) SHARED = -fPIC --shared -LDFLAGS = -L$(BUILD_DIR) -Wl,-rpath $(BUILD_DIR) +LDFLAGS = -L$(LIB_DIR) -all: build_dir +all: lutil.so lkcp.so -build_dir: - -mkdir $(BUILD_DIR) - -mkdir $(BIN_DIR) - -mkdir $(INCLUDE_DIR) - -mkdir $(LUA_EX_LIB) - -all: lua53 - -lua53: - cd $(EXTERNAL)/lua && $(MAKE) clean && $(MAKE) MYCFLAGS="-O2 -fPIC -g" linux - install -p -m 0755 $(EXTERNAL)/lua/src/lua $(BIN_DIR)/lua - install -p -m 0755 $(EXTERNAL)/lua/src/luac $(BIN_DIR)/luac - install -p -m 0644 $(EXTERNAL)/lua/src/liblua.a $(BUILD_DIR) - install -p -m 0644 $(EXTERNAL)/lua/src/*.h $(INCLUDE_DIR) - -all: $(LUA_EX_LIB)/lutil.so $(LUA_EX_LIB)/lkcp.so - -$(LUA_EX_LIB)/lutil.so: $(SRC)/lutil.c +lutil.so: $(SRC)/lutil.c gcc $(CFLAGS) $(SHARED) $^ -o $@ -$(LUA_EX_LIB)/lkcp.so: $(SRC)/lkcp.c $(EXTERNAL)/kcp/ikcp.c - cp $(EXTERNAL)/kcp/ikcp.h $(INCLUDE_DIR) - gcc $(CFLAGS) $(SHARED) $^ -o $@ $(LDFLAGS) +lkcp.so: $(SRC)/lkcp.c $(EXTERNAL)/kcp/ikcp.c + gcc $(CFLAGS) $(SHARED) $^ -o $@ $(LDFLAGS) -I$(EXTERNAL)/kcp all: -rm -rf $(TOP)/*.a $(TOP)/*.o - @echo 'make finish!!!!!!!!!!!!!!!!!' clean: - -rm -rf *.o *.a $(BIN_DIR) $(BUILD_DIR) $(INCLUDE_DIR) $(LUA_EX_LIB) + -rm -rf *.o *.a *.so diff --git a/src/lkcp.c b/src/lkcp.c index f57e529..8247131 100644 --- a/src/lkcp.c +++ b/src/lkcp.c @@ -87,7 +87,6 @@ static int kcp_gc(lua_State* L) { } static int lkcp_create(lua_State* L){ - uint64_t handle = luaL_ref(L, LUA_REGISTRYINDEX); int32_t conv = luaL_checkinteger(L, 1); struct Callback* c = malloc(sizeof(struct Callback)); From eab9451ebc30fa8f266ebe03c2559d1f7a19224c Mon Sep 17 00:00:00 2001 From: Dirk Chang Date: Tue, 30 Oct 2018 17:39:47 +0800 Subject: [PATCH 7/7] remove lkcp prefix --- lua-interface.md | 79 +++++++++++++++++++++++++++++++++++++++++------- src/lkcp.c | 30 +++++++++--------- src/testkcp.lua | 44 +++++++++++++-------------- 3 files changed, 105 insertions(+), 48 deletions(-) diff --git a/lua-interface.md b/lua-interface.md index 2c0e999..6dcd669 100644 --- a/lua-interface.md +++ b/lua-interface.md @@ -1,7 +1,7 @@ # LUA-INTERFACE -## LKcp.lkcp_create(session, func) +## LKcp.create(session, func) ### DESCRIPTION Create kcp object. @@ -13,7 +13,7 @@ ### RETURN kcp: kcp object -## kcp:lkcp_wndsize(sndwnd, rcvwnd) +## kcp:wndsize(sndwnd, rcvwnd) ### DESCRIPTION Set maximum window size: sndwnd=32, rcvwnd=32 by default @@ -25,7 +25,7 @@ ### RETURN None -## kcp:lkcp_nodelay(nodelay, interval, resend, nc) +## kcp:nodelay(nodelay, interval, resend, nc) ### DESCRIPTION Config re-transmission and flow control @@ -39,18 +39,18 @@ ### RETURN ret: always 0 -## kcp:lkcp_check(current) +## kcp:check(current) ### DESCRIPTION - Get when to invoke lkcp_update + Get when to invoke update ### PARAMETERS current: current timestamp in millisec ### RETURN - when: timestamp in millisec when to invoke lkcp_update + when: timestamp in millisec when to invoke update -## kcp:lkcp_update(current) +## kcp:update(current) ### DESCRIPTION Update state (call it repeatedly, every 10ms-100ms), or you can ask @@ -61,7 +61,7 @@ ### RETURN None -## kcp:lkcp_send(data) +## kcp:send(data) ### DESCRIPTION User/upper level send @@ -72,7 +72,7 @@ ### RETURN sent_len: below zero for error, otherwise succeed -## kcp:lkcp_flush() +## kcp:flush() ### DESCRIPTION Flush pending data @@ -83,7 +83,7 @@ ### RETURN None -## kcp:lkcp_input(data) +## kcp:input(data) ### DESCRIPTION When you received a low level packet (eg. UDP packet), call it @@ -94,7 +94,7 @@ ### RETURN ret: below zero for error, otherwise succeed -## kcp:lkcp_recv() +## kcp:recv() ### DESCRIPTION User/upper level recv @@ -106,3 +106,60 @@ rcv_len: Less than or equal to 0 for EAGAIN, otherwise for rcv_len rcv_buf: if rcv_len greater than 0, rcv_buf is data to recv +## kcp:setminrto(minrto) + +### DESCRIPTION + Config the minmum RTO. + +### PARAMETERS + minrto: Minmum RTO + +### RETURN + None + +## kcp:peeksize() + +### DESCRIPTION + check the size of next message in the recv queue + +### PARAMETERS + None + +### RETURN + size of next message in the recv queue + +## kcp:setmtu(mtu) + +### DESCRIPTION + change MTU size, default is 1400 + +### PARAMETERS + mtu: new MTU size + +### RETURN + rc: 0 for sucess, -1 invalid mtu, -2 cannot alloc overhead buffer + +## kcp:waitsnd() + +### DESCRIPTION + get how many packet is waiting to be sent + +### PARAMETERS + None + +### RETURN + packet size + + +## kcp:getconv() + +### DESCRIPTION + read conv + +### PARAMETERS + None + +### RETURN + conv + + diff --git a/src/lkcp.c b/src/lkcp.c index 8247131..e12c2ee 100644 --- a/src/lkcp.c +++ b/src/lkcp.c @@ -300,25 +300,25 @@ static int lkcp_getconv(lua_State* L) { static const struct luaL_Reg lkcp_methods [] = { - { "lkcp_recv" , lkcp_recv }, - { "lkcp_send" , lkcp_send }, - { "lkcp_update" , lkcp_update }, - { "lkcp_check" , lkcp_check }, - { "lkcp_input" , lkcp_input }, - { "lkcp_flush" , lkcp_flush }, - { "lkcp_wndsize" , lkcp_wndsize }, - { "lkcp_nodelay" , lkcp_nodelay }, - { "lkcp_setstream" , lkcp_setstream }, - { "lkcp_setminrto" , lkcp_setminrto }, - { "lkcp_peeksize",lkcp_peeksize }, - { "lkcp_setmtu",lkcp_setmtu }, - { "lkcp_waitsnd",lkcp_waitsnd }, + { "recv" , lkcp_recv }, + { "send" , lkcp_send }, + { "update" , lkcp_update }, + { "check" , lkcp_check }, + { "input" , lkcp_input }, + { "flush" , lkcp_flush }, + { "wndsize" , lkcp_wndsize }, + { "nodelay" , lkcp_nodelay }, + { "setstream" , lkcp_setstream }, + { "setminrto" , lkcp_setminrto }, + { "peeksize",lkcp_peeksize }, + { "setmtu",lkcp_setmtu }, + { "waitsnd",lkcp_waitsnd }, {NULL, NULL}, }; static const struct luaL_Reg l_methods[] = { - { "lkcp_create" , lkcp_create }, - { "lkcp_getconv",lkcp_getconv }, + { "create" , lkcp_create }, + { "getconv",lkcp_getconv }, {NULL, NULL}, }; diff --git a/src/testkcp.lua b/src/testkcp.lua index f1b3e56..c8746ed 100644 --- a/src/testkcp.lua +++ b/src/testkcp.lua @@ -31,7 +31,7 @@ local function test(mode) a = 'aaa', b = false, } - local kcp1 = LKcp.lkcp_create(session, function (buf) + local kcp1 = LKcp.create(session, function (buf) udp_output(buf, info) end) local info2 = { @@ -42,7 +42,7 @@ local function test(mode) print 'hahahah!!!' end, } - local kcp2 = LKcp.lkcp_create(session, function (buf) + local kcp2 = LKcp.create(session, function (buf) udp_output(buf, info2) end) @@ -57,26 +57,26 @@ local function test(mode) --配置窗口大小:平均延迟200ms,每20ms发送一个包, --而考虑到丢包重发,设置最大收发窗口为128 - kcp1:lkcp_wndsize(128, 128) - kcp2:lkcp_wndsize(128, 128) + kcp1:wndsize(128, 128) + kcp2:wndsize(128, 128) --判断测试用例的模式 if mode == 0 then --默认模式 - kcp1:lkcp_nodelay(0, 10, 0, 0) - kcp2:lkcp_nodelay(0, 10, 0, 0) + kcp1:nodelay(0, 10, 0, 0) + kcp2:nodelay(0, 10, 0, 0) elseif mode == 1 then --普通模式,关闭流控等 - kcp1:lkcp_nodelay(0, 10, 0, 1) - kcp2:lkcp_nodelay(0, 10, 0, 1) + kcp1:nodelay(0, 10, 0, 1) + kcp2:nodelay(0, 10, 0, 1) else --启动快速模式 --第二个参数 nodelay-启用以后若干常规加速将启动 --第三个参数 interval为内部处理时钟,默认设置为 10ms --第四个参数 resend为快速重传指标,设置为2 --第五个参数 为是否禁用常规流控,这里禁止 - kcp1:lkcp_nodelay(1, 10, 2, 1) - kcp2:lkcp_nodelay(1, 10, 2, 1) + kcp1:nodelay(1, 10, 2, 1) + kcp2:nodelay(1, 10, 2, 1) end local buffer = "" @@ -87,8 +87,8 @@ local function test(mode) while 1 do current = getms() - local nextt1 = kcp1:lkcp_check(current) - local nextt2 = kcp2:lkcp_check(current) + local nextt1 = kcp1:check(current) + local nextt2 = kcp2:check(current) local nextt = math.min(nextt1, nextt2) local diff = nextt - current if diff > 0 then @@ -96,15 +96,15 @@ local function test(mode) current = getms() end - kcp1:lkcp_update(current) - kcp2:lkcp_update(current) + kcp1:update(current) + kcp2:update(current) --每隔 20ms,kcp1发送数据 while current >= slap do local s1 = LUtil.uint322netbytes(index) local s2 = LUtil.uint322netbytes(current) - kcp1:lkcp_send(s1..s2) - --kcp1:lkcp_flush() + kcp1:send(s1..s2) + --kcp1:flush() slap = slap + 20 index = index + 1 end @@ -116,7 +116,7 @@ local function test(mode) break end --如果 p2收到udp,则作为下层协议输入到kcp2 - kcp2:lkcp_input(hr) + kcp2:input(hr) end --处理虚拟网络:检测是否有udp包从p2->p1 @@ -126,22 +126,22 @@ local function test(mode) break end --如果 p1收到udp,则作为下层协议输入到kcp1 - kcp1:lkcp_input(hr) + kcp1:input(hr) end --kcp2接收到任何包都返回回去 while 1 do - hrlen, hr = kcp2:lkcp_recv() + hrlen, hr = kcp2:recv() if hrlen <= 0 then break end - kcp2:lkcp_send(hr) - --kcp2:lkcp_flush() + kcp2:send(hr) + --kcp2:flush() end --kcp1收到kcp2的回射数据 while 1 do - hrlen, hr = kcp1:lkcp_recv() + hrlen, hr = kcp1:recv() --没有收到包就退出 if hrlen <= 0 then break