Skip to content

Commit 0b728f9

Browse files
committed
refactor: remove toNumberX and toIntegerX
Removes these functions in favor of toNumber and toInteger. These remaining functions error if the value cannot be returned as a number. This makes the API safer, while also being a bit more cumbersome. But it is better to be explicit than use the old toNumber and not know it returns 0 silently on fail.
1 parent 5ac473d commit 0b728f9

File tree

3 files changed

+42
-55
lines changed

3 files changed

+42
-55
lines changed

docs.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,8 @@ const ziglua = @import("ziglua");
204204
const Lua = ziglua.Lua;
205205
206206
fn adder(lua: *Lua) i32 {
207-
const a = lua.toInteger(1);
208-
const b = lua.toInteger(2);
207+
const a = lua.toInteger(1) catch 0;
208+
const b = lua.toInteger(2) catch 0;
209209
lua.pushInteger(a + b);
210210
return 1;
211211
}

src/tests.zig

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,17 @@ fn expectEqualStringsSentinel(expected: []const u8, actual: [*:0]const u8) !void
2424
// until issue #1717 we need to use the struct workaround
2525
const add = struct {
2626
fn addInner(l: *Lua) i32 {
27-
const a = l.toInteger(1);
28-
const b = l.toInteger(2);
27+
const a = l.toInteger(1) catch 0;
28+
const b = l.toInteger(2) catch 0;
2929
l.pushInteger(a + b);
3030
return 1;
3131
}
3232
}.addInner;
3333

