| /******************************************************************************* |
| * Copyright (c) 2009 Luaj.org. All rights reserved. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a copy |
| * of this software and associated documentation files (the "Software"), to deal |
| * in the Software without restriction, including without limitation the rights |
| * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| * copies of the Software, and to permit persons to whom the Software is |
| * furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in |
| * all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| * THE SOFTWARE. |
| ******************************************************************************/ |
| package org.luaj.vm3; |
| |
| public class LuaUserdata extends LuaValue { |
| |
| public Object m_instance; |
| public LuaValue m_metatable; |
| |
| public LuaUserdata(Object obj) { |
| m_instance = obj; |
| } |
| |
| public LuaUserdata(Object obj, LuaValue metatable) { |
| m_instance = obj; |
| m_metatable = metatable; |
| } |
| |
| public String tojstring() { |
| return String.valueOf(m_instance); |
| } |
| |
| public int type() { |
| return LuaValue.TUSERDATA; |
| } |
| |
| public String typename() { |
| return "userdata"; |
| } |
| |
| public int hashCode() { |
| return m_instance.hashCode(); |
| } |
| |
| public Object userdata() { |
| return m_instance; |
| } |
| |
| public boolean isuserdata() { |
| return true; |
| } |
| |
| public boolean isuserdata(Class c) { |
| return c.isAssignableFrom(m_instance.getClass()); |
| } |
| |
| public Object touserdata() { |
| return m_instance; |
| } |
| |
| public Object touserdata(Class c) { |
| return c.isAssignableFrom(m_instance.getClass()) ? m_instance : null; |
| } |
| |
| public Object optuserdata(Object defval) { |
| return m_instance; |
| } |
| |
| public Object optuserdata(Class c, Object defval) { |
| if (!c.isAssignableFrom(m_instance.getClass())) |
| typerror(c.getName()); |
| return m_instance; |
| } |
| |
| public LuaValue getmetatable() { |
| return m_metatable; |
| } |
| |
| public LuaValue setmetatable(LuaValue metatable) { |
| this.m_metatable = metatable; |
| return this; |
| } |
| |
| public Object checkuserdata() { |
| return m_instance; |
| } |
| |
| public Object checkuserdata(Class c) { |
| if (c.isAssignableFrom(m_instance.getClass())) |
| return m_instance; |
| return typerror(c.getName()); |
| } |
| |
| public LuaValue get(LuaValue key) { |
| return m_metatable != null ? gettable(this, key) : NIL; |
| } |
| |
| public void set(LuaValue key, LuaValue value) { |
| if (m_metatable == null || !settable(this, key, value)) |
| error("cannot set " + key + " for userdata"); |
| } |
| |
| public boolean equals(Object val) { |
| if (this == val) |
| return true; |
| if (!(val instanceof LuaUserdata)) |
| return false; |
| LuaUserdata u = (LuaUserdata) val; |
| return m_instance.equals(u.m_instance); |
| } |
| |
| // equality w/ metatable processing |
| public LuaValue eq(LuaValue val) { |
| return eq_b(val) ? TRUE : FALSE; |
| } |
| |
| public boolean eq_b(LuaValue val) { |
| if (val.raweq(this)) |
| return true; |
| if (m_metatable == null || !val.isuserdata()) |
| return false; |
| LuaValue valmt = val.getmetatable(); |
| return valmt != null && LuaValue.eqmtcall(this, m_metatable, val, valmt); |
| } |
| |
| // equality w/o metatable processing |
| public boolean raweq(LuaValue val) { |
| return val.raweq(this); |
| } |
| |
| public boolean raweq(LuaUserdata val) { |
| return this == val || (m_metatable == val.m_metatable && m_instance.equals(val.m_instance)); |
| } |
| |
| // __eq metatag processing |
| public boolean eqmt(LuaValue val) { |
| return m_metatable != null && val.isuserdata() ? LuaValue.eqmtcall(this, m_metatable, val, val.getmetatable()) : false; |
| } |
| } |