Ooops
November 25, 2020, 05:11:13 AM

Author Topic: [bmx] lua_objectfromtable by N [ 1+ years ago ]  (Read 605 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] lua_objectfromtable by N [ 1+ years ago ]
« on: June 29, 2017, 12:28:43 AM »
Title : lua_objectfromtable
Author : N
Posted : 1+ years ago

Description : There's not really a whole lot to say about this aside from how it determines how to set a value.

Provided the key in the KV pair of the table is a string, the first thing the method will do is check for a field with the same name as the key.  If no field is found, it checks for a setter method matching "set<key>".  If no method is found, it checks for _key, where the key is prefixed with an underscore.

If a field is found in either the first or the last case, the method checks to see if the value's type will work when assigning it to the field, and if it does the value of the field is set to that.

If a method is found, the last case will not occur.  The method (referring to lua_objectfromtable) will check to make sure the value will work with the first argument of the found method.  If it does, the method is called and presumably something is set.

When assigning a value to something that takes an object of any type (excluding arrays and strings) and the value is a table, the function will attempt to create an object from the table.

If any value cannot be assigned because the type of the field and the value being assigned are incompatible, an exception will be thrown.  If you attempt to create an array with the method, an exception will be thrown.  If you do not provide a type for the object or the value at the index provided is not a table, Null is returned.

No values are pushed onto the stack.


Code :
Code: BlitzMax
  1. Strict
  2.  
  3. Import Brl.Reflection
  4. Import LuGI.Core
  5.  
  6. Function lua_objectfromtable:Object(L@Ptr, index%, as:TTypeID)
  7.         Local reset% = lua_gettop(L)
  8.        
  9.         If Not (lua_istable(L, index) And as) Then
  10.                 Return Null
  11.         EndIf
  12.        
  13.         Assert as._class <> ArrayTypeID._class Else "Cannot use lua_objectfromtable to create an array"
  14.        
  15.         lua_pushvalue(L, index)
  16.         lua_pushnil(L)
  17.        
  18.         Local obj:Object = as.NewObject()
  19.  
  20.         ' poor man's profiling
  21. '       Local findtime%=0
  22. '       Local fsettime%=0
  23. '       Local msettime%=0
  24.        
  25. '       Local _t%, _t2%, _t3%
  26.        
  27.         While lua_next(L, -2)
  28.                 If lua_isstring(L, -2) Then
  29. '                       _t=millisecs()
  30.                         Local key$ = lua_tostring(L, -2)
  31.                         Local f:TField = as.FindField(key)
  32.                         If Not f Then
  33.                                 Local m:TMethod = as.FindMethod("set"+key)
  34.                                 If m Then
  35. '                                       _t2 = Millisecs()
  36.                                         Select m.ArgTypes()[0]
  37.                                                 Case ByteTypeID, ShortTypeID, IntTypeID, LongTypeID
  38.                                                         Assert lua_isnumber(L, -1) Else "Invalid value for integer setter argument"
  39.                                                         m.Invoke(obj, [Object(String(lua_tointeger(L, -1)))])
  40.                                                 Case FloatTypeID, DoubleTypeID
  41.                                                         Assert lua_isnumber(L, -1) Else "Invalid value for float/double setter argument"
  42.                                                         m.Invoke(obj, [Object(String(lua_tonumber(L, -1)))])
  43.                                                 Case StringTypeID
  44.                                                         Assert lua_isstring(L, -1) Else "Invalid value for string setter argument"
  45.                                                 Default
  46.                                                         If lua_istable(L, -1) And f.TypeID()._class <> ArrayTypeID._class Then
  47.                                                                 m.Invoke(obj, [lua_objectfromtable(L, -1, f.TypeID())])
  48.                                                         Else
  49.                                                                 Assert lua_isbmaxobject(L, -1) Else "Invalid value for object setter argument"
  50.                                                                 m.Invoke(obj, [lua_tobmaxobject(L, -1)])
  51.                                                         EndIf
  52.                                         End Select
  53. '                                       _t2 = Millisecs()-_t2
  54. '                                       msettime :+ _t2
  55. '                                       findtime :- _t2
  56.                                 Else
  57.                                         f = as.FindField("_"+key)
  58.                                 EndIf
  59.                         EndIf
  60. '                       findtime :+ Millisecs()-_t
  61.                        
  62.                         If f Then
  63. '                               _t = Millisecs()
  64.                                 Select f.TypeID()
  65.                                         Case ByteTypeID, ShortTypeID, IntTypeID
  66.                                                 Assert lua_isnumber(L, -1) Else "Invalid value for integer field"
  67.                                                 f.SetInt(obj, lua_tointeger(L, -1))
  68.                                         Case LongTypeID
  69.                                                 Assert lua_isnumber(L, -1) Else "Invalid value for long field"
  70.                                                 f.SetLong(obj, lua_tointeger(L, -1))
  71.                                         Case FloatTypeID
  72.                                                 Assert lua_isnumber(L, -1) Else "Invalid value for float field"
  73.                                                 f.SetFloat(obj, lua_tonumber(L, -1))
  74.                                         Case DoubleTypeID
  75.                                                 Assert lua_isnumber(L, -1) Else "Invalid value for double field"
  76.                                                 f.SetDouble(obj, lua_tonumber(L, -1))
  77.                                         Case StringTypeID
  78.                                                 Assert lua_isstring(L, -1) Else "Invalid value for string field"
  79.                                                 f.Set(obj, lua_tostring(L, -1))
  80.                                         Default
  81.                                                 If lua_istable(L, -1) And f.TypeID()._class <> ArrayTypeID._class Then
  82.                                                         f.Set(obj, lua_objectfromtable(L, -1, f.TypeID()))
  83.                                                 Else
  84.                                                         Assert lua_isbmaxobject(L, -1) Else "Invalid value for object field"
  85.                                                         f.Set(obj, lua_tobmaxobject(L, -1))
  86.                                                 EndIf
  87.                                 End Select
  88. '                               fsettime :+ Millisecs()-_t
  89.                         EndIf
  90.                 EndIf
  91.                
  92.                 lua_pop(L, 1)
  93.         Wend
  94.        
  95. '       DebugLog "find time:       "+findtime+"ms"
  96. '       DebugLog "method set time: "+msettime+"ms"
  97. '       DebugLog "field set time:  "+fsettime+"ms"
  98.        
  99.         lua_settop(L, reset)
  100.        
  101.         Return obj
  102. End Function


Comments : none...

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal