The Labs \ Source Viewer \ SSCLI \ Microsoft.JScript \ BuiltinFunction

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. /* This class wraps a MethodInfo so that it appears to be a script function. It is used to provide access to the methods in the builtin object model */
  16. namespace Microsoft.JScript
  17. {
  18.    
  19.     using Microsoft.JScript.Vsa;
  20.     using System;
  21.     using System.Reflection;
  22.    
  23.     public enum JSBuiltin
  24.     {
  25.         None = 0,
  26.         Array_concat = 1,
  27.         Array_join,
  28.         Array_pop,
  29.         Array_push,
  30.         Array_reverse,
  31.         Array_shift,
  32.         Array_slice,
  33.         Array_sort,
  34.         Array_splice,
  35.         Array_toLocaleString,
  36.         Array_toString,
  37.         Array_unshift,
  38.         Boolean_toString,
  39.         Boolean_valueOf,
  40.         Date_getDate,
  41.         Date_getDay,
  42.         Date_getFullYear,
  43.         Date_getHours,
  44.         Date_getMilliseconds,
  45.         Date_getMinutes,
  46.         Date_getMonth,
  47.         Date_getSeconds,
  48.         Date_getTime,
  49.         Date_getTimezoneOffset,
  50.         Date_getUTCDate,
  51.         Date_getUTCDay,
  52.         Date_getUTCFullYear,
  53.         Date_getUTCHours,
  54.         Date_getUTCMilliseconds,
  55.         Date_getUTCMinutes,
  56.         Date_getUTCMonth,
  57.         Date_getUTCSeconds,
  58.         Date_getVarDate,
  59.         Date_getYear,
  60.         Date_parse,
  61.         Date_setDate,
  62.         Date_setFullYear,
  63.         Date_setHours,
  64.         Date_setMinutes,
  65.         Date_setMilliseconds,
  66.         Date_setMonth,
  67.         Date_setSeconds,
  68.         Date_setTime,
  69.         Date_setUTCDate,
  70.         Date_setUTCFullYear,
  71.         Date_setUTCHours,
  72.         Date_setUTCMinutes,
  73.         Date_setUTCMilliseconds,
  74.         Date_setUTCMonth,
  75.         Date_setUTCSeconds,
  76.         Date_setYear,
  77.         Date_toDateString,
  78.         Date_toGMTString,
  79.         Date_toLocaleDateString,
  80.         Date_toLocaleString,
  81.         Date_toLocaleTimeString,
  82.         Date_toString,
  83.         Date_toTimeString,
  84.         Date_toUTCString,
  85.         Date_UTC,
  86.         Date_valueOf,
  87.         Enumerator_atEnd,
  88.         Enumerator_item,
  89.         Enumerator_moveFirst,
  90.         Enumerator_moveNext,
  91.         Error_toString,
  92.         Function_apply,
  93.         Function_call,
  94.         Function_toString,
  95.         Global_CollectGarbage,
  96.         Global_decodeURI,
  97.         Global_decodeURIComponent,
  98.         Global_encodeURI,
  99.         Global_encodeURIComponent,
  100.         Global_escape,
  101.         Global_eval,
  102.         Global_GetObject,
  103.         Global_isNaN,
  104.         Global_isFinite,
  105.         Global_parseFloat,
  106.         Global_parseInt,
  107.         Global_ScriptEngine,
  108.         Global_ScriptEngineBuildVersion,
  109.         Global_ScriptEngineMajorVersion,
  110.         Global_ScriptEngineMinorVersion,
  111.         Global_unescape,
  112.         Math_abs,
  113.         Math_acos,
  114.         Math_asin,
  115.         Math_atan,
  116.         Math_atan2,
  117.         Math_ceil,
  118.         Math_cos,
  119.         Math_exp,
  120.         Math_floor,
  121.         Math_log,
  122.         Math_max,
  123.         Math_min,
  124.         Math_pow,
  125.         Math_random,
  126.         Math_round,
  127.         Math_sin,
  128.         Math_sqrt,
  129.         Math_tan,
  130.         Number_toExponential,
  131.         Number_toFixed,
  132.         Number_toLocaleString,
  133.         Number_toPrecision,
  134.         Number_toString,
  135.         Number_valueOf,
  136.         Object_hasOwnProperty,
  137.         Object_isPrototypeOf,
  138.         Object_propertyIsEnumerable,
  139.         Object_toLocaleString,
  140.         Object_toString,
  141.         Object_valueOf,
  142.         RegExp_compile,
  143.         RegExp_exec,
  144.         RegExp_test,
  145.         RegExp_toString,
  146.         String_anchor,
  147.         String_big,
  148.         String_blink,
  149.         String_bold,
  150.         String_charAt,
  151.         String_charCodeAt,
  152.         String_concat,
  153.         String_fixed,
  154.         String_fontcolor,
  155.         String_fontsize,
  156.         String_fromCharCode,
  157.         String_indexOf,
  158.         String_italics,
  159.         String_lastIndexOf,
  160.         String_link,
  161.         String_localeCompare,
  162.         String_match,
  163.         String_replace,
  164.         String_search,
  165.         String_slice,
  166.         String_small,
  167.         String_split,
  168.         String_strike,
  169.         String_sub,
  170.         String_substr,
  171.         String_substring,
  172.         String_sup,
  173.         String_toLocaleLowerCase,
  174.         String_toLocaleUpperCase,
  175.         String_toLowerCase,
  176.         String_toString,
  177.         String_toUpperCase,
  178.         String_valueOf,
  179.         VBArray_dimensions,
  180.         VBArray_getItem,
  181.         VBArray_lbound,
  182.         VBArray_toArray,
  183.         VBArray_ubound
  184.     }
  185.    
  186.     internal sealed class BuiltinFunction : ScriptFunction
  187.     {
  188.         internal MethodInfo method;
  189.         private JSBuiltin biFunc;
  190.        
  191.         internal BuiltinFunction(object obj, MethodInfo method) : this(method.Name, obj, method, FunctionPrototype.ob)
  192.         {
  193.         }
  194.        
  195.         internal BuiltinFunction(string name, object obj, MethodInfo method, ScriptFunction parent) : base(parent, name)
  196.         {
  197.             this.noExpando = false;
  198.             ParameterInfo[] pars = method.GetParameters();
  199.             int n = this.ilength = pars.Length;
  200.             object[] attrs = CustomAttribute.GetCustomAttributes(method, typeof(JSFunctionAttribute), false);
  201.             JSFunctionAttribute attr = attrs.Length > 0 ? (JSFunctionAttribute)attrs[0] : new JSFunctionAttribute((JSFunctionAttributeEnum)0);
  202.             JSFunctionAttributeEnum attrVal = attr.attributeValue;
  203.             if ((attrVal & JSFunctionAttributeEnum.HasThisObject) != 0)
  204.                 this.ilength--;
  205.             if ((attrVal & JSFunctionAttributeEnum.HasEngine) != 0)
  206.                 this.ilength--;
  207.             if ((attrVal & JSFunctionAttributeEnum.HasVarArgs) != 0)
  208.                 this.ilength--;
  209.             this.biFunc = attr.builtinFunction;
  210.             if (this.biFunc == 0)
  211.                 this.method = new JSNativeMethod(method, obj, this.engine);
  212.             else
  213.                 this.method = null;
  214.         }
  215.        
  216.         internal override object Call(object[] args, object thisob)
  217.         {
  218.             return BuiltinFunction.QuickCall(args, thisob, this.biFunc, this.method, this.engine);
  219.         }
  220.        
  221.         static internal object QuickCall(object[] args, object thisob, JSBuiltin biFunc, MethodInfo method, VsaEngine engine)
  222.         {
  223.             int n = args.Length;
  224.             switch (biFunc) {
  225.                 case JSBuiltin.Array_concat:
  226.                     return ArrayPrototype.concat(thisob, engine, args);
  227.                 case JSBuiltin.Array_join:
  228.                     return ArrayPrototype.join(thisob, GetArg(args, 0, n));
  229.                 case JSBuiltin.Array_pop:
  230.                     return ArrayPrototype.pop(thisob);
  231.                 case JSBuiltin.Array_push:
  232.                     return ArrayPrototype.push(thisob, args);
  233.                 case JSBuiltin.Array_reverse:
  234.                     return ArrayPrototype.reverse(thisob);
  235.                 case JSBuiltin.Array_shift:
  236.                     return ArrayPrototype.shift(thisob);
  237.                 case JSBuiltin.Array_slice:
  238.                     return ArrayPrototype.slice(thisob, engine, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n));
  239.                 case JSBuiltin.Array_sort:
  240.                     return ArrayPrototype.sort(thisob, GetArg(args, 0, n));
  241.                 case JSBuiltin.Array_splice:
  242.                     return ArrayPrototype.splice(thisob, engine, Convert.ToNumber(GetArg(args, 0, n)), Convert.ToNumber(GetArg(args, 1, n)), VarArgs(args, 2, n));
  243.                 case JSBuiltin.Array_toLocaleString:
  244.                     return ArrayPrototype.toLocaleString(thisob);
  245.                 case JSBuiltin.Array_toString:
  246.                     return ArrayPrototype.toString(thisob);
  247.                 case JSBuiltin.Array_unshift:
  248.                     return ArrayPrototype.unshift(thisob, args);
  249.                 case JSBuiltin.Boolean_toString:
  250.                     return BooleanPrototype.toString(thisob);
  251.                 case JSBuiltin.Boolean_valueOf:
  252.                     return BooleanPrototype.valueOf(thisob);
  253.                 case JSBuiltin.Date_getDate:
  254.                     return DatePrototype.getDate(thisob);
  255.                 case JSBuiltin.Date_getDay:
  256.                     return DatePrototype.getDay(thisob);
  257.                 case JSBuiltin.Date_getFullYear:
  258.                     return DatePrototype.getFullYear(thisob);
  259.                 case JSBuiltin.Date_getHours:
  260.                     return DatePrototype.getHours(thisob);
  261.                 case JSBuiltin.Date_getMilliseconds:
  262.                     return DatePrototype.getMilliseconds(thisob);
  263.                 case JSBuiltin.Date_getMinutes:
  264.                     return DatePrototype.getMinutes(thisob);
  265.                 case JSBuiltin.Date_getMonth:
  266.                     return DatePrototype.getMonth(thisob);
  267.                 case JSBuiltin.Date_getSeconds:
  268.                     return DatePrototype.getSeconds(thisob);
  269.                 case JSBuiltin.Date_getTime:
  270.                     return DatePrototype.getTime(thisob);
  271.                 case JSBuiltin.Date_getTimezoneOffset:
  272.                     return DatePrototype.getTimezoneOffset(thisob);
  273.                 case JSBuiltin.Date_getUTCDate:
  274.                     return DatePrototype.getUTCDate(thisob);
  275.                 case JSBuiltin.Date_getUTCDay:
  276.                     return DatePrototype.getUTCDay(thisob);
  277.                 case JSBuiltin.Date_getUTCFullYear:
  278.                     return DatePrototype.getUTCFullYear(thisob);
  279.                 case JSBuiltin.Date_getUTCHours:
  280.                     return DatePrototype.getUTCHours(thisob);
  281.                 case JSBuiltin.Date_getUTCMilliseconds:
  282.                     return DatePrototype.getUTCMilliseconds(thisob);
  283.                 case JSBuiltin.Date_getUTCMinutes:
  284.                     return DatePrototype.getUTCMinutes(thisob);
  285.                 case JSBuiltin.Date_getUTCMonth:
  286.                     return DatePrototype.getUTCMonth(thisob);
  287.                 case JSBuiltin.Date_getUTCSeconds:
  288.                     return DatePrototype.getUTCSeconds(thisob);
  289.                 case JSBuiltin.Date_getVarDate:
  290.                     return DatePrototype.getVarDate(thisob);
  291.                 case JSBuiltin.Date_getYear:
  292.                     return DatePrototype.getYear(thisob);
  293.                 case JSBuiltin.Date_parse:
  294.                     return DateConstructor.parse(Convert.ToString(GetArg(args, 0, n)));
  295.                 case JSBuiltin.Date_setDate:
  296.                     return DatePrototype.setDate(thisob, Convert.ToNumber(GetArg(args, 0, n)));
  297.                 case JSBuiltin.Date_setFullYear:
  298.                     return DatePrototype.setFullYear(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n), GetArg(args, 2, n));
  299.                 case JSBuiltin.Date_setHours:
  300.                     return DatePrototype.setHours(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n), GetArg(args, 2, n), GetArg(args, 3, n));
  301.                 case JSBuiltin.Date_setMinutes:
  302.                     return DatePrototype.setMinutes(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n), GetArg(args, 2, n));
  303.                 case JSBuiltin.Date_setMilliseconds:
  304.                     return DatePrototype.setMilliseconds(thisob, Convert.ToNumber(GetArg(args, 0, n)));
  305.                 case JSBuiltin.Date_setMonth:
  306.                     return DatePrototype.setMonth(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n));
  307.                 case JSBuiltin.Date_setSeconds:
  308.                     return DatePrototype.setSeconds(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n));
  309.                 case JSBuiltin.Date_setTime:
  310.                     return DatePrototype.setTime(thisob, Convert.ToNumber(GetArg(args, 0, n)));
  311.                 case JSBuiltin.Date_setUTCDate:
  312.                     return DatePrototype.setUTCDate(thisob, Convert.ToNumber(GetArg(args, 0, n)));
  313.                 case JSBuiltin.Date_setUTCFullYear:
  314.                     return DatePrototype.setUTCFullYear(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n), GetArg(args, 2, n));
  315.                 case JSBuiltin.Date_setUTCHours:
  316.                     return DatePrototype.setUTCHours(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n), GetArg(args, 2, n), GetArg(args, 3, n));
  317.                 case JSBuiltin.Date_setUTCMinutes:
  318.                     return DatePrototype.setUTCMinutes(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n), GetArg(args, 2, n));
  319.                 case JSBuiltin.Date_setUTCMilliseconds:
  320.                     return DatePrototype.setUTCMilliseconds(thisob, Convert.ToNumber(GetArg(args, 0, n)));
  321.                 case JSBuiltin.Date_setUTCMonth:
  322.                     return DatePrototype.setUTCMonth(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n));
  323.                 case JSBuiltin.Date_setUTCSeconds:
  324.                     return DatePrototype.setUTCSeconds(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n));
  325.                 case JSBuiltin.Date_setYear:
  326.                     return DatePrototype.setYear(thisob, Convert.ToNumber(GetArg(args, 0, n)));
  327.                 case JSBuiltin.Date_toDateString:
  328.                     return DatePrototype.toDateString(thisob);
  329.                 case JSBuiltin.Date_toGMTString:
  330.                     return DatePrototype.toGMTString(thisob);
  331.                 case JSBuiltin.Date_toLocaleDateString:
  332.                     return DatePrototype.toLocaleDateString(thisob);
  333.                 case JSBuiltin.Date_toLocaleString:
  334.                     return DatePrototype.toLocaleString(thisob);
  335.                 case JSBuiltin.Date_toLocaleTimeString:
  336.                     return DatePrototype.toLocaleTimeString(thisob);
  337.                 case JSBuiltin.Date_toString:
  338.                     return DatePrototype.toString(thisob);
  339.                 case JSBuiltin.Date_toTimeString:
  340.                     return DatePrototype.toTimeString(thisob);
  341.                 case JSBuiltin.Date_toUTCString:
  342.                     return DatePrototype.toUTCString(thisob);
  343.                 case JSBuiltin.Date_UTC:
  344.                     return DateConstructor.UTC(GetArg(args, 0, n), GetArg(args, 1, n), GetArg(args, 2, n), GetArg(args, 3, n), GetArg(args, 4, n), GetArg(args, 5, n), GetArg(args, 6, n));
  345.                 case JSBuiltin.Date_valueOf:
  346.                     return DatePrototype.valueOf(thisob);
  347.                 case JSBuiltin.Enumerator_atEnd:
  348.                     return EnumeratorPrototype.atEnd(thisob);
  349.                 case JSBuiltin.Enumerator_item:
  350.                     return EnumeratorPrototype.item(thisob);
  351.                 case JSBuiltin.Enumerator_moveFirst:
  352.                     EnumeratorPrototype.moveFirst(thisob);
  353.                     return null;
  354.                 case JSBuiltin.Enumerator_moveNext:
  355.                     EnumeratorPrototype.moveNext(thisob);
  356.                     return null;
  357.                 case JSBuiltin.Error_toString:
  358.                     return ErrorPrototype.toString(thisob);
  359.                 case JSBuiltin.Function_apply:
  360.                     return FunctionPrototype.apply(thisob, GetArg(args, 0, n), GetArg(args, 1, n));
  361.                 case JSBuiltin.Function_call:
  362.                     return FunctionPrototype.call(thisob, GetArg(args, 0, n), VarArgs(args, 1, n));
  363.                 case JSBuiltin.Function_toString:
  364.                     return FunctionPrototype.toString(thisob);
  365.                 case JSBuiltin.Global_CollectGarbage:
  366.                     GlobalObject.CollectGarbage();
  367.                     return null;
  368.                 case JSBuiltin.Global_decodeURI:
  369.                     return GlobalObject.decodeURI(GetArg(args, 0, n));
  370.                 case JSBuiltin.Global_decodeURIComponent:
  371.                     return GlobalObject.decodeURIComponent(GetArg(args, 0, n));
  372.                 case JSBuiltin.Global_encodeURI:
  373.                     return GlobalObject.encodeURI(GetArg(args, 0, n));
  374.                 case JSBuiltin.Global_encodeURIComponent:
  375.                     return GlobalObject.encodeURIComponent(GetArg(args, 0, n));
  376.                 case JSBuiltin.Global_escape:
  377.                     return GlobalObject.escape(GetArg(args, 0, n));
  378.                 case JSBuiltin.Global_eval:
  379.                     return GlobalObject.eval(GetArg(args, 0, n));
  380.                 case JSBuiltin.Global_GetObject:
  381.                     return GlobalObject.GetObject(GetArg(args, 0, n), GetArg(args, 1, n));
  382.                 case JSBuiltin.Global_isNaN:
  383.                     return GlobalObject.isNaN(GetArg(args, 0, n));
  384.                 case JSBuiltin.Global_isFinite:
  385.                     return GlobalObject.isFinite(Convert.ToNumber(GetArg(args, 0, n)));
  386.                 case JSBuiltin.Global_parseFloat:
  387.                     return GlobalObject.parseFloat(GetArg(args, 0, n));
  388.                 case JSBuiltin.Global_parseInt:
  389.                     return GlobalObject.parseInt(GetArg(args, 0, n), GetArg(args, 1, n));
  390.                 case JSBuiltin.Global_ScriptEngine:
  391.                     return GlobalObject.ScriptEngine();
  392.                 case JSBuiltin.Global_ScriptEngineBuildVersion:
  393.                     return GlobalObject.ScriptEngineBuildVersion();
  394.                 case JSBuiltin.Global_ScriptEngineMajorVersion:
  395.                     return GlobalObject.ScriptEngineMajorVersion();
  396.                 case JSBuiltin.Global_ScriptEngineMinorVersion:
  397.                     return GlobalObject.ScriptEngineMinorVersion();
  398.                 case JSBuiltin.Global_unescape:
  399.                     return GlobalObject.unescape(GetArg(args, 0, n));
  400.                 case JSBuiltin.Math_abs:
  401.                     return MathObject.abs(Convert.ToNumber(GetArg(args, 0, n)));
  402.                 case JSBuiltin.Math_acos:
  403.                     return MathObject.acos(Convert.ToNumber(GetArg(args, 0, n)));
  404.                 case JSBuiltin.Math_asin:
  405.                     return MathObject.asin(Convert.ToNumber(GetArg(args, 0, n)));
  406.                 case JSBuiltin.Math_atan:
  407.                     return MathObject.atan(Convert.ToNumber(GetArg(args, 0, n)));
  408.                 case JSBuiltin.Math_atan2:
  409.                     return MathObject.atan2(Convert.ToNumber(GetArg(args, 0, n)), Convert.ToNumber(GetArg(args, 1, n)));
  410.                 case JSBuiltin.Math_ceil:
  411.                     return MathObject.ceil(Convert.ToNumber(GetArg(args, 0, n)));
  412.                 case JSBuiltin.Math_cos:
  413.                     return MathObject.cos(Convert.ToNumber(GetArg(args, 0, n)));
  414.                 case JSBuiltin.Math_exp:
  415.                     return MathObject.exp(Convert.ToNumber(GetArg(args, 0, n)));
  416.                 case JSBuiltin.Math_floor:
  417.                     return MathObject.floor(Convert.ToNumber(GetArg(args, 0, n)));
  418.                 case JSBuiltin.Math_log:
  419.                     return MathObject.log(Convert.ToNumber(GetArg(args, 0, n)));
  420.                 case JSBuiltin.Math_max:
  421.                     return MathObject.max(GetArg(args, 0, n), GetArg(args, 1, n), VarArgs(args, 2, n));
  422.                 case JSBuiltin.Math_min:
  423.                     return MathObject.min(GetArg(args, 0, n), GetArg(args, 1, n), VarArgs(args, 2, n));
  424.                 case JSBuiltin.Math_pow:
  425.                     return MathObject.pow(Convert.ToNumber(GetArg(args, 0, n)), Convert.ToNumber(GetArg(args, 1, n)));
  426.                 case JSBuiltin.Math_random:
  427.                     return MathObject.random();
  428.                 case JSBuiltin.Math_round:
  429.                     return MathObject.round(Convert.ToNumber(GetArg(args, 0, n)));
  430.                 case JSBuiltin.Math_sin:
  431.                     return MathObject.sin(Convert.ToNumber(GetArg(args, 0, n)));
  432.                 case JSBuiltin.Math_sqrt:
  433.                     return MathObject.sqrt(Convert.ToNumber(GetArg(args, 0, n)));
  434.                 case JSBuiltin.Math_tan:
  435.                     return MathObject.tan(Convert.ToNumber(GetArg(args, 0, n)));
  436.                 case JSBuiltin.Number_toExponential:
  437.                     return NumberPrototype.toExponential(thisob, GetArg(args, 0, n));
  438.                 case JSBuiltin.Number_toFixed:
  439.                     return NumberPrototype.toFixed(thisob, Convert.ToNumber(GetArg(args, 0, n)));
  440.                 case JSBuiltin.Number_toLocaleString:
  441.                     return NumberPrototype.toLocaleString(thisob);
  442.                 case JSBuiltin.Number_toPrecision:
  443.                     return NumberPrototype.toPrecision(thisob, GetArg(args, 0, n));
  444.                 case JSBuiltin.Number_toString:
  445.                     return NumberPrototype.toString(thisob, GetArg(args, 0, n));
  446.                 case JSBuiltin.Number_valueOf:
  447.                     return NumberPrototype.valueOf(thisob);
  448.                 case JSBuiltin.Object_hasOwnProperty:
  449.                     return ObjectPrototype.hasOwnProperty(thisob, GetArg(args, 0, n));
  450.                 case JSBuiltin.Object_isPrototypeOf:
  451.                     return ObjectPrototype.isPrototypeOf(thisob, GetArg(args, 0, n));
  452.                 case JSBuiltin.Object_propertyIsEnumerable:
  453.                     return ObjectPrototype.propertyIsEnumerable(thisob, GetArg(args, 0, n));
  454.                 case JSBuiltin.Object_toLocaleString:
  455.                     return ObjectPrototype.toLocaleString(thisob);
  456.                 case JSBuiltin.Object_toString:
  457.                     return ObjectPrototype.toString(thisob);
  458.                 case JSBuiltin.Object_valueOf:
  459.                     return ObjectPrototype.valueOf(thisob);
  460.                 case JSBuiltin.RegExp_compile:
  461.                     return RegExpPrototype.compile(thisob, GetArg(args, 0, n), GetArg(args, 1, n));
  462.                 case JSBuiltin.RegExp_exec:
  463.                     return RegExpPrototype.exec(thisob, GetArg(args, 0, n));
  464.                 case JSBuiltin.RegExp_test:
  465.                     return RegExpPrototype.test(thisob, GetArg(args, 0, n));
  466.                 case JSBuiltin.RegExp_toString:
  467.                     return RegExpPrototype.toString(thisob);
  468.                 case JSBuiltin.String_anchor:
  469.                     return StringPrototype.anchor(thisob, GetArg(args, 0, n));
  470.                 case JSBuiltin.String_big:
  471.                     return StringPrototype.big(thisob);
  472.                 case JSBuiltin.String_blink:
  473.                     return StringPrototype.blink(thisob);
  474.                 case JSBuiltin.String_bold:
  475.                     return StringPrototype.bold(thisob);
  476.                 case JSBuiltin.String_charAt:
  477.                     return StringPrototype.charAt(thisob, Convert.ToNumber(GetArg(args, 0, n)));
  478.                 case JSBuiltin.String_charCodeAt:
  479.                     return StringPrototype.charCodeAt(thisob, Convert.ToNumber(GetArg(args, 0, n)));
  480.                 case JSBuiltin.String_concat:
  481.                     return StringPrototype.concat(thisob, args);
  482.                 case JSBuiltin.String_fixed:
  483.                     return StringPrototype.@fixed(thisob);
  484.                 case JSBuiltin.String_fontcolor:
  485.                     return StringPrototype.fontcolor(thisob, GetArg(args, 0, n));
  486.                 case JSBuiltin.String_fontsize:
  487.                     return StringPrototype.fontsize(thisob, GetArg(args, 0, n));
  488.                 case JSBuiltin.String_fromCharCode:
  489.                     return StringConstructor.fromCharCode(args);
  490.                 case JSBuiltin.String_indexOf:
  491.                     return StringPrototype.indexOf(thisob, GetArg(args, 0, n), Convert.ToNumber(GetArg(args, 1, n)));
  492.                 case JSBuiltin.String_italics:
  493.                     return StringPrototype.italics(thisob);
  494.                 case JSBuiltin.String_lastIndexOf:
  495.                     return StringPrototype.lastIndexOf(thisob, GetArg(args, 0, n), Convert.ToNumber(GetArg(args, 1, n)));
  496.                 case JSBuiltin.String_link:
  497.                     return StringPrototype.link(thisob, GetArg(args, 0, n));
  498.                 case JSBuiltin.String_localeCompare:
  499.                     return StringPrototype.localeCompare(thisob, GetArg(args, 0, n));
  500.                 case JSBuiltin.String_match:
  501.                     return StringPrototype.match(thisob, engine, GetArg(args, 0, n));
  502.                 case JSBuiltin.String_replace:
  503.                     return StringPrototype.replace(thisob, GetArg(args, 0, n), GetArg(args, 1, n));
  504.                 case JSBuiltin.String_search:
  505.                     return StringPrototype.search(thisob, engine, GetArg(args, 0, n));
  506.                 case JSBuiltin.String_slice:
  507.                     return StringPrototype.slice(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n));
  508.                 case JSBuiltin.String_small:
  509.                     return StringPrototype.small(thisob);
  510.                 case JSBuiltin.String_split:
  511.                     return StringPrototype.split(thisob, engine, GetArg(args, 0, n), GetArg(args, 1, n));
  512.                 case JSBuiltin.String_strike:
  513.                     return StringPrototype.strike(thisob);
  514.                 case JSBuiltin.String_sub:
  515.                     return StringPrototype.sub(thisob);
  516.                 case JSBuiltin.String_substr:
  517.                     return StringPrototype.substr(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n));
  518.                 case JSBuiltin.String_substring:
  519.                     return StringPrototype.substring(thisob, Convert.ToNumber(GetArg(args, 0, n)), GetArg(args, 1, n));
  520.                 case JSBuiltin.String_sup:
  521.                     return StringPrototype.sup(thisob);
  522.                 case JSBuiltin.String_toLocaleLowerCase:
  523.                     return StringPrototype.toLocaleLowerCase(thisob);
  524.                 case JSBuiltin.String_toLocaleUpperCase:
  525.                     return StringPrototype.toLocaleUpperCase(thisob);
  526.                 case JSBuiltin.String_toLowerCase:
  527.                     return StringPrototype.toLowerCase(thisob);
  528.                 case JSBuiltin.String_toString:
  529.                     return StringPrototype.toString(thisob);
  530.                 case JSBuiltin.String_toUpperCase:
  531.                     return StringPrototype.toUpperCase(thisob);
  532.                 case JSBuiltin.String_valueOf:
  533.                     return StringPrototype.valueOf(thisob);
  534.                 case JSBuiltin.VBArray_dimensions:
  535.                     return VBArrayPrototype.dimensions(thisob);
  536.                 case JSBuiltin.VBArray_getItem:
  537.                     return VBArrayPrototype.getItem(thisob, args);
  538.                 case JSBuiltin.VBArray_lbound:
  539.                     return VBArrayPrototype.lbound(thisob, GetArg(args, 0, n));
  540.                 case JSBuiltin.VBArray_toArray:
  541.                     return VBArrayPrototype.toArray(thisob, engine);
  542.                 case JSBuiltin.VBArray_ubound:
  543.                     return VBArrayPrototype.ubound(thisob, GetArg(args, 0, n));
  544.             }
  545.             return method.Invoke(thisob, (BindingFlags)0, JSBinder.ob, args, null);
  546.         }
  547.        
  548.         private static object GetArg(object[] args, int i, int n)
  549.         {
  550.             return i < n ? args[i] : Missing.Value;
  551.         }
  552.        
  553.         private static object[] VarArgs(object[] args, int offset, int n)
  554.         {
  555.             object[] result = new object[n >= offset ? n - offset : 0];
  556.             for (int i = offset; i < n; i++)
  557.                 result[i - offset] = args[i];
  558.             return result;
  559.         }
  560.        
  561.         public override string ToString()
  562.         {
  563.             return "function " + this.name + "() {\n [native code]\n}";
  564.         }
  565.     }
  566. }

Developer Fusion