Bug 766448 - Refactor JSPropertySpec and JS_DefineProperties to accept JSJitInfos. (r=Waldo)

This commit is contained in:
Eric Faust 2012-08-07 22:26:18 -07:00
parent aa790aa109
commit 70d87f9165
20 changed files with 350 additions and 204 deletions

View File

@ -341,24 +341,25 @@ DECL_EVENT_CLASS(Event::sMainRuntimeClass, "WorkerEvent")
#undef DECL_EVENT_CLASS
JSPropertySpec Event::sProperties[] = {
{ "type", SLOT_type, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub },
{ "target", SLOT_target, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "currentTarget", SLOT_currentTarget, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "eventPhase", SLOT_eventPhase, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "bubbles", SLOT_bubbles, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "cancelable", SLOT_cancelable, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "timeStamp", SLOT_timeStamp, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "defaultPrevented", SLOT_defaultPrevented, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "isTrusted", SLOT_isTrusted, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ 0, 0, 0, NULL, NULL }
{ "type", SLOT_type, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "target", SLOT_target, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "currentTarget", SLOT_currentTarget, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "eventPhase", SLOT_eventPhase, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "bubbles", SLOT_bubbles, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "cancelable", SLOT_cancelable, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "timeStamp", SLOT_timeStamp, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "defaultPrevented", SLOT_defaultPrevented, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "isTrusted", SLOT_isTrusted, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
JSFunctionSpec Event::sFunctions[] = {
@ -370,10 +371,12 @@ JSFunctionSpec Event::sFunctions[] = {
};
JSPropertySpec Event::sStaticProperties[] = {
{ "CAPTURING_PHASE", CAPTURING_PHASE, CONSTANT_FLAGS, GetConstant, NULL },
{ "AT_TARGET", AT_TARGET, CONSTANT_FLAGS, GetConstant, NULL },
{ "BUBBLING_PHASE", BUBBLING_PHASE, CONSTANT_FLAGS, GetConstant, NULL },
{ 0, 0, 0, NULL, NULL }
{ "CAPTURING_PHASE", CAPTURING_PHASE, CONSTANT_FLAGS,
JSOP_WRAPPER(GetConstant), JSOP_NULLWRAPPER },
{ "AT_TARGET", AT_TARGET, CONSTANT_FLAGS, JSOP_WRAPPER(GetConstant), JSOP_NULLWRAPPER },
{ "BUBBLING_PHASE", BUBBLING_PHASE, CONSTANT_FLAGS,
JSOP_WRAPPER(GetConstant), JSOP_NULLWRAPPER },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
class MessageEvent : public Event
@ -593,12 +596,13 @@ DECL_MESSAGEEVENT_CLASS(MessageEvent::sMainRuntimeClass, "WorkerMessageEvent")
#undef DECL_MESSAGEEVENT_CLASS
JSPropertySpec MessageEvent::sProperties[] = {
{ "data", SLOT_data, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub },
{ "origin", SLOT_origin, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "source", SLOT_source, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ 0, 0, 0, NULL, NULL }
{ "data", SLOT_data, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "origin", SLOT_origin, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "source", SLOT_source, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
JSFunctionSpec MessageEvent::sFunctions[] = {
@ -778,13 +782,13 @@ DECL_ERROREVENT_CLASS(ErrorEvent::sMainRuntimeClass, "WorkerErrorEvent")
#undef DECL_ERROREVENT_CLASS
JSPropertySpec ErrorEvent::sProperties[] = {
{ "message", SLOT_message, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "filename", SLOT_filename, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "lineno", SLOT_lineno, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ 0, 0, 0, NULL, NULL }
{ "message", SLOT_message, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "filename", SLOT_filename, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "lineno", SLOT_lineno, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
JSFunctionSpec ErrorEvent::sFunctions[] = {
@ -952,13 +956,13 @@ JSClass ProgressEvent::sClass = {
};
JSPropertySpec ProgressEvent::sProperties[] = {
{ "lengthComputable", SLOT_lengthComputable, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "loaded", SLOT_loaded, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "total", SLOT_total, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ 0, 0, 0, NULL, NULL }
{ "lengthComputable", SLOT_lengthComputable, PROPERTY_FLAGS,
JSOP_WRAPPER(GetProperty), JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "loaded", SLOT_loaded, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "total", SLOT_total, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
JSFunctionSpec ProgressEvent::sFunctions[] = {

View File

@ -162,10 +162,13 @@ JSClass DOMException::sClass = {
};
JSPropertySpec DOMException::sProperties[] = {
{ "code", SLOT_code, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub },
{ "name", SLOT_name, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub },
{ "message", SLOT_message, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub },
{ 0, 0, 0, NULL, NULL }
{ "code", SLOT_code, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "name", SLOT_name, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "message", SLOT_message, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
JSFunctionSpec DOMException::sFunctions[] = {
@ -176,7 +179,7 @@ JSFunctionSpec DOMException::sFunctions[] = {
JSPropertySpec DOMException::sStaticProperties[] = {
#define EXCEPTION_ENTRY(_name) \
{ #_name, _name, CONSTANT_FLAGS, GetConstant, NULL },
{ #_name, _name, CONSTANT_FLAGS, JSOP_WRAPPER(GetConstant), JSOP_NULLWRAPPER },
EXCEPTION_ENTRY(INDEX_SIZE_ERR)
EXCEPTION_ENTRY(DOMSTRING_SIZE_ERR)
@ -206,7 +209,7 @@ JSPropertySpec DOMException::sStaticProperties[] = {
#undef EXCEPTION_ENTRY
{ 0, 0, 0, NULL, NULL }
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
// static

View File

@ -210,9 +210,9 @@ JSClass Blob::sClass = {
};
JSPropertySpec Blob::sProperties[] = {
{ "size", 0, PROPERTY_FLAGS, GetSize, js_GetterOnlyPropertyStub },
{ "type", 0, PROPERTY_FLAGS, GetType, js_GetterOnlyPropertyStub },
{ 0, 0, 0, NULL, NULL }
{ "size", 0, PROPERTY_FLAGS, JSOP_WRAPPER(GetSize), JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "type", 0, PROPERTY_FLAGS, JSOP_WRAPPER(GetType), JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
JSFunctionSpec Blob::sFunctions[] = {
@ -360,10 +360,11 @@ JSClass File::sClass = {
};
JSPropertySpec File::sProperties[] = {
{ "name", 0, PROPERTY_FLAGS, GetName, js_GetterOnlyPropertyStub },
{ "mozFullPath", 0, PROPERTY_FLAGS, GetMozFullPath,
js_GetterOnlyPropertyStub },
{ 0, 0, 0, NULL, NULL }
{ "name", 0, PROPERTY_FLAGS, JSOP_WRAPPER(GetName),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "mozFullPath", 0, PROPERTY_FLAGS, JSOP_WRAPPER(GetMozFullPath),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
nsIDOMBlob*

View File

@ -148,10 +148,10 @@ JSPropertySpec ImageData::sProperties[] = {
// something about it in the mean time. So we use NULL, which defaults to the
// class setter (JS_StrictPropertyStub), which is always a silent no-op,
// regardless of strict mode. Not ideal, but good enough for now.
{ "width", SLOT_width, PROPERTY_FLAGS, GetProperty, NULL },
{ "height", SLOT_height, PROPERTY_FLAGS, GetProperty, NULL },
{ "data", SLOT_data, PROPERTY_FLAGS, GetProperty, NULL },
{ 0, 0, 0, NULL, NULL }
{ "width", SLOT_width, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty), JSOP_NULLWRAPPER },
{ "height", SLOT_height, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty), JSOP_NULLWRAPPER },
{ "data", SLOT_data, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty), JSOP_NULLWRAPPER },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
} // anonymous namespace

View File

@ -154,19 +154,23 @@ JSClass Location::sClass = {
};
JSPropertySpec Location::sProperties[] = {
{ "href", SLOT_href, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub },
{ "protocol", SLOT_protocol, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "host", SLOT_host, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub },
{ "hostname", SLOT_hostname, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "port", SLOT_port, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub },
{ "pathname", SLOT_pathname, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "search", SLOT_search, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "hash", SLOT_hash, PROPERTY_FLAGS, GetProperty, js_GetterOnlyPropertyStub },
{ 0, 0, 0, NULL, NULL }
{ "href", SLOT_href, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "protocol", SLOT_protocol, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "host", SLOT_host, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "hostname", SLOT_hostname, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "port", SLOT_port, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "pathname", SLOT_pathname, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "search", SLOT_search, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "hash", SLOT_hash, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
JSFunctionSpec Location::sFunctions[] = {

View File

@ -143,15 +143,15 @@ JSClass Navigator::sClass = {
};
JSPropertySpec Navigator::sProperties[] = {
{ "appName", SLOT_appName, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "appVersion", SLOT_appVersion, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "platform", SLOT_platform, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ "userAgent", SLOT_userAgent, PROPERTY_FLAGS, GetProperty,
js_GetterOnlyPropertyStub },
{ 0, 0, 0, NULL, NULL }
{ "appName", SLOT_appName, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "appVersion", SLOT_appVersion, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "platform", SLOT_platform, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "userAgent", SLOT_userAgent, PROPERTY_FLAGS, JSOP_WRAPPER(GetProperty),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
} // anonymous namespace

View File

@ -292,10 +292,10 @@ DOMJSClass Worker::sClass = {
JSPropertySpec Worker::sProperties[] = {
{ sEventStrings[STRING_onerror], STRING_onerror, PROPERTY_FLAGS,
GetEventListener, SetEventListener },
JSOP_WRAPPER(GetEventListener), JSOP_WRAPPER(SetEventListener) },
{ sEventStrings[STRING_onmessage], STRING_onmessage, PROPERTY_FLAGS,
GetEventListener, SetEventListener },
{ 0, 0, 0, NULL, NULL }
JSOP_WRAPPER(GetEventListener), JSOP_WRAPPER(SetEventListener) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
JSFunctionSpec Worker::sFunctions[] = {

View File

@ -612,16 +612,16 @@ JSClass WorkerGlobalScope::sClass = {
};
JSPropertySpec WorkerGlobalScope::sProperties[] = {
{ "location", SLOT_location, PROPERTY_FLAGS, GetLocation,
js_GetterOnlyPropertyStub },
{ "location", SLOT_location, PROPERTY_FLAGS, JSOP_WRAPPER(GetLocation),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ sEventStrings[STRING_onerror], STRING_onerror, PROPERTY_FLAGS,
GetOnErrorListener, SetOnErrorListener },
JSOP_WRAPPER(GetOnErrorListener), JSOP_WRAPPER(SetOnErrorListener) },
{ sEventStrings[STRING_onclose], STRING_onclose, PROPERTY_FLAGS,
GetEventListener, SetEventListener },
{ "navigator", SLOT_navigator, PROPERTY_FLAGS, GetNavigator,
js_GetterOnlyPropertyStub },
{ "self", 0, PROPERTY_FLAGS, GetSelf, js_GetterOnlyPropertyStub },
{ 0, 0, 0, NULL, NULL }
JSOP_WRAPPER(GetEventListener), JSOP_WRAPPER(SetEventListener) },
{ "navigator", SLOT_navigator, PROPERTY_FLAGS, JSOP_WRAPPER(GetNavigator),
JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ "self", 0, PROPERTY_FLAGS, JSOP_WRAPPER(GetSelf), JSOP_WRAPPER(js_GetterOnlyPropertyStub) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
JSFunctionSpec WorkerGlobalScope::sFunctions[] = {
@ -864,8 +864,8 @@ DOMJSClass DedicatedWorkerGlobalScope::sClass = {
JSPropertySpec DedicatedWorkerGlobalScope::sProperties[] = {
{ sEventStrings[STRING_onmessage], STRING_onmessage, PROPERTY_FLAGS,
GetEventListener, SetEventListener },
{ 0, 0, 0, NULL, NULL }
JSOP_WRAPPER(GetEventListener), JSOP_WRAPPER(SetEventListener) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
JSFunctionSpec DedicatedWorkerGlobalScope::sFunctions[] = {

View File

@ -436,30 +436,49 @@ const uint8_t HIDDEN_PROP_ATTRS = JSPROP_PERMANENT | JSPROP_SHARED;
const uint8_t RO_HIDDEN_PROP_ATTRS = HIDDEN_PROP_ATTRS | JSPROP_READONLY;
static JSPropertySpec regexp_static_props[] = {
{"input", 0, REGEXP_STATIC_PROP_ATTRS, static_input_getter, static_input_setter},
{"multiline", 0, REGEXP_STATIC_PROP_ATTRS, static_multiline_getter,
static_multiline_setter},
{"lastMatch", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_lastMatch_getter, NULL},
{"lastParen", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_lastParen_getter, NULL},
{"leftContext", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_leftContext_getter, NULL},
{"rightContext", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_rightContext_getter, NULL},
{"$1", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_paren1_getter, NULL},
{"$2", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_paren2_getter, NULL},
{"$3", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_paren3_getter, NULL},
{"$4", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_paren4_getter, NULL},
{"$5", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_paren5_getter, NULL},
{"$6", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_paren6_getter, NULL},
{"$7", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_paren7_getter, NULL},
{"$8", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_paren8_getter, NULL},
{"$9", 0, RO_REGEXP_STATIC_PROP_ATTRS, static_paren9_getter, NULL},
{"$_", 0, HIDDEN_PROP_ATTRS, static_input_getter, static_input_setter},
{"$*", 0, HIDDEN_PROP_ATTRS, static_multiline_getter, static_multiline_setter},
{"$&", 0, RO_HIDDEN_PROP_ATTRS, static_lastMatch_getter, NULL},
{"$+", 0, RO_HIDDEN_PROP_ATTRS, static_lastParen_getter, NULL},
{"$`", 0, RO_HIDDEN_PROP_ATTRS, static_leftContext_getter, NULL},
{"$'", 0, RO_HIDDEN_PROP_ATTRS, static_rightContext_getter, NULL},
{0,0,0,0,0}
{"input", 0, REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_input_getter),
JSOP_WRAPPER(static_input_setter)},
{"multiline", 0, REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_multiline_getter),
JSOP_WRAPPER(static_multiline_setter)},
{"lastMatch", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_lastMatch_getter),
JSOP_NULLWRAPPER},
{"lastParen", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_lastParen_getter),
JSOP_NULLWRAPPER},
{"leftContext", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_leftContext_getter),
JSOP_NULLWRAPPER},
{"rightContext", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_rightContext_getter),
JSOP_NULLWRAPPER},
{"$1", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_paren1_getter),
JSOP_NULLWRAPPER},
{"$2", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_paren2_getter),
JSOP_NULLWRAPPER},
{"$3", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_paren3_getter),
JSOP_NULLWRAPPER},
{"$4", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_paren4_getter),
JSOP_NULLWRAPPER},
{"$5", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_paren5_getter),
JSOP_NULLWRAPPER},
{"$6", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_paren6_getter),
JSOP_NULLWRAPPER},
{"$7", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_paren7_getter),
JSOP_NULLWRAPPER},
{"$8", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_paren8_getter),
JSOP_NULLWRAPPER},
{"$9", 0, RO_REGEXP_STATIC_PROP_ATTRS, JSOP_WRAPPER(static_paren9_getter),
JSOP_NULLWRAPPER},
{"$_", 0, HIDDEN_PROP_ATTRS, JSOP_WRAPPER(static_input_getter),
JSOP_WRAPPER(static_input_setter)},
{"$*", 0, HIDDEN_PROP_ATTRS, JSOP_WRAPPER(static_multiline_getter),
JSOP_WRAPPER(static_multiline_setter)},
{"$&", 0, RO_HIDDEN_PROP_ATTRS, JSOP_WRAPPER(static_lastMatch_getter),
JSOP_NULLWRAPPER},
{"$+", 0, RO_HIDDEN_PROP_ATTRS, JSOP_WRAPPER(static_lastParen_getter),
JSOP_NULLWRAPPER},
{"$`", 0, RO_HIDDEN_PROP_ATTRS, JSOP_WRAPPER(static_leftContext_getter),
JSOP_NULLWRAPPER},
{"$'", 0, RO_HIDDEN_PROP_ATTRS, JSOP_WRAPPER(static_rightContext_getter),
JSOP_NULLWRAPPER},
{0,0,0,JSOP_NULLWRAPPER,JSOP_NULLWRAPPER}
};
JSObject *

View File

@ -435,11 +435,11 @@ static JSClass sCDataFinalizerClass = {
(JSPROP_READONLY | JSPROP_PERMANENT)
static JSPropertySpec sCTypeProps[] = {
{ "name", 0, CTYPESPROP_FLAGS, CType::NameGetter, NULL },
{ "size", 0, CTYPESPROP_FLAGS, CType::SizeGetter, NULL },
{ "ptr", 0, CTYPESPROP_FLAGS, CType::PtrGetter, NULL },
{ "prototype", 0, CTYPESPROP_FLAGS, CType::PrototypeGetter, NULL },
{ 0, 0, 0, NULL, NULL }
{ "name", 0, CTYPESPROP_FLAGS, JSOP_WRAPPER(CType::NameGetter), JSOP_NULLWRAPPER },
{ "size", 0, CTYPESPROP_FLAGS, JSOP_WRAPPER(CType::SizeGetter), JSOP_NULLWRAPPER },
{ "ptr", 0, CTYPESPROP_FLAGS, JSOP_WRAPPER(CType::PtrGetter), JSOP_NULLWRAPPER },
{ "prototype", 0, CTYPESPROP_FLAGS, JSOP_WRAPPER(CType::PrototypeGetter), JSOP_NULLWRAPPER },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
static JSFunctionSpec sCTypeFunctions[] = {
@ -457,8 +457,8 @@ static JSFunctionSpec sCABIFunctions[] = {
static JSPropertySpec sCDataProps[] = {
{ "value", 0, JSPROP_SHARED | JSPROP_PERMANENT,
CData::ValueGetter, CData::ValueSetter },
{ 0, 0, 0, NULL, NULL }
JSOP_WRAPPER(CData::ValueGetter), JSOP_WRAPPER(CData::ValueSetter) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
static JSFunctionSpec sCDataFunctions[] = {
@ -470,7 +470,7 @@ static JSFunctionSpec sCDataFunctions[] = {
};
static JSPropertySpec sCDataFinalizerProps[] = {
{ 0, 0, 0, NULL, NULL }
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
static JSFunctionSpec sCDataFinalizerFunctions[] = {
@ -486,8 +486,9 @@ static JSFunctionSpec sPointerFunction =
JS_FN("PointerType", PointerType::Create, 1, CTYPESCTOR_FLAGS);
static JSPropertySpec sPointerProps[] = {
{ "targetType", 0, CTYPESPROP_FLAGS, PointerType::TargetTypeGetter, NULL },
{ 0, 0, 0, NULL, NULL }
{ "targetType", 0, CTYPESPROP_FLAGS,
JSOP_WRAPPER(PointerType::TargetTypeGetter), JSOP_NULLWRAPPER },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
static JSFunctionSpec sPointerInstanceFunctions[] = {
@ -496,20 +497,23 @@ static JSFunctionSpec sPointerInstanceFunctions[] = {
JS_FN("decrement", PointerType::Decrement, 0, CTYPESFN_FLAGS),
JS_FS_END
};
static JSPropertySpec sPointerInstanceProps[] = {
{ "contents", 0, JSPROP_SHARED | JSPROP_PERMANENT,
PointerType::ContentsGetter, PointerType::ContentsSetter },
{ 0, 0, 0, NULL, NULL }
JSOP_WRAPPER(PointerType::ContentsGetter),
JSOP_WRAPPER(PointerType::ContentsSetter) },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
static JSFunctionSpec sArrayFunction =
JS_FN("ArrayType", ArrayType::Create, 1, CTYPESCTOR_FLAGS);
static JSPropertySpec sArrayProps[] = {
{ "elementType", 0, CTYPESPROP_FLAGS, ArrayType::ElementTypeGetter, NULL },
{ "length", 0, CTYPESPROP_FLAGS, ArrayType::LengthGetter, NULL },
{ 0, 0, 0, NULL, NULL }
{ "elementType", 0, CTYPESPROP_FLAGS,
JSOP_WRAPPER(ArrayType::ElementTypeGetter), JSOP_NULLWRAPPER },
{ "length", 0, CTYPESPROP_FLAGS,
JSOP_WRAPPER(ArrayType::LengthGetter), JSOP_NULLWRAPPER },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
static JSFunctionSpec sArrayInstanceFunctions[] = {
@ -519,16 +523,17 @@ static JSFunctionSpec sArrayInstanceFunctions[] = {
static JSPropertySpec sArrayInstanceProps[] = {
{ "length", 0, JSPROP_SHARED | JSPROP_READONLY | JSPROP_PERMANENT,
ArrayType::LengthGetter, NULL },
{ 0, 0, 0, NULL, NULL }
JSOP_WRAPPER(ArrayType::LengthGetter), JSOP_NULLWRAPPER },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
static JSFunctionSpec sStructFunction =
JS_FN("StructType", StructType::Create, 2, CTYPESCTOR_FLAGS);
static JSPropertySpec sStructProps[] = {
{ "fields", 0, CTYPESPROP_FLAGS, StructType::FieldsArrayGetter, NULL },
{ 0, 0, 0, NULL, NULL }
{ "fields", 0, CTYPESPROP_FLAGS,
JSOP_WRAPPER(StructType::FieldsArrayGetter), JSOP_NULLWRAPPER },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
static JSFunctionSpec sStructFunctions[] = {
@ -545,11 +550,15 @@ static JSFunctionSpec sFunctionFunction =
JS_FN("FunctionType", FunctionType::Create, 2, CTYPESCTOR_FLAGS);
static JSPropertySpec sFunctionProps[] = {
{ "argTypes", 0, CTYPESPROP_FLAGS, FunctionType::ArgTypesGetter, NULL },
{ "returnType", 0, CTYPESPROP_FLAGS, FunctionType::ReturnTypeGetter, NULL },
{ "abi", 0, CTYPESPROP_FLAGS, FunctionType::ABIGetter, NULL },
{ "isVariadic", 0, CTYPESPROP_FLAGS, FunctionType::IsVariadicGetter, NULL },
{ 0, 0, 0, NULL, NULL }
{ "argTypes", 0, CTYPESPROP_FLAGS,
JSOP_WRAPPER(FunctionType::ArgTypesGetter), JSOP_NULLWRAPPER },
{ "returnType", 0, CTYPESPROP_FLAGS,
JSOP_WRAPPER(FunctionType::ReturnTypeGetter), JSOP_NULLWRAPPER },
{ "abi", 0, CTYPESPROP_FLAGS,
JSOP_WRAPPER(FunctionType::ABIGetter), JSOP_NULLWRAPPER },
{ "isVariadic", 0, CTYPESPROP_FLAGS,
JSOP_WRAPPER(FunctionType::IsVariadicGetter), JSOP_NULLWRAPPER },
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
static JSFunctionSpec sFunctionInstanceFunctions[] = {
@ -616,12 +625,12 @@ static JSFunctionSpec sUInt64Functions[] = {
static JSPropertySpec sModuleProps[] = {
{ "errno", 0, JSPROP_SHARED | JSPROP_PERMANENT,
CData::ErrnoGetter, NULL },
JSOP_WRAPPER(CData::ErrnoGetter), JSOP_NULLWRAPPER },
#if defined(XP_WIN)
{ "winLastError", 0, JSPROP_SHARED | JSPROP_PERMANENT,
CData::LastErrorGetter, NULL },
JSOP_WRAPPER(CData::LastErrorGetter), JSOP_NULLWRAPPER },
#endif // defined(XP_WIN)
{ 0, 0, 0, NULL, NULL }
{ 0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER }
};
static JSFunctionSpec sModuleFunctions[] = {

View File

@ -3781,11 +3781,34 @@ JS_AlreadyHasOwnUCProperty(JSContext *cx, JSObject *objArg, const jschar *name,
return atom && JS_AlreadyHasOwnPropertyById(cx, obj, AtomToId(atom), foundp);
}
/* Wrapper functions to create wrappers with no corresponding JSJitInfo from API
* function arguments.
*/
static JSPropertyOpWrapper
GetterWrapper(JSPropertyOp getter)
{
JSPropertyOpWrapper ret;
ret.op = getter;
ret.info = NULL;
return ret;
}
static JSStrictPropertyOpWrapper
SetterWrapper(JSStrictPropertyOp setter)
{
JSStrictPropertyOpWrapper ret;
ret.op = setter;
ret.info = NULL;
return ret;
}
static JSBool
DefinePropertyById(JSContext *cx, HandleObject obj, HandleId id, HandleValue value,
PropertyOp getter, StrictPropertyOp setter, unsigned attrs,
unsigned flags, int tinyid)
const JSPropertyOpWrapper &get, const JSStrictPropertyOpWrapper &set,
unsigned attrs, unsigned flags, int tinyid)
{
PropertyOp getter = get.op;
StrictPropertyOp setter = set.op;
/*
* JSPROP_READONLY has no meaning when accessors are involved. Ideally we'd
* throw if this happens, but we've accepted it for long enough that it's
@ -3806,9 +3829,13 @@ DefinePropertyById(JSContext *cx, HandleObject obj, HandleId id, HandleValue val
attrs &= ~JSPROP_NATIVE_ACCESSORS;
if (getter) {
RootedObject global(cx, (JSObject*) &obj->global());
JSObject *getobj = JS_NewFunction(cx, (Native) getter, 0, 0, global, NULL);
JSFunction *getobj = JS_NewFunction(cx, (Native) getter, 0, 0, global, NULL);
if (!getobj)
return false;
if (get.info)
getobj->setJitInfo(get.info);
getter = JS_DATA_TO_FUNC_PTR(PropertyOp, getobj);
attrs |= JSPROP_GETTER;
}
@ -3816,9 +3843,13 @@ DefinePropertyById(JSContext *cx, HandleObject obj, HandleId id, HandleValue val
// Root just the getter, since the setter is not yet a JSObject.
AutoRooterGetterSetter getRoot(cx, JSPROP_GETTER, &getter, NULL);
RootedObject global(cx, (JSObject*) &obj->global());
JSObject *setobj = JS_NewFunction(cx, (Native) setter, 1, 0, global, NULL);
JSFunction *setobj = JS_NewFunction(cx, (Native) setter, 1, 0, global, NULL);
if (!setobj)
return false;
if (set.info)
setobj->setJitInfo(set.info);
setter = JS_DATA_TO_FUNC_PTR(StrictPropertyOp, setobj);
attrs |= JSPROP_SETTER;
}
@ -3850,7 +3881,8 @@ JS_DefinePropertyById(JSContext *cx, JSObject *objArg, jsid idArg, jsval value_,
RootedObject obj(cx, objArg);
RootedId id(cx, idArg);
RootedValue value(cx, value_);
return DefinePropertyById(cx, obj, id, value, getter, setter, attrs, 0, 0);
return DefinePropertyById(cx, obj, id, value, GetterWrapper(getter),
SetterWrapper(setter), attrs, 0, 0);
}
JS_PUBLIC_API(JSBool)
@ -3865,16 +3897,18 @@ JS_DefineElement(JSContext *cx, JSObject *objArg, uint32_t index, jsval valueArg
RootedId id(cx);
if (!IndexToId(cx, index, id.address()))
return false;
return DefinePropertyById(cx, obj, id, value, getter, setter, attrs, 0, 0);
return DefinePropertyById(cx, obj, id, value, GetterWrapper(getter),
SetterWrapper(setter), attrs, 0, 0);
}
static JSBool
DefineProperty(JSContext *cx, JSHandleObject obj, const char *name, const Value &value_,
PropertyOp getter, StrictPropertyOp setter, unsigned attrs,
unsigned flags, int tinyid)
const JSPropertyOpWrapper &getter, const JSStrictPropertyOpWrapper &setter,
unsigned attrs, unsigned flags, int tinyid)
{
RootedValue value(cx, value_);
AutoRooterGetterSetter gsRoot(cx, attrs, &getter, &setter);
AutoRooterGetterSetter gsRoot(cx, attrs, const_cast<JSPropertyOp *>(&getter.op),
const_cast<JSStrictPropertyOp *>(&setter.op));
RootedId id(cx);
if (attrs & JSPROP_INDEX) {
@ -3895,7 +3929,8 @@ JS_DefineProperty(JSContext *cx, JSObject *objArg, const char *name, jsval value
PropertyOp getter, JSStrictPropertyOp setter, unsigned attrs)
{
RootedObject obj(cx, objArg);
return DefineProperty(cx, obj, name, value, getter, setter, attrs, 0, 0);
return DefineProperty(cx, obj, name, value, GetterWrapper(getter),
SetterWrapper(setter), attrs, 0, 0);
}
JS_PUBLIC_API(JSBool)
@ -3903,7 +3938,8 @@ JS_DefinePropertyWithTinyId(JSContext *cx, JSObject *objArg, const char *name, i
jsval value, PropertyOp getter, JSStrictPropertyOp setter, unsigned attrs)
{
RootedObject obj(cx, objArg);
return DefineProperty(cx, obj, name, value, getter, setter, attrs, Shape::HAS_SHORTID, tinyid);
return DefineProperty(cx, obj, name, value, GetterWrapper(getter),
SetterWrapper(setter), attrs, Shape::HAS_SHORTID, tinyid);
}
static JSBool
@ -3917,7 +3953,8 @@ DefineUCProperty(JSContext *cx, JSHandleObject obj, const jschar *name, size_t n
if (!atom)
return false;
RootedId id(cx, AtomToId(atom));
return DefinePropertyById(cx, obj, id, value, getter, setter, attrs, flags, tinyid);
return DefinePropertyById(cx, obj, id, value, GetterWrapper(getter),
SetterWrapper(setter), attrs, flags, tinyid);
}
JS_PUBLIC_API(JSBool)
@ -3968,8 +4005,11 @@ JS_DefineObject(JSContext *cx, JSObject *objArg, const char *name, JSClass *jscl
if (!nobj)
return NULL;
if (!DefineProperty(cx, obj, name, ObjectValue(*nobj), NULL, NULL, attrs, 0, 0))
if (!DefineProperty(cx, obj, name, ObjectValue(*nobj), GetterWrapper(NULL),
SetterWrapper(NULL), attrs, 0, 0))
{
return NULL;
}
return nobj;
}
@ -3983,12 +4023,14 @@ JS_DefineConstDoubles(JSContext *cx, JSObject *objArg, JSConstDoubleSpec *cds)
AssertHeapIsIdle(cx);
CHECK_REQUEST(cx);
JSPropertyOpWrapper noget = GetterWrapper(NULL);
JSStrictPropertyOpWrapper noset = SetterWrapper(NULL);
for (ok = JS_TRUE; cds->name; cds++) {
Value value = DoubleValue(cds->dval);
attrs = cds->flags;
if (!attrs)
attrs = JSPROP_READONLY | JSPROP_PERMANENT;
ok = DefineProperty(cx, obj, cds->name, value, NULL, NULL, attrs, 0, 0);
ok = DefineProperty(cx, obj, cds->name, value, noget, noset, attrs, 0, 0);
if (!ok)
break;
}

View File

@ -4335,17 +4335,42 @@ struct JSConstDoubleSpec {
uint8_t spare[3];
};
typedef struct JSJitInfo JSJitInfo;
/*
* Wrappers to replace {Strict,}PropertyOp for JSPropertySpecs. This will allow
* us to pass one JSJitInfo per function with the property spec, without
* additional field overhead.
*/
typedef struct JSStrictPropertyOpWrapper {
JSStrictPropertyOp op;
const JSJitInfo *info;
} JSStrictPropertyOpWrapper;
typedef struct JSPropertyOpWrapper {
JSPropertyOp op;
const JSJitInfo *info;
} JSPropertyOpWrapper;
/*
* Macro static initializers which correspond to the old |op| and |NULL|
* respectively, and make it easy to pass no JSJitInfo as part of a
* JSPropertySpec.
*/
#define JSOP_WRAPPER(op) {op, NULL}
#define JSOP_NULLWRAPPER JSOP_WRAPPER(NULL)
/*
* To define an array element rather than a named property member, cast the
* element's index to (const char *) and initialize name with it, and set the
* JSPROP_INDEX bit in flags.
*/
struct JSPropertySpec {
const char *name;
int8_t tinyid;
uint8_t flags;
JSPropertyOp getter;
JSStrictPropertyOp setter;
const char *name;
int8_t tinyid;
uint8_t flags;
JSPropertyOpWrapper getter;
JSStrictPropertyOpWrapper setter;
};
struct JSFunctionSpec {

View File

@ -1292,4 +1292,11 @@ JS_GetDataViewByteLength(JSObject *obj, JSContext *cx);
JS_FRIEND_API(void *)
JS_GetDataViewData(JSObject *obj, JSContext *cx);
/*
* This struct contains metadata passed from the DOM to the JS Engine for JIT
* optimizations on DOM property accessors. Eventually, this should be made
* available to general JSAPI users, but we are not currently ready to do so.
*/
struct JSJitInfo;
#endif /* jsfriendapi_h___ */

View File

@ -1385,8 +1385,8 @@ js_NewFunction(JSContext *cx, JSObject *funobj, Native native, unsigned nargs,
fun->mutableScript().init(NULL);
fun->initEnvironment(parent);
} else {
fun->u.native = native;
JS_ASSERT(fun->u.native);
JS_ASSERT(native);
fun->initNative(native, NULL);
}
if (kind == JSFunction::ExtendedFinalizeKind) {
fun->flags |= JSFUN_EXTENDED;
@ -1419,7 +1419,7 @@ js_CloneFunctionObject(JSContext *cx, HandleFunction fun, HandleObject parent,
clone->initScript(fun->script());
clone->initEnvironment(parent);
} else {
clone->u.native = fun->native();
clone->initNative(fun->native(), fun->jitInfo());
}
clone->atom.init(fun->atom);

View File

@ -49,7 +49,13 @@ struct JSFunction : public JSObject
reflected as f.length/f.arity */
uint16_t flags; /* flags, see JSFUN_* below and in jsapi.h */
union U {
js::Native native; /* native method pointer or null */
class Native {
friend struct JSFunction;
js::Native native; /* native method pointer or null */
const JSJitInfo *jitinfo; /* Information about this function to be
used by the JIT;
use the accessor! */
} n;
struct Scripted {
JSScript *script_; /* interpreted bytecode descriptor or null;
use the accessor! */
@ -120,16 +126,20 @@ struct JSFunction : public JSObject
JSNative native() const {
JS_ASSERT(isNative());
return u.native;
return u.n.native;
}
JSNative maybeNative() const {
return isInterpreted() ? NULL : native();
}
inline void initNative(js::Native native, const JSJitInfo *jitinfo);
inline const JSJitInfo *jitInfo() const;
inline void setJitInfo(const JSJitInfo *data);
static unsigned offsetOfNativeOrScript() {
JS_STATIC_ASSERT(offsetof(U, native) == offsetof(U, i.script_));
JS_STATIC_ASSERT(offsetof(U, native) == offsetof(U, nativeOrScript));
JS_STATIC_ASSERT(offsetof(U, n.native) == offsetof(U, i.script_));
JS_STATIC_ASSERT(offsetof(U, n.native) == offsetof(U, nativeOrScript));
return offsetof(JSFunction, u.nativeOrScript);
}

View File

@ -42,6 +42,28 @@ JSFunction::initEnvironment(JSObject *obj)
((js::HeapPtrObject *)&u.i.env_)->init(obj);
}
inline void
JSFunction::initNative(js::Native native, const JSJitInfo *data)
{
JS_ASSERT(native);
u.n.native = native;
u.n.jitinfo = data;
}
inline const JSJitInfo *
JSFunction::jitInfo() const
{
JS_ASSERT(isNative());
return u.n.jitinfo;
}
inline void
JSFunction::setJitInfo(const JSJitInfo *data)
{
JS_ASSERT(isNative());
u.n.jitinfo = data;
}
inline void
JSFunction::initializeExtended()
{

View File

@ -72,13 +72,13 @@ CastAsObjectJsval(StrictPropertyOp op)
* JSNatives. To avoid widespread casting, have JS_PSG and JS_PSGS perform
* type-safe casts.
*/
#define JS_PSG(name,getter,flags) \
{name, 0, (flags) | JSPROP_SHARED | JSPROP_NATIVE_ACCESSORS, \
(JSPropertyOp)getter, NULL}
#define JS_PSGS(name,getter,setter,flags) \
{name, 0, (flags) | JSPROP_SHARED | JSPROP_NATIVE_ACCESSORS, \
(JSPropertyOp)getter, (JSStrictPropertyOp)setter}
#define JS_PS_END {0, 0, 0, 0, 0}
#define JS_PSG(name,getter,flags) \
{name, 0, (flags) | JSPROP_SHARED | JSPROP_NATIVE_ACCESSORS, \
JSOP_WRAPPER((JSPropertyOp)getter), JSOP_NULLWRAPPER}
#define JS_PSGS(name,getter,setter,flags) \
{name, 0, (flags) | JSPROP_SHARED | JSPROP_NATIVE_ACCESSORS, \
JSOP_WRAPPER((JSPropertyOp)getter), JSOP_WRAPPER((JSStrictPropertyOp)setter)}
#define JS_PS_END {0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER}
/******************************************************************************/

View File

@ -197,9 +197,9 @@ JS_FRIEND_DATA(Class) js::NamespaceClass = {
(JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT | JSPROP_SHARED)
static JSPropertySpec namespace_props[] = {
{js_prefix_str, 0, NAMESPACE_ATTRS, NamePrefix_getter, 0},
{js_uri_str, 0, NAMESPACE_ATTRS, NameURI_getter, 0},
{0,0,0,0,0}
{js_prefix_str, 0, NAMESPACE_ATTRS, JSOP_WRAPPER(NamePrefix_getter), JSOP_NULLWRAPPER},
{js_uri_str, 0, NAMESPACE_ATTRS, JSOP_WRAPPER(NameURI_getter), JSOP_NULLWRAPPER},
{0,0,0,JSOP_NULLWRAPPER, JSOP_NULLWRAPPER}
};
static JSBool
@ -341,9 +341,9 @@ JS_FRIEND_DATA(Class) js::AnyNameClass = {
#define QNAME_ATTRS (JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT | JSPROP_SHARED)
static JSPropertySpec qname_props[] = {
{js_uri_str, 0, QNAME_ATTRS, QNameNameURI_getter, 0},
{js_localName_str, 0, QNAME_ATTRS, QNameLocalName_getter, 0},
{0,0,0,0,0}
{js_uri_str, 0, QNAME_ATTRS, JSOP_WRAPPER(QNameNameURI_getter), JSOP_NULLWRAPPER},
{js_localName_str, 0, QNAME_ATTRS, JSOP_WRAPPER(QNameLocalName_getter), JSOP_NULLWRAPPER},
{0,0,0,JSOP_NULLWRAPPER,JSOP_NULLWRAPPER}
};
static JSString *
@ -1114,12 +1114,12 @@ static const char js_prettyIndent_str[] = "prettyIndent";
#define XSF_PRETTY_PRINTING JS_BIT(3)
static JSPropertySpec xml_static_props[] = {
{js_ignoreComments_str, 0, JSPROP_PERMANENT, NULL, NULL},
{js_ignoreProcessingInstructions_str, 0, JSPROP_PERMANENT, NULL, NULL},
{js_ignoreWhitespace_str, 0, JSPROP_PERMANENT, NULL, NULL},
{js_prettyPrinting_str, 0, JSPROP_PERMANENT, NULL, NULL},
{js_prettyIndent_str, 0, JSPROP_PERMANENT, NULL, NULL},
{0,0,0,0,0}
{js_ignoreComments_str, 0, JSPROP_PERMANENT, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER},
{js_ignoreProcessingInstructions_str, 0, JSPROP_PERMANENT, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER},
{js_ignoreWhitespace_str, 0, JSPROP_PERMANENT, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER},
{js_prettyPrinting_str, 0, JSPROP_PERMANENT, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER},
{js_prettyIndent_str, 0, JSPROP_PERMANENT, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER},
{0,0,0,JSOP_NULLWRAPPER, JSOP_NULLWRAPPER}
};
/* Macros for special-casing xml:, xmlns= and xmlns:foo= in ParseNodeToQName. */

View File

@ -103,7 +103,7 @@ const uint8_t PM_PATTRS =
JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT | JSPROP_SHARED;
#define GETTER(name) \
{ #name, 0, PM_PATTRS, pm_get_##name, 0 }
{ #name, 0, PM_PATTRS, JSOP_WRAPPER(pm_get_##name), JSOP_NULLWRAPPER }
static JSPropertySpec pm_props[] = {
GETTER(cpu_cycles),
@ -118,7 +118,7 @@ static JSPropertySpec pm_props[] = {
GETTER(context_switches),
GETTER(cpu_migrations),
GETTER(eventsMeasured),
{0,0,0,0,0}
{0,0,0,JSOP_NULLWRAPPER,JSOP_NULLWRAPPER}
};
#undef GETTER

View File

@ -3928,21 +3928,21 @@ static JSBool
its_set_customNative(JSContext *cx, unsigned argc, jsval *vp);
static JSPropertySpec its_props[] = {
{"color", ITS_COLOR, JSPROP_ENUMERATE, NULL, NULL},
{"height", ITS_HEIGHT, JSPROP_ENUMERATE, NULL, NULL},
{"width", ITS_WIDTH, JSPROP_ENUMERATE, NULL, NULL},
{"funny", ITS_FUNNY, JSPROP_ENUMERATE, NULL, NULL},
{"array", ITS_ARRAY, JSPROP_ENUMERATE, NULL, NULL},
{"rdonly", ITS_RDONLY, JSPROP_READONLY, NULL, NULL},
{"color", ITS_COLOR, JSPROP_ENUMERATE, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER},
{"height", ITS_HEIGHT, JSPROP_ENUMERATE, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER},
{"width", ITS_WIDTH, JSPROP_ENUMERATE, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER},
{"funny", ITS_FUNNY, JSPROP_ENUMERATE, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER},
{"array", ITS_ARRAY, JSPROP_ENUMERATE, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER},
{"rdonly", ITS_RDONLY, JSPROP_READONLY, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER},
{"custom", ITS_CUSTOM, JSPROP_ENUMERATE,
its_getter, its_setter},
JSOP_WRAPPER(its_getter), JSOP_WRAPPER(its_setter)},
{"customRdOnly", ITS_CUSTOMRDONLY, JSPROP_ENUMERATE | JSPROP_READONLY,
its_getter, its_setter},
JSOP_WRAPPER(its_getter), JSOP_WRAPPER(its_setter)},
{"customNative", ITS_CUSTOMNATIVE,
JSPROP_ENUMERATE | JSPROP_NATIVE_ACCESSORS,
(JSPropertyOp)its_get_customNative,
(JSStrictPropertyOp)its_set_customNative },
{NULL,0,0,NULL,NULL}
JSOP_WRAPPER((JSPropertyOp)its_get_customNative),
JSOP_WRAPPER((JSStrictPropertyOp)its_set_customNative)},
{NULL,0,0,JSOP_NULLWRAPPER, JSOP_NULLWRAPPER}
};
static JSBool its_noisy; /* whether to be noisy when finalizing it */