# # Copyright (C) 2006-2011 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # CRYPTO_MENU:=Cryptographic API modules CRYPTO_MODULES = \ ALGAPI2=crypto_algapi \ BLKCIPHER2=crypto_blkcipher crypto_confvar=CONFIG_CRYPTO_$(word 1,$(subst =,$(space),$(1))) crypto_file=$(LINUX_DIR)/crypto/$(word 2,$(subst =,$(space),$(1))).ko crypto_name=$(if $(findstring y,$($(call crypto_confvar,$(1)))),,$(word 2,$(subst =,$(space),$(1)))) define AddDepends/crypto SUBMENU:=$(CRYPTO_MENU) DEPENDS+= $(1) endef define KernelPackage/crypto-aead TITLE:=CryptoAPI AEAD support KCONFIG:= \ CONFIG_CRYPTO_AEAD \ CONFIG_CRYPTO_AEAD2 FILES:=$(LINUX_DIR)/crypto/aead.ko AUTOLOAD:=$(call AutoLoad,09,aead,1) $(call AddDepends/crypto, +LINUX_4_4:kmod-crypto-null) endef $(eval $(call KernelPackage,crypto-aead)) define KernelPackage/crypto-hash TITLE:=CryptoAPI hash support KCONFIG:=CONFIG_CRYPTO_HASH FILES:=$(LINUX_DIR)/crypto/crypto_hash.ko AUTOLOAD:=$(call AutoLoad,02,crypto_hash,1) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-hash)) define KernelPackage/crypto-manager TITLE:=CryptoAPI algorithm manager DEPENDS:=+kmod-crypto-aead +kmod-crypto-hash +kmod-crypto-pcompress KCONFIG:= \ CONFIG_CRYPTO_MANAGER \ CONFIG_CRYPTO_MANAGER2 FILES:=$(LINUX_DIR)/crypto/cryptomgr.ko AUTOLOAD:=$(call AutoLoad,09,cryptomgr,1) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-manager)) define KernelPackage/crypto-pcompress TITLE:=CryptoAPI Partial (de)compression operations KCONFIG:= \ CONFIG_CRYPTO_PCOMP=y \ CONFIG_CRYPTO_PCOMP2 FILES:=$(LINUX_DIR)/crypto/pcompress.ko AUTOLOAD:=$(call AutoLoad,09,pcompress) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-pcompress)) define KernelPackage/crypto-user TITLE:=CryptoAPI userspace interface DEPENDS:=+kmod-crypto-hash +kmod-crypto-manager KCONFIG:= \ CONFIG_CRYPTO_USER_API \ CONFIG_CRYPTO_USER_API_HASH \ CONFIG_CRYPTO_USER_API_SKCIPHER FILES:= \ $(LINUX_DIR)/crypto/af_alg.ko \ $(LINUX_DIR)/crypto/algif_hash.ko \ $(LINUX_DIR)/crypto/algif_skcipher.ko AUTOLOAD:=$(call AutoLoad,09,af_alg algif_hash algif_skcipher) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-user)) define KernelPackage/crypto-wq TITLE:=CryptoAPI work queue handling KCONFIG:=CONFIG_CRYPTO_WORKQUEUE FILES:=$(LINUX_DIR)/crypto/crypto_wq.ko AUTOLOAD:=$(call AutoLoad,09,crypto_wq) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-wq)) define KernelPackage/crypto-rng TITLE:=CryptoAPI random number generation DEPENDS:=+kmod-crypto-hash +kmod-crypto-hmac +kmod-crypto-sha256 KCONFIG:= \ CONFIG_CRYPTO_DRBG \ CONFIG_CRYPTO_DRBG_HMAC=y \ CONFIG_CRYPTO_DRBG_HASH=n \ CONFIG_CRYPTO_DRBG_MENU \ CONFIG_CRYPTO_JITTERENTROPY \ CONFIG_CRYPTO_RNG2 FILES:= \ $(LINUX_DIR)/crypto/drbg.ko@ge4.2 \ $(LINUX_DIR)/crypto/jitterentropy_rng.ko@ge4.2 \ $(LINUX_DIR)/crypto/krng.ko@lt4.2 \ $(LINUX_DIR)/crypto/rng.ko AUTOLOAD:=$(call AutoLoad,09,drbg@ge4.2 jitterentropy_rng@ge4.2 krng@lt4.2 rng) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-rng)) define KernelPackage/crypto-iv TITLE:=CryptoAPI initialization vectors DEPENDS:=+kmod-crypto-manager +kmod-crypto-rng +kmod-crypto-wq KCONFIG:= CONFIG_CRYPTO_BLKCIPHER2 FILES:= \ $(LINUX_DIR)/crypto/eseqiv.ko \ $(LINUX_DIR)/crypto/chainiv.ko AUTOLOAD:=$(call AutoLoad,10,eseqiv chainiv) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-iv)) define KernelPackage/crypto-echainiv TITLE:=Encrypted Chain IV Generator DEPENDS:=+kmod-crypto-aead KCONFIG:=CONFIG_CRYPTO_ECHAINIV FILES:=$(LINUX_DIR)/crypto/echainiv.ko AUTOLOAD:=$(call AutoLoad,09,echainiv) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-echainiv)) define KernelPackage/crypto-seqiv TITLE:=CryptoAPI Sequence Number IV Generator DEPENDS:=+kmod-crypto-aead +kmod-crypto-rng KCONFIG:=CONFIG_CRYPTO_SEQIV FILES:=$(LINUX_DIR)/crypto/seqiv.ko AUTOLOAD:=$(call AutoLoad,09,seqiv) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-seqiv)) define KernelPackage/crypto-hw-talitos TITLE:=Freescale integrated security engine (SEC) driver DEPENDS:=+kmod-crypto-manager +kmod-crypto-hash +kmod-random-core +kmod-crypto-authenc KCONFIG:= \ CONFIG_CRYPTO_HW=y \ CONFIG_CRYPTO_DEV_TALITOS \ CONFIG_CRYPTO_DEV_TALITOS1=y \ CONFIG_CRYPTO_DEV_TALITOS2=y FILES:= \ $(LINUX_DIR)/drivers/crypto/talitos.ko AUTOLOAD:=$(call AutoLoad,09,talitos) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-hw-talitos)) define KernelPackage/crypto-hw-padlock TITLE:=VIA PadLock ACE with AES/SHA hw crypto module DEPENDS:=+kmod-crypto-manager KCONFIG:= \ CONFIG_CRYPTO_HW=y \ CONFIG_CRYPTO_DEV_PADLOCK \ CONFIG_CRYPTO_DEV_PADLOCK_AES \ CONFIG_CRYPTO_DEV_PADLOCK_SHA FILES:= \ $(LINUX_DIR)/drivers/crypto/padlock-aes.ko \ $(LINUX_DIR)/drivers/crypto/padlock-sha.ko AUTOLOAD:=$(call AutoLoad,09,padlock-aes padlock-sha) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-hw-padlock)) define KernelPackage/crypto-hw-ccp TITLE:=AMD Cryptographic Coprocessor DEPENDS:=+kmod-crypto-authenc +kmod-crypto-hash +kmod-crypto-manager +kmod-random-core KCONFIG:= \ CONFIG_CRYPTO_HW=y \ CONFIG_CRYPTO_DEV_CCP=y \ CONFIG_CRYPTO_DEV_CCP_CRYPTO \ CONFIG_CRYPTO_DEV_CCP_DD FILES:= \ $(LINUX_DIR)/drivers/crypto/ccp/ccp.ko \ $(LINUX_DIR)/drivers/crypto/ccp/ccp-crypto.ko AUTOLOAD:=$(call AutoLoad,09,ccp ccp-crypto) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-hw-ccp)) define KernelPackage/crypto-hw-geode TITLE:=AMD Geode hardware crypto module DEPENDS:=+kmod-crypto-manager KCONFIG:= \ CONFIG_CRYPTO_HW=y \ CONFIG_CRYPTO_DEV_GEODE FILES:=$(LINUX_DIR)/drivers/crypto/geode-aes.ko AUTOLOAD:=$(call AutoLoad,09,geode-aes) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-hw-geode)) define KernelPackage/crypto-hw-hifn-795x TITLE:=HIFN 795x crypto accelerator DEPENDS:=+kmod-random-core +kmod-crypto-manager KCONFIG:= \ CONFIG_CRYPTO_HW=y \ CONFIG_CRYPTO_DEV_HIFN_795X \ CONFIG_CRYPTO_DEV_HIFN_795X_RNG=y FILES:=$(LINUX_DIR)/drivers/crypto/hifn_795x.ko AUTOLOAD:=$(call AutoLoad,09,hifn_795x) $(call AddDepends/crypto,+kmod-crypto-des) endef $(eval $(call KernelPackage,crypto-hw-hifn-795x)) define KernelPackage/crypto-authenc TITLE:=Combined mode wrapper for IPsec DEPENDS:=+kmod-crypto-manager +LINUX_4_4:kmod-crypto-null KCONFIG:=CONFIG_CRYPTO_AUTHENC FILES:=$(LINUX_DIR)/crypto/authenc.ko AUTOLOAD:=$(call AutoLoad,09,authenc) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-authenc)) define KernelPackage/crypto-cbc TITLE:=Cipher Block Chaining CryptoAPI module DEPENDS:=+kmod-crypto-manager KCONFIG:=CONFIG_CRYPTO_CBC FILES:=$(LINUX_DIR)/crypto/cbc.ko AUTOLOAD:=$(call AutoLoad,09,cbc) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-cbc)) define KernelPackage/crypto-ctr TITLE:=Counter Mode CryptoAPI module DEPENDS:=+kmod-crypto-manager +kmod-crypto-seqiv +kmod-crypto-iv KCONFIG:=CONFIG_CRYPTO_CTR FILES:=$(LINUX_DIR)/crypto/ctr.ko AUTOLOAD:=$(call AutoLoad,09,ctr) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-ctr)) define KernelPackage/crypto-ccm TITLE:=Support for Counter with CBC MAC (CCM) DEPENDS:=+kmod-crypto-ctr +kmod-crypto-aead KCONFIG:=CONFIG_CRYPTO_CCM FILES:=$(LINUX_DIR)/crypto/ccm.ko AUTOLOAD:=$(call AutoLoad,09,ccm) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-ccm)) define KernelPackage/crypto-pcbc TITLE:=Propagating Cipher Block Chaining CryptoAPI module DEPENDS:=+kmod-crypto-manager KCONFIG:=CONFIG_CRYPTO_PCBC FILES:=$(LINUX_DIR)/crypto/pcbc.ko AUTOLOAD:=$(call AutoLoad,09,pcbc) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-pcbc)) define KernelPackage/crypto-crc32c TITLE:=CRC32c CRC module DEPENDS:=+kmod-crypto-hash KCONFIG:=CONFIG_CRYPTO_CRC32C FILES:=$(LINUX_DIR)/crypto/crc32c_generic.ko AUTOLOAD:=$(call AutoLoad,04,crc32c_generic,1) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-crc32c)) define KernelPackage/crypto-des TITLE:=DES/3DES cipher CryptoAPI module KCONFIG:=CONFIG_CRYPTO_DES FILES:=$(LINUX_DIR)/crypto/des_generic.ko AUTOLOAD:=$(call AutoLoad,09,des_generic) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-des)) define KernelPackage/crypto-deflate TITLE:=Deflate compression CryptoAPI module DEPENDS:=+kmod-lib-zlib-inflate +kmod-lib-zlib-deflate KCONFIG:=CONFIG_CRYPTO_DEFLATE FILES:=$(LINUX_DIR)/crypto/deflate.ko AUTOLOAD:=$(call AutoLoad,09,deflate) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-deflate)) define KernelPackage/crypto-fcrypt TITLE:=FCRYPT cipher CryptoAPI module KCONFIG:=CONFIG_CRYPTO_FCRYPT FILES:=$(LINUX_DIR)/crypto/fcrypt.ko AUTOLOAD:=$(call AutoLoad,09,fcrypt) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-fcrypt)) define KernelPackage/crypto-ecb TITLE:=Electronic CodeBook CryptoAPI module DEPENDS:=+kmod-crypto-manager KCONFIG:=CONFIG_CRYPTO_ECB FILES:=$(LINUX_DIR)/crypto/ecb.ko AUTOLOAD:=$(call AutoLoad,09,ecb) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-ecb)) define KernelPackage/crypto-hmac TITLE:=HMAC digest CryptoAPI module DEPENDS:=+kmod-crypto-hash +kmod-crypto-manager KCONFIG:=CONFIG_CRYPTO_HMAC FILES:=$(LINUX_DIR)/crypto/hmac.ko AUTOLOAD:=$(call AutoLoad,09,hmac) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-hmac)) define KernelPackage/crypto-cmac TITLE:=Support for Cipher-based Message Authentication Code (CMAC) DEPENDS:=+kmod-crypto-hash KCONFIG:=CONFIG_CRYPTO_CMAC FILES:=$(LINUX_DIR)/crypto/cmac.ko AUTOLOAD:=$(call AutoLoad,09,cmac) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-cmac)) define KernelPackage/crypto-gcm TITLE:=GCM/GMAC CryptoAPI module DEPENDS:=+kmod-crypto-ctr +kmod-crypto-ghash +kmod-crypto-null KCONFIG:=CONFIG_CRYPTO_GCM FILES:=$(LINUX_DIR)/crypto/gcm.ko AUTOLOAD:=$(call AutoLoad,09,gcm) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-gcm)) define KernelPackage/crypto-gf128 TITLE:=GF(2^128) multiplication functions CryptoAPI module KCONFIG:=CONFIG_CRYPTO_GF128MUL FILES:=$(LINUX_DIR)/crypto/gf128mul.ko AUTOLOAD:=$(call AutoLoad,09,gf128mul) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-gf128)) define KernelPackage/crypto-ghash TITLE:=GHASH digest CryptoAPI module DEPENDS:=+kmod-crypto-gf128 +kmod-crypto-hash KCONFIG:=CONFIG_CRYPTO_GHASH FILES:=$(LINUX_DIR)/crypto/ghash-generic.ko AUTOLOAD:=$(call AutoLoad,09,ghash-generic) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-ghash)) define KernelPackage/crypto-md4 TITLE:=MD4 digest CryptoAPI module DEPENDS:=+kmod-crypto-hash KCONFIG:=CONFIG_CRYPTO_MD4 FILES:=$(LINUX_DIR)/crypto/md4.ko AUTOLOAD:=$(call AutoLoad,09,md4) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-md4)) define KernelPackage/crypto-md5 TITLE:=MD5 digest CryptoAPI module DEPENDS:=+kmod-crypto-hash KCONFIG:= \ CONFIG_CRYPTO_MD5 \ CONFIG_CRYPTO_MD5_OCTEON FILES:=$(LINUX_DIR)/crypto/md5.ko AUTOLOAD:=$(call AutoLoad,09,md5) $(call AddDepends/crypto) endef define KernelPackage/crypto-md5/octeon FILES+=$(LINUX_DIR)/arch/mips/cavium-octeon/crypto/octeon-md5.ko AUTOLOAD:=$(call AutoLoad,09,octeon-md5) endef $(eval $(call KernelPackage,crypto-md5)) define KernelPackage/crypto-michael-mic TITLE:=Michael MIC keyed digest CryptoAPI module DEPENDS:=+kmod-crypto-hash KCONFIG:=CONFIG_CRYPTO_MICHAEL_MIC FILES:=$(LINUX_DIR)/crypto/michael_mic.ko AUTOLOAD:=$(call AutoLoad,09,michael_mic) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-michael-mic)) define KernelPackage/crypto-sha1 TITLE:=SHA1 digest CryptoAPI module DEPENDS:=+kmod-crypto-hash KCONFIG:= \ CONFIG_CRYPTO_SHA1 \ CONFIG_CRYPTO_SHA1_OCTEON \ CONFIG_CRYPTO_SHA1_SSSE3 FILES:=$(LINUX_DIR)/crypto/sha1_generic.ko AUTOLOAD:=$(call AutoLoad,09,sha1_generic) $(call AddDepends/crypto) endef define KernelPackage/crypto-sha1/octeon FILES+=$(LINUX_DIR)/arch/mips/cavium-octeon/crypto/octeon-sha1.ko AUTOLOAD:=$(call AutoLoad,09,octeon-sha1) endef define KernelPackage/crypto-sha1/x86/64 FILES+=$(LINUX_DIR)/arch/x86/crypto/sha1-ssse3.ko AUTOLOAD:=$(call AutoLoad,09,sha1-ssse3) endef $(eval $(call KernelPackage,crypto-sha1)) define KernelPackage/crypto-sha256 TITLE:=SHA224 SHA256 digest CryptoAPI module DEPENDS:=+kmod-crypto-hash KCONFIG:= \ CONFIG_CRYPTO_SHA256 \ CONFIG_CRYPTO_SHA256_OCTEON \ CONFIG_CRYPTO_SHA256_SSSE3 FILES:=$(LINUX_DIR)/crypto/sha256_generic.ko AUTOLOAD:=$(call AutoLoad,09,sha256_generic) $(call AddDepends/crypto) endef define KernelPackage/crypto-sha256/octeon FILES+=$(LINUX_DIR)/arch/mips/cavium-octeon/crypto/octeon-sha256.ko AUTOLOAD:=$(call AutoLoad,09,octeon-sha256) endef define KernelPackage/crypto-sha256/x86/64 FILES+=$(LINUX_DIR)/arch/x86/crypto/sha256-ssse3.ko AUTOLOAD:=$(call AutoLoad,09,sha256-ssse3) endef $(eval $(call KernelPackage,crypto-sha256)) define KernelPackage/crypto-sha512 TITLE:=SHA512 digest CryptoAPI module DEPENDS:=+kmod-crypto-hash KCONFIG:= \ CONFIG_CRYPTO_SHA512 \ CONFIG_CRYPTO_SHA512_OCTEON \ CONFIG_CRYPTO_SHA512_SSSE3 FILES:=$(LINUX_DIR)/crypto/sha512_generic.ko AUTOLOAD:=$(call AutoLoad,09,sha512_generic) $(call AddDepends/crypto) endef define KernelPackage/crypto-sha512/octeon FILES+=$(LINUX_DIR)/arch/mips/cavium-octeon/crypto/octeon-sha512.ko AUTOLOAD:=$(call AutoLoad,09,octeon-sha512) endef define KernelPackage/crypto-sha512/x86/64 FILES+=$(LINUX_DIR)/arch/x86/crypto/sha512-ssse3.ko AUTOLOAD:=$(call AutoLoad,09,sha512-ssse3) endef $(eval $(call KernelPackage,crypto-sha512)) define KernelPackage/crypto-misc TITLE:=Other CryptoAPI modules DEPENDS:=+kmod-crypto-manager KCONFIG:= \ CONFIG_CRYPTO_ANUBIS \ CONFIG_CRYPTO_BLOWFISH \ CONFIG_CRYPTO_CAMELLIA \ CONFIG_CRYPTO_CAST5 \ CONFIG_CRYPTO_CAST6 \ CONFIG_CRYPTO_FCRYPT \ CONFIG_CRYPTO_KHAZAD \ CONFIG_CRYPTO_SERPENT \ CONFIG_CRYPTO_TEA \ CONFIG_CRYPTO_TGR192 \ CONFIG_CRYPTO_TWOFISH \ CONFIG_CRYPTO_TWOFISH_COMMON \ CONFIG_CRYPTO_TWOFISH_586 \ CONFIG_CRYPTO_WP512 FILES:= \ $(LINUX_DIR)/crypto/anubis.ko \ $(LINUX_DIR)/crypto/camellia_generic.ko \ $(LINUX_DIR)/crypto/cast_common.ko \ $(LINUX_DIR)/crypto/cast5_generic.ko \ $(LINUX_DIR)/crypto/cast6_generic.ko \ $(LINUX_DIR)/crypto/khazad.ko \ $(LINUX_DIR)/crypto/tea.ko \ $(LINUX_DIR)/crypto/tgr192.ko \ $(LINUX_DIR)/crypto/twofish_common.ko \ $(LINUX_DIR)/crypto/wp512.ko \ $(LINUX_DIR)/crypto/twofish_generic.ko \ $(LINUX_DIR)/crypto/blowfish_common.ko \ $(LINUX_DIR)/crypto/blowfish_generic.ko \ $(LINUX_DIR)/crypto/serpent_generic.ko $(call AddDepends/crypto) endef ifndef CONFIG_TARGET_x86_64 define KernelPackage/crypto-misc/x86 FILES+=$(LINUX_DIR)/arch/x86/crypto/twofish-i586.ko endef endif $(eval $(call KernelPackage,crypto-misc)) define KernelPackage/crypto-null TITLE:=Null CryptoAPI module KCONFIG:=CONFIG_CRYPTO_NULL FILES:=$(LINUX_DIR)/crypto/crypto_null.ko AUTOLOAD:=$(call AutoLoad,09,crypto_null) $(call AddDepends/crypto, +kmod-crypto-hash) endef $(eval $(call KernelPackage,crypto-null)) define KernelPackage/crypto-test TITLE:=Test CryptoAPI module KCONFIG:=CONFIG_CRYPTO_TEST FILES:=$(LINUX_DIR)/crypto/tcrypt.ko $(call AddDepends/crypto,+kmod-crypto-manager) endef $(eval $(call KernelPackage,crypto-test)) define KernelPackage/crypto-xts TITLE:=XTS cipher CryptoAPI module DEPENDS:=+kmod-crypto-gf128 +kmod-crypto-manager KCONFIG:=CONFIG_CRYPTO_XTS FILES:=$(LINUX_DIR)/crypto/xts.ko AUTOLOAD:=$(call AutoLoad,09,xts) $(call AddDepends/crypto) endef $(eval $(call KernelPackage,crypto-xts)) 62' href='#n362'>362 363
--- a/src/lvm.c
+++ b/src/lvm.c
@@ -31,6 +31,9 @@
/* limit for table tag-method chains (to avoid loops) */
#define MAXTAGLOOP 100
+#ifdef __GNUC__
+#define COMPUTED_GOTO 1
+#endif
/*
* If 'obj' is a string, it is tried to be interpreted as a number.
@@ -566,12 +569,63 @@ static inline int arith_mode( const TVal
ARITH_OP1_END
#endif
+#ifdef COMPUTED_GOTO
+#define OPCODE_TARGET(op) DO_OP_##op:
+#define CALL_OPCODE(op) goto *opcodes[op];
+#define OPCODE_PTR(op) [OP_##op] = &&DO_OP_##op
+#else
+#define OPCODE_TARGET(op) case OP_##op:
+#define CALL_OPCODE(op) switch (op)
+#endif
+
void luaV_execute (lua_State *L, int nexeccalls) {
LClosure *cl;
StkId base;
TValue *k;
const Instruction *pc;
+#ifdef COMPUTED_GOTO
+ static const void *opcodes[] = {
+ OPCODE_PTR(MOVE),
+ OPCODE_PTR(LOADK),
+ OPCODE_PTR(LOADBOOL),
+ OPCODE_PTR(LOADNIL),
+ OPCODE_PTR(GETUPVAL),
+ OPCODE_PTR(GETGLOBAL),
+ OPCODE_PTR(GETTABLE),
+ OPCODE_PTR(SETGLOBAL),
+ OPCODE_PTR(SETUPVAL),
+ OPCODE_PTR(SETTABLE),
+ OPCODE_PTR(NEWTABLE),
+ OPCODE_PTR(SELF),
+ OPCODE_PTR(ADD),
+ OPCODE_PTR(SUB),
+ OPCODE_PTR(MUL),
+ OPCODE_PTR(DIV),
+ OPCODE_PTR(MOD),
+ OPCODE_PTR(POW),
+ OPCODE_PTR(UNM),
+ OPCODE_PTR(NOT),
+ OPCODE_PTR(LEN),
+ OPCODE_PTR(CONCAT),
+ OPCODE_PTR(JMP),
+ OPCODE_PTR(EQ),
+ OPCODE_PTR(LT),
+ OPCODE_PTR(LE),
+ OPCODE_PTR(TEST),
+ OPCODE_PTR(TESTSET),
+ OPCODE_PTR(CALL),
+ OPCODE_PTR(TAILCALL),
+ OPCODE_PTR(RETURN),
+ OPCODE_PTR(FORLOOP),
+ OPCODE_PTR(FORPREP),
+ OPCODE_PTR(TFORLOOP),
+ OPCODE_PTR(SETLIST),
+ OPCODE_PTR(CLOSE),
+ OPCODE_PTR(CLOSURE),
+ OPCODE_PTR(VARARG)
+ };
+#endif
reentry: /* entry point */
lua_assert(isLua(L->ci));
pc = L->savedpc;
@@ -596,33 +650,33 @@ void luaV_execute (lua_State *L, int nex
lua_assert(base == L->base && L->base == L->ci->base);
lua_assert(base <= L->top && L->top <= L->stack + L->stacksize);
lua_assert(L->top == L->ci->top || luaG_checkopenop(i));
- switch (GET_OPCODE(i)) {
- case OP_MOVE: {
+ CALL_OPCODE(GET_OPCODE(i)) {
+ OPCODE_TARGET(MOVE) {
setobjs2s(L, ra, RB(i));
continue;
}
- case OP_LOADK: {
+ OPCODE_TARGET(LOADK) {
setobj2s(L, ra, KBx(i));
continue;
}
- case OP_LOADBOOL: {
+ OPCODE_TARGET(LOADBOOL) {
setbvalue(ra, GETARG_B(i));
if (GETARG_C(i)) pc++; /* skip next instruction (if C) */
continue;
}
- case OP_LOADNIL: {
+ OPCODE_TARGET(LOADNIL) {
TValue *rb = RB(i);
do {
setnilvalue(rb--);
} while (rb >= ra);
continue;
}
- case OP_GETUPVAL: {
+ OPCODE_TARGET(GETUPVAL) {
int b = GETARG_B(i);
setobj2s(L, ra, cl->upvals[b]->v);
continue;
}
- case OP_GETGLOBAL: {
+ OPCODE_TARGET(GETGLOBAL) {
TValue g;
TValue *rb = KBx(i);
sethvalue(L, &g, cl->env);
@@ -630,88 +684,88 @@ void luaV_execute (lua_State *L, int nex
Protect(luaV_gettable(L, &g, rb, ra));
continue;
}
- case OP_GETTABLE: {
+ OPCODE_TARGET(GETTABLE) {
Protect(luaV_gettable(L, RB(i), RKC(i), ra));
continue;
}
- case OP_SETGLOBAL: {
+ OPCODE_TARGET(SETGLOBAL) {
TValue g;
sethvalue(L, &g, cl->env);
lua_assert(ttisstring(KBx(i)));
Protect(luaV_settable(L, &g, KBx(i), ra));
continue;
}
- case OP_SETUPVAL: {
+ OPCODE_TARGET(SETUPVAL) {
UpVal *uv = cl->upvals[GETARG_B(i)];
setobj(L, uv->v, ra);
luaC_barrier(L, uv, ra);
continue;
}
- case OP_SETTABLE: {
+ OPCODE_TARGET(SETTABLE) {
Protect(luaV_settable(L, ra, RKB(i), RKC(i)));
continue;
}
- case OP_NEWTABLE: {
+ OPCODE_TARGET(NEWTABLE) {
int b = GETARG_B(i);
int c = GETARG_C(i);
sethvalue(L, ra, luaH_new(L, luaO_fb2int(b), luaO_fb2int(c)));
Protect(luaC_checkGC(L));
continue;
}
- case OP_SELF: {
+ OPCODE_TARGET(SELF) {
StkId rb = RB(i);
setobjs2s(L, ra+1, rb);
Protect(luaV_gettable(L, rb, RKC(i), ra));
continue;
}
- case OP_ADD: {
+ OPCODE_TARGET(ADD) {
TValue *rb = RKB(i), *rc= RKC(i);
arith_op_continue( luai_numadd, try_addint, luai_vectadd );
Protect(Arith(L, ra, rb, rc, TM_ADD)); \
continue;
}
- case OP_SUB: {
+ OPCODE_TARGET(SUB) {
TValue *rb = RKB(i), *rc= RKC(i);
arith_op_continue( luai_numsub, try_subint, luai_vectsub );
Protect(Arith(L, ra, rb, rc, TM_SUB));
continue;
}
- case OP_MUL: {
+ OPCODE_TARGET(MUL) {
TValue *rb = RKB(i), *rc= RKC(i);
arith_op_continue(luai_nummul, try_mulint, luai_vectmul);
Protect(Arith(L, ra, rb, rc, TM_MUL));
continue;
}
- case OP_DIV: {
+ OPCODE_TARGET(DIV) {
TValue *rb = RKB(i), *rc= RKC(i);
arith_op_continue(luai_numdiv, try_divint, luai_vectdiv);
Protect(Arith(L, ra, rb, rc, TM_DIV));
continue;
}
- case OP_MOD: {
+ OPCODE_TARGET(MOD) {
TValue *rb = RKB(i), *rc= RKC(i);
arith_op_continue_scalar(luai_nummod, try_modint); /* scalars only */
Protect(Arith(L, ra, rb, rc, TM_MOD));
continue;
}
- case OP_POW: {
+ OPCODE_TARGET(POW) {
TValue *rb = RKB(i), *rc= RKC(i);
arith_op_continue(luai_numpow, try_powint, luai_vectpow);
Protect(Arith(L, ra, rb, rc, TM_POW));
continue;
}
- case OP_UNM: {
+ OPCODE_TARGET(UNM) {
TValue *rb = RB(i);
arith_op1_continue(luai_numunm, try_unmint, luai_vectunm);
Protect(Arith(L, ra, rb, rb, TM_UNM));
continue;
}
- case OP_NOT: {
+ OPCODE_TARGET(NOT) {
int res = l_isfalse(RB(i)); /* next assignment may change this value */
setbvalue(ra, res);
continue;
}
- case OP_LEN: {
+ OPCODE_TARGET(LEN) {
const TValue *rb = RB(i);
switch (ttype(rb)) {
case LUA_TTABLE: {
@@ -731,18 +785,18 @@ void luaV_execute (lua_State *L, int nex
}
continue;
}
- case OP_CONCAT: {
+ OPCODE_TARGET(CONCAT) {
int b = GETARG_B(i);
int c = GETARG_C(i);
Protect(luaV_concat(L, c-b+1, c); luaC_checkGC(L));
setobjs2s(L, RA(i), base+b);
continue;
}
- case OP_JMP: {
+ OPCODE_TARGET(JMP) {
dojump(L, pc, GETARG_sBx(i));
continue;
}
- case OP_EQ: {
+ OPCODE_TARGET(EQ) {
TValue *rb = RKB(i);
TValue *rc = RKC(i);
Protect(
@@ -752,7 +806,7 @@ void luaV_execute (lua_State *L, int nex
pc++;
continue;
}
- case OP_LT: {
+ OPCODE_TARGET(LT) {
Protect(
if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i))
dojump(L, pc, GETARG_sBx(*pc));
@@ -760,7 +814,7 @@ void luaV_execute (lua_State *L, int nex
pc++;
continue;
}
- case OP_LE: {
+ OPCODE_TARGET(LE) {
Protect(
if (lessequal(L, RKB(i), RKC(i)) == GETARG_A(i))
dojump(L, pc, GETARG_sBx(*pc));
@@ -768,13 +822,13 @@ void luaV_execute (lua_State *L, int nex
pc++;
continue;
}
- case OP_TEST: {
+ OPCODE_TARGET(TEST) {
if (l_isfalse(ra) != GETARG_C(i))
dojump(L, pc, GETARG_sBx(*pc));
pc++;
continue;
}
- case OP_TESTSET: {
+ OPCODE_TARGET(TESTSET) {
TValue *rb = RB(i);
if (l_isfalse(rb) != GETARG_C(i)) {
setobjs2s(L, ra, rb);
@@ -783,7 +837,7 @@ void luaV_execute (lua_State *L, int nex
pc++;
continue;
}
- case OP_CALL: {
+ OPCODE_TARGET(CALL) {
int b = GETARG_B(i);
int nresults = GETARG_C(i) - 1;
if (b != 0) L->top = ra+b; /* else previous instruction set top */
@@ -804,7 +858,7 @@ void luaV_execute (lua_State *L, int nex
}
}
}
- case OP_TAILCALL: {
+ OPCODE_TARGET(TAILCALL) {
int b = GETARG_B(i);
if (b != 0) L->top = ra+b; /* else previous instruction set top */
L->savedpc = pc;
@@ -836,7 +890,7 @@ void luaV_execute (lua_State *L, int nex
}
}
}
- case OP_RETURN: {
+ OPCODE_TARGET(RETURN) {
int b = GETARG_B(i);
if (b != 0) L->top = ra+b-1;
if (L->openupval) luaF_close(L, base);
@@ -851,7 +905,7 @@ void luaV_execute (lua_State *L, int nex
goto reentry;
}
}
- case OP_FORLOOP: {
+ OPCODE_TARGET(FORLOOP) {
/* If start,step and limit are all integers, we don't need to check
* against overflow in the looping.
*/
@@ -879,7 +933,7 @@ void luaV_execute (lua_State *L, int nex
}
continue;
}
- case OP_FORPREP: {
+ OPCODE_TARGET(FORPREP) {
const TValue *init = ra;
const TValue *plimit = ra+1;
const TValue *pstep = ra+2;
@@ -902,7 +956,7 @@ void luaV_execute (lua_State *L, int nex
dojump(L, pc, GETARG_sBx(i));
continue;
}
- case OP_TFORLOOP: {
+ OPCODE_TARGET(TFORLOOP) {
StkId cb = ra + 3; /* call base */
setobjs2s(L, cb+2, ra+2);
setobjs2s(L, cb+1, ra+1);
@@ -918,7 +972,7 @@ void luaV_execute (lua_State *L, int nex
pc++;
continue;
}
- case OP_SETLIST: {
+ OPCODE_TARGET(SETLIST) {
int n = GETARG_B(i);
int c = GETARG_C(i);
int last;
@@ -940,11 +994,11 @@ void luaV_execute (lua_State *L, int nex
}
continue;
}
- case OP_CLOSE: {
+ OPCODE_TARGET(CLOSE) {
luaF_close(L, ra);
continue;
}
- case OP_CLOSURE: {
+ OPCODE_TARGET(CLOSURE) {
Proto *p;
Closure *ncl;
int nup, j;
@@ -964,7 +1018,7 @@ void luaV_execute (lua_State *L, int nex
Protect(luaC_checkGC(L));
continue;
}
- case OP_VARARG: {
+ OPCODE_TARGET(VARARG) {
int b = GETARG_B(i) - 1;
int j;
CallInfo *ci = L->ci;