opcode.c 代碼分析
Lua1.0 虛擬機的實現,語法分析中生成的字節碼交給它 lua_execute 來執行。
這個文件的主要部分就是 lua_execute 函數,而它就是很大的 switch case,Lua1.0 中定義的字節碼有多少種,這裏就有多少個相對應的 case 語句。這個函數再也不詳細分析,由於 Lua1.0 生成的字節碼在很差打印出來,或者在調試的時候能打印出來,但很很差看。到 Lua1.1 裏就有比較好看的字節碼的輸出格式,到時候,看下輸出的字節碼就清楚多了。
數組
/* ** Concatenate two given string, creating a mark space at the beginning. ** Return the new string pointer. */ static char *lua_strconc (char *l, char *r) { char *s = calloc (strlen(l)+strlen(r)+2, sizeof(char)); if (s == NULL) { lua_error ("not enough memory"); return NULL; } *s++ = 0; /* create mark space */ return strcat(strcpy(s,l),r); }
鏈接兩個字符串,在開頭空出一個標記位。
函數
/* ** Duplicate a string, creating a mark space at the beginning. ** Return the new string pointer. */ char *lua_strdup (char *l) { char *s = calloc (strlen(l)+2, sizeof(char)); if (s == NULL) { lua_error ("not enough memory"); return NULL; } *s++ = 0; /* create mark space */ return strcpy(s,l); }
拷貝字符串,開頭空一個標記位。
lua
/* ** Convert, if possible, to a number tag. ** Return 0 in success or not 0 on error. */ static int lua_tonumber (Object *obj) { char *ptr; if (tag(obj) != T_STRING) { lua_reportbug ("unexpected type at conversion to number"); return 1; } nvalue(obj) = strtod(svalue(obj), &ptr); if (*ptr) { lua_reportbug ("string to number convertion failed"); return 2; } tag(obj) = T_NUMBER; return 0; }
把 Object 轉化爲數值,這裏只有字符串能夠轉化,轉化後改變 Object 的類型標籤和值。
若是成功,返回0,不然返回其它。
static Object *lua_convtonumber (Object *obj)
判斷是否能夠轉化爲數值型,若是能夠,返回轉化後的 Object, 若是不能夠,返回空。
static int lua_tostring (Object *obj)
把 Object 轉化爲字符串類型,這裏只有數值才能夠轉化,轉化後改變 Object 的類型標籤和值。
若是成功,返回0,不然返回其它。
void lua_markstack (void)
標記棧中全部的字符串和數組。
int lua_dofile (char *filename)
給定文件名,打開文件,語法分析(語法分析若是成功分析完成後,會 lua_execute 執行。
int lua_dostring (char *string)
和上面的差很少,只不過這裏直接分析就是字符串。
int lua_call (char *functionname, int nparam)
給定函數名和參數個數,執行相應的字節碼。
Object *lua_getparam (int number)
返回參數,若是要返回第一個參數則應傳入1
real lua_getnumber (Object *object)
返回給定 Object 的數值,若是出錯的話,返回 0.0 。
char *lua_getstring (Object *object)
和上面的相似,只不過這裏返回的是字符串。
char *lua_copystring (Object *object)
和上面的相似,這裏返回的是它的一個拷貝。
lua_CFunction lua_getcfunction (Object *object)
返回給定 Object 的 函數指針,若是出錯,返回空。
void *lua_getuserdata (Object *object)
和上面的相似
Object *lua_getfield (Object *object, char *field)
給定數組和引用,返回相應的 Object.
Object *lua_getindexed (Object *object, float index)
同上,這裏傳入的是下標。
Object *lua_getglobal (char *name)
返回給定名字的全局對象,若是沒有,返回空。
Object *lua_pop (void)
對象出棧
int lua_pushnil (void)
空對象筆記本
int lua_pushnumber (real n)
number 入棧
int lua_pushstring (char *s)
int lua_pushcfunction (lua_CFunction fn)
int lua_pushuserdata (void *u)
int lua_pushobject (Object *o)
int lua_storeglobal (char *name)
int lua_storefield (lua_Object object, char *field)
int lua_storeindexed (lua_Object object, float index)
和上面的差很少,除了類型不同。和數據的傳輸方向不同,這裏是設置,上面是返回。
int lua_isnil (Object *object)
int lua_isnumber (Object *object)
int lua_isstring (Object *object)
int lua_istable (Object *object)
int lua_iscfunction (Object *object)
int lua_isuserdata (Object *object)
檢查對象是不是指定的類型。
void lua_type (void)
返回對象的類型。
void lua_obj2number (void)
對象轉化爲數值。
void lua_print (void)
打印對象值。
spa