Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement [Func] #11308

Merged
merged 12 commits into from May 27, 2016

Remove Prefable::terminator 🤖

  • Loading branch information
nox committed May 26, 2016
commit a20db08f06f93a693b9288728fc2a4a522f42344
@@ -1409,16 +1409,15 @@ def generatePrefableArray(self, array, name, specTemplate, specTerminator,
assert len(array) != 0
specs = []
prefableSpecs = []
prefableTemplate = ' Prefable { pref: %s, specs: %s[%d], terminator: %s }'
hasTerminator = 'true' if specTerminator else 'false'
prefableTemplate = ' Prefable { pref: %s, specs: %s[%d] }'

for cond, members in groupby(array, lambda m: getCondition(m, self.descriptor)):
currentSpecs = [specTemplate % getDataTuple(m) for m in members]
if specTerminator:
currentSpecs.append(specTerminator)
specs.append("&[\n" + ",\n".join(currentSpecs) + "]\n")
prefableSpecs.append(
prefableTemplate % (cond, name + "_specs", len(specs) - 1, hasTerminator))
prefableTemplate % (cond, name + "_specs", len(specs) - 1))

specsArray = ("const %s_specs: &'static [&'static[%s]] = &[\n" +
",\n".join(specs) + "\n" +
@@ -216,7 +216,9 @@ pub unsafe fn create_callback_interface_object(
rval.set(JS_NewObject(cx, ptr::null()));
assert!(!rval.ptr.is_null());
for prefable in constants {
define_constants(cx, rval.handle(), prefable.specs());
if let Some(specs) = prefable.specs() {
define_constants(cx, rval.handle(), specs);
}
}
define_name(cx, rval.handle(), name);
define_on_global_object(cx, receiver, name, rval.handle());
@@ -363,7 +365,9 @@ unsafe fn create_object(
define_prefable_methods(cx, rval.handle(), methods);
define_prefable_properties(cx, rval.handle(), properties);
for prefable in constants {
define_constants(cx, rval.handle(), prefable.specs());
if let Some(specs) = prefable.specs() {
define_constants(cx, rval.handle(), specs);
}
}
}

@@ -373,7 +377,9 @@ pub unsafe fn define_prefable_methods(
obj: HandleObject,
methods: &'static [Prefable<JSFunctionSpec>]) {
for prefable in methods {
define_methods(cx, obj, prefable.specs()).unwrap();
if let Some(specs) = prefable.specs() {
define_methods(cx, obj, specs).unwrap();
}
}
}

@@ -383,7 +389,9 @@ pub unsafe fn define_prefable_properties(
obj: HandleObject,
properties: &'static [Prefable<JSPropertySpec>]) {
for prefable in properties {
define_properties(cx, obj, prefable.specs()).unwrap();
if let Some(specs) = prefable.specs() {
define_properties(cx, obj, specs).unwrap();
}
}
}

@@ -557,24 +557,17 @@ pub struct Prefable<T: 'static> {
pub pref: Option<&'static str>,
/// The underlying slice of specifications.
pub specs: &'static [T],
/// Whether the specifications contain special terminating entries that should be
/// included or not.
pub terminator: bool,
}

impl<T> Prefable<T> {
/// Retrieve the slice represented by this container, unless the condition
/// guarding it is false.
pub fn specs(&self) -> &'static [T] {
pub fn specs(&self) -> Option<&'static [T]> {
if let Some(pref) = self.pref {
if !prefs::get_pref(pref).as_boolean().unwrap_or(false) {
return if self.terminator {
&self.specs[self.specs.len() - 1..]
} else {
&[]
};
return None;
}
}
self.specs
Some(self.specs)
}
}
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.