#Spidermonkey
I was doodling my Ebil Spider Monkey Kurai for funsies yesterday!
She's a lil menace to society! 😈
#OC #Sketch #Originalcharacter #Doodles #Evil #Villain #Spidermonkey #Characterdesign
February 5, 2026 at 11:37 PM
Staring at her blankly, he softly let the smoothie on the table, offering her an eyes closed smile which... Wasn't really giving happy vibes.

"Spidermonkey flavour. Wanna see?"
She tried, she really did… She fought hard to not make that joke.

The Girl of Steel, however, was not invincible…

“Ice cream flavor. And yours?”
And soon, both were sitted enjoying the smoothies.

With a loud slurp, he stopped and looked at the girl.

"Which flavour do you got?"
January 28, 2026 at 8:48 PM
Spidermonkey! I kind of waited to do this one till the end because I find spidermonkey a very challenging concept to balance the "spider" aspects from the monkey. #Ben10 #ben10redesign
January 7, 2026 at 11:45 AM
January 5, 2026 at 8:08 PM
i like this franchise a very normal amount
December 27, 2025 at 7:38 PM
Spoilers for Avatar 3…

Avatar 3 has genuinely hilarious moments if you only vaguely remember the other two: Edie Falco badly miscast as a general, Spidermonkey the twink with blonde locks, Suddenly Jemaine Clement!, the whale subtitles (reader, I nearly died), Sigourney Weaver in Avatar Heaven.
December 25, 2025 at 3:33 AM
My Discord wanted to see Mimzy added and well....

You better hold on tight spidermonkey
December 23, 2025 at 10:21 PM
I don't know! these are better than any answer I could gotten out of an expert human on either topic
December 19, 2025 at 3:47 PM
u better hold on tight, spidermonkey #ziggystardog
December 2, 2024 at 11:03 PM
Spidermonkey taken literally
Always thought the spider part could be pushed a tad further

#fanart #redesign #ben10
February 24, 2025 at 7:21 PM
#Lunchtime discussion: "If I want to read young adult fiction, I'll grab a copy of the Spidermonkey source".
December 7, 2024 at 8:40 PM
Jake Spider Monkey and Adam Lion from My Gym Partner's A Monkey! [2005-2008]
#cartoon #cartoons #cartoonart #cartoonnetwork #mygympartnersamonkey #fanart
November 14, 2024 at 8:47 PM
Where's the Twilight sheeit posting side of this joint? Ratties check in
#twilight
#spidermonkey
May 14, 2025 at 8:21 AM
spidermonkey wrench
November 8, 2024 at 3:56 PM
RANDOM OLD ART!!!
Coming in from April (or earlier) 2009, we have the Spider Monkey, an early portfolio piece I still like a lot. #monsterart #monsterartist #spidermonkey #monster
January 24, 2025 at 9:18 PM
Very interesting...some guys at Mozilla are putting together a version of Node running on SpiderMonkey instead of V8 https://zpao.com/posts/about-that-hybrid-v8monkey-engine/
November 18, 2024 at 8:49 PM
Implementing Iterator.range in SpiderMonkey In October 2024, I joined Outreachy as an Open Source...

https://spidermonkey.dev/blog/2025/03/05/iterator-range.html

Event Attributes
Implementing Iterator.range in SpiderMonkey
In October 2024, I joined Outreachy as an Open Source contributor and in December 2024, I joined Outreachy as an intern working with Mozilla. My role was to implement the TC39 Range Proposal in the SpiderMonkey JavaScript engine. `Iterator.range `is a new built-in method proposed for JavaScript iterators that allows generating a sequence of numbers within a specified range. It functions similarly to Python’s range, providing an easy and efficient way to iterate over a series of values: for (const i of Iterator.range(0, 43)) console.log(i); // 0 to 42 But also things like: function* even() { for (const i of Iterator.range(0, Infinity)) if (i % 2 === 0) yield i; } In this blog post, we will explore the implementation of Iterator.range in the SpiderMonkey JavaScript engine. ## Understanding the Implementation When I started working on `Iterator.range`, the initial implementation had been done, ie; adding a preference for the proposal and making the builtin accessible in the JavaScript shell. The `Iterator.range` simply returned `false`, a stub indicating that the actual implementation of `Iterator.range` was under development or not fully implemented, which is where I came in. As a start, I created a `CreateNumericRangeIterator` function that delegates to the `Iterator.range` function. Following that, I implemented the first three steps within the Iterator.range function. Next, I initialised variables and parameters for the `NUMBER-RANGE` data type in the `CreateNumericRangeIteratorfunction`. I focused on implementing sequences that increase by one, such as `Iterator.range(0, 10)`.Next, I created an `IteratorRangeGenerator*` function (ie, step 18 of the Range proposal), that when called doesn’t execute immediately, but returns a generator object which follows the iterator protocol. Inside the generator function you have `yield` statements which represents where the function suspends its execution and provides value back to the caller. Additionaly, I updated the `CreateNumericRangeIterator` function to invoke `IteratorRangeGenerator*` with the appropriate arguments, aligning with Step 19 of the specification, and added tests to verify its functionality. The generator will pause at each `yield`, and will not continue until the `next` method is called on the generator object that is created. The `NumericRangeIteratorPrototype` (Step 27.1.4.2 of the proposal) is the object that holds the `iterator prototype` for the Numeric range iterator. The `next()` method is added to the `NumericRangeIteratorPrototype`, when you call the `next()` method on an object created from `NumericRangeIteratorPrototype`, it doesn’t directly return a value, but it makes the generator `yield` the `next` value in the series, effectively resuming the suspended generator. The first time you invoke `next()` on the generator object created via `IteratorRangeGenerator*`, the generator will run up to the first `yield` statement and return the first value. When you invoke `next()` again, the`NumericRangeIteratorNext()` will be called. This method uses `GeneratorResume(this)`, which means the generator will pick up right where it left off, continuing to iterate the next `yield` statement or until iteration ends. ## Generator Alternative After discussions with my mentors Daniel and Arai, I transitioned from a generator-based implementation to a more efficient slot-based approach. This change involved defining `slots` to store the state necessary for computing the next value. The reasons included: * Efficiency: Directly managing iteration state is faster than relying on generator functions. * Simplified Implementation: A slot-based approach eliminates the need for generator-specific handling, making the code more maintainable. * Better Alignment with Other Iterators: Existing built-in iterators such as `StringIteratorPrototype` and `ArrayIteratorPrototype` do not use generators in their implementations. ## Perfomance and Benchmarks To quantify the performance improvements gained by transitioning from a generator-based implementation to a slot-based approach, I conducted comparative benchmarks using a test in the current bookmarks/central, and in the revision that used generator-based approach. My benchmark tested two key scenarios: * Floating-point range iteration: Iterating through 100,000 numbers with a step of 0.1 * BigInt range iteration: Iterating through 1,000,000 BigInts with a step of 2 Each test was run 100 times to eliminate anomalies. The benchmark code was structured as follows: // Benchmark for Number iteration var sum = 0; for (var i = 0; i < 100; ++i) { for (num of Iterator.range(0, 100000, 0.1)) { sum += num; } } print(sum); // Benchmark for BigInt iteration var sum = 0n; for (var i = 0; i < 100; ++i) { for (num of Iterator.range(0n, 1000000n, 2n)) { sum += num; } } print(sum); ## Results Implementation | Execution Time (ms) | Improvement ---|---|--- Generator-based | 8,174.60 | - Slot-based | 2,725.33 | 66.70% The slot-based implementation completed the benchmark in just 2.7 seconds compared to 8.2 seconds for the generator-based approach. This represents a 66.7% reduction in execution time, or in other words, the optimized implementation is approximately 3 times faster. ## Challenges Implementing BigInt support was straightforward from a specification perspective, but I encountered two blockers: ### 1. Handling Infinity Checks Correctly The specification ensures that start is either a Number or a BigInt in steps 3.a and 4.a. However, step 5 states: * If start is +∞ or -∞, throw a RangeError. Despite following this, my implementation still threw an error stating that start must be finite. After investigating, I found that the issue stemmed from using a self-hosted isFinite function. The specification requires isFinite to throw a TypeError for BigInt, but the self-hosted Number_isFinite returns false instead. This turned out to be more of an implementation issue than a specification issue. See Github discussion here. * Fix: Explicitly check that start is a number before calling isFinite: // Step 5: If start is +∞ or -∞, throw a RangeError. if (typeof start === "number" && !Number_isFinite(start)) { ThrowRangeError(JSMSG_ITERATOR_RANGE_START_INFINITY); } ### 2. Floating Point Precision Errors When testing floating-point sequences, I encountered an issue where some decimal values were not represented exactly due to JavaScript’s floating-point precision limitations. This caused incorrect test results. There’s a GitHub issue discussing this in depth. I implemented an approximatelyEqual function to compare values within a small margin of error. * Fix: Using approximatelyEqual in tests: const resultFloat2 = Array.from(Iterator.range(0, 1, 0.2)); approximatelyEqual(resultFloat2, [0, 0.2, 0.4, 0.6, 0.8]); This function ensures that minor precision errors do not cause test failures, improving floating-point range calculations. ## Next Steps and Future Improvements There are different stages a TC39 proposal goes through before it can be shipped. This document shows the different stages that a proposal goes through from ideation to consumption. The Iterator.range proposal is currently at stage 1 which is the Draft stage. Ideally, the proposal should advance to stage 3 which means that the specification is stable and no changes to the proposal are expected, but some necessary changes may still occur due to web incompatibilities or feedback from production-grade implementations. Currently, this implementation is in it’s early stages of implementation. It’s only built in Nightly and disabled by default until such a time the proposal is in stage 3 or 4 and no further revision to the specification can be made. ## Final Thoughts Working on the `Iterator.range` implementation in SpiderMonkey has been a deeply rewarding experience. I learned how to navigate a large and complex codebase, collaborate with experienced engineers, and translate a formal specification into an optimized, real-world implementation. The transition from a generator-based approach to a slot-based one was a significant learning moment, reinforcing the importance of efficiency in JavaScript engine internals. Beyond technical skills, I gained a deeper appreciation for the standardization process in JavaScript. The experience highlighted how proposals evolve through real-world feedback, and how early-stage implementations help shape their final form. As `Iterator.range` continues its journey through the TC39 proposal stages, I look forward to seeing its adoption in JavaScript engines and the impact it will have on developers. I hope this post provides useful insights into SpiderMonkey development and encourages others to contribute to open-source projects and JavaScript standardization efforts. If you’d like to read more, here are my blog posts that I made during the project: * Decoding Open Source: Vocabulary I’ve Learned on My Outreachy Journey * Mid-Internship Progress Report: Achievements and Goals Ahead * Navigating TC39 Proposals: From Error Handling to Iterator.range
spidermonkey.dev
March 5, 2025 at 5:41 PM
Alien #28
CODENAME: Spidermonkey
SPECIES: Arachnichimp
HOMEWORLD: Aranhascimmia

#Ben10 #ben10fanart #ben10au
November 17, 2024 at 10:00 PM
Just finished another lithographic drawing at La Máquina in Oaxaca #Endangered #SpiderMonkey #Lithography
December 15, 2025 at 11:32 PM
hold on tight, spidermonkey 🤪
January 3, 2026 at 10:20 PM
this is kinda how async exceptions work in V8: if they are thrown before the promise is awaited you get an error in the console, but if you later await the promise in a try/catch block, the error gets retroactively erased as the exception is handled properly. Spidermonkey leaves the error.
this implies pessimistic UI:

you do the action, it instantly errors, but then if it succeeds the error goes away
November 7, 2024 at 9:37 PM