return Writer.{ s };
}
+write_byte :: (use writer: ^Writer, byte: u8) {
+ stream_write_byte(stream, byte);
+}
+
write_str :: (use writer: ^Writer, s: str) {
stream_write(stream, s);
}
use package core
buf : [256] u8;
- s := conv.i64_to_str(cast(i64) n, cast(u64) base, buf[0 .. 256]);
+ s := conv.i64_to_str(cast(i64) n, cast(u64) base, ~~buf);
write_str(writer, s);
}
use package core
buf : [256] u8;
- s := conv.i64_to_str(n, base, buf[0 .. 256]);
+ s := conv.i64_to_str(n, base, ~~buf);
write_str(writer, s);
}
use package core
buf : [256] u8;
- s := conv.f64_to_str(cast(f64) f, buf[0 .. 256]);
+ s := conv.f64_to_str(cast(f64) f, ~~buf);
write_str(writer, s);
}
use package core
buf : [256] u8;
- s := conv.f64_to_str(f, buf[0 .. 256]);
+ s := conv.f64_to_str(f, ~~buf);
write_str(writer, s);
}
write_format :: (use writer: ^Writer, format: str, va: ...) {
// POTENTIAL BUG: this buffer will need to be bigger (or dynamic).
buffer: [2048] u8;
- write_str(writer, conv.str_format_va(format, buffer[0 .. 2048], va));
+ write_str(writer, conv.str_format_va(format, ~~buffer, va));
+}
+
+write_escaped_str :: (use writer: ^Writer, s: str) {
+ write_byte(writer, #char "\"");
+
+ while i := 0; i < s.count {
+ defer i += 1;
+ ch := s[i];
+
+ @Incomplete
+ switch ch {
+ case #char "\n" { write_byte(writer, #char "\\"); write_byte(writer, #char "n"); }
+ case #char "\r" { write_byte(writer, #char "\\"); write_byte(writer, #char "r"); }
+ case #char "\t" { write_byte(writer, #char "\\"); write_byte(writer, #char "t"); }
+ case #char "\v" { write_byte(writer, #char "\\"); write_byte(writer, #char "v"); }
+ case #char "\b" { write_byte(writer, #char "\\"); write_byte(writer, #char "b"); }
+ case #char "\f" { write_byte(writer, #char "\\"); write_byte(writer, #char "f"); }
+ case #char "\0" { write_byte(writer, #char "\\"); write_byte(writer, #char "0"); }
+ case #char "\"" { write_byte(writer, #char "\\"); write_byte(writer, #char "\""); }
+
+ case #default {
+ @Speed
+ write_byte(writer, ch);
+ }
+ }
+ }
+
+ write_byte(writer, #char "\"");
}
write :: #match {
print :: #match {
(x: str) {
- io.write(^print_writer, x);
+ io.write(^stdio.print_writer, x);
if x[x.count - 1] == #char "\n" && auto_flush_stdio do __flush_stdio();
},
- (x: $T) { io.write(^print_writer, x); },
- (x: $T, y: $R) { io.write(^print_writer, x, y); },
+ (x: $T) { io.write(^stdio.print_writer, x); },
+ (x: $T, y: $R) { io.write(^stdio.print_writer, x, y); },
}
println :: (x: $T) {
// Private and internal things
//
-#private_file print_stream : io.DynamicStringStream;
-#private_file print_writer : io.Writer;
+stdio : struct {
+ print_stream : io.DynamicStringStream;
+ print_writer : io.Writer;
+}
__stdio_init :: () {
- print_stream = io.dynamic_string_stream_make(2048, context.allocator);
- print_writer = io.writer_make(^print_stream);
+ stdio.print_stream = io.dynamic_string_stream_make(2048, context.allocator);
+ stdio.print_writer = io.writer_make(^stdio.print_stream);
}
__flush_stdio :: () {
- if print_stream.data.count == 0 do return;
+ if stdio.print_stream.data.count == 0 do return;
- ^print_stream
+ ^stdio.print_stream
|> io.dynamic_string_stream_to_str()
|> runtime.__output_string();
- ^print_stream |> io.stream_flush();
+ ^stdio.print_stream |> io.stream_flush();
}
}
if (alloc_arena->size + size >= alloc_arena->arena_size) {
- alloc_arena->size = sizeof(ptr);
bh__arena_internal* new_arena = (bh__arena_internal *) bh_alloc(alloc_arena->backing, alloc_arena->arena_size);
if (new_arena == NULL) {
new_arena->next_arena = NULL;
((bh__arena_internal *)(alloc_arena->current_arena))->next_arena = new_arena;
alloc_arena->current_arena = new_arena;
+ alloc_arena->size = sizeof(ptr);
}
retval = bh_pointer_add(alloc_arena->current_arena, alloc_arena->size);
Ast_Kind_Overloaded_Function,
Ast_Kind_Polymorphic_Proc,
Ast_Kind_Block,
- Ast_Kind_Local_Group,
Ast_Kind_Local,
Ast_Kind_Global,
Ast_Kind_Symbol,
"OVERLOADED_FUNCTION",
"POLYMORPHIC PROC",
"BLOCK",
- "LOCAL GROUP",
"LOCAL",
"GLOBAL",
"SYMBOL",
node_get_type_name(binop->right));
}
-CheckStatus check_binop_assignment(AstBinaryOp* binop, b32 assignment_is_ok) {
+CheckStatus check_binaryop_assignment(AstBinaryOp* binop, b32 assignment_is_ok) {
if (!assignment_is_ok) {
onyx_report_error(binop->token->pos, "Assignment not valid in expression.");
return Check_Error;
CheckStatus check_binaryop_compare(AstBinaryOp** pbinop) {
AstBinaryOp* binop = *pbinop;
- // :UnaryFieldAccessIsGross
- if (binop->left->kind == Ast_Kind_Unary_Field_Access || binop->right->kind == Ast_Kind_Unary_Field_Access) {
- if (type_check_or_auto_cast(&binop->left, binop->right->type));
- else if (type_check_or_auto_cast(&binop->right, binop->left->type));
- else {
- report_bad_binaryop(binop);
- return Check_Error;
- }
-
- binop->type = &basic_types[Basic_Kind_Bool];
- return Check_Success;
- }
-
if ( type_is_structlike_strict(binop->left->type)
|| type_is_structlike_strict(binop->right->type)) {
report_bad_binaryop(binop);
binop->flags |= Ast_Flag_Comptime;
}
- if (binop_is_assignment(binop->operation)) return check_binop_assignment(binop, assignment_is_ok);
+ if (binop_is_assignment(binop->operation)) return check_binaryop_assignment(binop, assignment_is_ok);
if (expression_types_must_be_known) {
if (binop->left->type == NULL || binop->right->type == NULL) {
}
}
+ // :UnaryFieldAccessIsGross
+ if (binop->left->kind == Ast_Kind_Unary_Field_Access || binop->right->kind == Ast_Kind_Unary_Field_Access) {
+ if (type_check_or_auto_cast(&binop->left, binop->right->type));
+ else if (type_check_or_auto_cast(&binop->right, binop->left->type));
+ else {
+ report_bad_binaryop(binop);
+ return Check_Error;
+ }
+ }
+
// NOTE: Try operator overloading before checking everything else.
if ((binop->left->type != NULL && binop->right->type != NULL) &&
(binop->left->type->kind != Type_Kind_Basic || binop->right->type->kind != Type_Kind_Basic)) {
if (binop->operation == Binary_Op_Bool_And || binop->operation == Binary_Op_Bool_Or)
return check_binaryop_bool(pbinop);
- // :UnaryFieldAccessIsGross
- if (binop->left->kind == Ast_Kind_Unary_Field_Access || binop->right->kind == Ast_Kind_Unary_Field_Access) {
- if (type_check_or_auto_cast(&binop->left, binop->right->type));
- else if (type_check_or_auto_cast(&binop->right, binop->left->type));
- else {
- report_bad_binaryop(binop);
- return Check_Error;
- }
- }
-
// NOTE: The left side cannot be compound.
// The right side always is numeric.
// The left side cannot be rawptr.
case Ast_Kind_Overloaded_Function: return sizeof(AstOverloadedFunction);
case Ast_Kind_Polymorphic_Proc: return sizeof(AstPolyProc);
case Ast_Kind_Block: return sizeof(AstBlock);
- case Ast_Kind_Local_Group: return sizeof(AstNode);
case Ast_Kind_Local: return sizeof(AstLocal);
case Ast_Kind_Global: return sizeof(AstGlobal);
case Ast_Kind_Symbol: return sizeof(AstNode);
case Ast_Kind_Subscript: return sizeof(AstSubscript);
case Ast_Kind_Slice: return sizeof(AstSubscript);
case Ast_Kind_Field_Access: return sizeof(AstFieldAccess);
+ case Ast_Kind_Unary_Field_Access: return sizeof(AstUnaryFieldAccess);
case Ast_Kind_Pipe: return sizeof(AstBinaryOp);
case Ast_Kind_Range_Literal: return sizeof(AstRangeLiteral);
case Ast_Kind_Method_Call: return sizeof(AstBinaryOp);
case Ast_Kind_Compound: return sizeof(AstCompound);
case Ast_Kind_Named_Value: return sizeof(AstNamedValue);
case Ast_Kind_Call_Site: return sizeof(AstCallSite);
+ case Ast_Kind_Static_If: return sizeof(AstIfWhile);
case Ast_Kind_Count: return 0;
}