Browse Source

Remove unnecessary wraps for non built-in functions (#1126)

pull/1130/head
João Borges 3 years ago committed by GitHub
parent
commit
72313a8da5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      boa/src/builtins/array/array_iterator.rs
  2. 44
      boa/src/builtins/array/mod.rs
  3. 2
      boa/src/builtins/array/tests.rs
  4. 12
      boa/src/builtins/date/mod.rs
  5. 2
      boa/src/builtins/function/mod.rs
  6. 6
      boa/src/builtins/map/map_iterator.rs
  7. 18
      boa/src/builtins/map/mod.rs
  8. 4
      boa/src/builtins/object/for_in_iterator.rs
  9. 8
      boa/src/builtins/object/mod.rs
  10. 14
      boa/src/builtins/string/mod.rs
  11. 2
      boa/src/lib.rs
  12. 2
      boa/src/syntax/ast/node/array/mod.rs
  13. 2
      boa/src/syntax/ast/node/iteration/for_in_loop/mod.rs
  14. 4
      boa/src/syntax/ast/node/template/mod.rs
  15. 11
      boa/src/syntax/parser/expression/assignment/mod.rs
  16. 6
      boa/src/syntax/parser/expression/primary/object_initializer/mod.rs
  17. 33
      boa_tester/src/exec.rs

4
boa/src/builtins/array/array_iterator.rs

@ -49,14 +49,14 @@ impl ArrayIterator {
context: &Context, context: &Context,
array: Value, array: Value,
kind: ArrayIterationKind, kind: ArrayIterationKind,
) -> Result<Value> { ) -> Value {
let array_iterator = Value::new_object(context); let array_iterator = Value::new_object(context);
array_iterator.set_data(ObjectData::ArrayIterator(Self::new(array, kind))); array_iterator.set_data(ObjectData::ArrayIterator(Self::new(array, kind)));
array_iterator array_iterator
.as_object() .as_object()
.expect("array iterator object") .expect("array iterator object")
.set_prototype_instance(context.iterator_prototypes().array_iterator().into()); .set_prototype_instance(context.iterator_prototypes().array_iterator().into());
Ok(array_iterator) array_iterator
} }
/// %ArrayIteratorPrototype%.next( ) /// %ArrayIteratorPrototype%.next( )

44
boa/src/builtins/array/mod.rs

