diff options
Diffstat (limited to 'upb/bindings/lua/upb.lua')
-rw-r--r-- | upb/bindings/lua/upb.lua | 248 |
1 files changed, 129 insertions, 119 deletions
diff --git a/upb/bindings/lua/upb.lua b/upb/bindings/lua/upb.lua index bda9dfe..4090b37 100644 --- a/upb/bindings/lua/upb.lua +++ b/upb/bindings/lua/upb.lua @@ -1,146 +1,156 @@ +--[[-------------------------------------------------------------------- + + upb - a minimalist implementation of protocol buffers. + + Copyright (c) 2009 Google Inc. See LICENSE for details. + Author: Josh Haberman <jhaberman@gmail.com> + +--------------------------------------------------------------------]]-- + +-- Before calling require on "upb_c", we need to load the same library +-- as RTLD_GLOBAL, for the benefit of other C extensions that depend on +-- C functions in the core. -- --- upb - a minimalist implementation of protocol buffers. --- --- Copyright (c) 2009 Google Inc. See LICENSE for details. --- Author: Josh Haberman <jhaberman@gmail.com> +-- This has to happen *before* the require call, because if the module +-- is loaded RTLD_LOCAL first, a subsequent load as RTLD_GLOBAL won't +-- have the proper effect, at least on some platforms. +package.loadlib(package.searchpath("upb_c", package.cpath), "*") + +local upb = require("upb_c") + +-- A convenience function for building/linking/freezing defs +-- while maintaining their original order. -- --- Pure-Lua support functions that are part of the "upb" module. --- This file is embedded and packaged into the "upb" C module binary -- it --- should not be installed or used directly! - -return function(upb) - -- A convenience function for building/linking/freezing defs - -- while maintaining their original order. - -- - -- Sample usage: - -- local m1, m2 = upb.build_defs{ - -- upb.MessageDef{full_name = "M1", fields = { - -- upb.FieldDef{ - -- name = "m2", - -- number = 1, - -- type = upb.TYPE_MESSAGE, - -- subdef_name = ".M2" - -- }, - -- } - -- }, - -- upb.MessageDef{full_name = "M2"} - -- } - upb.build_defs = function(defs) - upb.SymbolTable(defs) - -- Lua 5.2 puts unpack in the table library. - return (unpack or table.unpack)(defs) - end +-- Sample usage: +-- local m1, m2 = upb.build_defs{ +-- upb.MessageDef{full_name = "M1", fields = { +-- upb.FieldDef{ +-- name = "m2", +-- number = 1, +-- type = upb.TYPE_MESSAGE, +-- subdef_name = ".M2" +-- }, +-- } +-- }, +-- upb.MessageDef{full_name = "M2"} +-- } +upb.build_defs = function(defs) + upb.SymbolTable(defs) + -- Lua 5.2 puts unpack in the table library. + return (unpack or table.unpack)(defs) +end - local ipairs_iter = function(array, last_index) - local next_index = last_index + 1 - if next_index > #array then - return nil - end - return next_index, array[next_index] +local ipairs_iter = function(array, last_index) + local next_index = last_index + 1 + if next_index > #array then + return nil end + return next_index, array[next_index] +end - -- For iterating over the indexes and values of a upb.Array. - -- - -- for i, val in upb.ipairs(array) do - -- -- ... - -- end - upb.ipairs = function(array) - return ipairs_iter, array, 0 - end +-- For iterating over the indexes and values of a upb.Array. +-- +-- for i, val in upb.ipairs(array) do +-- -- ... +-- end +upb.ipairs = function(array) + return ipairs_iter, array, 0 +end - local set_named = function(obj, init) - for k, v in pairs(init) do - local func = obj["set_" .. k] - if not func then - error("Cannot set member: " .. k) - end - func(obj, v) +local set_named = function(obj, init) + for k, v in pairs(init) do + local func = obj["set_" .. k] + if not func then + error("Cannot set member: " .. k) end + func(obj, v) end +end + +-- Capture references to the functions we're wrapping. +local RealFieldDef = upb.FieldDef +local RealEnumDef = upb.EnumDef +local RealMessageDef = upb.MessageDef +local RealSymbolTable = upb.SymbolTable - -- Capture references to the functions we're wrapping. - local RealFieldDef = upb.FieldDef - local RealEnumDef = upb.EnumDef - local RealMessageDef = upb.MessageDef - local RealSymbolTable = upb.SymbolTable - - -- FieldDef constructor; a wrapper around the real constructor that can - -- set initial properties. - -- - -- User can specify initialization values like so: - -- upb.FieldDef{label=upb.LABEL_REQUIRED, name="my_field", number=5, - -- type=upb.TYPE_INT32, default_value=12, type_name="Foo"} - upb.FieldDef = function(init) - local f = RealFieldDef() - - if init then - -- Other members are often dependent on type, so set that first. - if init.type then - f:set_type(init.type) - init.type = nil - end - - set_named(f, init) +-- FieldDef constructor; a wrapper around the real constructor that can +-- set initial properties. +-- +-- User can specify initialization values like so: +-- upb.FieldDef{label=upb.LABEL_REQUIRED, name="my_field", number=5, +-- type=upb.TYPE_INT32, default_value=12, type_name="Foo"} +upb.FieldDef = function(init) + local f = RealFieldDef() + + if init then + -- Other members are often dependent on type, so set that first. + if init.type then + f:set_type(init.type) + init.type = nil end - return f + set_named(f, init) end + return f +end - -- MessageDef constructor; a wrapper around the real constructor that can - -- set initial properties. - -- - -- User can specify initialization values like so: - -- upb.MessageDef{full_name="MyMessage", extstart=8000, fields={...}} - upb.MessageDef = function(init) - local m = RealMessageDef() - - if init then - for _, f in pairs(init.fields or {}) do - m:add(f) - end - init.fields = nil - set_named(m, init) +-- MessageDef constructor; a wrapper around the real constructor that can +-- set initial properties. +-- +-- User can specify initialization values like so: +-- upb.MessageDef{full_name="MyMessage", extstart=8000, fields={...}} +upb.MessageDef = function(init) + local m = RealMessageDef() + + if init then + for _, f in pairs(init.fields or {}) do + m:add(f) end + init.fields = nil - return m + set_named(m, init) end - -- EnumDef constructor; a wrapper around the real constructor that can - -- set initial properties. - -- - -- User can specify initialization values like so: - -- upb.EnumDef{full_name="MyEnum", - -- values={ - -- {"FOO_VALUE_1", 1}, - -- {"FOO_VALUE_2", 2} - -- } - -- } - upb.EnumDef = function(init) - local e = RealEnumDef() - - if init then - for _, val in pairs(init.values or {}) do - e:add(val[1], val[2]) - end - init.values = nil - - set_named(e, init) + return m +end + +-- EnumDef constructor; a wrapper around the real constructor that can +-- set initial properties. +-- +-- User can specify initialization values like so: +-- upb.EnumDef{full_name="MyEnum", +-- values={ +-- {"FOO_VALUE_1", 1}, +-- {"FOO_VALUE_2", 2} +-- } +-- } +upb.EnumDef = function(init) + local e = RealEnumDef() + + if init then + for _, val in pairs(init.values or {}) do + e:add(val[1], val[2]) end + init.values = nil - return e + set_named(e, init) end - -- SymbolTable constructor; a wrapper around the real constructor that can - -- add an initial set of defs. - upb.SymbolTable = function(defs) - local s = RealSymbolTable() + return e +end - if defs then - s:add(defs) - end +-- SymbolTable constructor; a wrapper around the real constructor that can +-- add an initial set of defs. +upb.SymbolTable = function(defs) + local s = RealSymbolTable() - return s + if defs then + s:add(defs) end + + return s end + +return upb |