Lua Bindings For Node.JS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

70 lines
2.0 KiB

#include <stdlib.h>
#include "utils.h"
char * get_str(v8::Local<v8::Value> val){
if(!val->IsString()){
v8::ThrowException(v8::Exception::TypeError(v8::String::New("Argument Must Be A String")));
return NULL;
}
v8::String::AsciiValue val_string(val);
char * val_char_ptr = (char *) malloc(val_string.length() + 1);
strcpy(val_char_ptr, *val_string);
return val_char_ptr;
}
v8::Local<v8::Value> lua_to_value(lua_State* L, int i){
switch(lua_type(L, i)){
case LUA_TBOOLEAN:
return v8::Local<v8::Boolean>::New(v8::Boolean::New((int)lua_toboolean(L, i)));
break;
case LUA_TNUMBER:
return v8::Local<v8::Number>::New(v8::Number::New(lua_tonumber(L, i)));
break;
case LUA_TSTRING:
return v8::String::New((char *)lua_tostring(L, i));
break;
case LUA_TTABLE:
{
v8::Local<v8::Object> obj = v8::Object::New();
lua_pushnil(L);
while(lua_next(L, -2) != 0){
v8::Local<v8::Value> key = lua_to_value(L, -2);
v8::Local<v8::Value> value = lua_to_value(L, -1);
obj->Set(key, value);
lua_pop(L, 1);
}
return obj;
break;
}
default:
return v8::Local<v8::Primitive>::New(v8::Undefined());
break;
}
}
void push_value_to_lua(lua_State* L, v8::Handle<v8::Value> value){
if(value->IsString()){
lua_pushstring(L, get_str(v8::Local<v8::Value>::New(value)));
}else if(value->IsNumber()){
int i_value = value->ToNumber()->Value();
lua_pushinteger(L, i_value);
}else if(value->IsBoolean()){
int b_value = (int)value->ToBoolean()->Value();
lua_pushboolean(L, b_value);
}else if(value->IsObject()){
lua_newtable(L);
v8::Local<v8::Object> obj = value->ToObject();
v8::Local<v8::Array> keys = obj->GetPropertyNames();
for(uint32_t i = 0; i < keys->Length(); ++i){
v8::Local<v8::Value> key = keys->Get(i);
v8::Local<v8::Value> val = obj->Get(key);
push_value_to_lua(L, key);
push_value_to_lua(L, val);
lua_settable(L, -3);
}
}else{
lua_pushnil(L);
}
}