aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2014-04-10 15:05:52 +0200
committerMs2ger <ms2ger@gmail.com>2014-04-10 19:21:17 +0200
commitd11316fa05657caac6a17261e60485eb5497d8ca (patch)
tree6fb4591c364990134ee7f248c6e32e3333d6f4fd /src/components/script/dom
parent986664f52780481a8e875692331179c956627cb1 (diff)
downloadservo-d11316fa05657caac6a17261e60485eb5497d8ca.tar.gz
servo-d11316fa05657caac6a17261e60485eb5497d8ca.zip
Make GetCallableProperty more rustic.
Diffstat (limited to 'src/components/script/dom')
-rw-r--r--src/components/script/dom/bindings/callback.rs14
-rw-r--r--src/components/script/dom/bindings/codegen/CodegenRust.py18
2 files changed, 16 insertions, 16 deletions
diff --git a/src/components/script/dom/bindings/callback.rs b/src/components/script/dom/bindings/callback.rs
index dff5aeb6a2b..a6d7eb6a507 100644
--- a/src/components/script/dom/bindings/callback.rs
+++ b/src/components/script/dom/bindings/callback.rs
@@ -5,7 +5,7 @@
use dom::bindings::utils::Reflectable;
use js::jsapi::{JSContext, JSObject, JS_WrapObject, JS_ObjectIsCallable};
use js::jsapi::{JS_GetProperty, JSTracer, JS_CallTracer};
-use js::jsval::JSVal;
+use js::jsval::{JSVal, UndefinedValue};
use js::JSTRACE_OBJECT;
use std::cast;
@@ -61,20 +61,20 @@ impl CallbackInterface {
}
}
- pub fn GetCallableProperty(&self, cx: *JSContext, name: *libc::c_char, callable: &mut JSVal) -> bool {
+ pub fn GetCallableProperty(&self, cx: *JSContext, name: &str) -> Result<JSVal, ()> {
+ let mut callable = UndefinedValue();
unsafe {
- if JS_GetProperty(cx, self.callback, name, &*callable) == 0 {
- return false;
+ if name.to_c_str().with_ref(|name| JS_GetProperty(cx, self.callback, name, &mut callable as *mut JSVal as *JSVal)) == 0 {
+ return Err(());
}
if !callable.is_object() ||
JS_ObjectIsCallable(cx, callable.to_object()) == 0 {
//ThrowErrorMessage(cx, MSG_NOT_CALLABLE, description.get());
- return false;
+ return Err(());
}
-
- return true;
}
+ Ok(callable)
}
}
diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py
index 5041a1ae756..5fa018408bd 100644
--- a/src/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/src/components/script/dom/bindings/codegen/CodegenRust.py
@@ -5312,19 +5312,19 @@ class CallbackOperationBase(CallbackMethod):
"methodName": self.methodName
}
getCallableFromProp = string.Template(
- 'if "${methodName}".to_c_str().with_ref(|name| !self.parent.GetCallableProperty(cx, name, &mut callable)) {\n'
- ' return${errorReturn};\n'
- '}\n').substitute(replacements)
+ 'match self.parent.GetCallableProperty(cx, "${methodName}") {\n'
+ ' Err(_) => return${errorReturn},\n'
+ ' Ok(callable) => callable,\n'
+ '}').substitute(replacements)
if not self.singleOperation:
return 'JS::Rooted<JS::Value> callable(cx);\n' + getCallableFromProp
return (
'let isCallable = unsafe { JS_ObjectIsCallable(cx, self.parent.callback) != 0 };\n'
- 'let mut callable = UndefinedValue();\n'
- 'if isCallable {\n'
- ' callable = unsafe { ObjectValue(&*self.parent.callback) };\n'
- '} else {\n'
- '%s'
- '}\n' % CGIndenter(CGGeneric(getCallableFromProp)).define())
+ 'let callable =\n' +
+ CGIndenter(
+ CGIfElseWrapper('isCallable',
+ CGGeneric('unsafe { ObjectValue(&*self.parent.callback) }'),
+ CGGeneric(getCallableFromProp))).define() + ';\n')
class CallbackOperation(CallbackOperationBase):
"""