Browse Source

Implement `get/set $boa.limits.stack` (#3385)

pull/3411/head
Haled Odat 1 year ago committed by GitHub
parent
commit
cec98927f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 33
      boa_cli/src/debug/limits.rs
  2. 2
      boa_engine/src/vm/runtime_limits.rs
  3. 14
      docs/boa_object.md

33
boa_cli/src/debug/limits.rs

@ -16,6 +16,22 @@ fn set_loop(_: &JsValue, args: &[JsValue], context: &mut Context<'_>) -> JsResul
Ok(JsValue::undefined()) Ok(JsValue::undefined())
} }
fn get_stack(_: &JsValue, _: &[JsValue], context: &mut Context<'_>) -> JsResult<JsValue> {
let max = context.runtime_limits().stack_size_limit();
Ok(JsValue::from(max))
}
fn set_stack(_: &JsValue, args: &[JsValue], context: &mut Context<'_>) -> JsResult<JsValue> {
let value = args.get_or_undefined(0).to_length(context)?;
let Ok(value) = value.try_into() else {
return Err(JsNativeError::range()
.with_message(format!("Argument {value} greater than usize::MAX"))
.into());
};
context.runtime_limits_mut().set_stack_size_limit(value);
Ok(JsValue::undefined())
}
fn get_recursion(_: &JsValue, _: &[JsValue], context: &mut Context<'_>) -> JsResult<JsValue> { fn get_recursion(_: &JsValue, _: &[JsValue], context: &mut Context<'_>) -> JsResult<JsValue> {
let max = context.runtime_limits().recursion_limit(); let max = context.runtime_limits().recursion_limit();
Ok(JsValue::from(max)) Ok(JsValue::from(max))
@ -44,6 +60,17 @@ pub(super) fn create_object(context: &mut Context<'_>) -> JsObject {
.length(1) .length(1)
.build(); .build();
let get_stack =
FunctionObjectBuilder::new(context.realm(), NativeFunction::from_fn_ptr(get_stack))
.name("get stack")
.length(0)
.build();
let set_stack =
FunctionObjectBuilder::new(context.realm(), NativeFunction::from_fn_ptr(set_stack))
.name("set stack")
.length(1)
.build();
let get_recursion = let get_recursion =
FunctionObjectBuilder::new(context.realm(), NativeFunction::from_fn_ptr(get_recursion)) FunctionObjectBuilder::new(context.realm(), NativeFunction::from_fn_ptr(get_recursion))
.name("get recursion") .name("get recursion")
@ -61,6 +88,12 @@ pub(super) fn create_object(context: &mut Context<'_>) -> JsObject {
Some(set_loop), Some(set_loop),
Attribute::WRITABLE | Attribute::CONFIGURABLE | Attribute::NON_ENUMERABLE, Attribute::WRITABLE | Attribute::CONFIGURABLE | Attribute::NON_ENUMERABLE,
) )
.accessor(
js_string!("stack"),
Some(get_stack),
Some(set_stack),
Attribute::WRITABLE | Attribute::CONFIGURABLE | Attribute::NON_ENUMERABLE,
)
.accessor( .accessor(
js_string!("recursion"), js_string!("recursion"),
Some(get_recursion), Some(get_recursion),

2
boa_engine/src/vm/runtime_limits.rs

@ -16,7 +16,7 @@ impl Default for RuntimeLimits {
fn default() -> Self { fn default() -> Self {
Self { Self {
loop_iteration_limit: u64::MAX, loop_iteration_limit: u64::MAX,
resursion_limit: 400, resursion_limit: 512,
stack_size_limit: 1024, stack_size_limit: 1024,
} }
} }

14
docs/boa_object.md

@ -259,6 +259,20 @@ $boa.limits.loop = 10;
while (true) {} // RuntimeLimit: Maximum loop iteration limit 10 exceeded while (true) {} // RuntimeLimit: Maximum loop iteration limit 10 exceeded
``` ```
### Getter & Setter `$boa.limits.stack`
This is an accessor property on the module, its getter returns the value stack limit before an error is thrown.
Its setter can be used to set the recursion limit.
```javascript
$boa.limits.stack = 10;
function x() {
return;
}
x(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // RuntimeLimit: exceeded maximum call stack length
```
### Getter & Setter `$boa.limits.recursion` ### Getter & Setter `$boa.limits.recursion`
This is an accessor property on the module, its getter returns the recursion limit before an error is thrown. This is an accessor property on the module, its getter returns the recursion limit before an error is thrown.

Loading…
Cancel
Save