diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-01-07 18:00:33 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-01-07 18:00:33 -0200 |
commit | f61d435a7d34a07c2edd51714ad6072916e40092 (patch) | |
tree | 4f1618078fb008b579533a661b46dba83624a42c /lvm.c | |
parent | 071b2ae0e1aba719cb3f909d2b02c79f5873ff36 (diff) | |
download | lua-f61d435a7d34a07c2edd51714ad6072916e40092.tar.gz lua-f61d435a7d34a07c2edd51714ad6072916e40092.tar.bz2 lua-f61d435a7d34a07c2edd51714ad6072916e40092.zip |
a^b calls `pow´ (from math.h) directly
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 19 |
1 files changed, 9 insertions, 10 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 2.19 2005/01/04 15:55:12 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.20 2005/01/05 18:20:51 roberto Exp roberto $ |
3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -339,14 +339,7 @@ static StkId Arith (lua_State *L, StkId ra, const TValue *rb, | |||
339 | case TM_SUB: setnvalue(ra, nvalue(b) - nvalue(c)); break; | 339 | case TM_SUB: setnvalue(ra, nvalue(b) - nvalue(c)); break; |
340 | case TM_MUL: setnvalue(ra, nvalue(b) * nvalue(c)); break; | 340 | case TM_MUL: setnvalue(ra, nvalue(b) * nvalue(c)); break; |
341 | case TM_DIV: setnvalue(ra, nvalue(b) / nvalue(c)); break; | 341 | case TM_DIV: setnvalue(ra, nvalue(b) / nvalue(c)); break; |
342 | case TM_POW: { | 342 | case TM_POW: setnvalue(ra, lua_pow(nvalue(b), nvalue(c))); break; |
343 | const TValue *f = luaH_getstr(hvalue(gt(L)), G(L)->tmname[TM_POW]); | ||
344 | if (!ttisfunction(f)) | ||
345 | luaG_runerror(L, "`__pow' (`^' operator) is not a function"); | ||
346 | prepTMcall(L, f, b, c); | ||
347 | callTMres(L, ra); | ||
348 | break; | ||
349 | } | ||
350 | default: lua_assert(0); break; | 343 | default: lua_assert(0); break; |
351 | } | 344 | } |
352 | } | 345 | } |
@@ -515,7 +508,13 @@ StkId luaV_execute (lua_State *L, int nexeccalls) { | |||
515 | continue; | 508 | continue; |
516 | } | 509 | } |
517 | case OP_POW: { | 510 | case OP_POW: { |
518 | base = Arith(L, ra, RKB(i), RKC(i), TM_POW, pc); /***/ | 511 | TValue *rb = RKB(i); |
512 | TValue *rc = RKC(i); | ||
513 | if (ttisnumber(rb) && ttisnumber(rc)) { | ||
514 | setnvalue(ra, lua_pow(nvalue(rb), nvalue(rc))); | ||
515 | } | ||
516 | else | ||
517 | base = Arith(L, ra, rb, rc, TM_POW, pc); /***/ | ||
519 | continue; | 518 | continue; |
520 | } | 519 | } |
521 | case OP_UNM: { | 520 | case OP_UNM: { |