mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-03-01 05:48:26 +00:00

Date: Mon, 07 May 2001 14:25:34 +0200 From: Igor Bukanov <igor.bukanov@windriver.com> Organization: Wind River To: Norris Boyd <nboyd@atg.com> The current code that implements execMethod/methodArity for IdFunction support returns an arbitrary value for id that is not known. This is not very good behavior because it may hide bugs in the id support and it also does not allow to distinguish ids that are used for function from ids used for properties like String.length. To fix this I changed semantic of the methodArity method to return -1 for an unknown/non-method id and added code to throw an exception for bad ids. This change requires to adjust all NativeSomething objects that use IdScriptabl and after a release all such interface changes would be no go, but is not a release yet, right? I also eliminated the "IdFunction f" argument from IdFunction.Master.methodArity and the tagId field from IdFunction. When I wrote the initial code for IdFunction.java, I added that just to be able to use same id number in a class that implements IdFunction.Master and its descendants via checking idTag. But that does not work in general because IdScriptable can use id for non-function fields as well so to avoid id clashes another way should be used. For example, if someone would like to extend NativeMath to support more functionality, he can use: class Math2: extends NativeMath { private static idBase; { if (idBase == 0) idBase = super.getMaximumId(); } public int methodArity(int methodId) { switch (methodId - idBase) { case Id_foo: return 2; case Id_bar: return 3; } return super.methodArity(methodId); } public Object execMethod (int methodId, IdFunction f, Context cx, Scriptable scope, Scriptable thisObj, Object[] args) throws JavaScriptException { switch (methodId - idBase) { case Id_foo: return ...; case Id_bar: return ...; } return super.execMethod(methodId, f, cx, scope, thisObj, args); } protected int getMaximumId() { return idBase + MAX_ID; } protected String getIdName(int id) { switch (id - idBase) { case Id_foo: return "for"; case Id_bar: return "bar"; } return super.getIdName(id); } ... private static final int Id_foo = 1, Id_bar = 2, MAX_ID = 2; etc. Note that a simpler solution to make MAX_ID field public in NativeMath and write in Math2: private static final int Id_foo = NativeMath.MAX_ID + 1, Id_bar = NativeMath.MAX_ID + 2, MAX_ID = NativeMath.MAX_ID + 2; does not work because in this way adding any new id to NativeMath would break binary compatibility with Math2.