aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/api/transpiler.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/javascript/jsc/api/transpiler.zig')
-rw-r--r--src/javascript/jsc/api/transpiler.zig45
1 files changed, 39 insertions, 6 deletions
diff --git a/src/javascript/jsc/api/transpiler.zig b/src/javascript/jsc/api/transpiler.zig
index 404475460..b8a8192c6 100644
--- a/src/javascript/jsc/api/transpiler.zig
+++ b/src/javascript/jsc/api/transpiler.zig
@@ -828,7 +828,7 @@ pub fn finalize(
this.arena.deinit();
}
-fn getParseResult(this: *Transpiler, allocator: std.mem.Allocator, code: []const u8, loader: ?Loader) ?Bundler.ParseResult {
+fn getParseResult(this: *Transpiler, allocator: std.mem.Allocator, code: []const u8, loader: ?Loader, macro_js_ctx: JSValue) ?Bundler.ParseResult {
const name = this.transpiler_options.default_loader.stdinName();
const source = logger.Source.initPathString(name, code);
@@ -847,6 +847,7 @@ fn getParseResult(this: *Transpiler, allocator: std.mem.Allocator, code: []const
.path = source.path,
.virtual_source = &source,
.replace_exports = this.transpiler_options.runtime.replace_exports,
+ .macro_js_ctx = macro_js_ctx,
// .allocator = this.
};
@@ -915,7 +916,7 @@ pub fn scan(
JSAst.Expr.Data.Store.reset();
}
- const parse_result = getParseResult(this, arena.allocator(), code, loader) orelse {
+ const parse_result = getParseResult(this, arena.allocator(), code, loader, JSC.JSValue.zero) orelse {
if ((this.bundler.log.warnings + this.bundler.log.errors) > 0) {
var out_exception = this.bundler.log.toJS(ctx.ptr(), getAllocator(ctx), "Parse error");
exception.* = out_exception.asObjectRef();
@@ -1020,19 +1021,45 @@ pub fn transformSync(
};
const code = code_holder.slice();
- JSC.C.JSValueProtect(ctx, arguments[0]);
- defer JSC.C.JSValueUnprotect(ctx, arguments[0]);
+ JSC.JSValue.c(arguments[0]).ensureStillAlive();
+ defer JSC.JSValue.c(arguments[0]).ensureStillAlive();
args.eat();
+ var js_ctx_value: JSC.JSValue = JSC.JSValue.zero;
const loader: ?Loader = brk: {
if (args.next()) |arg| {
args.eat();
- break :brk Loader.fromJS(ctx.ptr(), arg, exception);
+ if (arg.isNumber() or arg.isString()) {
+ break :brk Loader.fromJS(ctx.ptr(), arg, exception);
+ }
+
+ if (arg.isObject()) {
+ js_ctx_value = arg;
+ break :brk null;
+ }
}
break :brk null;
};
+ if (args.nextEat()) |arg| {
+ if (arg.isObject()) {
+ js_ctx_value = arg;
+ } else {
+ JSC.throwInvalidArguments("Expected a Loader or object", .{}, ctx, exception);
+ return null;
+ }
+ }
+ if (!js_ctx_value.isEmpty()) {
+ js_ctx_value.ensureStillAlive();
+ }
+
+ defer {
+ if (!js_ctx_value.isEmpty()) {
+ js_ctx_value.ensureStillAlive();
+ }
+ }
+
if (exception.* != null) return null;
JSAst.Stmt.Data.Store.reset();
@@ -1052,7 +1079,13 @@ pub fn transformSync(
this.bundler = prev_bundler;
}
- var parse_result = getParseResult(this, arena.allocator(), code, loader) orelse {
+ var parse_result = getParseResult(
+ this,
+ arena.allocator(),
+ code,
+ loader,
+ js_ctx_value,
+ ) orelse {
if ((this.bundler.log.warnings + this.bundler.log.errors) > 0) {
var out_exception = this.bundler.log.toJS(ctx.ptr(), getAllocator(ctx), "Parse error");
exception.* = out_exception.asObjectRef();