• Stars
    star
    1,152
  • Rank 39,013 (Top 0.8 %)
  • Language
    C
  • License
    Other
  • Created over 10 years ago
  • Updated about 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

OpenResty's Branch of LuaJIT 2

Name

openresty/luajit2 - OpenResty's maintained branch of LuaJIT.

Table of Contents

Description

This is the official OpenResty branch of LuaJIT. It is not to be considered a fork, since we still regularly synchronize changes from the upstream LuaJIT project (https://github.com/LuaJIT/LuaJIT).

OpenResty extensions

Additionally to synchronizing upstream changes, we introduce our own changes which haven't been merged yet (or never will be). This document describes those changes that are specific to this branch.

New Lua APIs

table.isempty

syntax: res = isempty(tab)

Returns true when the given Lua table contains neither non-nil array elements nor non-nil key-value pairs, or false otherwise.

This API can be JIT compiled.

Usage:

local isempty = require "table.isempty"

print(isempty({}))  -- true
print(isempty({nil, dog = nil}))  -- true
print(isempty({"a", "b"}))  -- false
print(isempty({nil, 3}))  -- false
print(isempty({cat = 3}))  -- false

Back to TOC

table.isarray

syntax: res = isarray(tab)

Returns true when the given Lua table is a pure array-like Lua table, or false otherwise.

Empty Lua tables are treated as arrays.

This API can be JIT compiled.

Usage:

local isarray = require "table.isarray"

print(isarray{"a", true, 3.14})  -- true
print(isarray{dog = 3})  -- false
print(isarray{})  -- true

Back to TOC

table.nkeys

syntax: n = nkeys(tab)

Returns the total number of elements in a given Lua table (i.e. from both the array and hash parts combined).

This API can be JIT compiled.

Usage:

local nkeys = require "table.nkeys"

print(nkeys({}))  -- 0
print(nkeys({ "a", nil, "b" }))  -- 2
print(nkeys({ dog = 3, cat = 4, bird = nil }))  -- 2
print(nkeys({ "a", dog = 3, cat = 4 }))  -- 3

Back to TOC

table.clone

syntax: t = clone(tab)

Returns a shallow copy of the given Lua table.

This API can be JIT compiled.

Usage:

local clone = require "table.clone"

local x = {x=12, y={5, 6, 7}}
local y = clone(x)
... use y ...

Note: We observe 7% over-all speedup in the edgelang-fan compiler's compiling speed whose Lua is generated by the fanlang compiler.

Note bis: Deep cloning is planned to be supported by adding true as a second argument.

Back to TOC

jit.prngstate

syntax: state = jit.prngstate(state?)

Returns (and optionally sets) the current PRNG state (an array of 8 Lua numbers with 32-bit integer values) currently used by the JIT compiler.

When the state argument is non-nil, it is expected to be an array of up to 8 unsigned Lua numbers, each with value less than 2**32-1. This will set the current PRNG state and return the state that was overridden.

Note: For backward compatibility, state argument can also be an unsigned Lua number less than 2**32-1.

Note: When the state argument is an array and less than 8 numbers, or the state is a number, the remaining positions are filled with zeros.

Usage:

local state = jit.prngstate()
local oldstate = jit.prngstate{ a, b, c, ... }

jit.prngstate(32) -- {32, 0, 0, 0, 0, 0, 0, 0}
jit.prngstate{432, 23, 50} -- {432, 23, 50, 0, 0, 0, 0, 0}

Note: This API has no effect if LuaJIT is compiled with -DLUAJIT_DISABLE_JIT, and will return a table with all 0.

Back to TOC

thread.exdata

syntax: exdata = th_exdata(data?)

This API allows for embedding user data into a thread (lua_State).

The retrieved exdata value on the Lua land is represented as a cdata object of the ctype void*.

As of this version, retrieving the exdata (i.e. th_exdata() without any argument) can be JIT compiled.

Usage:

local th_exdata = require "thread.exdata"

th_exdata(0xdeadbeefLL)  -- set the exdata of the current Lua thread
local exdata = th_exdata()  -- fetch the exdata of the current Lua thread

Also available are the following public C API functions for manipulating exdata on the C land:

void lua_setexdata(lua_State *L, void *exdata);
void *lua_getexdata(lua_State *L);

The exdata pointer is initialized to NULL when the main thread is created. Any child Lua thread will inherit its parent's exdata, but still can override it.

Note: This API will not be available if LuaJIT is compiled with -DLUAJIT_DISABLE_FFI.

Note bis: This API is used internally by the OpenResty core, and it is strongly discouraged to use it yourself in the context of OpenResty.

Back to TOC

thread.exdata2

syntax: exdata = th_exdata2(data?)

Similar to thread.exdata but for a 2nd separate user data as a pointer value.

Back to TOC

New C API

lua_setexdata

void lua_setexdata(lua_State *L, void *exdata);

Sets extra user data as a pointer value to the current Lua state or thread.

Back to TOC

lua_getexdata

void *lua_getexdata(lua_State *L);

Gets extra user data as a pointer value to the current Lua state or thread.

Back to TOC

lua_setexdata2

void lua_setexdata2(lua_State *L, void *exdata2);

Similar to lua_setexdata but for a 2nd user data (pointer) value.

Back to TOC

lua_getexdata2

void *lua_getexdata2(lua_State *L);

Similar to lua_getexdata but for a 2nd user data (pointer) value.

Back to TOC

lua_resetthread

void lua_resetthread(lua_State *L, lua_State *th);

Resets the state of th to the initial state of a newly created Lua thread object as returned by lua_newthread(). This is mainly for Lua thread recycling. Lua threads in arbitrary states (like yielded or errored) can be reset properly.

The current implementation does not shrink the already allocated Lua stack though. It only clears it.

Back to TOC

New macros

The macros described in this section have been added to this branch.

Back to TOC

OPENRESTY_LUAJIT

In the luajit.h header file, a new macro OPENRESTY_LUAJIT was defined to help distinguishing this OpenResty-specific branch of LuaJIT.

HAVE_LUA_RESETTHREAD

This macro is set when the lua_resetthread C API is present.

Back to TOC

Optimizations

Updated JIT default parameters

We use more appressive default JIT compiler options to help large OpenResty Lua applications.

The following jit.opt options are used by default:

maxtrace=8000
maxrecord=16000
minstitch=3
maxmcode=40960  -- in KB

Back to TOC

String hashing

This optimization only applies to Intel CPUs supporting the SSE 4.2 instruction sets. For such CPUs, and when this branch is compiled with -msse4.2, the string hashing function used for strings interning will be based on an optimized crc32 implementation (see lj_str_new()).

This optimization still provides constant-time hashing complexity (O(n)), but makes hash collision attacks harder for strings up to 127 bytes of size.

Back to TOC

Updated bytecode options

New -bL option

The bytecode option L was added to display Lua sources line numbers.

For example, luajit -bL -e 'print(1)' now produces bytecode dumps like below:

-- BYTECODE -- "print(1)":0-1
0001     [1]    GGET     0   0      ; "print"
0002     [1]    KSHORT   1   1
0003     [1]    CALL     0   1   2
0004     [1]    RET0     0   1

The [N] column corresponds to the Lua source line number. For example, [1] means "the first source line".

Back to TOC

Updated -bl option

The bytecode option l was updated to display the constant tables of each Lua prototype.

For example, luajit -bl a.lua' now produces bytecode dumps like below:

-- BYTECODE -- a.lua:0-48
KGC    0    "print"
KGC    1    "hi"
KGC    2    table
KGC    3    a.lua:17
KN    1    1000000
KN    2    1.390671161567e-309
...

Back to TOC

Miscellaneous

  • Increased the maximum number of allowed upvalues from 60 to 120.
  • Various important bugfixes in the JIT compiler and Lua VM which have not been merged in upstream LuaJIT.
  • Removed the GCC 4 requirement for x86 on older systems such as Solaris i386.
  • In the Makefile file, make sure we always install the symlink for "luajit" even for alpha or beta versions.
  • Applied a patch to fix DragonFlyBSD compatibility. Note: this is not an officially supported target.
  • feature: jit.dump: output Lua source location after every BC.
  • feature: added internal memory-buffer-based trace entry/exit/start-recording event logging, mainly for debugging bugs in the JIT compiler. it requires -DLUA_USE_TRACE_LOGS when building LuaJIT.
  • feature: save g->jit_base to g->saved_jit_base before lj_err_throw clears g->jit_base which makes it impossible to get Lua backtrace in such states.

Back to TOC

Copyright & License

LuaJIT is a Just-In-Time (JIT) compiler for the Lua programming language.

Project Homepage: http://luajit.org/

LuaJIT is Copyright (C) 2005-2019 Mike Pall.

Additional patches for OpenResty are copyrighted by Yichun Zhang and OpenResty Inc.:

Copyright (C) 2017-2019 Yichun Zhang. All rights reserved.

Copyright (C) 2017-2019 OpenResty Inc. All rights reserved.

LuaJIT is free software, released under the MIT license. See full Copyright Notice in the COPYRIGHT file or in luajit.h.

Documentation for the official LuaJIT is available in HTML format. Please point your favorite browser to:

doc/luajit.html

Back to TOC

More Repositories

1

openresty

High Performance Web Platform Based on Nginx and LuaJIT
C
12,021
star
2

lua-nginx-module

Embed the Power of Lua into NGINX HTTP servers
C
11,049
star
3

nginx-tutorials

Nginx Tutorials
Perl
2,851
star
4

lua-resty-redis

Lua redis client driver for the ngx_lua based on the cosocket API
Lua
1,863
star
5

openresty-systemtap-toolkit

Real-time analysis and diagnostics tools for OpenResty (including NGINX, LuaJIT, ngx_lua, and more) based on SystemTap
Perl
1,640
star
6

headers-more-nginx-module

Set, add, and clear arbitrary output headers in NGINX http servers
C
1,592
star
7

openresty.org

Code and data for the openresty.org site
HTML
1,254
star
8

echo-nginx-module

An Nginx module for bringing the power of "echo", "sleep", "time" and more to Nginx's config file
C
1,139
star
9

docker-openresty

Docker tooling for OpenResty
Dockerfile
915
star
10

redis2-nginx-module

Nginx upstream module for the Redis 2.0 protocol
C
892
star
11

lua-resty-limit-traffic

Lua library for limiting and controlling traffic in OpenResty/ngx_lua
Lua
794
star
12

lua-resty-core

New FFI-based API for lua-nginx-module
Lua
775
star
13

stream-lua-nginx-module

Embed the power of Lua into NGINX TCP/UDP servers
C
709
star
14

lua-resty-mysql

Nonblocking Lua MySQL driver library for ngx_lua or OpenResty
Lua
693
star
15

stapxx

Simple macro language extentions to systemtap
Perl
682
star
16

sregex

A non-backtracking NFA/DFA-based Perl-compatible regex engine matching on large data streams
C
614
star
17

lua-resty-upstream-healthcheck

Health Checker for Nginx Upstream Servers in Pure Lua
Lua
506
star
18

lua-upstream-nginx-module

Nginx C module to expose Lua API to ngx_lua for Nginx upstreams
C
497
star
19

lua-resty-websocket

WebSocket support for the ngx_lua module (and OpenResty)
Lua
492
star
20

srcache-nginx-module

Transparent subrequest-based caching layout for arbitrary nginx locations.
C
469
star
21

opm

OpenResty Package Manager
Lua
454
star
22

lua-resty-lrucache

Lua-land LRU Cache based on LuaJIT FFI
Lua
432
star
23

test-nginx

Data-driven test scaffold for Nginx C module and OpenResty Lua library development
Perl
430
star
24

lua-resty-string

String utilities and common hash functions for ngx_lua and LuaJIT
Lua
423
star
25

lua-resty-upload

Streaming reader and parser for http file uploading based on ngx_lua cosocket
Lua
392
star
26

set-misc-nginx-module

Various set_xxx directives added to nginx's rewrite module (md5/sha1, sql/json quoting, and many more)
C
384
star
27

drizzle-nginx-module

an nginx upstream module that talks to mysql and drizzle by libdrizzle
C
335
star
28

openresty-gdb-utils

GDB Utilities for OpenResty (including Nginx, ngx_lua, LuaJIT, and more)
Python
328
star
29

lua-resty-dns

DNS resolver for the nginx lua module
Lua
319
star
30

lua-resty-balancer

A generic consistent hash implementation for OpenResty/Lua
Lua
319
star
31

programming-openresty

Programming OpenResty Book
Perl
318
star
32

lua-resty-lock

Simple nonblocking lock API for ngx_lua based on shared memory dictionaries
Lua
302
star
33

openresty-devel-utils

Utilities for nginx module development
Perl
263
star
34

resty-cli

Fancy command-line utilities for OpenResty
Perl
262
star
35

replace-filter-nginx-module

Streaming regular expression replacement in response bodies
C
255
star
36

lua-resty-memcached

Lua memcached client driver for the ngx_lua based on the cosocket API
Lua
209
star
37

memc-nginx-module

An extended version of the standard memcached module that supports set, add, delete, and many more memcached commands.
C
208
star
38

encrypted-session-nginx-module

encrypt and decrypt nginx variable values
C
195
star
39

openresty-packaging

Official OpenResty packaging source and scripts for various Linux distributions and other systems
Makefile
172
star
40

rds-json-nginx-module

An nginx output filter that formats Resty DBD Streams generated by ngx_drizzle and others to JSON
C
154
star
41

xss-nginx-module

Native support for cross-site scripting (XSS) in an nginx
C
147
star
42

mockeagain

Mocking ideally slow network that only allows reading and/or writing one byte at a time
C
128
star
43

lua-resty-shell

Lua module for nonblocking system shell command executions
Perl
120
star
44

lua-tablepool

Lua table recycling pools for LuaJIT
Perl
110
star
45

lua-redis-parser

Lua module for parsing raw redis responses
C
92
star
46

openresty-survey

OpenResty Web App for OpenResty User Survey
HTML
90
star
47

lua-ssl-nginx-module

NGINX C module that extends ngx_http_lua_module for enhanced SSL/TLS capabilities
Lua
86
star
48

opsboy

A rule-based sysadmin tool that helps setting up complex environment for blank machines
Perl
83
star
49

no-pool-nginx

replace nginx's pool mechanism with plain malloc & free to help tools like valgrind
Shell
77
star
50

stream-echo-nginx-module

TCP/stream echo module for NGINX (a port of ngx_http_echo_module)
C
70
star
51

meta-lua-nginx-module

Meta Lua Nginx Module supporting both Http Lua Module and Stream Lua Module
C
65
star
52

array-var-nginx-module

Add support for array-typed variables to nginx config files
C
64
star
53

lemplate

OpenResty/Lua template framework implementing Perl's TT2 templating language
Perl
53
star
54

openresty-con

JavaScript
46
star
55

nginx-dtrace

An nginx fork that adds dtrace USDT probes
C
44
star
56

lua-resty-memcached-shdict

Powerful memcached client with a shdict caching layer and many other features
Lua
34
star
57

lua-resty-shdict-simple

Simple applicaton-oriented interface to the OpenResty shared dictionary API
Perl
32
star
58

lua-resty-signal

Lua library for killing or sending signals to UNIX processes
Perl
31
star
59

luajit2-test-suite

OpenResty's LuaJIT test suite based on Mike Pall's LuaJIT tests
Lua
29
star
60

ngx_postgres

OpenResty's fork of FRiCKLE/ngx_postgres
C
26
star
61

rds-csv-nginx-module

Nginx output filter module to convert Resty-DBD-Streams (RDS) to Comma-Separated Values (CSV)
C
22
star
62

showman-samples

Sample screenplay files for generating our public video tutorials using OpenResty Showman
20
star
63

lua-rds-parser

Resty DBD Stream (RDS) parser for Lua written in C
C
19
star
64

redis-nginx-module

8
star
65

AB-test-http

test http requests between two systems.
Perl
5
star
66

transparency

2
star