Compare commits
2 Commits
429f7a52ad
...
8e42aa57fd
Author | SHA1 | Date |
---|---|---|
kayomn | 8e42aa57fd | |
kayomn | 9a0a594345 |
|
@ -3,10 +3,13 @@ const coral = @import("coral");
|
||||||
const ext = @import("./ext.zig");
|
const ext = @import("./ext.zig");
|
||||||
|
|
||||||
pub const Access = union (enum) {
|
pub const Access = union (enum) {
|
||||||
|
null,
|
||||||
sandboxed_path: *const Path,
|
sandboxed_path: *const Path,
|
||||||
|
|
||||||
pub fn open_readable(self: Access, readable_path: Path) ?*Readable {
|
pub fn open_readable(self: Access, readable_path: Path) ?*Readable {
|
||||||
switch (self) {
|
switch (self) {
|
||||||
|
.null => return null,
|
||||||
|
|
||||||
.sandboxed_path => |sandboxed_path| {
|
.sandboxed_path => |sandboxed_path| {
|
||||||
const readable_path_string = sandboxed_path.joined(readable_path).to_string() orelse return null;
|
const readable_path_string = sandboxed_path.joined(readable_path).to_string() orelse return null;
|
||||||
|
|
||||||
|
@ -17,6 +20,8 @@ pub const Access = union (enum) {
|
||||||
|
|
||||||
pub fn query(self: Access, path: Path) ?Info {
|
pub fn query(self: Access, path: Path) ?Info {
|
||||||
switch (self) {
|
switch (self) {
|
||||||
|
.null => return null,
|
||||||
|
|
||||||
.sandboxed_path => |sandboxed_path| {
|
.sandboxed_path => |sandboxed_path| {
|
||||||
const path_string = sandboxed_path.joined(path).to_string() orelse return null;
|
const path_string = sandboxed_path.joined(path).to_string() orelse return null;
|
||||||
const rw_ops = ext.SDL_RWFromFile(path_string, "rb") orelse return null;
|
const rw_ops = ext.SDL_RWFromFile(path_string, "rb") orelse return null;
|
||||||
|
|
|
@ -164,12 +164,18 @@ pub const RuntimeEnv = struct {
|
||||||
try self.compile_expression(chunk, grouped_expression.*);
|
try self.compile_expression(chunk, grouped_expression.*);
|
||||||
},
|
},
|
||||||
|
|
||||||
.import => {
|
.builtin => |builtin| {
|
||||||
try chunk.opcodes.push_one(.{.push_builtin = .import});
|
coral.debug.assert(builtin.len != 0);
|
||||||
},
|
|
||||||
|
|
||||||
.print => {
|
const decoded_builtin = @as(?Builtin, switch (builtin[0]) {
|
||||||
try chunk.opcodes.push_one(.{.push_builtin = .print});
|
'i' => if (coral.io.ends_with(builtin, "mport")) .import else null,
|
||||||
|
'p' => if (coral.io.ends_with(builtin, "rint")) .print else null,
|
||||||
|
else => null,
|
||||||
|
});
|
||||||
|
|
||||||
|
try chunk.opcodes.push_one(.{.push_builtin = decoded_builtin orelse {
|
||||||
|
return chunk.env.raise(error.BadSyntax, "unknown builtin");
|
||||||
|
}});
|
||||||
},
|
},
|
||||||
|
|
||||||
.local_get => |local_get| {
|
.local_get => |local_get| {
|
||||||
|
@ -802,9 +808,9 @@ pub const RuntimeEnv = struct {
|
||||||
});
|
});
|
||||||
|
|
||||||
pub const Options = struct {
|
pub const Options = struct {
|
||||||
import_access: file.Access,
|
import_access: file.Access = .null,
|
||||||
print: *const Printer,
|
print: ?*const Printer = null,
|
||||||
print_error: *const Printer,
|
print_error: ?*const Printer = null,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Printer = fn (buffer: []const coral.io.Byte) void;
|
pub const Printer = fn (buffer: []const coral.io.Byte) void;
|
||||||
|
@ -1185,21 +1191,29 @@ pub const RuntimeEnv = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn print(self: *RuntimeEnv, buffer: []const coral.io.Byte) void {
|
pub fn print(self: *RuntimeEnv, buffer: []const coral.io.Byte) void {
|
||||||
self.options.print(buffer);
|
if (self.options.print) |bound_print| {
|
||||||
|
bound_print(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn print_error(self: *RuntimeEnv, buffer: []const coral.io.Byte) void {
|
||||||
|
if (self.options.print_error) |bound_print_error| {
|
||||||
|
bound_print_error(buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn raise(self: *RuntimeEnv, error_value: RuntimeError, message: []const coral.io.Byte) RuntimeError {
|
pub fn raise(self: *RuntimeEnv, error_value: RuntimeError, message: []const coral.io.Byte) RuntimeError {
|
||||||
self.options.print_error(message);
|
self.print_error(message);
|
||||||
|
|
||||||
if (!self.frames.is_empty()) {
|
if (!self.frames.is_empty()) {
|
||||||
self.options.print_error("stack trace:");
|
self.print_error("stack trace:");
|
||||||
|
|
||||||
var remaining_frames = self.frames.values.len;
|
var remaining_frames = self.frames.values.len;
|
||||||
|
|
||||||
while (remaining_frames != 0) {
|
while (remaining_frames != 0) {
|
||||||
remaining_frames -= 1;
|
remaining_frames -= 1;
|
||||||
|
|
||||||
self.options.print_error(self.frames.values[remaining_frames].name);
|
self.print_error(self.frames.values[remaining_frames].name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,8 +13,7 @@ pub const Expression = union (enum) {
|
||||||
nil_literal,
|
nil_literal,
|
||||||
true_literal,
|
true_literal,
|
||||||
false_literal,
|
false_literal,
|
||||||
import,
|
builtin: []const coral.io.Byte,
|
||||||
print,
|
|
||||||
number_literal: []const coral.io.Byte,
|
number_literal: []const coral.io.Byte,
|
||||||
string_literal: []const coral.io.Byte,
|
string_literal: []const coral.io.Byte,
|
||||||
symbol_literal: []const coral.io.Byte,
|
symbol_literal: []const coral.io.Byte,
|
||||||
|
@ -354,25 +353,8 @@ fn parse_factor(self: *Self) ParseError!Expression {
|
||||||
|
|
||||||
.builtin => |builtin| {
|
.builtin => |builtin| {
|
||||||
self.tokenizer.skip_newlines();
|
self.tokenizer.skip_newlines();
|
||||||
coral.debug.assert(builtin.len != 0);
|
|
||||||
|
|
||||||
switch (builtin[0]) {
|
break: parse .{.builtin = builtin};
|
||||||
'i' => {
|
|
||||||
if (coral.io.ends_with(builtin, "mport")) {
|
|
||||||
break: parse .import;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
'p' => {
|
|
||||||
if (coral.io.ends_with(builtin, "rint")) {
|
|
||||||
break: parse .print;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
else => {},
|
|
||||||
}
|
|
||||||
|
|
||||||
return self.report("unknown builtin");
|
|
||||||
},
|
},
|
||||||
|
|
||||||
.symbol_brace_left => {
|
.symbol_brace_left => {
|
||||||
|
|
Loading…
Reference in New Issue