From 894cd31c5227fd4061f6eb2bd6140c540946d394 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Tue, 9 Aug 2005 14:42:02 -0300 Subject: [PATCH] #string is primitive --- lstrlib.c | 4 +--- lvm.c | 25 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/lstrlib.c b/lstrlib.c index 4a99d4d2..a80a00ba 100644 --- a/lstrlib.c +++ b/lstrlib.c @@ -1,5 +1,5 @@ /* -** $Id: lstrlib.c,v 1.119 2005/07/12 14:32:08 roberto Exp $ +** $Id: lstrlib.c,v 1.120 2005/07/31 16:47:34 roberto Exp roberto $ ** Standard library for string operations and pattern-matching ** See Copyright Notice in lua.h */ @@ -810,8 +810,6 @@ static void createmetatable (lua_State *L) { lua_pop(L, 1); /* pop dummy string */ lua_pushvalue(L, -2); /* string library... */ lua_setfield(L, -2, "__index"); /* ...is the __index metamethod */ - lua_getfield(L, -2, "len"); - lua_setfield(L, -2, "__len"); lua_pop(L, 1); /* pop metatable */ } diff --git a/lvm.c b/lvm.c index adc9019a..037d696e 100644 --- a/lvm.c +++ b/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 2.47 2005/06/13 14:15:22 roberto Exp roberto $ +** $Id: lvm.c,v 2.48 2005/07/05 14:31:20 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -548,14 +548,21 @@ StkId luaV_execute (lua_State *L, int nexeccalls) { } case OP_LEN: { const TValue *rb = RB(i); - if (ttype(rb) == LUA_TTABLE) { - setnvalue(ra, cast(lua_Number, luaH_getn(hvalue(rb)))); - } - else { /* try metamethod */ - Protect( - if (!call_binTM(L, rb, &luaO_nilobject, ra, TM_LEN)) - luaG_typeerror(L, rb, "get length of"); - ) + switch (ttype(rb)) { + case LUA_TTABLE: { + setnvalue(ra, cast(lua_Number, luaH_getn(hvalue(rb)))); + break; + } + case LUA_TSTRING: { + setnvalue(ra, cast(lua_Number, tsvalue(rb)->len)); + break; + } + default: { /* try metamethod */ + Protect( + if (!call_binTM(L, rb, &luaO_nilobject, ra, TM_LEN)) + luaG_typeerror(L, rb, "get length of"); + ) + } } continue; }