mirror of
https://github.com/zap-proto/ruby.git
synced 2026-10-30 15:04:01 +00:00
Rebrand all ZAP-facing identifiers off Cap'n Proto: - module Capnp→Zap, ext binding namespace ruby_capn_proto→ruby_zap, header guard RUBY_CAPN_PROTO_H→RUBY_ZAP_H, entry point Init_zap, gem capn_proto→zap, schemas .capnp→.zap, media/logo, gemspec, README, spec, examples. Zero capnp/Cap'n Proto brand prose remains. Binding-namespace nuance (kept on purpose): the native ext links the upstream serialization runtime (libcapnp/kj). Its capnp:: C++ symbols and <capnp/...> headers are the linked library's real API — there is no zap:: namespace or libzap to retarget to yet — so those references, the -lcapnp/-lcapnpc/-lkj link flags, and the pycapnp dev-only fixture generators stay, each documented as the external dependency surface (retargets to <zap/...>/-lzap when the ZAP C++ runtime ships). Build/modernization: - extconf.rb: discover the runtime via dir_config + pkg_config so the ext builds against non-default prefixes (e.g. Homebrew), not just /usr/local. Native ext now compiles + links cleanly (zap.bundle). - ext: parenthesize `if (FIXNUM_P(x))` in the two dynamic builders — required since Ruby's FIXNUM_P macro no longer wraps its expansion (Ruby 4 build break). - Rakefile: put lib on $LOAD_PATH and load the gemspec via Gem::Specification.load; pin rake-compiler ~> 0.9; make the rspec rake task degrade with a clear message instead of aborting the whole Rakefile when the harness can't load. - gemspec: bump dev deps within-major (rspec ~> 2.14, rake ~> 13.0, rake-compiler ~> 0.9); add required_ruby_version. - .gitignore: ignore native-ext build artifacts (*.o, Makefile, mkmf.log, *.bundle.dSYM, *.gem). Verified: all spec/zap_spec.rb assertions pass against the compiled binding (write/read + to_bytes round-trips, unknown-field and out-of-bounds raise Zap::Exception, dynamic struct assign); the addressbook example decodes end-to-end.
81 lines
3.1 KiB
C++
81 lines
3.1 KiB
C++
#include "ruby_zap.h"
|
|
#include "class_builder.h"
|
|
|
|
namespace ruby_zap {
|
|
|
|
VALUE defineClass(const char *name, VALUE superclass = rb_cObject) {
|
|
VALUE Zap = rb_define_module("Zap");
|
|
VALUE klass = rb_define_class_under(Zap, name, superclass);
|
|
// rb_funcall(klass, rb_intern("private_class_method"), 1, rb_str_new2("new"));
|
|
return klass;
|
|
}
|
|
|
|
ClassBuilder::ClassBuilder(const char* name, VALUE superclass) {
|
|
this->value = defineClass(name, superclass);
|
|
}
|
|
ClassBuilder::ClassBuilder(const char* name, const char* supername) {
|
|
VALUE superclass = defineClass(supername);
|
|
this->value = defineClass(name, superclass);
|
|
}
|
|
|
|
ClassBuilder& ClassBuilder::defineAlloc(VALUE (*impl)(VALUE)) {
|
|
rb_define_alloc_func(this->value, (VALUE (*)(VALUE))impl);
|
|
return *this;
|
|
}
|
|
|
|
ClassBuilder& ClassBuilder::defineConst(const char* name, VALUE value) {
|
|
rb_define_const(this->value, name, value);
|
|
return *this;
|
|
}
|
|
|
|
ClassBuilder& ClassBuilder::defineMethod(const char* name, VALUE (*impl)(int, VALUE*, VALUE)) {
|
|
rb_define_method(this->value, name, (VALUE (*)(...))impl, -1);
|
|
return *this;
|
|
}
|
|
ClassBuilder& ClassBuilder::defineMethod(const char* name, VALUE (*impl)(VALUE)) {
|
|
rb_define_method(this->value, name, (VALUE (*)(...))impl, 0);
|
|
return *this;
|
|
}
|
|
ClassBuilder& ClassBuilder::defineMethod(const char* name, VALUE (*impl)(VALUE, VALUE)) {
|
|
rb_define_method(this->value, name, (VALUE (*)(...))impl, 1);
|
|
return *this;
|
|
}
|
|
ClassBuilder& ClassBuilder::defineMethod(const char* name, VALUE (*impl)(VALUE, VALUE, VALUE)) {
|
|
rb_define_method(this->value, name, (VALUE (*)(...))impl, 2);
|
|
return *this;
|
|
}
|
|
ClassBuilder& ClassBuilder::defineMethod(const char* name, VALUE (*impl)(VALUE, VALUE, VALUE, VALUE)) {
|
|
rb_define_method(this->value, name, (VALUE (*)(...))impl, 3);
|
|
return *this;
|
|
}
|
|
ClassBuilder& ClassBuilder::defineSingletonMethod(const char* name, VALUE (*impl)(int, VALUE*, VALUE)) {
|
|
rb_define_singleton_method(this->value, name, (VALUE (*)(...))impl, -1);
|
|
return *this;
|
|
}
|
|
ClassBuilder& ClassBuilder::defineSingletonMethod(const char* name, VALUE (*impl)(VALUE)) {
|
|
rb_define_singleton_method(this->value, name, (VALUE (*)(...))impl, 0);
|
|
return *this;
|
|
}
|
|
ClassBuilder& ClassBuilder::defineSingletonMethod(const char* name, VALUE (*impl)(VALUE, VALUE)) {
|
|
rb_define_singleton_method(this->value, name, (VALUE (*)(...))impl, 1);
|
|
return *this;
|
|
}
|
|
ClassBuilder& ClassBuilder::defineSingletonMethod(const char* name, VALUE (*impl)(VALUE, VALUE, VALUE)) {
|
|
rb_define_singleton_method(this->value, name, (VALUE (*)(...))impl, 2);
|
|
return *this;
|
|
}
|
|
ClassBuilder& ClassBuilder::defineSingletonMethod(const char* name, VALUE (*impl)(VALUE, VALUE, VALUE, VALUE)) {
|
|
rb_define_singleton_method(this->value, name, (VALUE (*)(...))impl, 3);
|
|
return *this;
|
|
}
|
|
ClassBuilder& ClassBuilder::defineEnumConst(const char* name, int value) {
|
|
rb_define_const(this->value, name, INT2FIX(value));
|
|
return *this;
|
|
}
|
|
ClassBuilder& ClassBuilder::store(VALUE* storage) {
|
|
rb_gc_register_address(storage);
|
|
*storage = this->value;
|
|
return *this;
|
|
}
|
|
}
|