Skip to content

Commit

Permalink
Merge pull request #9 from grain-lang/safe-string-val
Browse files Browse the repository at this point in the history
Copy OCaml strings so they don't get GC'd
  • Loading branch information
ospencer committed Jul 4, 2020
2 parents 8038753 + 81fd504 commit 780d8bc
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 49 deletions.
18 changes: 9 additions & 9 deletions src/binaryen_stubs_exports.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ CAMLprim value
caml_binaryen_add_function_export(value _module, value _internalName, value _externalName) {
CAMLparam3(_module, _internalName, _externalName);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* internalName = String_val(_internalName);
char* externalName = String_val(_externalName);
char* internalName = Safe_String_val(_internalName);
char* externalName = Safe_String_val(_externalName);
BinaryenExportRef exp = BinaryenAddFunctionExport(module, internalName, externalName);
CAMLreturn(alloc_BinaryenExportRef(exp));
}
Expand All @@ -28,8 +28,8 @@ CAMLprim value
caml_binaryen_add_table_export(value _module, value _internalName, value _externalName) {
CAMLparam3(_module, _internalName, _externalName);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* internalName = String_val(_internalName);
char* externalName = String_val(_externalName);
char* internalName = Safe_String_val(_internalName);
char* externalName = Safe_String_val(_externalName);
BinaryenExportRef exp = BinaryenAddTableExport(module, internalName, externalName);
CAMLreturn(alloc_BinaryenExportRef(exp));
}
Expand All @@ -38,8 +38,8 @@ CAMLprim value
caml_binaryen_add_memory_export(value _module, value _internalName, value _externalName) {
CAMLparam3(_module, _internalName, _externalName);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* internalName = String_val(_internalName);
char* externalName = String_val(_externalName);
char* internalName = Safe_String_val(_internalName);
char* externalName = Safe_String_val(_externalName);
BinaryenExportRef exp = BinaryenAddMemoryExport(module, internalName, externalName);
CAMLreturn(alloc_BinaryenExportRef(exp));
}
Expand All @@ -48,8 +48,8 @@ CAMLprim value
caml_binaryen_add_global_export(value _module, value _internalName, value _externalName) {
CAMLparam3(_module, _internalName, _externalName);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* internalName = String_val(_internalName);
char* externalName = String_val(_externalName);
char* internalName = Safe_String_val(_internalName);
char* externalName = Safe_String_val(_externalName);
BinaryenExportRef exp = BinaryenAddGlobalExport(module, internalName, externalName);
CAMLreturn(alloc_BinaryenExportRef(exp));
}
Expand All @@ -58,7 +58,7 @@ CAMLprim value
caml_binaryen_remove_export(value _module, value _externalName) {
CAMLparam2(_module, _externalName);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* externalName = String_val(_externalName);
char* externalName = Safe_String_val(_externalName);
BinaryenRemoveExport(module, externalName);
CAMLreturn(Val_unit);
}
18 changes: 9 additions & 9 deletions src/binaryen_stubs_expressions.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ CAMLprim value
caml_binaryen_block(value _module, value _name, value _children) {
CAMLparam3(_module, _name, _children);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
_children = array_of_list(_children);
int childLen = array_length(_children);
BinaryenExpressionRef children[childLen];
Expand All @@ -50,7 +50,7 @@ CAMLprim value
caml_binaryen_loop(value _module, value _name, value _body) {
CAMLparam3(_module, _name, _body);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
BinaryenExpressionRef body = BinaryenExpressionRef_val(_body);
BinaryenExpressionRef exp = BinaryenLoop(module, name, body);
CAMLreturn(alloc_BinaryenExpressionRef(exp));
Expand All @@ -60,7 +60,7 @@ CAMLprim value
caml_binaryen_break(value _module, value _name, value _cond, value _res) {
CAMLparam4(_module, _name, _cond, _res);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
BinaryenExpressionRef cond = BinaryenExpressionRef_val(_cond);
BinaryenExpressionRef res = BinaryenExpressionRef_val(_res);
BinaryenExpressionRef exp = BinaryenBreak(module, name, cond, res);
Expand All @@ -75,9 +75,9 @@ caml_binaryen_switch(value _module, value _names, value _defaultName, value _con
int namesLen = array_length(_names);
const char* names[namesLen];
for (int i = 0; i < namesLen; i++) {
names[i] = String_val(Field(_names, i));
names[i] = Safe_String_val(Field(_names, i));
}
char* defaultName = String_val(_defaultName);
char* defaultName = Safe_String_val(_defaultName);
BinaryenExpressionRef cond = BinaryenExpressionRef_val(_cond);
BinaryenExpressionRef val = BinaryenExpressionRef_val(_val);
BinaryenExpressionRef exp = BinaryenSwitch(module, names, namesLen, defaultName, cond, val);
Expand All @@ -88,7 +88,7 @@ CAMLprim value
caml_binaryen_call(value _module, value _name, value _params, value _retty) {
CAMLparam4(_module, _name, _params, _retty);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
_params = array_of_list(_params);
int paramsLen = array_length(_params);
BinaryenExpressionRef params[paramsLen];
Expand Down Expand Up @@ -121,7 +121,7 @@ CAMLprim value
caml_binaryen_return_call(value _module, value _name, value _params, value _retty) {
CAMLparam4(_module, _name, _params, _retty);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
_params = array_of_list(_params);
int paramsLen = array_length(_params);
BinaryenExpressionRef params[paramsLen];
Expand Down Expand Up @@ -185,7 +185,7 @@ CAMLprim value
caml_binaryen_global_get(value _module, value _name, value _ty) {
CAMLparam3(_module, _name, _ty);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
BinaryenType ty = BinaryenType_val(_ty);
BinaryenExpressionRef exp = BinaryenGlobalGet(module, name, ty);
CAMLreturn(alloc_BinaryenExpressionRef(exp));
Expand All @@ -195,7 +195,7 @@ CAMLprim value
caml_binaryen_global_set(value _module, value _name, value _val) {
CAMLparam3(_module, _name, _val);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
BinaryenExpressionRef val = BinaryenExpressionRef_val(_val);
BinaryenExpressionRef exp = BinaryenGlobalSet(module, name, val);
CAMLreturn(alloc_BinaryenExpressionRef(exp));
Expand Down
2 changes: 1 addition & 1 deletion src/binaryen_stubs_function_tables.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ caml_binaryen_set_function_table(value _module, value _initial, value _maximum,
int funcnamesLen = array_length(_funcnames);
const char* funcnames[funcnamesLen];
for (int i = 0; i < funcnamesLen; i++) {
funcnames[i] = String_val(Field(_funcnames, i));
funcnames[i] = Safe_String_val(Field(_funcnames, i));
}
BinaryenExpressionRef offset = BinaryenExpressionRef_val(_offset);
BinaryenSetFunctionTable(module, initial, maximum, funcnames, funcnamesLen, offset);
Expand Down
6 changes: 3 additions & 3 deletions src/binaryen_stubs_functions.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ caml_binaryen_add_function(value _module, value _name, value _params, value _res
CAMLparam5(_module, _name, _params, _results, _locals);
CAMLxparam1(_body);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
BinaryenType params = BinaryenType_val(_params);
BinaryenType results = BinaryenType_val(_results);
int len = array_length(_locals);
Expand All @@ -40,7 +40,7 @@ CAMLprim value
caml_binaryen_get_function(value _module, value _name) {
CAMLparam2(_module, _name);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
BinaryenFunctionRef fun = BinaryenGetFunction(module, name);
CAMLreturn(alloc_BinaryenFunctionRef(fun));
}
Expand All @@ -49,7 +49,7 @@ CAMLprim value
caml_binaryen_remove_function(value _module, value _name) {
CAMLparam2(_module, _name);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
BinaryenRemoveFunction(module, name);
CAMLreturn(Val_unit);
}
Expand Down
6 changes: 3 additions & 3 deletions src/binaryen_stubs_globals.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ CAMLprim value
caml_binaryen_add_global(value _module, value _name, value _ty, value _mutable_, value _init) {
CAMLparam5(_module, _name, _ty, _mutable_, _init);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
BinaryenType ty = BinaryenType_val(_ty);
int8_t mutable_ = Bool_val(_mutable_);
BinaryenExpressionRef init = BinaryenExpressionRef_val(_init);
Expand All @@ -30,7 +30,7 @@ CAMLprim value
caml_binaryen_get_global(value _module, value _name) {
CAMLparam2(_module, _name);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
BinaryenGlobalRef glob = BinaryenGetGlobal(module, name);
CAMLreturn(alloc_BinaryenGlobalRef(glob));
}
Expand All @@ -39,7 +39,7 @@ CAMLprim value
caml_binaryen_remove_global(value _module, value _name) {
CAMLparam2(_module, _name);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* name = String_val(_name);
char* name = Safe_String_val(_name);
BinaryenRemoveGlobal(module, name);
CAMLreturn(Val_unit);
}
24 changes: 12 additions & 12 deletions src/binaryen_stubs_imports.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ caml_binaryen_add_function_import(value _module, value _internalName, value _ext
CAMLparam5(_module, _internalName, _externalModuleName, _externalBaseName, _paramsty);
CAMLxparam1(_resultsty);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* internalName = String_val(_internalName);
char* externalModuleName = String_val(_externalModuleName);
char* externalBaseName = String_val(_externalBaseName);
char* internalName = Safe_String_val(_internalName);
char* externalModuleName = Safe_String_val(_externalModuleName);
char* externalBaseName = Safe_String_val(_externalBaseName);
BinaryenType paramsty = BinaryenType_val(_paramsty);
BinaryenType resultsty = BinaryenType_val(_resultsty);
BinaryenAddFunctionImport(module, internalName, externalModuleName, externalBaseName, paramsty, resultsty);
Expand All @@ -28,9 +28,9 @@ CAMLprim value
caml_binaryen_add_table_import(value _module, value _internalName, value _externalModuleName, value _externalBaseName) {
CAMLparam4(_module, _internalName, _externalModuleName, _externalBaseName);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* internalName = String_val(_internalName);
char* externalModuleName = String_val(_externalModuleName);
char* externalBaseName = String_val(_externalBaseName);
char* internalName = Safe_String_val(_internalName);
char* externalModuleName = Safe_String_val(_externalModuleName);
char* externalBaseName = Safe_String_val(_externalBaseName);
BinaryenAddTableImport(module, internalName, externalModuleName, externalBaseName);
CAMLreturn(Val_unit);
}
Expand All @@ -39,9 +39,9 @@ CAMLprim value
caml_binaryen_add_memory_import(value _module, value _internalName, value _externalModuleName, value _externalBaseName, value _shared) {
CAMLparam5(_module, _internalName, _externalModuleName, _externalBaseName, _shared);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* internalName = String_val(_internalName);
char* externalModuleName = String_val(_externalModuleName);
char* externalBaseName = String_val(_externalBaseName);
char* internalName = Safe_String_val(_internalName);
char* externalModuleName = Safe_String_val(_externalModuleName);
char* externalBaseName = Safe_String_val(_externalBaseName);
uint8_t shared = Bool_val(_shared);
BinaryenAddMemoryImport(module, internalName, externalModuleName, externalBaseName, shared);
CAMLreturn(Val_unit);
Expand All @@ -52,9 +52,9 @@ caml_binaryen_add_global_import(value _module, value _internalName, value _exter
CAMLparam5(_module, _internalName, _externalModuleName, _externalBaseName, _ty);
CAMLxparam1(_mutable_);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
char* internalName = String_val(_internalName);
char* externalModuleName = String_val(_externalModuleName);
char* externalBaseName = String_val(_externalBaseName);
char* internalName = Safe_String_val(_internalName);
char* externalModuleName = Safe_String_val(_externalModuleName);
char* externalBaseName = Safe_String_val(_externalBaseName);
BinaryenType ty = BinaryenType_val(_ty);
int mutable_ = Bool_val(_mutable_);
BinaryenAddGlobalImport(module, internalName, externalModuleName, externalBaseName, ty, mutable_);
Expand Down
4 changes: 2 additions & 2 deletions src/binaryen_stubs_memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ caml_binaryen_set_memory(value _module, value _initial, value _maximum, value _e
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
BinaryenIndex initial = Int_val(_initial);
BinaryenIndex maximum = Int_val(_maximum);
char* exportName = String_val(_exportName);
char* exportName = Safe_String_val(_exportName);
_segments = array_of_list(_segments);
int segmentsLen = array_length(_segments);
const char* segments[segmentsLen];
for (int i = 0; i < segmentsLen; i++) {
segments[i] = String_val(Field(_segments, i));
segments[i] = Safe_String_val(Field(_segments, i));
}
_segmentPassive = array_of_list(_segmentPassive);
int segmentPassiveLen = array_length(_segmentPassive);
Expand Down
20 changes: 10 additions & 10 deletions src/binaryen_stubs_modules.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ caml_binaryen_module_dispose(value module) {
CAMLprim value
caml_binaryen_module_parse(value _text) {
CAMLparam1(_text);
const char* text = String_val(_text);
const char* text = Safe_String_val(_text);
BinaryenModuleRef module = BinaryenModuleParse(text);
CAMLreturn(alloc_BinaryenModuleRef(module));
}
Expand Down Expand Up @@ -128,16 +128,16 @@ caml_binaryen_set_low_memory_unused(value _level) {
CAMLprim value
caml_binaryen_get_pass_argument(value _name) {
CAMLparam1(_name);
const char* name = String_val(_name);
const char* name = Safe_String_val(_name);
const char* val = BinaryenGetPassArgument(name);
CAMLreturn(caml_copy_string(val));
}

CAMLprim value
caml_binaryen_set_pass_argument(value _name, value _val) {
CAMLparam2(_name, _val);
const char* name = String_val(_name);
const char* val = String_val(_val);
const char* name = Safe_String_val(_name);
const char* val = Safe_String_val(_val);
BinaryenSetPassArgument(name, val);
CAMLreturn(Val_unit);
}
Expand Down Expand Up @@ -195,7 +195,7 @@ caml_binaryen_module_run_passes(value _module, value _passes) {
int passesLen = array_length(_passes);
const char* passes[passesLen];
for (int i = 0; i < passesLen; i++) {
passes[i] = String_val(Field(_passes, i));
passes[i] = Safe_String_val(Field(_passes, i));
}
BinaryenModuleRunPasses(module, passes, passesLen);
CAMLreturn(Val_unit);
Expand All @@ -215,7 +215,7 @@ caml_binaryen_module_write(value _module, value _sourceMapUrl) {
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
const char* sourceMapUrl;
if (Is_some(_sourceMapUrl)) {
sourceMapUrl = String_val(Field(_sourceMapUrl, 0));
sourceMapUrl = Safe_String_val(Field(_sourceMapUrl, 0));
} else {
sourceMapUrl = NULL;
}
Expand Down Expand Up @@ -249,7 +249,7 @@ caml_binaryen_module_write_text(value _module) {
CAMLprim value
caml_binaryen_module_read(value _bytes) {
CAMLparam1(_bytes);
char* bytes = String_val(_bytes);
char* bytes = Safe_String_val(_bytes);
int length = caml_string_length(_bytes);
BinaryenModuleRef result = BinaryenModuleRead(bytes, length);
CAMLreturn(alloc_BinaryenModuleRef(result));
Expand All @@ -267,7 +267,7 @@ CAMLprim value
caml_binaryen_module_add_debug_info_filename(value _module, value _filename) {
CAMLparam2(_module, _filename);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
const char* filename = String_val(_filename);
const char* filename = Safe_String_val(_filename);
int result = BinaryenModuleAddDebugInfoFileName(module, filename);
CAMLreturn(Val_int(result));
}
Expand All @@ -287,8 +287,8 @@ CAMLprim value
caml_binaryen_add_custom_section(value _module, value _name, value _contents) {
CAMLparam3(_module, _name, _contents);
BinaryenModuleRef module = BinaryenModuleRef_val(_module);
const char* name = String_val(_name);
const char* contents = String_val(_contents);
const char* name = Safe_String_val(_name);
const char* contents = Safe_String_val(_contents);
int contentsLen = caml_string_length(_contents);
BinaryenAddCustomSection(module, name, contents, contentsLen);
CAMLreturn(Val_unit);
Expand Down
4 changes: 4 additions & 0 deletions src/ocaml_helpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include <caml/alloc.h>
#include <caml/custom.h>

#include <string.h>

#include <binaryen-c.h>

static struct custom_operations binaryen_ops;
Expand All @@ -25,6 +27,8 @@ static struct custom_operations binaryen_ops;
#define Is_none(v) ((v) == Val_none)
#define Is_some(v) Is_block(v)

#define Safe_String_val(v) strdup(String_val(v))

CAMLprim value
caml_alloc_some(value v);

Expand Down

0 comments on commit 780d8bc

Please sign in to comment.