@@ -11,7 +11,7 @@ function TCData<|T: ConstructorArgument, ...: ...any|>
1111 -- this assumes keys are in order, which in the typesystem they SHOULD be
1212 if ... then
1313 if is_array then
14- local tbl = ...
14+ local tbl = copy<| ...|>
1515
1616 if type(tbl) == "table" then
1717 if #tbl - 1 > keysof<|T|> then error<|"too many initializers", 2|> end
@@ -24,7 +24,13 @@ function TCData<|T: ConstructorArgument, ...: ...any|>
2424 error("expected type '" .. tostring(contract) .. "' at index " .. (i - 1), 2)
2525 end
2626
27- T[i - 1] = v & contract
27+ local obj = copy<|v|>
28+
29+ for k, v in pairs(contract) do
30+ if rawget(obj, k) == nil then obj[k] = v end
31+ end
32+
33+ T[i - 1] = obj
2834 end
2935 end
3036 elseif type(T) == "table" then
@@ -78,16 +84,16 @@ function TCData<|T: ConstructorArgument, ...: ...any|>
7884
7985 return TCData<|obj|>
8086 end,
81- __le = function <|self: self, other: self|>
87+ __le = function <|self: self, other: self | number | any |>
8288 return boolean
8389 end,
84- __lt = function <|self: self, other: self|>
90+ __lt = function <|self: self, other: self | number | any |>
8591 return boolean
8692 end,
87- __add = function <|self: self, other: self | number|>
93+ __add = function <|self: self, other: self | number | any |>
8894 return TCData<|T|>
8995 end,
90- __sub = function <|self: self, other: self | number|>
96+ __sub = function <|self: self, other: self | number | any |>
9197 return TCData<|T|>
9298 end,
9399 }
@@ -156,13 +162,12 @@ type Modules["ffi"] = {
156162 arch = "x86" | "x64" | "arm" | "ppc" | "ppcspe" | "mips",
157163 C = {},
158164 abi = function=(string)>(boolean),
159- copy = function=(any, any, number | nil)>(nil ),
165+ copy = function=(any, any, number | nil | TCData<|number|> )>(),
160166 alignof = function=(ctype)>(number),
161- string = function=(cdata, number | nil)>(string),
162167 gc = function=(ctype, Function)>(cdata),
163168 istype = function=(ctype, any)>(boolean),
164- fill = function=(cdata, number, any)>(nil ),
165- offsetof = function=(cdata, number)>(number),
169+ fill = function=(cdata, number | TCData<|number|> , any)>(),
170+ offsetof = function=(cdata, number | TCData<|number|> )>(number),
166171}
167172--type Modules["ffi"].C.@Name = "FFI_C"
168173type Modules["jit.vmdef"] = {
@@ -326,7 +331,7 @@ function FFIType<|str: string|>
326331 return number
327332end
328333
329- type ffi.string = function=(TCData<|{[number] = number}|> | string, number | nil)>(string)
334+ type ffi.string = function=(TCData<|{[number] = number}|> | string, TCData<|number|> | number | nil)>(string)
330335
331336do
332337 type ffi.C = ffi.load("")
0 commit comments