@ -120,7 +120,7 @@ impl Array {
.unwrap_or_else(|| context.standard_objects().array_object().prototype()); .unwrap_or_else(|| context.standard_objects().array_object().prototype());
// Delegate to the appropriate constructor based on the number of arguments // Delegate to the appropriate constructor based on the number of arguments
match args.len() { match args.len() {
0 => Array::construct_array_empty(prototype, context), 0 => Ok(Array::construct_array_empty(prototype, context)),
1 => Array::construct_array_length(prototype, &args[0], context), 1 => Array::construct_array_length(prototype, &args[0], context),
_ => Array::construct_array_values(prototype, args, context), _ => Array::construct_array_values(prototype, args, context),
} }
@ -132,7 +132,7 @@ impl Array {
/// - [ECMAScript reference][spec] /// - [ECMAScript reference][spec]
/// ///
/// [spec]: https://tc39.es/ecma262/#sec-array-constructor-array /// [spec]: https://tc39.es/ecma262/#sec-array-constructor-array
fn construct_array_empty(proto: GcObject, context: &mut Context) -> Result<Value> { fn construct_array_empty(proto: GcObject, context: &mut Context) -> Value {
Array::array_create(0, Some(proto), context) Array::array_create(0, Some(proto), context)
} }
@ -147,7 +147,7 @@ impl Array {
length: &Value, length: &Value,
context: &mut Context, context: &mut Context,
) -> Result<Value> { ) -> Result<Value> {
let array = Array::array_create(0, Some(prototype), context)?; let array = Array::array_create(0, Some(prototype), context);
if !length.is_number() { if !length.is_number() {
array.set_property(0, DataDescriptor::new(length, Attribute::all())); array.set_property(0, DataDescriptor::new(length, Attribute::all()));
@ -174,7 +174,7 @@ impl Array {
context: &mut Context, context: &mut Context,
) -> Result<Value> { ) -> Result<Value> {
let items_len = items.len().try_into().map_err(interror_to_value)?; let items_len = items.len().try_into().map_err(interror_to_value)?;
let array = Array::array_create(items_len, Some(prototype), context)?; let array = Array::array_create(items_len, Some(prototype), context);
for (k, item) in items.iter().enumerate() { for (k, item) in items.iter().enumerate() {
array.set_property(k, DataDescriptor::new(item.clone(), Attribute::all())); array.set_property(k, DataDescriptor::new(item.clone(), Attribute::all()));
@ -189,11 +189,7 @@ impl Array {
/// - [ECMAScript reference][spec] /// - [ECMAScript reference][spec]
/// ///
/// [spec]: https://tc39.es/ecma262/#sec-arraycreate /// [spec]: https://tc39.es/ecma262/#sec-arraycreate
fn array_create( fn array_create(length: u32, prototype: Option<GcObject>, context: &mut Context) -> Value {
length: u32,
prototype: Option<GcObject>,
context: &mut Context,
) -> Result<Value> {
let prototype = match prototype { let prototype = match prototype {
Some(prototype) => prototype, Some(prototype) => prototype,
None => context.standard_objects().array_object().prototype(), None => context.standard_objects().array_object().prototype(),
@ -214,11 +210,11 @@ impl Array {
); );
array.set_property("length", length); array.set_property("length", length);
Ok(array) array
} }
/// Creates a new `Array` instance. /// Creates a new `Array` instance.
pub(crate) fn new_array(context: &Context) -> Result<Value> { pub(crate) fn new_array(context: &Context) -> Value {
let array = Value::new_object(context); let array = Value::new_object(context);
array.set_data(ObjectData::Array); array.set_data(ObjectData::Array);
array array
@ -230,7 +226,7 @@ impl Array {
Attribute::WRITABLE | Attribute::NON_ENUMERABLE | Attribute::PERMANENT, Attribute::WRITABLE | Attribute::NON_ENUMERABLE | Attribute::PERMANENT,
); );
array.set_property("length", length); array.set_property("length", length);
Ok(array) array
} }
/// Utility function for creating array objects. /// Utility function for creating array objects.
@ -682,7 +678,7 @@ impl Array {
return context.throw_range_error("Invalid array length"); return context.throw_range_error("Invalid array length");
} }
let new = Self::new_array(context)?; let new = Self::new_array(context);
let values = (0..length) let values = (0..length)
.map(|idx| { .map(|idx| {
@ -960,7 +956,7 @@ impl Array {
/// [spec]: https://tc39.es/ecma262/#sec-array.prototype.slice /// [spec]: https://tc39.es/ecma262/#sec-array.prototype.slice
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice /// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
pub(crate) fn slice(this: &Value, args: &[Value], context: &mut Context) -> Result<Value> { pub(crate) fn slice(this: &Value, args: &[Value], context: &mut Context) -> Result<Value> {
let new_array = Self::new_array(context)?; let new_array = Self::new_array(context);
let len = this.get_field("length", context)?.to_length(context)?; let len = this.get_field("length", context)?.to_length(context)?;
let from = Self::get_relative_start(context, args.get(0), len)?; let from = Self::get_relative_start(context, args.get(0), len)?;
@ -1005,7 +1001,7 @@ impl Array {
let length = this.get_field("length", context)?.to_length(context)?; let length = this.get_field("length", context)?.to_length(context)?;
let new = Self::new_array(context)?; let new = Self::new_array(context);
let values = (0..length) let values = (0..length)
.map(|idx| { .map(|idx| {
@ -1245,7 +1241,11 @@ impl Array {
/// [spec]: https://tc39.es/ecma262/#sec-array.prototype.values /// [spec]: https://tc39.es/ecma262/#sec-array.prototype.values
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/values /// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/values
pub(crate) fn values(this: &Value, _: &[Value], context: &mut Context) -> Result<Value> { pub(crate) fn values(this: &Value, _: &[Value], context: &mut Context) -> Result<Value> {
ArrayIterator::create_array_iterator(context, this.clone(), ArrayIterationKind::Value) Ok(ArrayIterator::create_array_iterator(
context,
this.clone(),
ArrayIterationKind::Value,
))
} }
/// `Array.prototype.keys( )` /// `Array.prototype.keys( )`
@ -1259,7 +1259,11 @@ impl Array {
/// [spec]: https://tc39.es/ecma262/#sec-array.prototype.values /// [spec]: https://tc39.es/ecma262/#sec-array.prototype.values
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/values /// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/values
pub(crate) fn keys(this: &Value, _: &[Value], context: &mut Context) -> Result<Value> { pub(crate) fn keys(this: &Value, _: &[Value], context: &mut Context) -> Result<Value> {
ArrayIterator::create_array_iterator(context, this.clone(), ArrayIterationKind::Key) Ok(ArrayIterator::create_array_iterator(
context,
this.clone(),
ArrayIterationKind::Key,
))
} }
/// `Array.prototype.entries( )` /// `Array.prototype.entries( )`
@ -1273,7 +1277,11 @@ impl Array {
/// [spec]: https://tc39.es/ecma262/#sec-array.prototype.values /// [spec]: https://tc39.es/ecma262/#sec-array.prototype.values
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/values /// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/values
pub(crate) fn entries(this: &Value, _: &[Value], context: &mut Context) -> Result<Value> { pub(crate) fn entries(this: &Value, _: &[Value], context: &mut Context) -> Result<Value> {
ArrayIterator::create_array_iterator(context, this.clone(), ArrayIterationKind::KeyAndValue) Ok(ArrayIterator::create_array_iterator(
context,
this.clone(),
ArrayIterationKind::KeyAndValue,
))
} }
/// Represents the algorithm to calculate `relativeStart` (or `k`) in array functions. /// Represents the algorithm to calculate `relativeStart` (or `k`) in array functions.

2
boa/src/builtins/array/tests.rs

@ -1366,7 +1366,7 @@ fn get_relative_end() {
fn array_length_is_not_enumerable() { fn array_length_is_not_enumerable() {
let context = Context::new(); let context = Context::new();
let array = Array::new_array(&context).unwrap(); let array = Array::new_array(&context);
let desc = array.get_property("length").unwrap(); let desc = array.get_property("length").unwrap();
assert!(!desc.enumerable()); assert!(!desc.enumerable());
} }

12
boa/src/builtins/date/mod.rs

@ -371,7 +371,7 @@ impl Date {
context: &mut Context, context: &mut Context,
) -> Result<Value> { ) -> Result<Value> {
if new_target.is_undefined() { if new_target.is_undefined() {
Self::make_date_string() Ok(Self::make_date_string())
} else { } else {
let prototype = new_target let prototype = new_target
.as_object() .as_object()
@ -386,7 +386,7 @@ impl Date {
obj.set_prototype_instance(prototype.into()); obj.set_prototype_instance(prototype.into());
let this = obj.into(); let this = obj.into();
if args.is_empty() { if args.is_empty() {
Self::make_date_now(&this) Ok(Self::make_date_now(&this))
} else if args.len() == 1 { } else if args.len() == 1 {
Self::make_date_single(&this, args, context) Self::make_date_single(&this, args, context)
} else { } else {
@ -405,8 +405,8 @@ impl Date {
/// ///
/// [spec]: https://tc39.es/ecma262/#sec-date-constructor /// [spec]: https://tc39.es/ecma262/#sec-date-constructor
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date /// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
pub(crate) fn make_date_string() -> Result<Value> { pub(crate) fn make_date_string() -> Value {
Ok(Value::from(Local::now().to_rfc3339())) Value::from(Local::now().to_rfc3339())
} }
/// `Date()` /// `Date()`
@ -419,10 +419,10 @@ impl Date {
/// ///
/// [spec]: https://tc39.es/ecma262/#sec-date-constructor /// [spec]: https://tc39.es/ecma262/#sec-date-constructor
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date /// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
pub(crate) fn make_date_now(this: &Value) -> Result<Value> { pub(crate) fn make_date_now(this: &Value) -> Value {
let date = Date::default(); let date = Date::default();
this.set_data(ObjectData::Date(date)); this.set_data(ObjectData::Date(date));
Ok(this.clone()) this.clone()
} }
/// `Date(value)` /// `Date(value)`

2
boa/src/builtins/function/mod.rs

@ -119,7 +119,7 @@ impl Function {
local_env: &Environment, local_env: &Environment,
) { ) {
// Create array of values // Create array of values
let array = Array::new_array(context).unwrap(); let array = Array::new_array(context);
Array::add_to_array_object(&array, &args_list[index..], context).unwrap(); Array::add_to_array_object(&array, &args_list[index..], context).unwrap();
// Create binding // Create binding

6
boa/src/builtins/map/map_iterator.rs

@ -49,14 +49,14 @@ impl MapIterator {
context: &Context, context: &Context,
map: Value, map: Value,
kind: MapIterationKind, kind: MapIterationKind,
) -> Result<Value> { ) -> Value {
let map_iterator = Value::new_object(context); let map_iterator = Value::new_object(context);
map_iterator.set_data(ObjectData::MapIterator(Self::new(map, kind))); map_iterator.set_data(ObjectData::MapIterator(Self::new(map, kind)));
map_iterator map_iterator
.as_object() .as_object()
.expect("map iterator object") .expect("map iterator object")
.set_prototype_instance(context.iterator_prototypes().map_iterator().into()); .set_prototype_instance(context.iterator_prototypes().map_iterator().into());
Ok(map_iterator) map_iterator
} }
/// %MapIteratorPrototype%.next( ) /// %MapIteratorPrototype%.next( )
@ -104,7 +104,7 @@ impl MapIterator {
} }
MapIterationKind::KeyAndValue => { MapIterationKind::KeyAndValue => {
let result = Array::construct_array( let result = Array::construct_array(
&Array::new_array(context)?, &Array::new_array(context),
&[key.clone(), value.clone()], &[key.clone(), value.clone()],
context, context,
)?; )?;

18
boa/src/builtins/map/mod.rs

@ -158,7 +158,11 @@ impl Map {
/// [spec]: https://www.ecma-international.org/ecma-262/11.0/index.html#sec-map.prototype.entries /// [spec]: https://www.ecma-international.org/ecma-262/11.0/index.html#sec-map.prototype.entries
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/entries /// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/entries
pub(crate) fn entries(this: &Value, _: &[Value], context: &mut Context) -> Result<Value> { pub(crate) fn entries(this: &Value, _: &[Value], context: &mut Context) -> Result<Value> {
MapIterator::create_map_iterator(context, this.clone(), MapIterationKind::KeyAndValue) Ok(MapIterator::create_map_iterator(
context,
this.clone(),
MapIterationKind::KeyAndValue,
))
} }
/// `Map.prototype.keys()` /// `Map.prototype.keys()`
@ -172,7 +176,11 @@ impl Map {
/// [spec]: https://tc39.es/ecma262/#sec-map.prototype.keys /// [spec]: https://tc39.es/ecma262/#sec-map.prototype.keys
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/keys /// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/keys
pub(crate) fn keys(this: &Value, _: &[Value], context: &mut Context) -> Result<Value> { pub(crate) fn keys(this: &Value, _: &[Value], context: &mut Context) -> Result<Value> {
MapIterator::create_map_iterator(context, this.clone(), MapIterationKind::Key) Ok(MapIterator::create_map_iterator(
context,
this.clone(),
MapIterationKind::Key,
))
} }
/// Helper function to set the size property. /// Helper function to set the size property.
@ -395,7 +403,11 @@ impl Map {
/// [spec]: https://tc39.es/ecma262/#sec-map.prototype.values /// [spec]: https://tc39.es/ecma262/#sec-map.prototype.values
/// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/values /// [mdn]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/values
pub(crate) fn values(this: &Value, _: &[Value], context: &mut Context) -> Result<Value> { pub(crate) fn values(this: &Value, _: &[Value], context: &mut Context) -> Result<Value> {
MapIterator::create_map_iterator(context, this.clone(), MapIterationKind::Value) Ok(MapIterator::create_map_iterator(
context,
this.clone(),
MapIterationKind::Value,
))
} }
/// Helper function to get a key-value pair from an array. /// Helper function to get a key-value pair from an array.

4
boa/src/builtins/object/for_in_iterator.rs

@ -45,14 +45,14 @@ impl ForInIterator {
/// - [ECMA reference][spec] /// - [ECMA reference][spec]
/// ///
/// [spec]: https://tc39.es/ecma262/#sec-createforiniterator /// [spec]: https://tc39.es/ecma262/#sec-createforiniterator
pub(crate) fn create_for_in_iterator(context: &Context, object: Value) -> Result<Value> { pub(crate) fn create_for_in_iterator(context: &Context, object: Value) -> Value {
let for_in_iterator = Value::new_object(context); let for_in_iterator = Value::new_object(context);
for_in_iterator.set_data(ObjectData::ForInIterator(Self::new(object))); for_in_iterator.set_data(ObjectData::ForInIterator(Self::new(object)));
for_in_iterator for_in_iterator
.as_object() .as_object()
.expect("for in iterator object") .expect("for in iterator object")
.set_prototype_instance(context.iterator_prototypes().for_in_iterator().into()); .set_prototype_instance(context.iterator_prototypes().for_in_iterator().into());
Ok(for_in_iterator) for_in_iterator
} }
/// %ForInIteratorPrototype%.next( ) /// %ForInIteratorPrototype%.next( )

8
boa/src/builtins/object/mod.rs

@ -164,7 +164,7 @@ impl Object {
let key = key.to_property_key(context)?; let key = key.to_property_key(context)?;
if let Some(desc) = object.get_own_property(&key) { if let Some(desc) = object.get_own_property(&key) {
return Ok(Self::from_property_descriptor(desc, context)?); return Ok(Self::from_property_descriptor(desc, context));
} }
} }
@ -197,7 +197,7 @@ impl Object {
let desc = object let desc = object
.get_own_property(&key) .get_own_property(&key)
.expect("Expected property to be on object."); .expect("Expected property to be on object.");
Self::from_property_descriptor(desc, context)? Self::from_property_descriptor(desc, context)
}; };
if !descriptor.is_undefined() { if !descriptor.is_undefined() {
@ -216,7 +216,7 @@ impl Object {
/// [ECMAScript reference][spec] /// [ECMAScript reference][spec]
/// ///
/// [spec]: https://tc39.es/ecma262/#sec-frompropertydescriptor /// [spec]: https://tc39.es/ecma262/#sec-frompropertydescriptor
fn from_property_descriptor(desc: PropertyDescriptor, context: &mut Context) -> Result<Value> { fn from_property_descriptor(desc: PropertyDescriptor, context: &mut Context) -> Value {
let mut descriptor = ObjectInitializer::new(context); let mut descriptor = ObjectInitializer::new(context);
if let PropertyDescriptor::Data(data_desc) = &desc { if let PropertyDescriptor::Data(data_desc) = &desc {
@ -251,7 +251,7 @@ impl Object {
Attribute::all(), Attribute::all(),
); );
Ok(descriptor.build().into()) descriptor.build().into()
} }
/// Uses the SameValue algorithm to check equality of objects /// Uses the SameValue algorithm to check equality of objects

14
boa/src/builtins/string/mod.rs

@ -910,11 +910,11 @@ impl String {
max_length: i32, max_length: i32,
fill_string: Option<RcString>, fill_string: Option<RcString>,
at_start: bool, at_start: bool,
) -> Result<Value> { ) -> Value {
let primitive_length = primitive.len() as i32; let primitive_length = primitive.len() as i32;
if max_length <= primitive_length { if max_length <= primitive_length {
return Ok(Value::from(primitive)); return Value::from(primitive);
} }
let filter = fill_string.as_deref().unwrap_or(" "); let filter = fill_string.as_deref().unwrap_or(" ");
@ -929,9 +929,9 @@ impl String {
let concat_fill_str: StdString = fill_str.chars().take(fill_len as usize).collect(); let concat_fill_str: StdString = fill_str.chars().take(fill_len as usize).collect();
if at_start { if at_start {
Ok(Value::from(format!("{}{}", concat_fill_str, &primitive))) Value::from(format!("{}{}", concat_fill_str, &primitive))
} else { } else {
Ok(Value::from(format!("{}{}", primitive, &concat_fill_str))) Value::from(format!("{}{}", primitive, &concat_fill_str))
} }
} }
@ -959,7 +959,7 @@ impl String {
let fill_string = args.get(1).map(|arg| arg.to_string(context)).transpose()?; let fill_string = args.get(1).map(|arg| arg.to_string(context)).transpose()?;
Self::string_pad(primitive, max_length, fill_string, false) Ok(Self::string_pad(primitive, max_length, fill_string, false))
} }
/// `String.prototype.padStart( targetLength [, padString] )` /// `String.prototype.padStart( targetLength [, padString] )`
@ -986,7 +986,7 @@ impl String {
let fill_string = args.get(1).map(|arg| arg.to_string(context)).transpose()?; let fill_string = args.get(1).map(|arg| arg.to_string(context)).transpose()?;
Self::string_pad(primitive, max_length, fill_string, true) Ok(Self::string_pad(primitive, max_length, fill_string, true))
} }
/// String.prototype.trim() /// String.prototype.trim()
@ -1263,7 +1263,7 @@ impl String {
.collect(), .collect(),
}; };
let new = Array::new_array(context)?; let new = Array::new_array(context);
Array::construct_array(&new, &values, context) Array::construct_array(&new, &values, context)
} }

2
boa/src/lib.rs

@ -42,6 +42,8 @@ This is an experimental Javascript lexer, parser and compiler written in Rust. C
missing_doc_code_examples missing_doc_code_examples
)] )]
// builtins module has a lot of built-in functions that need unnecessary_wraps
#[allow(clippy::unnecessary_wraps)]
pub mod builtins; pub mod builtins;
pub mod class; pub mod class;
pub mod environment; pub mod environment;

2
boa/src/syntax/ast/node/array/mod.rs

@ -38,7 +38,7 @@ pub struct ArrayDecl {
impl Executable for ArrayDecl { impl Executable for ArrayDecl {
fn run(&self, context: &mut Context) -> Result<Value> { fn run(&self, context: &mut Context) -> Result<Value> {
let _timer = BoaProfiler::global().start_event("ArrayDecl", "exec"); let _timer = BoaProfiler::global().start_event("ArrayDecl", "exec");
let array = Array::new_array(context)?; let array = Array::new_array(context);
let mut elements = Vec::new(); let mut elements = Vec::new();
for elem in self.as_ref() { for elem in self.as_ref() {
if let Node::Spread(ref x) = elem { if let Node::Spread(ref x) = elem {

2
boa/src/syntax/ast/node/iteration/for_in_loop/mod.rs

@ -84,7 +84,7 @@ impl Executable for ForInLoop {
return Ok(result); return Ok(result);
} }
let object = object.to_object(context)?; let object = object.to_object(context)?;
let for_in_iterator = ForInIterator::create_for_in_iterator(context, Value::from(object))?; let for_in_iterator = ForInIterator::create_for_in_iterator(context, Value::from(object));
let next_function = for_in_iterator let next_function = for_in_iterator
.get_property("next") .get_property("next")
.map(|p| p.as_data_descriptor().unwrap().value()) .map(|p| p.as_data_descriptor().unwrap().value())

4
boa/src/syntax/ast/node/template/mod.rs

@ -88,8 +88,8 @@ impl Executable for TaggedTemplate {
fn run(&self, context: &mut Context) -> Result<Value> { fn run(&self, context: &mut Context) -> Result<Value> {
let _timer = BoaProfiler::global().start_event("TaggedTemplate", "exec"); let _timer = BoaProfiler::global().start_event("TaggedTemplate", "exec");
let template_object = Array::new_array(context)?; let template_object = Array::new_array(context);
let raw_array = Array::new_array(context)?; let raw_array = Array::new_array(context);
for (i, raw) in self.raws.iter().enumerate() { for (i, raw) in self.raws.iter().enumerate() {
raw_array.set_field(i, Value::from(raw), context)?; raw_array.set_field(i, Value::from(raw), context)?;

11
boa/src/syntax/parser/expression/assignment/mod.rs

@ -217,6 +217,13 @@ where
/// [spec]: https://tc39.es/ecma262/#sec-assignment-operators-static-semantics-early-errors /// [spec]: https://tc39.es/ecma262/#sec-assignment-operators-static-semantics-early-errors
#[inline] #[inline]
pub(crate) fn is_assignable(node: &Node) -> bool { pub(crate) fn is_assignable(node: &Node) -> bool {
matches!(node, Node::GetConstField(_) | Node::GetField(_) | Node::Assign(_) matches!(
| Node::Call(_) | Node::Identifier(_) | Node::Object(_)) node,
Node::GetConstField(_)
| Node::GetField(_)
| Node::Assign(_)
| Node::Call(_)
| Node::Identifier(_)
| Node::Object(_)
)
} }

6
boa/src/syntax/parser/expression/primary/object_initializer/mod.rs

@ -208,8 +208,10 @@ where
idn @ "get" | idn @ "set" idn @ "get" | idn @ "set"
if matches!( if matches!(
cursor.peek(0)?.map(|t| t.kind()), cursor.peek(0)?.map(|t| t.kind()),
Some(&TokenKind::Identifier(_)) | Some(&TokenKind::Keyword(_)) Some(&TokenKind::Identifier(_))
| Some(&TokenKind::BooleanLiteral(_)) | Some(&TokenKind::NullLiteral) | Some(&TokenKind::Keyword(_))
| Some(&TokenKind::BooleanLiteral(_))
| Some(&TokenKind::NullLiteral)
| Some(&TokenKind::NumericLiteral(_)) | Some(&TokenKind::NumericLiteral(_))
) => ) =>
{ {

33
boa_tester/src/exec.rs

@ -110,18 +110,27 @@ impl Test {
&& !IGNORED.contains_test(&self.name) && !IGNORED.contains_test(&self.name)
&& !IGNORED.contains_any_feature(&self.features) && !IGNORED.contains_any_feature(&self.features)
&& (matches!(self.expected_outcome, Outcome::Positive) && (matches!(self.expected_outcome, Outcome::Positive)
|| matches!(self.expected_outcome, Outcome::Negative { || matches!(
phase: Phase::Parse, self.expected_outcome,
error_type: _, Outcome::Negative {
}) phase: Phase::Parse,
|| matches!(self.expected_outcome, Outcome::Negative { error_type: _,
phase: Phase::Early, }
error_type: _, )
}) || matches!(
|| matches!(self.expected_outcome, Outcome::Negative { self.expected_outcome,
phase: Phase::Runtime, Outcome::Negative {
error_type: _, phase: Phase::Early,
})) { error_type: _,
}
)
|| matches!(
self.expected_outcome,
Outcome::Negative {
phase: Phase::Runtime,
error_type: _,
}
)) {
let res = panic::catch_unwind(|| match self.expected_outcome { let res = panic::catch_unwind(|| match self.expected_outcome {
Outcome::Positive => { Outcome::Positive => {
// TODO: implement async and add `harness/doneprintHandle.js` to the includes. // TODO: implement async and add `harness/doneprintHandle.js` to the includes.

Loading…
Cancel
Save