/*
 * Copyright 2008 Jacek Caban for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "jsglobal_dispid.h"

import "oaidl.idl";

[
    uuid(3eef9759-35fc-11d1-8ce4-00c04fc2b085),
    version(1.0),
]
library JSGlobal
{
    importlib("stdole2.tlb");

    interface StringInstance;

    [
        uuid(3eef9758-35fc-11d1-8ce4-00C04fc2b086)
    ]
    dispinterface GlobalObj {
    properties:
        [id(DISPID_GLOBAL_NAN), readonly]
        VARIANT NaN;

        [id(DISPID_GLOBAL_INFINITY), readonly]
        VARIANT Infinity;

    methods:
        [id(DISPID_GLOBAL_ARRAY)]
        VARIANT Array();

        [id(DISPID_GLOBAL_BOOLEAN)]
        VARIANT Boolean();

        [id(DISPID_GLOBAL_DATE)]
        VARIANT Date();

        [id(DISPID_GLOBAL_FUNCTION)]
        VARIANT Function();

        [id(DISPID_GLOBAL_NUMBER)]
        VARIANT Number();

        [id(DISPID_GLOBAL_OBJECT)]
        VARIANT Object();

        [id(DISPID_GLOBAL_STRING)]
        VARIANT String();

        [id(DISPID_GLOBAL_REGEXP)]
        VARIANT RegExp();

        [id(DISPID_GLOBAL_ACTIVEXOBJ)]
        VARIANT ActiveXObject();

        [id(DISPID_GLOBAL_VBARRAY)]
        VARIANT VBArray();

        [id(DISPID_GLOBAL_ENUMERATOR)]
        VARIANT Enumerator();

        [id(DISPID_GLOBAL_ESCAPE)]
        VARIANT escape(VARIANT String);

        [id(DISPID_GLOBAL_EVAL)]
        VARIANT eval(VARIANT x);

        [id(DISPID_GLOBAL_ISNAN)]
        VARIANT isNaN(VARIANT Number);

        [id(DISPID_GLOBAL_ISFINITE)]
        VARIANT isFinite(VARIANT Number);

        [id(DISPID_GLOBAL_PARSEINT)]
        VARIANT parseInt(
                VARIANT String,
                VARIANT radix);

        [id(DISPID_GLOBAL_PARSEFLOAT)]
        VARIANT parseFloat(VARIANT String);

        [id(DISPID_GLOBAL_UNESCAPE)]
        VARIANT unescape(VARIANT String);

        [id(DISPID_GLOBAL_GETOBJECT)]
        VARIANT GetObject(
                [optional] VARIANT path,
                [optional] VARIANT classname);

        [id(DISPID_GLOBAL_SCRIPTENGINE)]
        VARIANT ScriptEngine();

        [id(DISPID_GLOBAL_MAJORVER)]
        VARIANT ScriptEngineMajorVersion();

        [id(DISPID_GLOBAL_MINORVER)]
        VARIANT ScriptEngineMinorVersion();

        [id(DISPID_GLOBAL_BUILDVER)]
        VARIANT ScriptEngineBuildVersion();

        [id(DISPID_GLOBAL_COLLECT)]
        VARIANT CollectGarbage();

        [id(DISPID_GLOBAL_MATH)]
        VARIANT Math();
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b087)
    ]
    dispinterface DateObj {
    properties:
    methods:
        [id(DISPID_DATEOBJ_PARSE)]
        VARIANT parse(VARIANT String);

        [id(DISPID_DATEOBJ_UTC)]
        VARIANT UTC(
                VARIANT year,
                [optional] VARIANT month,
                [optional] VARIANT Date,
                [optional] VARIANT hours,
                [optional] VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT ms);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00C04fc2b088)
    ]
    dispinterface MathObj {
    properties:
        [id(DISPID_MATHOBJ_E), readonly]
        VARIANT E;

        [id(DISPID_MATHOBJ_LOG2E), readonly]
        VARIANT LOG2E;

        [id(DISPID_MATHOBJ_LOG10E), readonly]
        VARIANT LOG10E;

        [id(DISPID_MATHOBJ_LN2), readonly]
        VARIANT LN2;

        [id(DISPID_MATHOBJ_LN10), readonly]
        VARIANT LN10;

        [id(DISPID_MATHOBJ_PI), readonly]
        VARIANT PI;

        [id(DISPID_MATHOBJ_SQRT2), readonly]
        VARIANT SQRT2;

        [id(DISPID_MATHOBJ_SQRT1_2), readonly]
        VARIANT SQRT1_2;

    methods:
        [id(DISPID_MATHOBJ_ABS)]
        VARIANT abs(VARIANT x);

        [id(DISPID_MATHOBJ_ACOS)]
        VARIANT acos(VARIANT x);

        [id(DISPID_MATHOBJ_ASIN)]
        VARIANT asin(VARIANT x);

        [id(DISPID_MATHOBJ_ATAN)]
        VARIANT atan(VARIANT x);

        [id(DISPID_MATHOBJ_ATAN2)]
        VARIANT atan2(VARIANT x, VARIANT y);

        [id(DISPID_MATHOBJ_CEIL)]
        VARIANT ceil(VARIANT x);

        [id(DISPID_MATHOBJ_COS)]
        VARIANT cos(VARIANT x);

        [id(DISPID_MATHOBJ_EXP)]
        VARIANT exp(VARIANT x);

        [id(DISPID_MATHOBJ_FLOOR)]
        VARIANT floor(VARIANT x);

        [id(DISPID_MATHOBJ_LOG)]
        VARIANT log(VARIANT x);

        [id(DISPID_MATHOBJ_MAX)]
        VARIANT max(VARIANT x, VARIANT y);

        [id(DISPID_MATHOBJ_MIN)]
        VARIANT min(VARIANT x, VARIANT y);

        [id(DISPID_MATHOBJ_POW)]
        VARIANT pow(VARIANT x, VARIANT y);

        [id(DISPID_MATHOBJ_RANDOM)]
        VARIANT random();

        [id(DISPID_MATHOBJ_ROUND)]
        VARIANT round(VARIANT x);

        [id(DISPID_MATHOBJ_SIN)]
        VARIANT sin(VARIANT x);

        [id(DISPID_MATHOBJ_SQRT)]
        VARIANT sqrt(VARIANT x);

        [id(DISPID_MATHOBJ_TAN)]
        VARIANT tan(VARIANT x);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b089)
    ]
    dispinterface NumberObj {
    properties:
        [id(DISPID_NUMBEROBJ_MAX_VALUE), readonly]
        VARIANT MAX_VALUE;

        [id(DISPID_NUMBEROBJ_MIN_VALUE), readonly]
        VARIANT MIN_VALUE;

        [id(DISPID_NUMBEROBJ_NAN), readonly]
        VARIANT NaN;

        [id(DISPID_NUMBEROBJ_NEGATIVE_INFINITY), readonly]
        VARIANT NEGATIVE_INFINITY;

        [id(DISPID_NUMBEROBJ_POSITIVE_INFINITY), readonly]
        VARIANT POSITIVE_INFINITY;

    methods:
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b090)
    ]
    dispinterface RegExpObj {
    properties:
        [id(DISPID_REGEXPOBJ_INDEX), readonly]
        VARIANT index;

        [id(DISPID_REGEXPOBJ_INPUT), readonly]
        VARIANT input;

        [id(DISPID_REGEXPOBJ_LASTINDEX), readonly]
        VARIANT lastIndex;

    methods:
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b091)
    ]
    dispinterface StringObj {
    properties:
    methods:
        [id(DISPID_STRINGOBJ_FROMCHARCODE)]
        VARIANT fromCharCode(VARIANT char0);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b092)
    ]
    dispinterface ArrayInstance {
    properties:
        [id(DISPID_ARRAY_LENGTH)]
        VARIANT length;

    methods:
        [id(DISPID_ARRAY_CONCAT)]
        ArrayInstance *concat(VARIANT Array);

        [id(DISPID_ARRAY_JOIN)]
        StringInstance *join(VARIANT separator);

        [id(DISPID_ARRAY_POP)]
        VARIANT pop();

        [id(DISPID_ARRAY_PUSH)]
        VARIANT push(VARIANT value);

        [id(DISPID_ARRAY_REVERSE)]
        ArrayInstance *reverse();

        [id(DISPID_ARRAY_SHIFT)]
        VARIANT shift();

        [id(DISPID_ARRAY_SLICE)]
        ArrayInstance *slice(
                VARIANT start,
                VARIANT end);

        [id(DISPID_ARRAY_SORT)]
        ArrayInstance *sort(VARIANT sortfunction);

        [id(DISPID_ARRAY_SPLICE)]
        ArrayInstance *splice(
                VARIANT start,
                VARIANT deletecount);

        [id(DISPID_ARRAY_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ARRAY_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ARRAY_VALUEOF)]
        ArrayInstance *valueOf();

        [id(DISPID_ARRAY_UNSHIFT)]
        VARIANT unshift(VARIANT value);

        [id(DISPID_ARRAY_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ARRAY_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ARRAY_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b093)
    ]
    dispinterface FunctionInstance {
    properties:
        [id(DISPID_FUNCTION_LENGTH)]
        VARIANT length;
    methods:
        [id(DISPID_FUNCTION_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_FUNCTION_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_FUNCTION_VALUEOF)]
        FunctionInstance *valueOf();

        [id(DISPID_FUNCTION_APPLY)]
        VARIANT apply(
                VARIANT thisValue,
                VARIANT argArray);

        [id(DISPID_FUNCTION_CALL)]
        VARIANT call(VARIANT thisValue);

        [id(DISPID_FUNCTION_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_FUNCTION_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_FUNCTION_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b094)
    ]
    dispinterface StringInstance {
    properties:
        [id(DISPID_STRING_LENGTH)]
        VARIANT length;
    methods:
        [id(DISPID_STRING_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_STRING_VALUEOF)]
        StringInstance *valueOf();

        [id(DISPID_STRING_ANCHOR)]
        StringInstance *anchor(VARIANT anchorString);

        [id(DISPID_STRING_BIG)]
        StringInstance *big();

        [id(DISPID_STRING_BLINK)]
        StringInstance *blink();

        [id(DISPID_STRING_BOLD)]
        StringInstance *bold();

        [id(DISPID_STRING_CHARAT)]
        StringInstance *charAt(VARIANT index);

        [id(DISPID_STRING_CHARCODEAT)]
        VARIANT charCodeAt(VARIANT index);

        [id(DISPID_STRING_CONCAT)]
        StringInstance *concat(VARIANT String);

        [id(DISPID_STRING_FIXED)]
        StringInstance *fixed();

        [id(DISPID_STRING_FONTCOLOR)]
        StringInstance *fontcolor(VARIANT colorval);

        [id(DISPID_STRING_FONTSIZE)]
        StringInstance *fontsize(VARIANT size);

        [id(DISPID_STRING_INDEXOF)]
        VARIANT indexOf(
                VARIANT substring,
                VARIANT startindex);

        [id(DISPID_STRING_ITALICS)]
        StringInstance *italics();

        [id(DISPID_STRING_LASTINDEXOF)]
        VARIANT lastIndexOf(
                VARIANT substring,
                VARIANT startindex);

        [id(DISPID_STRING_LINK)]
        StringInstance *link(VARIANT linkstring);

        [id(DISPID_STRING_MATCH)]
        VARIANT match(VARIANT RegExp);

        [id(DISPID_STRING_REPLACE)]
        StringInstance *replace(
                VARIANT RegExp,
                VARIANT replacetext);

        [id(DISPID_STRING_SEARCH)]
        VARIANT search(VARIANT RegExp);

        [id(DISPID_STRING_SLICE)]
        StringInstance *slice(
                VARIANT start,
                VARIANT end);

        [id(DISPID_STRING_SMALL)]
        StringInstance *_small(); /* FIXME */

        [id(DISPID_STRING_SPLIT)]
        ArrayInstance *split(VARIANT RegExp);

        [id(DISPID_STRING_STRIKE)]
        StringInstance *strike();

        [id(DISPID_STRING_SUB)]
        StringInstance *sub();

        [id(DISPID_STRING_SUBSTRING)]
        StringInstance *substring(
                VARIANT start,
                VARIANT end);

        [id(DISPID_STRING_SUBSTR)]
        StringInstance *substr(
                VARIANT start,
                VARIANT length);

        [id(DISPID_STRING_SUP)]
        StringInstance *sup();

        [id(DISPID_STRING_TOLOWERCASE)]
        StringInstance *toLowerCase();

        [id(DISPID_STRING_TOUPPERCASE)]
        StringInstance *toUpperCase();

        [id(DISPID_STRING_TOLOCLOWERCASE)]
        StringInstance *toLocaleLowerCase();

        [id(DISPID_STRING_TOLOCUPPERCASE)]
        StringInstance *toLocaleUpperCase();

        [id(DISPID_STRING_LOCCOMPARE)]
        VARIANT localeCompare(VARIANT that);

        [id(DISPID_STRING_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_STRING_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_STRING_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b095)
    ]
    dispinterface BoolInstance {
    properties:
    methods:
        [id(DISPID_BOOL_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_BOOL_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_BOOL_VALUEOF)]
        VARIANT valueOf();

        [id(DISPID_BOOL_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_BOOL_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_BOOL_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00C04fc2b096)
    ]
    dispinterface NumberInstance {
    properties:
    methods:
        [id(DISPID_NUMBER_TOSTRING)]
        StringInstance *toString(VARIANT radix);

        [id(DISPID_NUMBER_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_NUMBER_TOFIXED)]
        StringInstance *toFixed(VARIANT fractionDigits);

        [id(DISPID_NUMBER_TOEXPONENTIAL)]
        StringInstance *toExponential(VARIANT fractionDigits);

        [id(DISPID_NUMBER_TOPRECISION)]
        StringInstance *toPrecision(VARIANT precision);

        [id(DISPID_NUMBER_VALUEOF)]
        VARIANT valueOf();

        [id(DISPID_NUMBER_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_NUMBER_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_NUMBER_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b097)
    ]
    dispinterface ObjectInstance {
    properties:
    methods:
        [id(DISPID_OBJECT_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_OBJECT_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_OBJECT_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_OBJECT_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_OBJECT_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);

        [id(DISPID_OBJECT_VALUEOF)]
        ObjectInstance *valueOf();
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00C04fc2b098)
    ]
    dispinterface DateInstance {
    properties:
    methods:
        [id(DISPID_DATE_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_DATE_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_DATE_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_DATE_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_DATE_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);

        [id(DISPID_DATE_VALUEOF)]
        DateInstance *valueOf();

        [id(DISPID_DATE_TOUTCSTRING)]
        StringInstance *toUTCString();

        [id(DISPID_DATE_TODATESTRING)]
        StringInstance *toDateString();

        [id(DISPID_DATE_TOTIMESTRING)]
        StringInstance *toTimeString();

        [id(DISPID_DATE_TOLOCDATESTRING)]
        StringInstance *toLocaleDateString();

        [id(DISPID_DATE_TOLOCTIMESTRING)]
        StringInstance *toLocaleTimeString();

        [id(DISPID_DATE_GETTIME)]
        VARIANT getTime();

        [id(DISPID_DATE_GETFULLYEAR)]
        VARIANT getFullYear();

        [id(DISPID_DATE_GETUTCFULLYEAR)]
        VARIANT getUTCFullYear();

        [id(DISPID_DATE_GETMONTH)]
        VARIANT getMonth();

        [id(DISPID_DATE_GETUTCMONTH)]
        VARIANT getUTCMonth();

        [id(DISPID_DATE_GETDATE)]
        VARIANT getDate();

        [id(DISPID_DATE_GETUTCDATE)]
        VARIANT getUTCDate();

        [id(DISPID_DATE_GETDAY)]
        VARIANT getDay();

        [id(DISPID_DATE_GETUTCDAY)]
        VARIANT getUTCDay();

        [id(DISPID_DATE_GETHOURS)]
        VARIANT getHours();

        [id(DISPID_DATE_GETUTCHOURS)]
        VARIANT getUTCHours();

        [id(DISPID_DATE_GETMINUTES)]
        VARIANT getMinutes();

        [id(DISPID_DATE_GETUTCMINUTES)]
        VARIANT getUTCMinutes();

        [id(DISPID_DATE_GETSECONDS)]
        VARIANT getSeconds();

        [id(DISPID_DATE_GETUTCSECONDS)]
        VARIANT getUTCSeconds();

        [id(DISPID_DATE_GETMILLISECONDS)]
        VARIANT getMilliseconds();

        [id(DISPID_DATE_GETUTCMILLISECONDS)]
        VARIANT getUTCMilliseconds();

        [id(DISPID_DATE_GETTIMEZONEOFFSET)]
        VARIANT getTimezoneOffset();

        [id(DISPID_DATE_SETTIME)]
        DateInstance *setTime(VARIANT time);

        [id(DISPID_DATE_SETMILLISECONDS)]
        DateInstance *setMilliseconds(VARIANT milliseconds);

        [id(DISPID_DATE_SETUTCMILLISECONDS)]
        DateInstance *setUTCMilliseconds(VARIANT milliseconds);

        [id(DISPID_DATE_SETSECONDS)]
        DateInstance *setSeconds(
                VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETUTCSECONDS)]
        DateInstance *setUTCSeconds(
                VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETMINUTES)]
        DateInstance *setMinutes(
                VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETUTCMINUTES)]
        DateInstance *setUTCMinutes(
                VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETHOURS)]
        DateInstance *setHours(
                VARIANT hours,
                [optional] VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETUTCHOURS)]
        DateInstance *setUTCHours(
                VARIANT hours,
                [optional] VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETDATE)]
        DateInstance *setDate(VARIANT Date);

        [id(DISPID_DATE_SETUTCDATE)]
        DateInstance *setUTCDate(VARIANT Date);

        [id(DISPID_DATE_SETMONTH)]
        DateInstance *setMonth(
                VARIANT month,
                [optional] VARIANT Date);

        [id(DISPID_DATE_SETUTCMONTH)]
        DateInstance *setUTCMonth(
                VARIANT month,
                [optional] VARIANT Date);

        [id(DISPID_DATE_SETFULLYEAR)]
        DateInstance *setFullYear(
                VARIANT year,
                [optional] VARIANT month,
                [optional] VARIANT Date);

        [id(DISPID_DATE_SETUTCFULLYEAR)]
        DateInstance *setUTCFullYear(
                VARIANT year,
                [optional] VARIANT month,
                [optional] VARIANT Date);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04Fc2b099)
    ]
    dispinterface RegExpInstance {
    properties:
        [id(DISPID_REGEXP_SOURCE)]
         StringInstance *source;

        [id(DISPID_REGEXP_GLOBAL)]
        VARIANT global;

        [id(DISPID_REGEXP_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_REGEXP_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_REGEXP_LASTINDEX)]
        VARIANT lastIndex;
    methods:
        [id(DISPID_REGEXP_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_REGEXP_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_REGEXP_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_REGEXP_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_REGEXP_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);

        [id(DISPID_REGEXP_EXEC)]
        ArrayInstance *exec(VARIANT String);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09a)
    ]
    dispinterface ErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09b)
    ]
    dispinterface EvalErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09c)
    ]
    dispinterface RangeErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09d)
    ]
    dispinterface ReferenceErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09e)
    ]
    dispinterface SyntaxErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09f)
    ]
    dispinterface TypeErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b0a0)
    ]
    dispinterface URIErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }
}
