On 12/10/19 5:35 PM, Jacek Caban wrote:
On 12/9/19 4:29 PM, Gabriel Ivăncescu wrote:
+enum memid_type { + memid_invalid, + memid_inherited, + memid_func, + memid_var +};
+static inline enum memid_type get_memid_type(const ScriptTypeInfo *typeinfo, MEMBERID memid) +{ + if (memid <= 0) return memid_invalid; + if (memid & DISPID_FUNCTION_MASK) + { + memid &= ~DISPID_FUNCTION_MASK; + if (memid >= typeinfo->func_memid_map_cnt) + return memid_inherited; + if (typeinfo->func_memid_map[memid] == ~0) + return memid_invalid; + return memid_func; + } + if (memid > typeinfo->num_vars) + return memid_inherited; + return memid_var; +}
It seems that could let default ITypeInfo handle invalid IDs and you could just forward all calls to unknown IDs to it. You don't need a new map for that, you could just use a binary search on funcs.
Thanks,
Jacek
Sure, that sounds like a good approach as well. I'll look into it tomorrow.
I have a question, though, about jscript (similar patch for jscript, not sent yet to mailing list). In jscript, variables and functions can be deleted, and so currently I have a map of memids for both vars and functions (just one map for both).
Should I also use a binary search there (needed for both variables and functions), or rather keep the single map for both, which I think is slightly simpler code?
Currently I identify whether an element in the map is a variable or a function by looking at where it points to: if it points within the bounds of the function array, then it's a function. So no extra fields needed, other than the map itself.
This is all for jscript of course (not vbscript or this patch, but related).
Thanks, Gabriel