3434
const sub = struct {
3535
fn subInner(l: *Lua) i32 {
36-
const a = l.toInteger(1);
37-
const b = l.toInteger(2);
36+
const a = l.toInteger(1) catch 0;
37+
const b = l.toInteger(2) catch 0;
3838
l.pushInteger(a - b);
3939
return 1;
4040
}
@@ -157,61 +157,61 @@ test "arithmetic (lua_arith)" {
157157
lua.pushNumber(42);
158158

159159
lua.arith(.add);
160-
try expectEqual(@as(f64, 52), lua.toNumber(1));
160+
try expectEqual(@as(f64, 52), try lua.toNumber(1));
161161

162162
lua.pushNumber(12);
163163
lua.arith(.sub);
164-
try expectEqual(@as(f64, 40), lua.toNumber(1));
164+
try expectEqual(@as(f64, 40), try lua.toNumber(1));
165165

166166
lua.pushNumber(2);
167167
lua.arith(.mul);
168-
try expectEqual(@as(f64, 80), lua.toNumber(1));
168+
try expectEqual(@as(f64, 80), try lua.toNumber(1));
169169

170170
lua.pushNumber(8);
171171
lua.arith(.div);
172-
try expectEqual(@as(f64, 10), lua.toNumber(1));
172+
try expectEqual(@as(f64, 10), try lua.toNumber(1));
173173

174174
// prep for idiv
175175
lua.pushNumber(1);
176176
lua.arith(.add);
177177
lua.pushNumber(2);
178178
lua.arith(.idiv);
179-
try expectEqual(@as(f64, 5), lua.toNumber(1));
179+
try expectEqual(@as(f64, 5), try lua.toNumber(1));
180180

181181
lua.pushNumber(2);
182182
lua.arith(.mod);
183-
try expectEqual(@as(f64, 1), lua.toNumber(1));
183+
try expectEqual(@as(f64, 1), try lua.toNumber(1));
184184

185185
lua.arith(.unm);
186-
try expectEqual(@as(f64, -1), lua.toNumber(1));
186+
try expectEqual(@as(f64, -1), try lua.toNumber(1));
187187

188188
lua.arith(.unm);
189189
lua.pushNumber(2);
190190
lua.arith(.shl);
191-
try expectEqual(@as(i64, 4), lua.toInteger(1));
191+
try expectEqual(@as(i64, 4), try lua.toInteger(1));
192192

193193
lua.pushNumber(1);
194194
lua.arith(.shr);
195-
try expectEqual(@as(i64, 2), lua.toInteger(1));
195+
try expectEqual(@as(i64, 2), try lua.toInteger(1));
196196

197197
lua.pushNumber(4);
198198
lua.arith(.bor);
199-
try expectEqual(@as(i64, 6), lua.toInteger(1));
199+
try expectEqual(@as(i64, 6), try lua.toInteger(1));
200200

201201
lua.pushNumber(1);
202202
lua.arith(.band);
203-
try expectEqual(@as(i64, 0), lua.toInteger(1));
203+
try expectEqual(@as(i64, 0), try lua.toInteger(1));
204204

205205
lua.pushNumber(1);
206206
lua.arith(.bxor);
207-
try expectEqual(@as(i64, 1), lua.toInteger(1));
207+
try expectEqual(@as(i64, 1), try lua.toInteger(1));
208208

209209
lua.arith(.bnot); // 0xFFFFFFFFFFFFFFFE which is -2
210-
try expectEqual(@as(i64, -2), lua.toInteger(1));
210+
try expectEqual(@as(i64, -2), try lua.toInteger(1));
211211

212212
lua.pushNumber(3);
213213
lua.arith(.pow);
214-
try expectEqual(@as(i64, -8), lua.toInteger(1));
214+
try expectEqual(@as(i64, -8), try lua.toInteger(1));
215215
}
216216

217217
test "compare" {
@@ -292,8 +292,8 @@ test "type of and getting values" {
292292
try expectEqual(lua.state, (try lua.toThread(7)).state);
293293
try expectEqual(@as(ziglua.CFn, ziglua.wrap(add)), try lua.toCFunction(9));
294294

295-
try expectEqual(@as(Number, 0.1), try lua.toNumberX(6));
296-
try expectEqual(@as(Integer, 1), try lua.toIntegerX(3));
295+
try expectEqual(@as(Number, 0.1), try lua.toNumber(6));
296+
try expectEqual(@as(Integer, 1), try lua.toInteger(3));
297297
}
298298

299299
test "typenames" {
@@ -325,7 +325,7 @@ test "executing string contents" {
325325
try expectEqual(LuaType.function, lua.getGlobal("f"));
326326
lua.pop(1);
327327
try expectEqual(LuaType.number, lua.getGlobal("a"));
328-
try expectEqual(@as(i64, 12), lua.toInteger(1));
328+
try expectEqual(@as(i64, 12), try lua.toInteger(1));
329329

330330
try expectError(Error.Syntax, lua.loadString("bad syntax"));
331331
try lua.loadString("a = g()");
@@ -394,10 +394,10 @@ test "stack manipulation" {
394394
try expectEqual(@as(i32, 10), lua.getTop());
395395

396396
lua.copy(1, 2);
397-
try expectEqual(@as(i64, 10), lua.toInteger(1));
398-
try expectEqual(@as(i64, 10), lua.toInteger(2));
399-
try expectEqual(@as(i64, 1), lua.toInteger(3));
400-
try expectEqual(@as(i64, 8), lua.toInteger(-1));
397+
try expectEqual(@as(i64, 10), try lua.toInteger(1));
398+
try expectEqual(@as(i64, 10), try lua.toInteger(2));
399+
try expectEqual(@as(i64, 1), try lua.toInteger(3));
400+
try expectEqual(@as(i64, 8), try lua.toInteger(-1));
401401

402402
lua.setTop(0);
403403
try expectEqual(@as(i32, 0), lua.getTop());
@@ -416,7 +416,7 @@ test "calling a function" {
416416
// we know it should be safe
417417
lua.call(2, 1);
418418

419-
try expectEqual(@as(i64, 42), lua.toInteger(1));
419+
try expectEqual(@as(i64, 42), try lua.toInteger(1));
420420
}
421421

422422
test "version" {
@@ -482,7 +482,7 @@ test "string buffers" {
482482
try expectEqualStrings("abcdefghijklmnopqrstuvwxyz", try lua.toBytes(-1));
483483

484484
lua.len(-1);
485-
try expectEqual(@as(Integer, 26), lua.toInteger(-1));
485+
try expectEqual(@as(Integer, 26), try lua.toInteger(-1));
486486
}
487487

488488
test "global table" {
@@ -532,7 +532,7 @@ test "function registration" {
532532
lua.pushInteger(42);
533533
lua.pushInteger(40);
534534
try lua.protectedCall(2, 1, 0);
535-
try expectEqual(@as(Integer, 2), lua.toInteger(-1));
535+
try expectEqual(@as(Integer, 2), try lua.toInteger(-1));
536536

537537
// now test the newlib variation to build a library from functions
538538
// indirectly tests newLibTable
@@ -639,7 +639,7 @@ test "table access" {
639639

640640
_ = lua.pushString("other one");
641641
try expectEqual(LuaType.number, lua.rawGetTable(1));
642-
try expectEqual(@as(Integer, 1234), lua.toInteger(-1));
642+
try expectEqual(@as(Integer, 1234), try lua.toInteger(-1));
643643

644644
// a.name = "ziglua"
645645
_ = lua.pushString("name");
@@ -701,11 +701,11 @@ test "conversions" {
701701
// string conversion
702702
try lua.stringToNumber("1");
703703
try expect(lua.isInteger(-1));
704-
try expectEqual(@as(Integer, 1), lua.toInteger(1));
704+
try expectEqual(@as(Integer, 1), try lua.toInteger(1));
705705

706706
try lua.stringToNumber(" 1.0 ");
707707
try expect(lua.isNumber(-1));
708-
try expectEqual(@as(Number, 1.0), lua.toNumber(-1));
708+
try expectEqual(@as(Number, 1.0), try lua.toNumber(-1));
709709

710710
try expectError(Error.Fail, lua.stringToNumber("a"));
711711
try expectError(Error.Fail, lua.stringToNumber("1.a"));
@@ -762,7 +762,7 @@ test "dump and load" {
762762
// now call the new function (which should return the value + 5)
763763
lua.pushInteger(6);
764764
try lua.protectedCall(1, 1, 0);
765-
try expectEqual(@as(Integer, 11), lua.toInteger(-1));
765+
try expectEqual(@as(Integer, 11), try lua.toInteger(-1));
766766
}
767767

768768
test "threads" {
@@ -802,7 +802,7 @@ test "userdata and uservalues" {
802802
try lua.setIndexUserValue(1, 2);
803803

804804
try expectEqual(LuaType.number, try lua.getIndexUserValue(1, 1));
805-
try expectEqual(@as(Number, 1234.56), lua.toNumber(-1));
805+
try expectEqual(@as(Number, 1234.56), try lua.toNumber(-1));
806806
try expectEqual(LuaType.string, try lua.getIndexUserValue(1, 2));
807807
try expectEqualStrings("test string", try lua.toBytes(-1));
808808

@@ -820,7 +820,7 @@ test "upvalues" {
820820
// counter from PIL
821821
const counter = struct {
822822
fn inner(l: *Lua) i32 {
823-
var counter = l.toInteger(Lua.upvalueIndex(1));
823+
var counter = l.toInteger(Lua.upvalueIndex(1)) catch 0;
824824
counter += 1;
825825
l.pushInteger(counter);
826826
l.copy(-1, Lua.upvalueIndex(1));
@@ -838,7 +838,7 @@ test "upvalues" {
838838
while (expected <= 10) : (expected += 1) {
839839
_ = lua.getGlobal("counter");
840840
lua.call(0, 1);
841-
try expectEqual(expected, lua.toInteger(-1));
841+
try expectEqual(expected, try lua.toInteger(-1));
842842
lua.pop(1);
843843
}
844844
}
@@ -864,7 +864,7 @@ test "table traversal" {
864864
},
865865
.number => {
866866
try expectEqualStrings("third", try lua.toBytes(-2));
867-
try expectEqual(@as(Integer, 1), lua.toInteger(-1));
867+
try expectEqual(@as(Integer, 1), try lua.toInteger(-1));
868868
},
869869
else => unreachable,
870870
}
@@ -915,7 +915,7 @@ test "closing vars" {
915915

916916
// this should have incremented "closed_vars" to 2
917917
_ = lua.getGlobal("closed_vars");
918-
try expectEqual(@as(Number, 2), lua.toNumber(-1));
918+
try expectEqual(@as(Number, 2), try lua.toNumber(-1));
919919
}
920920

921921
test "raise error" {
@@ -970,7 +970,7 @@ test "yielding" {
970970
var i: i32 = 0;
971971
while (i < 5) : (i += 1) {
972972
try expectEqual(ziglua.ResumeStatus.yield, try thread.resumeThread(lua, 0, &results));
973-
try expectEqual(@as(Integer, i), thread.toInteger(-1));
973+
try expectEqual(@as(Integer, i), try thread.toInteger(-1));
974974
thread.pop(results);
975975
}
976976
try expectEqual(ziglua.ResumeStatus.ok, try thread.resumeThread(lua, 0, &results));

src/ziglua.zig

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -932,18 +932,10 @@ pub const Lua = struct {
932932
c.lua_toclose(lua.state, index);
933933
}
934934

935-
/// Equivalent to toIntegerX but does not return errors
936-
/// TODO: there really isn't a reason to use this...
937-
/// perhaps combine with toIntegerX and always enforce errors
938-
/// The caller can always choose to ignore (same for toNumber)
939-
pub fn toInteger(lua: *Lua, index: i32) Integer {
940-
return lua.toIntegerX(index) catch return 0;
941-
}
942-
943935
/// Converts the Lua value at the given `index` to a signed integer
944936
/// The Lua value must be an integer, or a number, or a string convertible to an integer otherwise toIntegerX returns 0
945937
/// Returns an error if the conversion failed
946-
pub fn toIntegerX(lua: *Lua, index: i32) !Integer {
938+
pub fn toInteger(lua: *Lua, index: i32) !Integer {
947939
var success: c_int = undefined;
948940
const result = c.lua_tointegerx(lua.state, index, &success);
949941
if (success == 0) return Error.Fail;
@@ -959,15 +951,10 @@ pub const Lua = struct {
959951
return Error.Fail;
960952
}
961953

962-
/// Equivalent to toNumberX but does not return errors
963-
pub fn toNumber(lua: *Lua, index: i32) Number {
964-
return lua.toNumberX(index) catch return 0;
965-
}
966-
967954
/// Converts the Lua value at the given `index` to a float
968955
/// The Lua value must be a number or a string convertible to a number otherwise toNumberX returns 0
969956
/// Returns an error if the conversion failed
970-
pub fn toNumberX(lua: *Lua, index: i32) !Number {
957+
pub fn toNumber(lua: *Lua, index: i32) !Number {
971958
var success: c_int = undefined;
972959
const result = c.lua_tonumberx(lua.state, index, &success);
973960
if (success == 0) return Error.Fail;

0 commit comments

Comments
 (0)