From f36b1f6c7c9046f1917b5c92f680d86c94380a87 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Thu, 6 Feb 2025 12:49:17 +0100 Subject: [PATCH] Added server example --- examples/server/server.q | 52 ++++++++++++++++++++++++++++++++++ src/core/CompileCall.go | 5 ++++ src/core/ExpressionToMemory.go | 9 +++--- src/scanner/scanStruct.go | 10 ++++++- tests/errors/TypeMismatch.q | 2 +- 5 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 examples/server/server.q diff --git a/examples/server/server.q b/examples/server/server.q new file mode 100644 index 0000000..b27d049 --- /dev/null +++ b/examples/server/server.q @@ -0,0 +1,52 @@ +import sys + +struct sockaddr_in { + sin_family Int16 + sin_port Int16 + sin_addr Int64 + sin_zero Int64 +} + +// Open server and client in 2 terminals: +// [1] q run examples/server +// [2] netcat 127.0.0.1 8080 +main() { + socket := sys.socket(2, 1, 0) + + if socket < 0 { + sys.write(1, "socket error\n", 13) + sys.exit(1) + } + + addr := new(sockaddr_in) + addr.sin_family = 2 + addr.sin_port = 0x901F + addr.sin_addr = 0 + addr.sin_zero = 0 + + if sys.bind(socket, addr, 20) != 0 { + sys.write(1, "bind error\n", 11) + sys.exit(1) + } + + delete(addr) + + if sys.listen(socket, 10) != 0 { + sys.write(1, "listen error\n", 13) + sys.exit(1) + } + + sys.write(1, "listening...\n", 13) + + loop { + conn := sys.accept(socket, 0, 0) + + if conn != -1 { + sys.write(1, "accepted\n", 9) + sys.write(conn, "Hello\n", 6) + sys.close(conn) + } else { + sys.write(1, "error\n", 6) + } + } +} \ No newline at end of file diff --git a/src/core/CompileCall.go b/src/core/CompileCall.go index 5ce42f1..9ac1b93 100644 --- a/src/core/CompileCall.go +++ b/src/core/CompileCall.go @@ -5,6 +5,7 @@ import ( "git.akyoto.dev/cli/q/src/errors" "git.akyoto.dev/cli/q/src/expression" + "git.akyoto.dev/cli/q/src/token" "git.akyoto.dev/cli/q/src/types" "git.akyoto.dev/cli/q/src/x86" ) @@ -94,6 +95,10 @@ func (f *Function) CompileCall(root *expression.Expression) (*Function, error) { } if !types.Is(typ, fn.Input[i].Type) { + if parameters[i].Token.Kind == token.Number && parameters[i].Token.Text(f.File.Bytes) == "0" { + continue + } + return nil, errors.New(&errors.TypeMismatch{ Encountered: typ.Name(), Expected: fn.Input[i].Type.Name(), diff --git a/src/core/ExpressionToMemory.go b/src/core/ExpressionToMemory.go index e50262d..0176701 100644 --- a/src/core/ExpressionToMemory.go +++ b/src/core/ExpressionToMemory.go @@ -4,7 +4,6 @@ import ( "git.akyoto.dev/cli/q/src/asm" "git.akyoto.dev/cli/q/src/errors" "git.akyoto.dev/cli/q/src/expression" - "git.akyoto.dev/cli/q/src/sizeof" "git.akyoto.dev/cli/q/src/token" "git.akyoto.dev/cli/q/src/types" ) @@ -37,11 +36,11 @@ func (f *Function) ExpressionToMemory(node *expression.Expression, memory asm.Me return nil, err } - size := byte(sizeof.Signed(int64(number))) + // size := byte(sizeof.Signed(int64(number))) - if size > memory.Length { - return nil, errors.New(&errors.NumberExceedsBounds{Number: number, ExpectedSize: memory.Length, Size: size}, f.File, node.Token.Position) - } + // if size > memory.Length { + // return nil, errors.New(&errors.NumberExceedsBounds{Number: number, ExpectedSize: memory.Length, Size: size}, f.File, node.Token.Position) + // } f.MemoryNumber(asm.STORE, memory, number) return types.Int, nil diff --git a/src/scanner/scanStruct.go b/src/scanner/scanStruct.go index f2319e9..3f9e74d 100644 --- a/src/scanner/scanStruct.go +++ b/src/scanner/scanStruct.go @@ -35,7 +35,15 @@ func (s *Scanner) scanStruct(file *fs.File, tokens token.List, i int) (int, erro fieldTypeName := tokens[i].Text(file.Bytes) fieldType := types.Int - if fieldTypeName != "Int" { + switch fieldTypeName { + case "Int", "Int64": + case "Int32": + fieldType = types.Int32 + case "Int16": + fieldType = types.Int16 + case "Int8": + fieldType = types.Int8 + default: panic("not implemented") } diff --git a/tests/errors/TypeMismatch.q b/tests/errors/TypeMismatch.q index d86c306..4da2421 100644 --- a/tests/errors/TypeMismatch.q +++ b/tests/errors/TypeMismatch.q @@ -1,5 +1,5 @@ main() { - writeToMemory(0) + writeToMemory(42) } writeToMemory(p Pointer) {