#include #include "utils.h" char * get_str(v8::Local 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 lua_to_value(lua_State* L, int i){ switch(lua_type(L, i)){ case LUA_TBOOLEAN: return v8::Local::New(v8::Boolean::New((int)lua_toboolean(L, i))); break; case LUA_TNUMBER: return v8::Local::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 obj = v8::Object::New(); lua_pushnil(L); while(lua_next(L, -2) != 0){ v8::Local key = lua_to_value(L, -2); v8::Local value = lua_to_value(L, -1); obj->Set(key, value); lua_pop(L, 1); } return obj; break; } default: return v8::Local::New(v8::Undefined()); break; } } void push_value_to_lua(lua_State* L, v8::Handle value){ if(value->IsString()){ lua_pushstring(L, get_str(v8::Local::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 obj = value->ToObject(); v8::Local keys = obj->GetPropertyNames(); for(uint32_t i = 0; i < keys->Length(); ++i){ v8::Local key = keys->Get(i); v8::Local val = obj->Get(key); push_value_to_lua(L, key); push_value_to_lua(L, val); lua_settable(L, -3); } }else{ lua_pushnil(L); } }