aboutsummaryrefslogtreecommitdiff
path: root/opcode.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-02-11 09:40:01 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-02-11 09:40:01 -0200
commit205ee1ec84c0f0e9c2df923fdcfa29207e8e72b3 (patch)
tree1e2683e673e5fbf2230343df4faac3b252eee38c /opcode.c
parentb48847c5fac055f0d6120029f6fe1a50c852a8ac (diff)
downloadlua-205ee1ec84c0f0e9c2df923fdcfa29207e8e72b3.tar.gz
lua-205ee1ec84c0f0e9c2df923fdcfa29207e8e72b3.tar.bz2
lua-205ee1ec84c0f0e9c2df923fdcfa29207e8e72b3.zip
userdata can handle arbitrary binary data;
user tag is stored with data;
Diffstat (limited to 'opcode.c')
-rw-r--r--opcode.c46
1 files changed, 36 insertions, 10 deletions
diff --git a/opcode.c b/opcode.c
index 5c03d7b5..281cf1bb 100644
--- a/opcode.c
+++ b/opcode.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_opcode="$Id: opcode.c,v 3.78 1996/11/22 13:08:28 roberto Exp roberto $"; 6char *rcs_opcode="$Id: opcode.c,v 3.79 1997/01/31 14:27:11 roberto Exp roberto $";
7 7
8#include <setjmp.h> 8#include <setjmp.h>
9#include <stdio.h> 9#include <stdio.h>
@@ -709,6 +709,20 @@ char *lua_getstring (lua_Object object)
709 else return (svalue(Address(object))); 709 else return (svalue(Address(object)));
710} 710}
711 711
712void *lua_getbinarydata (lua_Object object)
713{
714 if (object == LUA_NOOBJECT || tag(Address(object)) != LUA_T_USERDATA)
715 lua_error("getbinarydata: object is not binary data");
716 return svalue(Address(object));
717}
718
719int lua_getbindatasize (lua_Object object)
720{
721 if (object == LUA_NOOBJECT || tag(Address(object)) != LUA_T_USERDATA)
722 return 0;
723 else return (Address(object))->value.ts->size;
724}
725
712/* 726/*
713** Given an object handle, return its cfuntion pointer. On error, return NULL. 727** Given an object handle, return its cfuntion pointer. On error, return NULL.
714*/ 728*/
@@ -725,9 +739,7 @@ lua_CFunction lua_getcfunction (lua_Object object)
725*/ 739*/
726void *lua_getuserdata (lua_Object object) 740void *lua_getuserdata (lua_Object object)
727{ 741{
728 if (object == LUA_NOOBJECT || tag(Address(object)) < LUA_T_USERDATA) 742 return *(void **)lua_getbinarydata(object);
729 return NULL;
730 else return (uvalue(Address(object)));
731} 743}
732 744
733 745
@@ -825,15 +837,25 @@ void lua_pushcfunction (lua_CFunction fn)
825 incr_top; 837 incr_top;
826} 838}
827 839
840void lua_pushbinarydata (void *buff, int size, int tag)
841{
842 if (buff == NULL)
843 tag(top) = LUA_T_NIL;
844 else {
845 tsvalue(top) = luaI_createuserdata(buff, size, tag);
846 tag(top) = LUA_T_USERDATA;
847 }
848 incr_top;
849}
850
828/* 851/*
829** Push an object (tag=userdata) to stack. 852** Push an object (tag=userdata) to stack.
830*/ 853*/
831void lua_pushusertag (void *u, int tag) 854void lua_pushusertag (void *u, int tag)
832{ 855{
833 if (tag < LUA_T_USERDATA) 856 if (tag < LUA_T_USERDATA)
834 lua_error("invalid tag in `lua_pushusertag'"); 857 lua_error("invalid tag in `lua_pushusertag'");
835 tag(top) = tag; uvalue(top) = u; 858 lua_pushbinarydata(&u, sizeof(void *), tag);
836 incr_top;
837} 859}
838 860
839/* 861/*
@@ -862,8 +884,12 @@ int lua_type (lua_Object o)
862{ 884{
863 if (o == LUA_NOOBJECT) 885 if (o == LUA_NOOBJECT)
864 return LUA_T_NIL; 886 return LUA_T_NIL;
865 else 887 else {
866 return tag(Address(o)); 888 lua_Type t = tag(Address(o));
889 if (t == LUA_T_USERDATA)
890 return (Address(o))->value.ts->tag;
891 else return tag(Address(o));
892 }
867} 893}
868 894
869 895