Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions src/compile.ml
Original file line number Diff line number Diff line change
Expand Up @@ -758,6 +758,12 @@ module ElemHeap = struct
reference table *)
let remember_reference env : G.t =
Func.share_code1 env "remember_reference" ("ref", I32Type) [I32Type] (fun env get_ref ->
(* Check table space *)
get_ref_ctr ^^
compile_unboxed_const max_references ^^
G.i (Compare (Wasm.Values.I32 I64Op.LtU)) ^^
E.else_trap_with env "Reference table full" ^^

(* Return index *)
get_ref_ctr ^^

Expand Down Expand Up @@ -811,6 +817,12 @@ module ClosureTable = struct
reference table *)
let remember_closure env : G.t =
Func.share_code1 env "remember_closure" ("ptr", I32Type) [I32Type] (fun env get_ptr ->
(* Check table space *)
get_counter ^^
compile_unboxed_const (Int32.sub max_entries 1l) ^^
G.i (Compare (Wasm.Values.I32 I64Op.LtU)) ^^
E.else_trap_with env "Closure table full" ^^

(* Return index *)
get_counter ^^
compile_add_const 1l ^^
Expand Down Expand Up @@ -2821,6 +2833,8 @@ module Serialization = struct
| (Func _ | Obj (Actor, _)) ->
inc_data_size (compile_unboxed_const Heap.word_size) ^^
inc_ref_size 1l
| Non ->
E.trap_with env "buffer_size called on value of type None"
| _ -> todo "buffer_size" (Arrange_ir.typ t) G.nop
end ^^
get_data_size ^^
Expand Down Expand Up @@ -2949,6 +2963,8 @@ module Serialization = struct
get_x ^^ Dfinity.unbox_reference env ^^
store_unskewed_ptr ^^
write_word allocate_ref
| Non ->
E.trap_with env "serializing value of type None"
| _ -> todo "serialize" (Arrange_ir.typ t) G.nop
end ^^
get_data_buf ^^
Expand Down Expand Up @@ -3075,6 +3091,8 @@ module Serialization = struct
G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
load_unskewed_ptr ^^
Dfinity.box_reference env
| Non ->
E.trap_with env "deserializing value of type None"
| _ -> todo_trap env "deserialize" (Arrange_ir.typ t)
end ^^
get_data_buf
Expand Down Expand Up @@ -3308,6 +3326,15 @@ module GC = struct
G.i Return
] ^^

(* Get object size *)
get_obj ^^ HeapTraversal.object_size env ^^ set_len ^^

(* Grow memory if needed *)
get_end_to_space ^^
get_len ^^ compile_mul_const Heap.word_size ^^
G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
Heap.grow_memory env ^^

(* Copy the referenced object to to space *)
get_obj ^^ HeapTraversal.object_size env ^^ set_len ^^

Expand Down
3 changes: 3 additions & 0 deletions stdlib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,9 @@ $(OUTDIR)/ProduceExchange.out: $(PRODUCE_EXCHANGE_SRC) \
$(OUTDIR)/ProduceExchange.wasm: $(PRODUCE_EXCHANGE_SRC) | $(OUTDIR)
$(ASC) -c --dfinity -o $@ examples/produce-exchange/serverActor.as

$(OUTDIR)/memory-access-oob.wasm: $(PRODUCE_EXCHANGE_SRC) | $(OUTDIR)
$(ASC) -c --dfinity -o $@ examples/produce-exchange/test/memory-access-oob.as

$(DOCDIR)/%.md: %.as $(MDofAS) | $(DOCDIR)
@echo "<!-- **[ Do not edit; This file was machine-generated on `date`. ]** -->" > $@
@echo "" >> $@
Expand Down
2 changes: 1 addition & 1 deletion stdlib/examples/produce-exchange/serverActor.as
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ let Result = (import "../../result.as");

type Result<Ok,Err> = Result.Result<Ok,Err>;

actor server {
class Server() {
Copy link
Contributor

Choose a reason for hiding this comment

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

Or maybe it's just this.


/**
Server Actor
Expand Down
44 changes: 44 additions & 0 deletions stdlib/examples/produce-exchange/test/memory-access-oob.as
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
let A = (import "../serverActor.as");

actor test {

func go() : async Text {
let s = A.Server();

let r = await s.registrarAddRegion("region", "");
print "\nAdded region";

ignore(await s.registrarAddUser("0", "0", "", 0, true, true, true, true)); print "\nAdded user 0";
ignore(await s.registrarAddUser("1", "1", "", 0, true, true, true, true)); print "\nAdded user 1";
ignore(await s.registrarAddUser("2", "2", "", 0, true, true, true, true)); print "\nAdded user 2";
ignore(await s.registrarAddUser("3", "3", "", 0, true, true, true, true)); print "\nAdded user 3";
ignore(await s.registrarAddUser("4", "4", "", 0, true, true, true, true)); print "\nAdded user 4";
ignore(await s.registrarAddUser("5", "5", "", 0, true, true, true, true)); print "\nAdded user 5";
ignore(await s.registrarAddUser("6", "6", "", 0, true, true, true, true)); print "\nAdded user 6";
ignore(await s.registrarAddUser("7", "7", "", 0, true, true, true, true)); print "\nAdded user 7";
ignore(await s.registrarAddUser("8", "8", "", 0, true, true, true, true)); print "\nAdded user 8";
ignore(await s.registrarAddUser("9", "9", "", 0, true, true, true, true)); print "\nAdded user 9";
ignore(await s.registrarAddUser("10", "10", "", 0, true, true, true, true)); print "\nAdded user 10";
ignore(await s.registrarAddUser("11", "11", "", 0, true, true, true, true)); print "\nAdded user 11";
ignore(await s.registrarAddUser("12", "12", "", 0, true, true, true, true)); print "\nAdded user 12";
ignore(await s.registrarAddUser("13", "13", "", 0, true, true, true, true)); print "\nAdded user 13";
ignore(await s.registrarAddUser("14", "14", "", 0, true, true, true, true)); print "\nAdded user 14";
ignore(await s.registrarAddUser("15", "15", "", 0, true, true, true, true)); print "\nAdded user 15";
ignore(await s.registrarAddUser("16", "16", "", 0, true, true, true, true)); print "\nAdded user 16";
ignore(await s.registrarAddUser("17", "17", "", 0, true, true, true, true)); print "\nAdded user 17";
ignore(await s.registrarAddUser("18", "18", "", 0, true, true, true, true)); print "\nAdded user 18";
ignore(await s.registrarAddUser("19", "19", "", 0, true, true, true, true)); print "\nAdded user 19";
ignore(await s.registrarAddUser("20", "20", "", 0, true, true, true, true)); print "\nAdded user 20";
ignore(await s.registrarAddUser("21", "21", "", 0, true, true, true, true)); print "\nAdded user 21";
ignore(await s.registrarAddUser("22", "22", "", 0, true, true, true, true)); print "\nAdded user 22";
ignore(await s.registrarAddUser("23", "23", "", 0, true, true, true, true)); print "\nAdded user 23";
ignore(await s.registrarAddUser("24", "24", "", 0, true, true, true, true)); print "\nAdded user 24";
ignore(await s.registrarAddUser("25", "25", "", 0, true, true, true, true)); print "\nAdded user 25";
ignore(await s.registrarAddUser("26", "26", "", 0, true, true, true, true)); print "\nAdded user 26";
ignore(await s.registrarAddUser("27", "27", "", 0, true, true, true, true)); print "\nAdded user 27";
ignore(await s.registrarAddUser("28", "28", "", 0, true, true, true, true)); print "\nAdded user 28";
ignore(await s.registrarAddUser("29", "29", "", 0, true, true, true, true)); print "\nAdded user 29";

"Done";
};
};