aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2014-04-10 12:09:18 +0200
committerMs2ger <ms2ger@gmail.com>2014-04-10 12:09:18 +0200
commit8c4a3aa3877bd59bccef3668c237fd247adee5f8 (patch)
tree7fff31484e2952aee1d679173b30b1756de8e701 /src
parentd7f450dbd7bb7dcc8b0ecf688e999a7ceb3c1154 (diff)
downloadservo-8c4a3aa3877bd59bccef3668c237fd247adee5f8.tar.gz
servo-8c4a3aa3877bd59bccef3668c237fd247adee5f8.zip
Use ToJSValConvertible for all conversions to JSVal.
Diffstat (limited to 'src')
-rw-r--r--src/components/script/dom/bindings/codegen/CodegenRust.py74
-rw-r--r--src/components/script/dom/bindings/conversions.rs20
2 files changed, 20 insertions, 74 deletions
diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py
index 7c6b7bed88a..8786a15e5c2 100644
--- a/src/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/src/components/script/dom/bindings/codegen/CodegenRust.py
@@ -1048,78 +1048,8 @@ def getWrapTemplateForType(type, descriptorProvider, result, successCode,
Returns (templateString, infallibility of conversion template)
"""
- haveSuccessCode = successCode is not None
- if not haveSuccessCode:
- successCode = "return 1;"
-
- # We often want exceptionCode to be indented, since it often appears in an
- # if body.
- exceptionCodeIndented = CGIndenter(CGGeneric(exceptionCode))
-
- def setValue(value, callWrapValue=False):
- """
- Returns the code to set the jsval to value. If "callWrapValue" is true
- JS_WrapValue will be called on the jsval.
- """
- if not callWrapValue:
- tail = successCode
- elif haveSuccessCode:
- tail = ("if JS_WrapValue(cx, ${jsvalPtr}) == 0 {\n" +
- " return 0;\n" +
- "}\n" +
- successCode)
- else:
- tail = "return JS_WrapValue(cx, ${jsvalPtr} as *JSVal);"
- return ("${jsvalRef} = %s;\n" +
- tail) % (value)
-
- if type is None or type.isVoid():
- return (setValue("UndefinedValue()"), True)
-
- if type.isArray():
- raise TypeError("Can't handle array return values yet")
-
- if type.isSequence():
- raise TypeError("Can't handle sequence return values yet")
-
- if type.isGeckoInterface():
- return (setValue("(%s).to_jsval(cx)" % result), True)
-
- if type.isString():
- return (setValue("(%s).to_jsval(cx)" % result), True)
-
- if type.isEnum():
- return (setValue("(%s).to_jsval(cx)" % result), True)
-
- if type.isCallback():
- assert not type.isInterface()
- # XXXbz we're going to assume that callback types are always
- # nullable and always have [TreatNonCallableAsNull] for now.
- # See comments in WrapNewBindingObject explaining why we need
- # to wrap here.
- # NB: setValue(..., True) calls JS_WrapValue(), so is fallible
- return (setValue("JS::ObjectOrNullValue(%s)" % result, True), False)
-
- if type.tag() == IDLType.Tags.any:
- # See comments in WrapNewBindingObject explaining why we need
- # to wrap here.
- # NB: setValue(..., True) calls JS_WrapValue(), so is fallible
- return (setValue(result, True), False)
-
- if type.isObject() or type.isSpiderMonkeyInterface():
- # See comments in WrapNewBindingObject explaining why we need
- # to wrap here.
- if type.nullable():
- toValue = "ObjectOrNullValue(%s)"
- else:
- toValue = "ObjectValue(&*(%s))"
- # NB: setValue(..., True) calls JS_WrapValue(), so is fallible
- return (setValue(toValue % result, True), False)
-
- if not type.isPrimitive():
- raise TypeError("Need to learn to wrap %s" % type)
-
- return (setValue("(%s).to_jsval(cx)" % result), True)
+ template = "${jsvalRef} = (%s).to_jsval(cx);\n%s" % (result, successCode or "return 1;")
+ return (template, True)
def wrapForType(type, descriptorProvider, templateValues):
diff --git a/src/components/script/dom/bindings/conversions.rs b/src/components/script/dom/bindings/conversions.rs
index 513dac9964a..1826782ac84 100644
--- a/src/components/script/dom/bindings/conversions.rs
+++ b/src/components/script/dom/bindings/conversions.rs
@@ -14,8 +14,8 @@ use js::jsapi::{JS_ValueToUint16, JS_ValueToNumber, JS_ValueToBoolean};
use js::jsapi::{JS_NewUCStringCopyN, JS_ValueToString};
use js::jsapi::{JS_WrapValue};
use js::jsval::JSVal;
-use js::jsval::{NullValue, BooleanValue, Int32Value, UInt32Value, StringValue};
-use js::jsval::ObjectValue;
+use js::jsval::{UndefinedValue, NullValue, BooleanValue, Int32Value, UInt32Value};
+use js::jsval::{StringValue, ObjectValue};
use js::glue::RUST_JS_NumberValue;
use std::default::Default;
use std::libc;
@@ -29,6 +29,22 @@ pub trait FromJSValConvertible<T> {
}
+impl ToJSValConvertible for () {
+ fn to_jsval(&self, _cx: *JSContext) -> JSVal {
+ UndefinedValue()
+ }
+}
+
+impl ToJSValConvertible for JSVal {
+ fn to_jsval(&self, cx: *JSContext) -> JSVal {
+ let mut value = *self;
+ if unsafe { JS_WrapValue(cx, &mut value as *mut JSVal as *JSVal) } == 0 {
+ fail!("JS_WrapValue failed.");
+ }
+ value
+ }
+}
+
unsafe fn convert_from_jsval<T: Default>(
cx: *JSContext, value: JSVal,
convert_fn: extern "C" unsafe fn(*JSContext, JSVal, *T) -> JSBool) -> Result<T, ()> {