static EncodedJSValue JSC_HOST_CALL constructHTMLOptionElement(ExecState* exec)
{
    JSOptionConstructor* jsConstructor = static_cast<JSOptionConstructor*>(exec->callee());
    Document* document = jsConstructor->document();
    if (!document)
        return throwVMError(exec, createReferenceError(exec, "Option constructor associated document is unavailable"));

    String data;
    if ((exec->argumentCount() >= 1) && !exec->argument(0).isUndefined())
        data = ustringToString(exec->argument(0).toString(exec));

    String value;
    if ((exec->argumentCount() >= 2)  && !exec->argument(1).isUndefined())
        value = ustringToString(exec->argument(1).toString(exec));
    bool defaultSelected = (exec->argumentCount() >= 3) && exec->argument(2).toBoolean(exec);
    bool selected = (exec->argumentCount() >= 4) && exec->argument(3).toBoolean(exec);

    ExceptionCode ec = 0;
    RefPtr<HTMLOptionElement> element = HTMLOptionElement::createForJSConstructor(document, data, value, defaultSelected, selected, ec);
    if (ec) {
        setDOMException(exec, ec);
        return JSValue::encode(JSValue());
    }

    return JSValue::encode(asObject(toJS(exec, jsConstructor->globalObject(), element.release())));
}
static JSObject* constructHTMLOptionElement(ExecState* exec, JSObject* constructor, const ArgList& args)
{
    JSOptionConstructor* jsConstructor = static_cast<JSOptionConstructor*>(constructor);
    Document* document = jsConstructor->document();
    if (!document)
        return throwError(exec, ReferenceError, "Option constructor associated document is unavailable");

    RefPtr<HTMLOptionElement> element = static_pointer_cast<HTMLOptionElement>(document->createElement(HTMLNames::optionTag, false));

    ExceptionCode ec = 0;
    RefPtr<Text> text = document->createTextNode("");
    if (!args.at(0).isUndefined())
        text->setData(args.at(0).toString(exec), ec);
    if (ec == 0)
        element->appendChild(text.release(), ec);
    if (ec == 0 && !args.at(1).isUndefined())
        element->setValue(args.at(1).toString(exec));
    if (ec == 0)
        element->setDefaultSelected(args.at(2).toBoolean(exec));
    if (ec == 0)
        element->setSelected(args.at(3).toBoolean(exec));

    if (ec) {
        setDOMException(exec, ec);
        return 0;
    }

    return asObject(toJS(exec, jsConstructor->globalObject(), element.release()));
}