summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-04-29 14:12:50 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-04-29 14:12:50 -0300
commit88bf2f83c035e612db103d7138a8312c455e4c88 (patch)
treee11d49feacbe6c78d5f07d621878852590813915
parent8fff05f6d00802fa47614d681f1c7a17694856e8 (diff)
downloadlua-88bf2f83c035e612db103d7138a8312c455e4c88.tar.gz
lua-88bf2f83c035e612db103d7138a8312c455e4c88.tar.bz2
lua-88bf2f83c035e612db103d7138a8312c455e4c88.zip
new function 'tointeger' + 'luaV_arith' replaced by 'luaT_trybinTM'
-rw-r--r--lapi.c66
-rw-r--r--ltable.c17
-rw-r--r--lvm.c78
-rw-r--r--lvm.h9
4 files changed, 70 insertions, 100 deletions
diff --git a/lapi.c b/lapi.c
index 7ad8817d..e870afd2 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 2.176 2013/04/26 16:03:50 roberto Exp roberto $ 2** $Id: lapi.c,v 2.177 2013/04/26 19:51:17 roberto Exp roberto $
3** Lua API 3** Lua API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -311,10 +311,9 @@ LUA_API void lua_arith (lua_State *L, int op) {
311 o1 = L->top - 2; 311 o1 = L->top - 2;
312 o2 = L->top - 1; 312 o2 = L->top - 1;
313 if (tonumber(o1, &n1) && tonumber(o2, &n2)) { 313 if (tonumber(o1, &n1) && tonumber(o2, &n2)) {
314 setnvalue(o1, luaO_arith(op, n1, n2)); 314 setnvalue(o1, luaO_numarith(op, n1, n2));
315 } 315 }
316 else 316 else luaT_trybinTM(L, o1, o2, o1, cast(TMS, op - LUA_OPADD + TM_ADD));
317 luaV_arith(L, o1, o1, o2, cast(TMS, op - LUA_OPADD + TM_ADD));
318 L->top--; 317 L->top--;
319 lua_unlock(L); 318 lua_unlock(L);
320} 319}
@@ -339,53 +338,30 @@ LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) {
339} 338}
340 339
341 340
342LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *isnum) { 341LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *pisnum) {
343 lua_Number n; 342 lua_Number n;
344 const TValue *o = index2addr(L, idx); 343 const TValue *o = index2addr(L, idx);
345 if (tonumber(o, &n)) { 344 int isnum = tonumber(o, &n);
346 if (isnum) *isnum = 1; 345 if (!isnum)
347 return n; 346 n = 0; /* call to 'tonumber' may change 'n' even if it fails */
348 } 347 if (pisnum) *pisnum = isnum;
349 else { 348 return n;
350 if (isnum) *isnum = 0;
351 return 0;
352 }
353} 349}
354 350
355 351
356LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *isnum) { 352LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *pisnum) {
357 lua_Number n; 353 lua_Integer res;
358 const TValue *o = index2addr(L, idx); 354 const TValue *o = index2addr(L, idx);
359 if (ttisinteger(o)) { 355 int isnum = tointeger(o, &res);
360 if (isnum) *isnum = 1; 356 if (!isnum)
361 return ivalue(o); 357 res = 0; /* call to 'tointeger' may change 'n' even if it fails */
362 } 358 if (pisnum) *pisnum = isnum;
363 else if (tonumber(o, &n)) { 359 return res;
364 lua_Integer res;
365 lua_number2integer(res, n);
366 if (isnum) *isnum = 1;
367 return res;
368 }
369 else {
370 if (isnum) *isnum = 0;
371 return 0;
372 }
373} 360}
374 361
375 362
376LUA_API lua_Unsigned lua_tounsignedx (lua_State *L, int idx, int *isnum) { 363LUA_API lua_Unsigned lua_tounsignedx (lua_State *L, int idx, int *pisnum) {
377 lua_Number n; 364 return lua_tointegerx(L, idx, pisnum); /* at least for now... <<<< */
378 const TValue *o = index2addr(L, idx);
379 if (tonumber(o, &n)) {
380 lua_Unsigned res;
381 lua_number2unsigned(res, n);
382 if (isnum) *isnum = 1;
383 return res;
384 }
385 else {
386 if (isnum) *isnum = 0;
387 return 0;
388 }
389} 365}
390 366
391 367
@@ -491,17 +467,15 @@ LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
491 467
492LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { 468LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {
493 lua_lock(L); 469 lua_lock(L);
494 setivalue(L->top, cast_num(n)); 470 setivalue(L->top, n);
495 api_incr_top(L); 471 api_incr_top(L);
496 lua_unlock(L); 472 lua_unlock(L);
497} 473}
498 474
499 475
500LUA_API void lua_pushunsigned (lua_State *L, lua_Unsigned u) { 476LUA_API void lua_pushunsigned (lua_State *L, lua_Unsigned u) {
501 lua_Number n;
502 lua_lock(L); 477 lua_lock(L);
503 n = lua_unsigned2number(u); 478 setivalue(L->top, cast_integer(u));
504 setnvalue(L->top, n);
505 api_incr_top(L); 479 api_incr_top(L);
506 lua_unlock(L); 480 lua_unlock(L);
507} 481}
diff --git a/ltable.c b/ltable.c
index 00906642..2e95ce26 100644
--- a/ltable.c
+++ b/ltable.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltable.c,v 2.73 2013/04/15 15:44:46 roberto Exp roberto $ 2** $Id: ltable.c,v 2.74 2013/04/26 15:39:25 roberto Exp roberto $
3** Lua tables (hash) 3** Lua tables (hash)
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -123,17 +123,6 @@ static Node *mainposition (const Table *t, const TValue *key) {
123} 123}
124 124
125 125
126static int numisint (lua_Number n, lua_Integer *p) {
127 lua_Integer k;
128 lua_number2integer(k, n);
129 if (luai_numeq(cast_num(k), n)) { /* 'k' is int? */
130 *p = k;
131 return 1;
132 }
133 return 0;
134}
135
136
137/* 126/*
138** returns the index for `key' if `key' is an appropriate key to live in 127** returns the index for `key' if `key' is an appropriate key to live in
139** the array part of the table, -1 otherwise. 128** the array part of the table, -1 otherwise.
@@ -423,7 +412,7 @@ TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) {
423 lua_Integer k; 412 lua_Integer k;
424 if (luai_numisnan(L, n)) 413 if (luai_numisnan(L, n))
425 luaG_runerror(L, "table index is NaN"); 414 luaG_runerror(L, "table index is NaN");
426 if (numisint(n, &k)) { /* index is int? */ 415 if (luaV_numtointeger(n, &k)) { /* index is int? */
427 setivalue(&aux, k); 416 setivalue(&aux, k);
428 key = &aux; /* insert it as an integer */ 417 key = &aux; /* insert it as an integer */
429 } 418 }
@@ -505,7 +494,7 @@ const TValue *luaH_get (Table *t, const TValue *key) {
505 case LUA_TNIL: return luaO_nilobject; 494 case LUA_TNIL: return luaO_nilobject;
506 case LUA_TNUMFLT: { 495 case LUA_TNUMFLT: {
507 lua_Integer k; 496 lua_Integer k;
508 if (numisint(fltvalue(key), &k)) /* index is int? */ 497 if (luaV_numtointeger(fltvalue(key), &k)) /* index is int? */
509 return luaH_getint(t, k); /* use specialized version */ 498 return luaH_getint(t, k); /* use specialized version */
510 /* else go through */ 499 /* else go through */
511 } 500 }
diff --git a/lvm.c b/lvm.c
index 815c864a..4f32a3e0 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.165 2013/04/26 16:06:53 roberto Exp roberto $ 2** $Id: lvm.c,v 2.166 2013/04/26 19:51:17 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*/
@@ -56,6 +56,28 @@ int luaV_tostring (lua_State *L, StkId obj) {
56} 56}
57 57
58 58
59int luaV_numtointeger (lua_Number n, lua_Integer *p) {
60 lua_Integer k;
61 lua_number2integer(k, n);
62 if (luai_numeq(cast_num(k), n)) { /* 'k' is int? */
63 *p = k;
64 return 1;
65 }
66 return 0;
67}
68
69
70int luaV_tointeger_ (const TValue *obj, lua_Integer *p) {
71 lua_Number n;
72 lua_assert(!ttisinteger(obj));
73 if (tonumber(obj, &n)) {
74 n = l_mathop(floor)(n);
75 return luaV_numtointeger(n, p);
76 }
77 else return 0;
78}
79
80
59void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { 81void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) {
60 int loop; 82 int loop;
61 for (loop = 0; loop < MAXTAGLOOP; loop++) { 83 for (loop = 0; loop < MAXTAGLOOP; loop++) {
@@ -225,10 +247,8 @@ void luaV_concat (lua_State *L, int total) {
225 do { 247 do {
226 StkId top = L->top; 248 StkId top = L->top;
227 int n = 2; /* number of elements handled in this pass (at least 2) */ 249 int n = 2; /* number of elements handled in this pass (at least 2) */
228 if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) { 250 if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1))
229 if (!luaT_callbinTM(L, top-2, top-1, top-2, TM_CONCAT)) 251 luaT_trybinTM(L, top-2, top-1, top-2, TM_CONCAT);
230 luaG_concaterror(L, top-2, top-1);
231 }
232 else if (tsvalue(top-1)->len == 0) /* second operand is empty? */ 252 else if (tsvalue(top-1)->len == 0) /* second operand is empty? */
233 (void)tostring(L, top - 2); /* result is first operand */ 253 (void)tostring(L, top - 2); /* result is first operand */
234 else if (ttisstring(top-2) && tsvalue(top-2)->len == 0) { 254 else if (ttisstring(top-2) && tsvalue(top-2)->len == 0) {
@@ -335,18 +355,6 @@ lua_Integer luaV_pow (lua_Integer x, lua_Integer y) {
335} 355}
336 356
337 357
338void luaV_arith (lua_State *L, StkId ra, const TValue *rb,
339 const TValue *rc, TMS op) {
340 lua_Number b, c;
341 if (tonumber(rb, &b) && tonumber(rc, &c)) {
342 lua_Number res = luaO_arith(op - TM_ADD + LUA_OPADD, b, c);
343 setnvalue(ra, res);
344 }
345 else if (!luaT_callbinTM(L, rb, rc, ra, op))
346 luaG_aritherror(L, rb, rc);
347}
348
349
350/* 358/*
351** check whether cached closure in prototype 'p' may be reused, that is, 359** check whether cached closure in prototype 'p' may be reused, that is,
352** whether there is a cached closure with the same upvalues needed by 360** whether there is a cached closure with the same upvalues needed by
@@ -422,7 +430,7 @@ void luaV_finishOp (lua_State *L) {
422 break; 430 break;
423 } 431 }
424 case OP_CONCAT: { 432 case OP_CONCAT: {
425 StkId top = L->top - 1; /* top when 'luaT_callbinTM' was called */ 433 StkId top = L->top - 1; /* top when 'luaT_trybinTM' was called */
426 int b = GETARG_B(inst); /* first element to concatenate */ 434 int b = GETARG_B(inst); /* first element to concatenate */
427 int total = cast_int(top - 1 - (base + b)); /* yet to concatenate */ 435 int total = cast_int(top - 1 - (base + b)); /* yet to concatenate */
428 setobj2s(L, top - 2, top); /* put TM result in proper position */ 436 setobj2s(L, top - 2, top); /* put TM result in proper position */
@@ -586,12 +594,12 @@ void luaV_execute (lua_State *L) {
586 lua_Number nb; lua_Number nc; 594 lua_Number nb; lua_Number nc;
587 if (ttisinteger(rb) && ttisinteger(rc)) { 595 if (ttisinteger(rb) && ttisinteger(rc)) {
588 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 596 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
589 setivalue(ra, ib + ic); 597 setivalue(ra, cast_integer(cast_unsigned(ib) + cast_unsigned(ic)));
590 } 598 }
591 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 599 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
592 setnvalue(ra, luai_numadd(L, nb, nc)); 600 setnvalue(ra, luai_numadd(L, nb, nc));
593 } 601 }
594 else { Protect(luaV_arith(L, ra, rb, rc, TM_ADD)); } 602 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); }
595 ) 603 )
596 vmcase(OP_SUB, 604 vmcase(OP_SUB,
597 TValue *rb = RKB(i); 605 TValue *rb = RKB(i);
@@ -599,12 +607,12 @@ void luaV_execute (lua_State *L) {
599 lua_Number nb; lua_Number nc; 607 lua_Number nb; lua_Number nc;
600 if (ttisinteger(rb) && ttisinteger(rc)) { 608 if (ttisinteger(rb) && ttisinteger(rc)) {
601 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 609 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
602 setivalue(ra, ib - ic); 610 setivalue(ra, cast_integer(cast_unsigned(ib) - cast_unsigned(ic)));
603 } 611 }
604 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 612 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
605 setnvalue(ra, luai_numsub(L, nb, nc)); 613 setnvalue(ra, luai_numsub(L, nb, nc));
606 } 614 }
607 else { Protect(luaV_arith(L, ra, rb, rc, TM_SUB)); } 615 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SUB)); }
608 ) 616 )
609 vmcase(OP_MUL, 617 vmcase(OP_MUL,
610 TValue *rb = RKB(i); 618 TValue *rb = RKB(i);
@@ -612,12 +620,12 @@ void luaV_execute (lua_State *L) {
612 lua_Number nb; lua_Number nc; 620 lua_Number nb; lua_Number nc;
613 if (ttisinteger(rb) && ttisinteger(rc)) { 621 if (ttisinteger(rb) && ttisinteger(rc)) {
614 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); 622 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
615 setivalue(ra, ib * ic); 623 setivalue(ra, cast_integer(cast_unsigned(ib) * cast_unsigned(ic)));
616 } 624 }
617 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 625 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
618 setnvalue(ra, luai_nummul(L, nb, nc)); 626 setnvalue(ra, luai_nummul(L, nb, nc));
619 } 627 }
620 else { Protect(luaV_arith(L, ra, rb, rc, TM_MUL)); } 628 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MUL)); }
621 ) 629 )
622 vmcase(OP_DIV, /* float division (always with floats) */ 630 vmcase(OP_DIV, /* float division (always with floats) */
623 TValue *rb = RKB(i); 631 TValue *rb = RKB(i);
@@ -626,20 +634,16 @@ void luaV_execute (lua_State *L) {
626 if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 634 if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
627 setnvalue(ra, luai_numdiv(L, nb, nc)); 635 setnvalue(ra, luai_numdiv(L, nb, nc));
628 } 636 }
629 else { Protect(luaV_arith(L, ra, rb, rc, TM_DIV)); } 637 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV)); }
630 ) 638 )
631 vmcase(OP_IDIV, /* integer division */ 639 vmcase(OP_IDIV, /* integer division */
632 TValue *rb = RKB(i); 640 TValue *rb = RKB(i);
633 TValue *rc = RKC(i); 641 TValue *rc = RKC(i);
634 lua_Number nb; lua_Number nc; 642 lua_Integer ib; lua_Integer ic;
635 if (ttisinteger(rb) && ttisinteger(rc)) { 643 if (tointeger(rb, &ib) && tointeger(rc, &ic)) {
636 lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc);
637 setivalue(ra, luaV_div(L, ib, ic)); 644 setivalue(ra, luaV_div(L, ib, ic));
638 } 645 }
639 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 646 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_IDIV)); }
640 setnvalue(ra, luai_numidiv(L, nb, nc));
641 }
642 else { Protect(luaV_arith(L, ra, rb, rc, TM_IDIV)); }
643 ) 647 )
644 vmcase(OP_MOD, 648 vmcase(OP_MOD,
645 TValue *rb = RKB(i); 649 TValue *rb = RKB(i);
@@ -652,7 +656,7 @@ void luaV_execute (lua_State *L) {
652 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 656 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
653 setnvalue(ra, luai_nummod(L, nb, nc)); 657 setnvalue(ra, luai_nummod(L, nb, nc));
654 } 658 }
655 else { Protect(luaV_arith(L, ra, rb, rc, TM_MOD)); } 659 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MOD)); }
656 ) 660 )
657 vmcase(OP_POW, 661 vmcase(OP_POW,
658 TValue *rb = RKB(i); 662 TValue *rb = RKB(i);
@@ -667,20 +671,20 @@ void luaV_execute (lua_State *L) {
667 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { 671 else if (tonumber(rb, &nb) && tonumber(rc, &nc)) {
668 setnvalue(ra, luai_numpow(L, nb, nc)); 672 setnvalue(ra, luai_numpow(L, nb, nc));
669 } 673 }
670 else { Protect(luaV_arith(L, ra, rb, rc, TM_POW)); } 674 else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); }
671 ) 675 )
672 vmcase(OP_UNM, 676 vmcase(OP_UNM,
673 TValue *rb = RB(i); 677 TValue *rb = RB(i);
678 lua_Number nb;
674 if (ttisinteger(rb)) { 679 if (ttisinteger(rb)) {
675 lua_Integer ib = ivalue(rb); 680 lua_Integer ib = ivalue(rb);
676 setivalue(ra, -ib); 681 setivalue(ra, -ib);
677 } 682 }
678 else if (ttisfloat(rb)) { 683 else if (tonumber(rb, &nb)) {
679 lua_Number nb = fltvalue(rb);
680 setnvalue(ra, luai_numunm(L, nb)); 684 setnvalue(ra, luai_numunm(L, nb));
681 } 685 }
682 else { 686 else {
683 Protect(luaV_arith(L, ra, rb, rb, TM_UNM)); 687 Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM));
684 } 688 }
685 ) 689 )
686 vmcase(OP_NOT, 690 vmcase(OP_NOT,
diff --git a/lvm.h b/lvm.h
index 9d0d66ca..591c94ec 100644
--- a/lvm.h
+++ b/lvm.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.h,v 2.20 2013/04/25 19:12:41 roberto Exp roberto $ 2** $Id: lvm.h,v 2.21 2013/04/26 16:03:50 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*/
@@ -18,6 +18,9 @@
18#define tonumber(o,n) \ 18#define tonumber(o,n) \
19 (ttisfloat(o) ? (*(n) = fltvalue(o), 1) : luaV_tonumber_(o,n)) 19 (ttisfloat(o) ? (*(n) = fltvalue(o), 1) : luaV_tonumber_(o,n))
20 20
21#define tointeger(o,i) \
22 (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointeger_(o,i))
23
21 24
22#define luaV_rawequalobj(t1,t2) luaV_equalobj(NULL,t1,t2) 25#define luaV_rawequalobj(t1,t2) luaV_equalobj(NULL,t1,t2)
23 26
@@ -26,6 +29,8 @@ LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2);
26LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r); 29LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r);
27LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r); 30LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r);
28LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n); 31LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n);
32LUAI_FUNC int luaV_tointeger_ (const TValue *obj, lua_Integer *p);
33LUAI_FUNC int luaV_numtointeger (lua_Number n, lua_Integer *p);
29LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj); 34LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj);
30LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key, 35LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key,
31 StkId val); 36 StkId val);
@@ -37,8 +42,6 @@ LUAI_FUNC void luaV_concat (lua_State *L, int total);
37LUAI_FUNC lua_Integer luaV_div (lua_State *L, lua_Integer x, lua_Integer y); 42LUAI_FUNC lua_Integer luaV_div (lua_State *L, lua_Integer x, lua_Integer y);
38LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y); 43LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y);
39LUAI_FUNC lua_Integer luaV_pow (lua_Integer x, lua_Integer y); 44LUAI_FUNC lua_Integer luaV_pow (lua_Integer x, lua_Integer y);
40LUAI_FUNC void luaV_arith (lua_State *L, StkId ra, const TValue *rb,
41 const TValue *rc, TMS op);
42LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb); 45LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb);
43 46
44#endif 47#endif