Fix mruby bindings #197
|
@ -117,7 +117,7 @@ static void mrbBindingInit(mrb_state *mrb)
|
||||||
/* Load global constants */
|
/* Load global constants */
|
||||||
mrb_define_global_const(mrb, "MKXP", mrb_true_value());
|
mrb_define_global_const(mrb, "MKXP", mrb_true_value());
|
||||||
|
|
||||||
mrb_value debug = rb_bool_new(shState->config().editor.debug);
|
mrb_value debug = mrb_bool_value(shState->config().editor.debug);
|
||||||
if (rgssVer == 1)
|
if (rgssVer == 1)
|
||||||
|
|||||||
mrb_define_global_const(mrb, "DEBUG", debug);
|
mrb_define_global_const(mrb, "DEBUG", debug);
|
||||||
else if (rgssVer >= 2)
|
else if (rgssVer >= 2)
|
||||||
|
@ -298,7 +298,7 @@ runRMXPScripts(mrb_state *mrb, mrbc_context *ctx)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int scriptCount = mrb_ary_len(scriptMrb, scriptArray);
|
int scriptCount = RARRAY_LEN(scriptArray);
|
||||||
|
|
||||||
std::string decodeBuffer;
|
std::string decodeBuffer;
|
||||||
decodeBuffer.resize(0x1000);
|
decodeBuffer.resize(0x1000);
|
||||||
|
|
|
@ -71,8 +71,7 @@ static const MrbExcData excData[] =
|
||||||
{ Shutdown, "SystemExit" },
|
{ Shutdown, "SystemExit" },
|
||||||
Why the rename? Is Why the rename? Is `IOError` already defined by mruby?
Yeah. If I remember right, this throws up some error about Yeah. If I remember right, this throws up some error about `IOError` already existing.
Should I rename this to something better? Should I rename this to something better?
This is from the io-gem too, right. Just delete this entry in the array, and query the existing error class like done here: https://github.com/Ancurio/mkxp/blob/master/binding-mruby/binding-util.cpp#L120 This is from the io-gem too, right. Just delete this entry in the array, and query the existing error class like done here: https://github.com/Ancurio/mkxp/blob/master/binding-mruby/binding-util.cpp#L120
Did this, but tbh I've no idea what's going on here Did this, but tbh I've no idea what's going on here
|
|||||||
{ PHYSFS, "PHYSFSError" },
|
{ PHYSFS, "PHYSFSError" },
|
||||||
{ SDL, "SDLError" },
|
{ SDL, "SDLError" },
|
||||||
{ MKXP, "MKXPError" },
|
{ MKXP, "MKXPError" }
|
||||||
{ IO, "IOError" }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static elementsN(excData);
|
static elementsN(excData);
|
||||||
|
@ -118,6 +117,7 @@ MrbData::MrbData(mrb_state *mrb)
|
||||||
|
|
||||||
exc[TypeError] = mrb_class_get(mrb, "TypeError");
|
exc[TypeError] = mrb_class_get(mrb, "TypeError");
|
||||||
exc[ArgumentError] = mrb_class_get(mrb, "ArgumentError");
|
exc[ArgumentError] = mrb_class_get(mrb, "ArgumentError");
|
||||||
|
exc[IOError] = mrb_class_get(mrb, "IOError");
|
||||||
|
|
||||||
for (size_t i = 0; i < symDataN; ++i)
|
for (size_t i = 0; i < symDataN; ++i)
|
||||||
symbols[symData[i].ind] = mrb_intern_cstr(mrb, symData[i].str);
|
symbols[symData[i].ind] = mrb_intern_cstr(mrb, symData[i].str);
|
||||||
|
@ -134,6 +134,7 @@ static const MrbException excToMrbExc[] =
|
||||||
|
|
||||||
TypeError,
|
TypeError,
|
||||||
ArgumentError,
|
ArgumentError,
|
||||||
|
IOError,
|
||||||
|
|
||||||
PHYSFS, /* PHYSFSError */
|
PHYSFS, /* PHYSFSError */
|
||||||
SDL, /* SDLError */
|
SDL, /* SDLError */
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <mruby/data.h>
|
#include <mruby/data.h>
|
||||||
#include <mruby/variable.h>
|
#include <mruby/variable.h>
|
||||||
#include <mruby/class.h>
|
#include <mruby/class.h>
|
||||||
|
#include <mruby/string.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
@ -90,6 +91,7 @@ enum MrbException
|
||||||
|
|
||||||
TypeError,
|
TypeError,
|
||||||
ArgumentError,
|
ArgumentError,
|
||||||
|
IOError,
|
||||||
|
|
||||||
MrbExceptionsMax
|
MrbExceptionsMax
|
||||||
};
|
};
|
||||||
|
@ -352,11 +354,13 @@ inline mrb_value
|
||||||
objectLoad(mrb_state *mrb, mrb_value self, const mrb_data_type &type)
|
objectLoad(mrb_state *mrb, mrb_value self, const mrb_data_type &type)
|
||||||
{
|
{
|
||||||
RClass *klass = mrb_class_ptr(self);
|
RClass *klass = mrb_class_ptr(self);
|
||||||
char *data;
|
|
||||||
int data_len;
|
|
||||||
mrb_get_args(mrb, "s", &data, &data_len);
|
|
||||||
|
|
||||||
C *c = C::deserialize(data, data_len);
|
mrb_value data;
|
||||||
|
mrb_get_args(mrb, "S", &data);
|
||||||
|
|
||||||
|
int data_len = mrb_string_value_len(mrb, data);
|
||||||
|
|
||||||
|
C *c = C::deserialize(RSTRING_PTR(data), data_len);
|
||||||
|
|
||||||
RData *obj = mrb_data_object_alloc(mrb, klass, c, &type);
|
RData *obj = mrb_data_object_alloc(mrb, klass, c, &type);
|
||||||
mrb_value obj_value = mrb_obj_value(obj);
|
mrb_value obj_value = mrb_obj_value(obj);
|
||||||
|
|
|
@ -49,7 +49,12 @@ MRB_METHOD(fontInitialize)
|
||||||
|
|
||||||
mrb_get_args(mrb, "|zi", &name, &size);
|
mrb_get_args(mrb, "|zi", &name, &size);
|
||||||
|
|
||||||
Font *f = new Font(name, size);
|
Font *f;
|
||||||
|
|
||||||
|
std::vector<std::string> names;
|
||||||
|
names.push_back(name);
|
||||||
|
|
||||||
|
f = new Font(&names, size);
|
||||||
|
|
||||||
setPrivateData(self, f, FontType);
|
setPrivateData(self, f, FontType);
|
||||||
|
|
||||||
|
@ -86,9 +91,7 @@ MRB_METHOD(fontInitializeCopy)
|
||||||
|
|
||||||
MRB_METHOD(FontGetName)
|
MRB_METHOD(FontGetName)
|
||||||
{
|
{
|
||||||
Font *f = getPrivateData<Font>(mrb, self);
|
return mrb_iv_get(mrb, self, mrb_intern_cstr(mrb, "name"));
|
||||||
|
|
||||||
return mrb_str_new_cstr(mrb, f->getName());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MRB_METHOD(FontSetName)
|
MRB_METHOD(FontSetName)
|
||||||
|
@ -98,7 +101,11 @@ MRB_METHOD(FontSetName)
|
||||||
mrb_value name;
|
mrb_value name;
|
||||||
mrb_get_args(mrb, "S", &name);
|
mrb_get_args(mrb, "S", &name);
|
||||||
|
|
||||||
f->setName(RSTRING_PTR(name));
|
std::vector<std::string> names;
|
||||||
|
names.push_back(RSTRING_PTR(name));
|
||||||
|
|
||||||
|
f->setName(names);
|
||||||
|
mrb_iv_set(mrb, self, mrb_intern_cstr(mrb, "name"), name);
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
@ -135,17 +142,21 @@ DEF_KLASS_PROP(Font, mrb_bool, DefaultItalic, "b", bool)
|
||||||
DEF_KLASS_PROP(Font, mrb_bool, DefaultOutline, "b", bool)
|
DEF_KLASS_PROP(Font, mrb_bool, DefaultOutline, "b", bool)
|
||||||
DEF_KLASS_PROP(Font, mrb_bool, DefaultShadow, "b", bool)
|
DEF_KLASS_PROP(Font, mrb_bool, DefaultShadow, "b", bool)
|
||||||
Same as with get/SetName, except that the IV is stored in the Class object. Same as with get/SetName, except that the IV is stored in the Class object.
|
|||||||
|
|
||||||
MRB_FUNCTION(FontGetDefaultName)
|
MRB_METHOD(FontGetDefaultName)
|
||||||
{
|
{
|
||||||
return mrb_str_new_cstr(mrb, Font::getDefaultName());
|
return mrb_iv_get(mrb, self, mrb_intern_cstr(mrb, "default_name"));
|
||||||
}
|
}
|
||||||
|
|
||||||
MRB_FUNCTION(FontSetDefaultName)
|
MRB_METHOD(FontSetDefaultName)
|
||||||
{
|
{
|
||||||
mrb_value nameObj;
|
mrb_value nameObj;
|
||||||
mrb_get_args(mrb, "S", &nameObj);
|
mrb_get_args(mrb, "S", &nameObj);
|
||||||
|
|
||||||
Font::setDefaultName(RSTRING_PTR(nameObj));
|
std::vector<std::string> names;
|
||||||
|
names.push_back(RSTRING_PTR(nameObj));
|
||||||
|
|
||||||
|
Font::setDefaultName(names, shState->fontState());
|
||||||
|
mrb_iv_set(mrb, self, mrb_intern_cstr(mrb, "default_name"), nameObj);
|
||||||
|
|
||||||
return nameObj;
|
return nameObj;
|
||||||
}
|
}
|
||||||
|
|
|
@ -596,7 +596,7 @@ fileBindingInit(mrb_state *mrb)
|
||||||
mrb_define_method(mrb, klass, "path", fileGetPath, MRB_ARGS_NONE());
|
mrb_define_method(mrb, klass, "path", fileGetPath, MRB_ARGS_NONE());
|
||||||
|
|
||||||
/* FileTest */
|
/* FileTest */
|
||||||
RClass *module = mrb_define_module(mrb, "FileTest");
|
RClass *module = mrb_define_module(mrb, "MKXPFileTest");
|
||||||
mrb_define_module_function(mrb, module, "exist?", fileTestDoesExist, MRB_ARGS_REQ(1));
|
mrb_define_module_function(mrb, module, "exist?", fileTestDoesExist, MRB_ARGS_REQ(1));
|
||||||
With this rename the class becomes pointless (scripts expect this standard name, which is also mentioned in the RGSS documentation); why was it necessary? Is there a native implementation now? With this rename the class becomes pointless (scripts expect this standard name, which is also mentioned in the RGSS documentation); why was it necessary? Is there a native implementation now?
Yup, it is in the Yup, it is in the `mruby-io` mrbgem that is included with the default build (check [this](https://github.com/mruby/mruby/blob/b724e06cf25eee4c05dcc0e3a1a65bb608091cc4/mrbgems/mruby-io/src/file_test.c), for some reason, the documentation doesn't list this). I'm a bit inclined towards keeping this code for a while since I haven't really tested much yet, so just renamed it to `MKXPFileTest`. What do you think?
Renaming the Module defeats the entire purpose of having it; code expecting Renaming the Module defeats the entire purpose of having it; code expecting `FileTest` functions will not work. Could you check whether the `mruby-io` gem covers all of the functions mentioned in the RGSS1 documentation? Either we require the gem to be disabled for mkxp, or drop the mkxp code in favor of the gem.
@Ancurio just checked, it does implement everything we want (and much more) for @Ancurio just checked, it does implement everything we want (and much more) for `FileTest` and nothing for `File` (so no overlapping symbols). Actually I'm strongly against disabling `mruby-io`, since being a core mrbgem, this will definitely break something else (mruby-marshal for a start)
@pulsejet Oh I'm sorry, I just finally understood why you renamed the module; my brain must have been lagging. The rename is fine (although I'd like to delete my code as soon as possible), with a comment about why the old classes exist. @pulsejet Oh I'm sorry, I just finally understood why you renamed the module; my brain must have been lagging. The rename is fine (although I'd like to delete my code as soon as possible), with a comment about why the old classes exist.
I'm still confused about `File` though; why did you not have to rename that to `MKXPFile`?
Weirdly, the Weirdly, the `File` class of the `mruby-io` is completely different, while `FileTest` is exactly the same, so we need `File` (though I've not tried removing it). Not really sure about *anything* here, but one thing I can confirm is that `this code works` :P
So it's https://github.com/mruby/mruby/blob/b724e06cf25eee4c05dcc0e3a1a65bb608091cc4/mrbgems/mruby-io/src/file.c#L395
https://github.com/mruby/mruby/blob/b724e06cf25eee4c05dcc0e3a1a65bb608091cc4/mrbgems/mruby-io/src/file_test.c#L365
So it's `IO::File` in mruby while `FileTest` is defined in the global namespace? That's weird.
|
|||||||
mrb_define_module_function(mrb, module, "directory?", fileTestIsDirectory, MRB_ARGS_REQ(1));
|
mrb_define_module_function(mrb, module, "directory?", fileTestIsDirectory, MRB_ARGS_REQ(1));
|
||||||
mrb_define_module_function(mrb, module, "file?", fileTestIsFile, MRB_ARGS_REQ(1));
|
mrb_define_module_function(mrb, module, "file?", fileTestIsFile, MRB_ARGS_REQ(1));
|
||||||
|
|
|
@ -172,7 +172,7 @@ MRB_FUNCTION(kernelLoadData)
|
||||||
mrb_get_args(mrb, "z", &filename);
|
mrb_get_args(mrb, "z", &filename);
|
||||||
|
|
||||||
SDL_RWops ops;
|
SDL_RWops ops;
|
||||||
GUARD_EXC( shState->fileSystem().openRead(ops, filename); )
|
GUARD_EXC( shState->fileSystem().openReadRaw(ops, filename); )
|
||||||
|
|
||||||
mrb_value obj;
|
mrb_value obj;
|
||||||
try { obj = marshalLoadInt(mrb, &ops); }
|
try { obj = marshalLoadInt(mrb, &ops); }
|
||||||
|
|
|
@ -473,8 +473,8 @@ read_value(MarshalContext *ctx)
|
||||||
mrb_state *mrb = ctx->mrb;
|
mrb_state *mrb = ctx->mrb;
|
||||||
int8_t type = ctx->readByte();
|
int8_t type = ctx->readByte();
|
||||||
mrb_value value;
|
mrb_value value;
|
||||||
if (mrb->arena_idx > maxArena)
|
if (mrb->gc.arena_idx > maxArena)
|
||||||
maxArena = mrb->arena_idx;
|
maxArena = mrb->gc.arena_idx;
|
||||||
|
|
||||||
I don't remember the internals of mruby too well so I'll just trust that this does the right thing :) I don't remember the internals of mruby too well so I'll just trust that this does the right thing :)
|
|||||||
int arena = mrb_gc_arena_save(mrb);
|
int arena = mrb_gc_arena_save(mrb);
|
||||||
|
|
||||||
|
@ -676,7 +676,7 @@ static void
|
||||||
write_array(MarshalContext *ctx, mrb_value array)
|
write_array(MarshalContext *ctx, mrb_value array)
|
||||||
{
|
{
|
||||||
mrb_state *mrb = ctx->mrb;
|
mrb_state *mrb = ctx->mrb;
|
||||||
int len = mrb_ary_len(mrb, array);
|
int len = RARRAY_LEN(array);
|
||||||
write_fixnum(ctx, len);
|
write_fixnum(ctx, len);
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
@ -687,8 +687,6 @@ write_array(MarshalContext *ctx, mrb_value array)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
KHASH_DECLARE(ht, mrb_value, mrb_value, 1)
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
write_hash(MarshalContext *ctx, mrb_value hash)
|
write_hash(MarshalContext *ctx, mrb_value hash)
|
||||||
{
|
{
|
||||||
|
@ -707,7 +705,7 @@ write_hash(MarshalContext *ctx, mrb_value hash)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
write_value(ctx, kh_key(h, k));
|
write_value(ctx, kh_key(h, k));
|
||||||
write_value(ctx, kh_val(h, k));
|
write_value(ctx, kh_val(h, k).v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -732,7 +730,7 @@ write_object(MarshalContext *ctx, mrb_value object)
|
||||||
write_value(ctx, mrb_str_intern(mrb, path));
|
write_value(ctx, mrb_str_intern(mrb, path));
|
||||||
|
|
||||||
mrb_value iv_ary = mrb_obj_instance_variables(mrb, object);
|
mrb_value iv_ary = mrb_obj_instance_variables(mrb, object);
|
||||||
int iv_count = mrb_ary_len(mrb, iv_ary);
|
int iv_count = RARRAY_LEN(iv_ary);
|
||||||
write_fixnum(ctx, iv_count);
|
write_fixnum(ctx, iv_count);
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
hm,
rb_
is from the MRI binding, so this probably slipped in with PR #191.