mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Merge pull request #2668 from Ms2ger/CreateInterfaceObjects-failures
Handle JSAPI OOM failures by task failure as soon as possible.
This commit is contained in:
commit
9eff8b458f
2 changed files with 31 additions and 64 deletions
|
@ -1877,10 +1877,8 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod):
|
|||
# if we don't need to create anything, why are we generating this?
|
||||
assert needInterfaceObject or needInterfacePrototypeObject
|
||||
|
||||
getParentProto = ("let parentProto: *mut JSObject = %s;\n" +
|
||||
"if parentProto.is_null() {\n" +
|
||||
" return ptr::mut_null();\n" +
|
||||
"}\n") % getParentProto
|
||||
getParentProto = ("let parentProto: *mut JSObject = %s;\n"
|
||||
"assert!(parentProto.is_not_null());\n") % getParentProto
|
||||
|
||||
if self.descriptor.interface.ctor():
|
||||
constructHook = CONSTRUCT_HOOK_NAME
|
||||
|
@ -1953,6 +1951,7 @@ class CGGetPerInterfaceObject(CGAbstractMethod):
|
|||
let cachedObject: *mut JSObject = *protoOrIfaceArray.offset(%s as int);
|
||||
if cachedObject.is_null() {
|
||||
let tmp: *mut JSObject = CreateInterfaceObjects(aCx, aGlobal, aReceiver);
|
||||
assert!(tmp.is_not_null());
|
||||
*protoOrIfaceArray.offset(%s as int) = tmp;
|
||||
tmp
|
||||
} else {
|
||||
|
|
|
@ -230,9 +230,6 @@ pub fn CreateInterfaceObjects2(cx: *mut JSContext, global: *mut JSObject, receiv
|
|||
proto = CreateInterfacePrototypeObject(cx, global, protoProto,
|
||||
protoClass, methods,
|
||||
properties, constants);
|
||||
if proto.is_null() {
|
||||
return ptr::mut_null();
|
||||
}
|
||||
|
||||
unsafe {
|
||||
JS_SetReservedSlot(proto, DOM_PROTO_INSTANCE_CLASS_SLOT,
|
||||
|
@ -247,9 +244,6 @@ pub fn CreateInterfaceObjects2(cx: *mut JSContext, global: *mut JSObject, receiv
|
|||
constructor, ctorNargs, proto,
|
||||
staticMethods, constants, s)
|
||||
});
|
||||
if interface.is_null() {
|
||||
return ptr::mut_null();
|
||||
}
|
||||
}
|
||||
|
||||
if protoClass.is_not_null() {
|
||||
|
@ -268,52 +262,40 @@ fn CreateInterfaceObject(cx: *mut JSContext, global: *mut JSObject, receiver: *m
|
|||
unsafe {
|
||||
let fun = JS_NewFunction(cx, constructorNative, ctorNargs,
|
||||
JSFUN_CONSTRUCTOR, global, name);
|
||||
if fun.is_null() {
|
||||
return ptr::mut_null();
|
||||
}
|
||||
assert!(fun.is_not_null());
|
||||
|
||||
let constructor = JS_GetFunctionObject(fun);
|
||||
assert!(constructor.is_not_null());
|
||||
|
||||
match staticMethods {
|
||||
Some(staticMethods) => {
|
||||
if !DefineMethods(cx, constructor, staticMethods) {
|
||||
return ptr::mut_null();
|
||||
}
|
||||
},
|
||||
Some(staticMethods) => DefineMethods(cx, constructor, staticMethods),
|
||||
_ => (),
|
||||
}
|
||||
|
||||
match constants {
|
||||
Some(constants) => {
|
||||
if !DefineConstants(cx, constructor, constants) {
|
||||
return ptr::mut_null();
|
||||
}
|
||||
},
|
||||
Some(constants) => DefineConstants(cx, constructor, constants),
|
||||
_ => (),
|
||||
}
|
||||
|
||||
if proto.is_not_null() && JS_LinkConstructorAndPrototype(cx, constructor, proto) == 0 {
|
||||
return ptr::mut_null();
|
||||
if proto.is_not_null() {
|
||||
assert!(JS_LinkConstructorAndPrototype(cx, constructor, proto) != 0);
|
||||
}
|
||||
|
||||
let mut alreadyDefined = 0;
|
||||
if JS_AlreadyHasOwnProperty(cx, receiver, name, &mut alreadyDefined) == 0 {
|
||||
return ptr::mut_null();
|
||||
}
|
||||
assert!(JS_AlreadyHasOwnProperty(cx, receiver, name, &mut alreadyDefined) != 0);
|
||||
|
||||
if alreadyDefined == 0 &&
|
||||
JS_DefineProperty(cx, receiver, name, ObjectValue(&*constructor),
|
||||
None, None, 0) == 0 {
|
||||
return ptr::mut_null();
|
||||
if alreadyDefined == 0 {
|
||||
assert!(JS_DefineProperty(cx, receiver, name,
|
||||
ObjectValue(&*constructor),
|
||||
None, None, 0) != 0);
|
||||
}
|
||||
|
||||
return constructor;
|
||||
}
|
||||
}
|
||||
|
||||
fn DefineConstants(cx: *mut JSContext, obj: *mut JSObject, constants: &'static [ConstantSpec]) -> bool {
|
||||
constants.iter().all(|spec| {
|
||||
fn DefineConstants(cx: *mut JSContext, obj: *mut JSObject, constants: &'static [ConstantSpec]) {
|
||||
for spec in constants.iter() {
|
||||
let jsval = match spec.value {
|
||||
NullVal => NullValue(),
|
||||
IntVal(i) => Int32Value(i),
|
||||
|
@ -323,23 +305,23 @@ fn DefineConstants(cx: *mut JSContext, obj: *mut JSObject, constants: &'static [
|
|||
VoidVal => UndefinedValue(),
|
||||
};
|
||||
unsafe {
|
||||
JS_DefineProperty(cx, obj, spec.name.as_ptr() as *libc::c_char,
|
||||
jsval, None, None,
|
||||
JSPROP_ENUMERATE | JSPROP_READONLY |
|
||||
JSPROP_PERMANENT) != 0
|
||||
assert!(JS_DefineProperty(cx, obj, spec.name.as_ptr() as *libc::c_char,
|
||||
jsval, None, None,
|
||||
JSPROP_ENUMERATE | JSPROP_READONLY |
|
||||
JSPROP_PERMANENT) != 0);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fn DefineMethods(cx: *mut JSContext, obj: *mut JSObject, methods: &'static [JSFunctionSpec]) -> bool {
|
||||
unsafe {
|
||||
JS_DefineFunctions(cx, obj, methods.as_ptr()) != 0
|
||||
}
|
||||
}
|
||||
|
||||
fn DefineProperties(cx: *mut JSContext, obj: *mut JSObject, properties: &'static [JSPropertySpec]) -> bool {
|
||||
fn DefineMethods(cx: *mut JSContext, obj: *mut JSObject, methods: &'static [JSFunctionSpec]) {
|
||||
unsafe {
|
||||
JS_DefineProperties(cx, obj, properties.as_ptr()) != 0
|
||||
assert!(JS_DefineFunctions(cx, obj, methods.as_ptr()) != 0);
|
||||
}
|
||||
}
|
||||
|
||||
fn DefineProperties(cx: *mut JSContext, obj: *mut JSObject, properties: &'static [JSPropertySpec]) {
|
||||
unsafe {
|
||||
assert!(JS_DefineProperties(cx, obj, properties.as_ptr()) != 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -350,34 +332,20 @@ fn CreateInterfacePrototypeObject(cx: *mut JSContext, global: *mut JSObject,
|
|||
constants: Option<&'static [ConstantSpec]>) -> *mut JSObject {
|
||||
unsafe {
|
||||
let ourProto = JS_NewObjectWithUniqueType(cx, protoClass, parentProto, global);
|
||||
if ourProto.is_null() {
|
||||
return ptr::mut_null();
|
||||
}
|
||||
assert!(ourProto.is_not_null());
|
||||
|
||||
match methods {
|
||||
Some(methods) => {
|
||||
if !DefineMethods(cx, ourProto, methods) {
|
||||
return ptr::mut_null();
|
||||
}
|
||||
},
|
||||
Some(methods) => DefineMethods(cx, ourProto, methods),
|
||||
_ => (),
|
||||
}
|
||||
|
||||
match properties {
|
||||
Some(properties) => {
|
||||
if !DefineProperties(cx, ourProto, properties) {
|
||||
return ptr::mut_null();
|
||||
}
|
||||
},
|
||||
Some(properties) => DefineProperties(cx, ourProto, properties),
|
||||
_ => (),
|
||||
}
|
||||
|
||||
match constants {
|
||||
Some(constants) => {
|
||||
if !DefineConstants(cx, ourProto, constants) {
|
||||
return ptr::mut_null();
|
||||
}
|
||||
},
|
||||
Some(constants) => DefineConstants(cx, ourProto, constants),
|
||||
_ => (),
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue