Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error object returned by pcall() declared to always be a string #79

Open
Feuermurmel opened this issue Nov 6, 2024 · 0 comments
Open

Comments

@Feuermurmel
Copy link

Description

pcall() is declared to return LuaMultiReturn<[true, R] | [false, string]>, but in Lua, the error object can be anything. This leads to problem when the error object is used in a context where it matters whether it can be something other than a string.

To reproduce

Consider the following example (playground):

function foo(this: void) {
    throw {}
}

let result = pcall(foo)

if (!result[0]) {
    print("error: " + result[1])
}

Function foo() throws an empty object. To allow concatenation with a string, a call to tostring() needs to be inserted, but it isn't. So the concatenation in the argument to print() fails:

Lua execution error:
	[string "--[[ Generated with https://github.com/TypeSc..."]:7: attempt to concatenate a table value (field '?')

If the correct type is added to the declaration of result, the call to tostring() is inserted:

let result: [true, void] | [false, unknown] = pcall(foo)

Generated code:

--[[ Generated with https://github.com/TypeScriptToLua/TypeScriptToLua ]]
function foo()
    error({}, 0)
end
result = {pcall(foo)}
if not result[1] then
    print("error: " .. tostring(result[2]))
end

Expected behavior

I think that the return type of pcall() should be changed to LuaMultiReturn<[true, R] | [false, unknown]>. The same applies to coroutine.resume().

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant