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

Compile external scripts off the main thread #26710

Merged
merged 1 commit into from Jul 21, 2020

Conversation

AbhishekSharma102
Copy link
Contributor

@AbhishekSharma102 AbhishekSharma102 commented May 29, 2020


  • ./mach build -d does not report any errors
  • ./mach test-tidy does not report any errors
  • These changes fix #26571 (GitHub issue number if applicable)
  • There are tests for these changes OR
  • These changes do not require tests because ___

@highfive
Copy link

@highfive highfive commented May 29, 2020

Thanks for the pull request, and welcome! The Servo team is excited to review your changes, and you should hear from @ferjm (or someone else) soon.

@highfive
Copy link

@highfive highfive commented May 29, 2020

Heads up! This PR modifies the following files:

@highfive
Copy link

@highfive highfive commented May 29, 2020

warning Warning warning

  • These commits modify unsafe code. Please review it carefully!
  • These commits modify script code, but no tests are modified. Please consider adding a test!

@AbhishekSharma102
Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 commented May 29, 2020

Hey @gterzian I have some questions regarding this.

  1. FinishOffThread should be called on the main thread or the callback? Documentation says on the runtime's main thread. If that's the case, should we store it in the callbackData and call it in evaluate_script_on_global_with_result?

  2. evaluate_script_on_global_with_result should have the CompileOffThread call or run_a_classic_script?

  3. Could you please explain more on networking_task_source?

Sorry if some questions seem trivial.

callbackData: *mut c_void,
) {
let castedCallbackData = callbackData as *mut OffThreadCompilationData;
let script: JSScript* = FinishOffThreadScript(*(castedCallbackData.context), token);
Copy link
Member

@gterzian gterzian May 29, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To answer your question: here you would use the OffThreadCompilationData to then queue a task, and inside that task you would do the rest such as calling FinishOffThreadScript. The task will execute "on the main thread".

Also, the JS context can be obtained from inside the task, by calling global.get_cx() and then you need to de-reference it when needed, for example by doing FinishOffThreadScript(*global.get_cx(), token);

(and yes context is often used in the other structs I pointed to to refer to the Trusted<GlobalScope> but that is just a name to say it's the "context" for the overal task that is being queued)

Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 May 29, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Like other structs this would also not have access to the original context, and needs to be stored. Is that correct?

Copy link
Member

@gterzian gterzian May 30, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, correct, you need to store the Trusted<GlobalScope>(and other things if you need them.

@@ -285,6 +285,14 @@ struct FileListener {
task_canceller: TaskCanceller,
}

#[derive(JSTraceable, MallocSizeOf)]
Copy link
Member

@gterzian gterzian May 29, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this struct will be used in the IPC router only, you don't need to derive those traits which are mostly meant for stuff inside a struct marked as dom_struct.

pub struct OffThreadCompilationData {
context: JSContext
canceller: TaskCanceller,
task_source: TimerTaskSource,
Copy link
Member

@gterzian gterzian May 29, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To answer your other question, so here you should instead store the NetworkingTaskSource, which is available via a call to GlobalScope.networking_task_source().

Then later when you need to queue a task, you can do OffThreadCompilationData.task_source.queue_with_canceller(or do this via a method on the struct), like is done for example at

let _ = self.task_source.queue_with_canceller(

Copy link
Member

@gterzian gterzian May 29, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd say you can define a handle(&self, token: *mut c_void) method on the struct, and then from the callback call handle(token), and inside the method queue the task and move the token into the task closure, then inside the closure you can use the token for example to call FinishOffThreadScript.

Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 May 29, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once the FinishOffThreadScript has been called, we need to call evaluate_script_on_global_with_result with the obtained script, to call JS_ExecuteScript. So calling CompileOffThread can be called directly from run_a_classic_script.

Is that correct? If yes, how would the result be returned by evaluate_script_on_global_with_result to run_a_classic_script, as the task is queued and i think forgotten.

Copy link
Member

@gterzian gterzian May 30, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On second thoughts, I think we should do the off-thread compilation earlier, when the data has been received from the network.

So the entry point should I think be around here:

// Step 18.6 (When the chosen algorithm asynchronously completes).

So I think you can:

add a new enum looking like:

SourceCode {
    Text(DOMString),
    Compiled(JSScript),
}

Replace ScriptOrigin text with code: SourceCode.

  1. Store both the Trusted<HTMLScriptElement> and the ScriptOrigin, and also ExternalScriptKind onto the OffThreadCompilationData.
  2. Call the off-thread compilation API
  3. From the callback, queue a task that will:
    a. call FinishOffThreadScript
    b. Set ScriptOrigin.code to to the result of that call .
    c. continue running the algorithm at

Then evaluate_script_on_global_with_result could be changed to take an SourceCode as the code argument, and inside you can either call Evaluate2 or JS_ExecuteScript, based on what is available.

I'm not completely sure if this is completely spec compliant, actually I'm not seeing anything about compilation in the spec, so I think this is a good starting point, and it seems to sort of match what Gecko is doing(since the code is in their ScriptLoader class). cc @jdm

Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 May 31, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a question, can these scripts be compiled in any context? As GlobalScope is not yet defined and would not be available.

Also how do we ensure in this that offthreadcompilation is used only when called by run_a_classic_script, as I believe this is done for all scripts?

Copy link
Member

@gterzian gterzian May 31, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

o I think I will need to create a new task_canceller for this. Is it correct?

Yes you can call global.task_canceller() to get one, and then store it on the OffThreadCompilationContext along with the rest, and then use it later to queue the task. (see for example

let _ = self.task_source.queue_with_canceller(
)

Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 May 31, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried getting the globalscope object using self.elem.global() but wasn't able to. HTMLScriptElement doesn't seem to have it. Can you please confirm?

Copy link
Member

@gterzian gterzian May 31, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you first need to get the root out of the trusted, doing let elem = self.elem.root(); , then elem.global() should work

Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 Jun 1, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had some questions regarding OffThreadCompilation methods we are using.

  1. These methods are written in C, but we do an unsafe call to them using a wrapper defined in rust?
  2. For JSScript, I get the error that malloc_size_of is not implemented. Upon reading the documentation, I believe it is similar to a string in rust for the time being. So implementing that would mean something to similar done for string?
  3. Another error during task queuing is OffThreadToken cannot be passed between threads safely. I think a simple clone should do the job, so that function needs to be implemented for it. Is that correct?

Also pushed some code. Please let me know if going in the correct direction.

Copy link
Member

@gterzian gterzian Jun 3, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Yes, I think that's a correct description.
  2. You can ignore it, using an annoation like in
    #[ignore_malloc_size_of = "mozjs"]
  3. I'm not sure about this one. I would say define a struct OffthreadToken;, and then in the callback cast the *mut OffThreadToken to it? Then cast it back when you call FinishOffThreadScript?

@jdm do you have an idea how to represent OffThreadToken* token in Rust and make it Send? It appears to be just an empty class defined at https://github.com/servo/mozjs/blob/aabcc9ba889b2755f1e4e83f28323a60415a790f/mozjs/js/src/vm/HelperThreads.h#L37

@gterzian gterzian assigned gterzian and unassigned ferjm May 31, 2020
@gterzian
Copy link
Member

@gterzian gterzian commented Jun 1, 2020

Could you please add a "FIX #{issue number}" in the opening description for the PR(that way it will be closed when this will, and it also makes it easier to go back to the issue).

Looks like it's going in the right direction!

@@ -860,6 +860,12 @@ unsafe impl JSTraceable for StyleLocked<MediaList> {
}
}

unsafe impl JSTraceable for JSScript {
Copy link
Member

@gterzian gterzian Jun 1, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we're going to have to store the script in a Heap, and then this won't be necessary, see https://github.com/servo/rust-mozjs/blob/11cabdef2cbf0884a2cc33e3c73719646bd31ce5/src/rust.rs#L465

) {
let off_thread_compilation_context: &mut OffThreadCompilationContext =
&mut *(callback_data as *mut OffThreadCompilationContext);
let elem = off_thread_compilation_context.script_element.root();
Copy link
Member

@gterzian gterzian Jun 3, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this kind of stuff will have to be done from inside the queued task.

let _ = off_thread_compilation_context.task_source.queue_with_canceller(
task! (off_thread_compile_continue: move || {
let global_context = global;
off_thread_compilation_context.script_origin.code = SourceCode::Compiled(*FinishOffThreadScript(*global_context.get_cx(), token));
Copy link
Member

@gterzian gterzian Jun 3, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So I think we're going to have to do two things:

  1. Root the JsScript as soon as it is received here, using the rooted! macro(you'll see various example across the codebase, just search you'll find many).
  2. store it inside a Heap inside the ScriptOrigin. For that I think you'll have to do something like:
let rooted_script = rooted! //
let heap = Heap::default();
heap.set(rooted_script.get());
let source_code = SourceCode::Compiled(heap);

Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 Jun 15, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the significance of rooted?

Copy link
Member

@gterzian gterzian Jun 15, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gterzian
Copy link
Member

@gterzian gterzian commented Jun 19, 2020

Ok so I ended-up looking at this locally, and I think it's actually pretty hard to find the right structure, I ended-up finding something over at https://github.com/gterzian/servo/tree/unblock_off_thread_compilation_pr, which I think could be useful to unblock this PR?

It took me quite a lot of compilation cycles locally to figure out, so I think it would have been impractical to do with via even more, and probably confusing, review cycles.

@AbhishekSharma102 How about you rebase this off of that branch? There is still some work to finish, for example in evaluate_script_on_global_with_result, and I also suspect there will be some need for further debugging and so on.

I think there is also an issue that is similar to this and you could use what you've learned to do that one, it is at #25209

@AbhishekSharma102
Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 commented Jun 21, 2020

Hey @gterzian ! Thanks for the help. I will take a look. Sorry this is taking so long, as pre occupied with some other work.

@AbhishekSharma102
Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 commented Jul 8, 2020

I keep facing issues in this compilation step.
rustc --crate-name servo --edition=2018 ports/winit/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts --crate-type bin --emit=dep-info,link -Cembed-bitcode=no -C debuginfo=2 --cfg 'feature="default"' --cfg 'feature="egl"' --cfg 'feature="layout-2013"' --cfg 'feature="max_log_level"' --cfg 'feature="media-gstreamer"' --cfg 'feature="native-bluetooth"' --cfg 'feature="webdriver"' -C metadata=f92413ac43bf4d65 -C extra-filename=-f92413ac43bf4d65 --out-dir /servo_codes/servo/target/debug/deps -C incremental=/servo_codes/servo/target/debug/incremental -L dependency=/servo_codes/servo/target/debug/deps --extern backtrace=/servo_codes/servo/target/debug/deps/libbacktrace-c2de253738f90dda.rlib --extern clipboard=/servo_codes/servo/target/debug/deps/libclipboard-8cdd848607beeec5.rlib --extern euclid=/servo_codes/servo/target/debug/deps/libeuclid-860d44d6f8bac949.rlib --extern getopts=/servo_codes/servo/target/debug/deps/libgetopts-f7c37fe6e97f0526.rlib --extern image=/servo_codes/servo/target/debug/deps/libimage-f5fa0b5fb9d8ed8d.rlib --extern keyboard_types=/servo_codes/servo/target/debug/deps/libkeyboard_types-844dac95fd59d379.rlib --extern lazy_static=/servo_codes/servo/target/debug/deps/liblazy_static-43f70af18d2bceaa.rlib --extern libc=/servo_codes/servo/target/debug/deps/liblibc-61b63b0480794d3d.rlib --extern servo=/servo_codes/servo/target/debug/deps/libservo-ce935d12301a3a40.rlib --extern log=/servo_codes/servo/target/debug/deps/liblog-1483e2d7b9f1cf22.rlib --extern servo_media=/servo_codes/servo/target/debug/deps/libservo_media-bdb2208652d515dc.rlib --extern shellwords=/servo_codes/servo/target/debug/deps/libshellwords-2c1f93ce98cb1ed4.rlib --extern sig=/servo_codes/servo/target/debug/deps/libsig-d7ed8854566421c7.rlib --extern surfman=/servo_codes/servo/target/debug/deps/libsurfman-f4f4a8eb4b1584ae.rlib --extern tinyfiledialogs=/servo_codes/servo/target/debug/deps/libtinyfiledialogs-909cab068201ce77.rlib --extern webxr=/servo_codes/servo/target/debug/deps/libwebxr-c78e8dd8736c4e40.rlib --extern winit=/servo_codes/servo/target/debug/deps/libwinit-3bb6a4b7602c9773.rlib -C link-args=-fuse-ld=gold -W unused-extern-crates -L native=/usr/lib/x86_64-linux-gnu -L native=/usr/lib/x86_64-linux-gnu -L native=/usr/lib/x86_64-linux-gnu -L native=/usr/lib/x86_64-linux-gnu -L native=/usr/lib/x86_64-linux-gnu -L native=/servo_codes/servo/target/debug/build/fontsan-a838246ab2050249/out/lib -L native=/servo_codes/servo/target/debug/build/miniz-sys-f174e987e15b97f4/out -L native=/usr/lib/x86_64-linux-gnu -L native=/servo_codes/servo/target/debug/build/jemalloc-sys-3850958afd320de4/out/build/lib -L native=/usr/lib/x86_64-linux-gnu -L native=/servo_codes/servo/support/linux/gstreamer/gst/lib -L native=/servo_codes/servo/support/linux/gstreamer/gst/lib -L native=/servo_codes/servo/support/linux/gstreamer/gst/lib -L native=/servo_codes/servo/target/debug/build/mozangle-10b974c9166bcb40/out -L native=/servo_codes/servo/target/debug/build/mozjs-8aa97c24a8623cb4/out -L native=/servo_codes/servo/target/debug/build/mozjs_sys-7554fc71b8fcca7b/out/build/js/src/build -L native=/servo_codes/servo/target/debug/build/mozjs_sys-7554fc71b8fcca7b/out/build/glue -L native=/usr/lib/x86_64-linux-gnu -L native=/servo_codes/servo/support/linux/gstreamer/gst/lib -L native=/servo_codes/servo/support/linux/gstreamer/gst/lib -L native=/servo_codes/servo/support/linux/gstreamer/gst/lib -L native=/servo_codes/servo/support/linux/gstreamer/gst/lib -L native=/servo_codes/servo/support/linux/gstreamer/gst/lib -L native=/servo_codes/servo/support/linux/gstreamer/gst/lib -L native=/servo_codes/servo/support/linux/gstreamer/gst/lib -L native=/servo_codes/servo/support/linux/gstreamer/gst/lib -L native=/servo_codes/servo/target/debug/build/tinyfiledialogs-4ef66bfd68031559/out

with this note:
note: /home/abhishek/.cargo/registry/src/github.com-1ecc6299db9ec823/gstreamer-webrtc-0.15.5/src/auto/enums.rs:274: error: undefined reference to 'gst_webrtc_data_channel_state_get_type'

Any suggestions on this?

@gterzian
Copy link
Member

@gterzian gterzian commented Jul 8, 2020

It might be #27090, or another issue related to gstreamer, or it might warrant opening a new issue.

@jdm
Copy link
Member

@jdm jdm commented Jul 8, 2020

You will need to run ./mach bootstrap-gstreamer and uninstall the gir1.2-gst-plugins-bad-1.0 package.

@gterzian
Copy link
Member

@gterzian gterzian commented Jul 9, 2020

@AbhishekSharma102 Ok thanks for adding the "execute script part", which looks good(although I suspect we'll need to debug it a bit in practice).

On that last commit, you could add me a co-author, using 2792687+gterzian@users.noreply.github.com as email and following the instructions at https://docs.github.com/en/github/committing-changes-to-your-project/creating-a-commit-with-multiple-authors

@AbhishekSharma102
Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 commented Jul 9, 2020

@gterzian I will do that. I am planning to squash commits into one, and will add into that.

Regarding the squashing, unfortunately I merged from master after the first two commits, so there are several comments between the first and last two. Could you suggest on how to merge them?

@gterzian
Copy link
Member

@gterzian gterzian commented Jul 9, 2020

Regarding the squashing, unfortunately I merged from master after the first two commits, so there are several comments between the first and last two. Could you suggest on how to merge them?

I'm not sure, maybe just try squashing them all into one?

Usually we don't merge, rather we rebase(and only if there is an actual conflict or it's otherwise necessary), see https://github.com/servo/servo/wiki/Github-workflow

@gterzian
Copy link
Member

@gterzian gterzian commented Jul 9, 2020

unfortunately I merged from master after the first two commits, so there are several comments between the first and last two

I tried rebasing my branch off of servo/master and there were no conflicts, what problems are you encountering?

@AbhishekSharma102
Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 commented Jul 9, 2020

Managed to resolve them. Using git too much for the first time, thus the issues. Merged all commits to one.

Please let me know if any other changes/tests are needed.

@gterzian
Copy link
Member

@gterzian gterzian commented Jul 9, 2020

@bors-servo try=wpt

bors-servo added a commit that referenced this issue Jul 9, 2020
added callback function

<!-- Please describe your changes on the following line: -->

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [ ] `./mach build -d` does not report any errors
- [ ] `./mach test-tidy` does not report any errors
- [ ] These changes fix #26571  (GitHub issue number if applicable)

<!-- Either: -->
- [ ] There are tests for these changes OR
- [ ] These changes do not require tests because ___

<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
@bors-servo
Copy link
Contributor

@bors-servo bors-servo commented Jul 9, 2020

Trying commit 37358b5 with merge 30d5236...

@bors-servo
Copy link
Contributor

@bors-servo bors-servo commented Jul 9, 2020

💔 Test failed - status-taskcluster

@bors-servo
Copy link
Contributor

@bors-servo bors-servo commented Jul 21, 2020

💔 Test failed - status-taskcluster

Co-authored-by: Gregory Terzian <2792687+gterzian@users.noreply.github.com>
Co-authored-by: Abhishek Sharma <20724848+AbhishekSharma102@users.noreply.github.com>
@jdm
Copy link
Member

@jdm jdm commented Jul 21, 2020

@bors-servo r=jdm,gterzian

@bors-servo
Copy link
Contributor

@bors-servo bors-servo commented Jul 21, 2020

📌 Commit 1119dd1 has been approved by jdm,gterzian

@AbhishekSharma102
Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 commented Jul 21, 2020

Aha - we're violating the rule that script source characters need to live until the callback is called, so we're racing with the off-thread parser as we destroy the utf-16 characters that we pass when we call CompileOffThread.

I seem to have completely missed this. Sorry for this.

@bors-servo
Copy link
Contributor

@bors-servo bors-servo commented Jul 21, 2020

Testing commit 1119dd1 with merge 82a9e9d...

bors-servo added a commit that referenced this issue Jul 21, 2020
Compile external scripts off the main thread

<!-- Please describe your changes on the following line: -->

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [ ] These changes fix #26571  (GitHub issue number if applicable)

<!-- Either: -->
- [ ] There are tests for these changes OR
- [ ] These changes do not require tests because ___

<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
@bors-servo
Copy link
Contributor

@bors-servo bors-servo commented Jul 21, 2020

💔 Test failed - status-taskcluster

@jdm
Copy link
Member

@jdm jdm commented Jul 21, 2020

@bors-servo retry

@bors-servo
Copy link
Contributor

@bors-servo bors-servo commented Jul 21, 2020

Testing commit 1119dd1 with merge a242913...

@bors-servo
Copy link
Contributor

@bors-servo bors-servo commented Jul 21, 2020

☀️ Test successful - status-taskcluster
Approved by: jdm,gterzian
Pushing a242913 to master...

@bors-servo bors-servo merged commit a242913 into servo:master Jul 21, 2020
2 checks passed
@gterzian
Copy link
Member

@gterzian gterzian commented Jul 22, 2020

@jdm thanks for catching that. You added the tracer right? So you mean previously it could be GC'ed during the off-thread compilation?

@jdm
Copy link
Member

@jdm jdm commented Jul 22, 2020

Not GCed; we called source_text.encode_utf16().collect() before passing the resulting vector's pointer to CompileOffThread, but then we would drop the vector when we left that stack frame. I moved the vector into the OffThreadCompileContext to ensure that it remained alive until we dropped that context inside the off thread compilation callback function.

@jdm
Copy link
Member

@jdm jdm commented Jul 22, 2020

I don't think I added the JSScript tracer to this PR. I guess we just haven't ever tried to store a JSScript in a Heap before?

@gterzian
Copy link
Member

@gterzian gterzian commented Jul 22, 2020

I moved the vector into the OffThreadCompileContext to ensure that it remained alive until we dropped that context inside the off thread compilation callback function.

Makes sense, thanks for the info.

I guess we just haven't ever tried to store a JSScript in a Heap before?

I think so too.

There is this: https://github.com/servo/rust-mozjs/blob/0caf5549cddbb34ad16abf35fb6bfbff824a4d14/src/rust.rs#L466

However that's Trace, not JsTraceable...

@AbhishekSharma102
Copy link
Contributor Author

@AbhishekSharma102 AbhishekSharma102 commented Jul 22, 2020

I don't think I added the JSScript tracer to this PR. I guess we just haven't ever tried to store a JSScript in a Heap before?

I added the tracer as RootedTraceableBox needed it i think. So did something similar to that was done for JSString and JSObject. Hope that was correct.

Also, can you suggest a easy/medium issue that I could work on next? Should i pick up #25209 ?

@gterzian
Copy link
Member

@gterzian gterzian commented Jul 22, 2020

#25209 is a good one I think, yes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants