Example #1
0
void EnumDescriptor_register(VALUE module) {
  VALUE klass = rb_define_class_under(
      module, "EnumDescriptor", rb_cObject);
  rb_define_alloc_func(klass, EnumDescriptor_alloc);
  rb_define_method(klass, "name", EnumDescriptor_name, 0);
  rb_define_method(klass, "name=", EnumDescriptor_name_set, 1);
  rb_define_method(klass, "add_value", EnumDescriptor_add_value, 2);
  rb_define_method(klass, "lookup_name", EnumDescriptor_lookup_name, 1);
  rb_define_method(klass, "lookup_value", EnumDescriptor_lookup_value, 1);
  rb_define_method(klass, "each", EnumDescriptor_each, 0);
  rb_define_method(klass, "enummodule", EnumDescriptor_enummodule, 0);
  rb_include_module(klass, rb_mEnumerable);
  cEnumDescriptor = klass;
  rb_gc_register_address(&cEnumDescriptor);
}
Example #2
0
/* Init */
void
Init_webkit(void)
{
  mWebKit = rb_define_module("WebKit");
  rb_define_singleton_method(mWebKit, "set_web_database_path", WebKit_CLASS_set_web_database_path, 1);
  rb_define_singleton_method(mWebKit, "remove_all_web_databases", WebKit_CLASS_remove_all_web_databases, 0);
  rb_define_singleton_method(mWebKit, "set_default_web_database_quota", WebKit_CLASS_set_default_web_database_quota, 1);
  cJavascriptError = rb_define_class_under(mWebKit, "JavascriptError", rb_eStandardError);
  cWebSettings = G_DEF_CLASS(WEBKIT_TYPE_WEB_SETTINGS, "WebSettings", mWebKit);
  rb_define_method(cWebSettings, "initialize", WebSettings_initialize, 0);
  cWebFrame = G_DEF_CLASS(WEBKIT_TYPE_WEB_FRAME, "WebFrame", mWebKit);
  rb_define_method(cWebFrame, "exec_js", WebFrame_exec_js, 1);
  rb_define_method(cWebFrame, "setup_ruby", WebFrame_setup_ruby, 0);
  rb_define_method(cWebFrame, "add_js_api", WebFrame_add_js_api, 1);
  rb_define_method(cWebFrame, "load_string", WebFrame_load_string, 4);
  cWebView = G_DEF_CLASS(WEBKIT_TYPE_WEB_VIEW, "WebView", mWebKit);
  rb_define_method(cWebView, "initialize", WebView_initialize, 0);
  rb_define_method(cWebView, "open", WebView_open, 1);
  rb_define_method(cWebView, "execute_script", WebView_execute_script, 1);
  rb_define_method(cWebView, "set_settings", WebView_set_settings, 1);
  rb_define_method(cWebView, "load_string", WebView_load_string, 4);
  rb_define_method(cWebView, "load_uri", WebView_load_uri, 1);
  rb_define_method(cWebView, "main_frame", WebView_main_frame, 0);
  rb_define_method(cWebView, "focused_frame", WebView_focused_frame, 0);
  rb_define_method(cWebView, "progress", WebView_progress, 0);
  rb_define_method(cWebView, "title", WebView_title, 0);
  rb_define_method(cWebView, "uri", WebView_uri, 0);
  rb_define_method(cWebView, "reload", WebView_reload, 0);
  rb_define_method(cWebView, "reload_bypass_cache", WebView_reload_bypass_cache, 0);
  rb_define_method(cWebView, "set_custom_encoding", WebView_set_custom_encoding, 1);
  rb_define_method(cWebView, "stop_loading", WebView_stop_loading, 0);
  cTargetInfo = G_DEF_CLASS(WEBKIT_TYPE_WEB_VIEW_TARGET_INFO, "TargetInfo", cWebView);
  cViewMode = G_DEF_CLASS(WEBKIT_TYPE_WEB_VIEW_VIEW_MODE, "ViewMode", cWebView);
  cDownloadStatus = G_DEF_CLASS(WEBKIT_TYPE_DOWNLOAD_STATUS, "DownloadStatus", mWebKit);
  cDownloadError = G_DEF_CLASS(WEBKIT_TYPE_DOWNLOAD_ERROR, "DownloadError", mWebKit);
  cNetworkError = G_DEF_CLASS(WEBKIT_TYPE_NETWORK_ERROR, "NetworkError", mWebKit);
  cPolicyError = G_DEF_CLASS(WEBKIT_TYPE_POLICY_ERROR, "PolicyError", mWebKit);
  cPluginError = G_DEF_CLASS(WEBKIT_TYPE_PLUGIN_ERROR, "PluginError", mWebKit);
  cCacheModel = G_DEF_CLASS(WEBKIT_TYPE_CACHE_MODEL, "CacheModel", mWebKit);
  cHitTestResultContext = G_DEF_CLASS(WEBKIT_TYPE_HIT_TEST_RESULT_CONTEXT, "HitTestResultContext", mWebKit);
  cLoadStatus = G_DEF_CLASS(WEBKIT_TYPE_LOAD_STATUS, "LoadStatus", mWebKit);
  cNavigationReason = G_DEF_CLASS(WEBKIT_TYPE_WEB_NAVIGATION_REASON, "NavigationReason", mWebKit);
  cEditingBehavior = G_DEF_CLASS(WEBKIT_TYPE_EDITING_BEHAVIOR, "EditingBehavior", mWebKit);
  cNavigationResponse = G_DEF_CLASS(WEBKIT_TYPE_NAVIGATION_RESPONSE, "NavigationResponse", mWebKit);
  cSelectionAffinity = G_DEF_CLASS(WEBKIT_TYPE_SELECTION_AFFINITY, "SelectionAffinity", mWebKit);
  cInsertAction = G_DEF_CLASS(WEBKIT_TYPE_INSERT_ACTION, "InsertAction", mWebKit);
rb_gc_register_address(&_gcpool_RubyFunc);
}
Example #3
0
VALUE rb_fiber_schedule_to_req() {
	int id = uwsgi.wsgi_req->async_id;

        if (!uwsgi.wsgi_req->suspended) {
                ufiber.fib[id] = rb_fiber_new(uwsgi_fiber_request, Qnil);
                rb_gc_register_address(&ufiber.fib[id]);
                uwsgi.wsgi_req->suspended = 1;
        }

        rb_fiber_resume(ufiber.fib[id], 0, NULL);

        if (uwsgi.wsgi_req->suspended) {
                uwsgi.wsgi_req->async_status = UWSGI_AGAIN;
        }

	return Qnil;
}
Example #4
0
void connection_start(backend_t *backend, int fd, struct sockaddr_in remote_addr)
{
  connection_t *c = (connection_t *) queue_pop(&backend->connections);
  
  /* no free connection found, add more */
  if (c == NULL) {
    connections_push(backend);
    c = (connection_t *) queue_pop(&backend->connections);
  }
  
  assert(c != NULL);
  
  /* init connection */
  c->finished       = 0;
  c->loop           = backend->loop;
  c->backend        = backend;
  c->content_length = 0;
  c->fd             = fd;
  c->remote_addr    = inet_ntoa(remote_addr.sin_addr);
  c->thread.obj     = Qnil;
  c->thread.active  = 0;
  
  /* mark as used to Ruby GC */
  c->env = rb_hash_new();
  rb_gc_register_address(&c->env);
  
  /* reset buffers */
  buffer_reset(&c->read_buffer);
  buffer_reset(&c->write_buffer);
  
  /* reinit parser */
  http_parser_init(&c->parser);
  c->parser.data = c;
  
  /* init libev stuff */
  c->read_watcher.data    = c;
  c->write_watcher.data   = c;
  c->timeout_watcher.data = c;
  ev_io_init(&c->read_watcher, connection_readable_cb, c->fd, EV_READ | EV_ERROR);
  ev_io_init(&c->write_watcher, connection_writable_cb, c->fd, EV_WRITE | EV_ERROR);
  ev_timer_init(&c->timeout_watcher, connection_timeout_cb, backend->timeout, backend->timeout);
  
  /* start event watchers */
  ev_timer_start(c->loop, &c->timeout_watcher);
  ev_io_start(c->loop, &c->read_watcher);
}
Example #5
0
static void
sax_drive_init(SaxDrive dr, VALUE handler, VALUE io, SaxOptions options) {
    ox_sax_buf_init(&dr->buf, io);
    dr->buf.dr = dr;
    stack_init(&dr->stack);
    dr->handler = handler;
    dr->value_obj = rb_data_object_alloc(ox_sax_value_class, dr, 0, 0);
    rb_gc_register_address(&dr->value_obj);
    dr->options = *options;
    dr->hints = 0;
    dr->err = 0;
    has_init(&dr->has, handler);
#if HAS_ENCODING_SUPPORT
    if ('\0' == *ox_default_options.encoding) {
	VALUE	encoding;

	dr->encoding = 0;
	if (rb_respond_to(io, ox_external_encoding_id) && Qnil != (encoding = rb_funcall(io, ox_external_encoding_id, 0))) {
	    int	e = rb_enc_get_index(encoding);
	    if (0 <= e) {
		dr->encoding = rb_enc_from_index(e);
	    }
	}
    } else {
        dr->encoding = rb_enc_find(ox_default_options.encoding);
    }
#elif HAS_PRIVATE_ENCODING
    if ('\0' == *ox_default_options.encoding) {
	VALUE	encoding;

	if (rb_respond_to(io, ox_external_encoding_id) && Qnil != (encoding = rb_funcall(io, ox_external_encoding_id, 0))) {
	    dr->encoding = encoding;
	} else {
	    dr->encoding = Qnil;
	}
    } else {
        dr->encoding = rb_str_new2(ox_default_options.encoding);
    }
#else
    dr->encoding = 0;
#endif
}
Example #6
0
static void
accept_callback(picoev_loop* loop, int fd, int events, void* cb_arg)
{
  int client_fd;
  client_t *client;
  struct sockaddr_in client_addr;
  if ((events & PICOEV_TIMEOUT) != 0) {
    // time out
    // next turn or other process
    return;
  }else if ((events & PICOEV_READ) != 0) {
    socklen_t client_len = sizeof(client_addr);
#ifdef linux
    client_fd = accept4(fd, (struct sockaddr *)&client_addr, &client_len, SOCK_NONBLOCK | SOCK_CLOEXEC);
#else
    client_fd = accept(fd, (struct sockaddr *)&client_addr, &client_len);
#endif
    if (client_fd != -1) {
#ifdef DEBUG
      printf("accept fd %d \n", client_fd);
#endif
      setup_sock(client_fd);
      client = new_client_t(client_fd, client_addr);

      client->environ = Qnil;
      rb_gc_register_address(&client->environ);

      init_parser(client, server_name, server_port);

      picoev_add(loop, client_fd, PICOEV_READ, READ_LONG_TIMEOUT_SECS, r_callback, (void *)client);
    }else{
      if (errno != EAGAIN && errno != EWOULDBLOCK) {
	// TODO:
	// raise exception from errno
	/* rb_raise(); */
	/* write_error_log(__FILE__, __LINE__); */
	// die
	loop_done = 0;
      }
    }
  }
}
Example #7
0
void FieldDescriptor_register(VALUE module) {
  VALUE klass = rb_define_class_under(
      module, "FieldDescriptor", rb_cObject);
  rb_define_alloc_func(klass, FieldDescriptor_alloc);
  rb_define_method(klass, "name", FieldDescriptor_name, 0);
  rb_define_method(klass, "name=", FieldDescriptor_name_set, 1);
  rb_define_method(klass, "type", FieldDescriptor_type, 0);
  rb_define_method(klass, "type=", FieldDescriptor_type_set, 1);
  rb_define_method(klass, "label", FieldDescriptor_label, 0);
  rb_define_method(klass, "label=", FieldDescriptor_label_set, 1);
  rb_define_method(klass, "number", FieldDescriptor_number, 0);
  rb_define_method(klass, "number=", FieldDescriptor_number_set, 1);
  rb_define_method(klass, "submsg_name", FieldDescriptor_submsg_name, 0);
  rb_define_method(klass, "submsg_name=", FieldDescriptor_submsg_name_set, 1);
  rb_define_method(klass, "subtype", FieldDescriptor_subtype, 0);
  rb_define_method(klass, "get", FieldDescriptor_get, 1);
  rb_define_method(klass, "set", FieldDescriptor_set, 2);
  cFieldDescriptor = klass;
  rb_gc_register_address(&cFieldDescriptor);
}
Example #8
0
void MessagePack_Unpacker_module_init(VALUE mMessagePack)
{
    msgpack_unpacker_static_init();

    cMessagePack_Unpacker = rb_define_class_under(mMessagePack, "Unpacker", rb_cObject);

    eUnpackError = rb_define_class_under(mMessagePack, "UnpackError", rb_eStandardError);

    eMalformedFormatError = rb_define_class_under(mMessagePack, "MalformedFormatError", eUnpackError);

    eStackError = rb_define_class_under(mMessagePack, "StackError", eUnpackError);

    eTypeError = rb_define_class_under(mMessagePack, "TypeError", rb_eStandardError);

    rb_define_alloc_func(cMessagePack_Unpacker, Unpacker_alloc);

    rb_define_method(cMessagePack_Unpacker, "initialize", Unpacker_initialize, -1);
    rb_define_method(cMessagePack_Unpacker, "buffer", Unpacker_buffer, 0);
    rb_define_method(cMessagePack_Unpacker, "read", Unpacker_read, 0);
    rb_define_alias(cMessagePack_Unpacker, "unpack", "read");
    rb_define_method(cMessagePack_Unpacker, "skip", Unpacker_skip, 0);
    rb_define_method(cMessagePack_Unpacker, "skip_nil", Unpacker_skip_nil, 0);
    rb_define_method(cMessagePack_Unpacker, "read_array_header", Unpacker_read_array_header, 0);
    rb_define_method(cMessagePack_Unpacker, "read_map_header", Unpacker_read_map_header, 0);
    //rb_define_method(cMessagePack_Unpacker, "peek_next_type", Unpacker_peek_next_type, 0);  // TODO
    rb_define_method(cMessagePack_Unpacker, "feed", Unpacker_feed, 1);
    rb_define_method(cMessagePack_Unpacker, "each", Unpacker_each, 0);
    rb_define_method(cMessagePack_Unpacker, "feed_each", Unpacker_feed_each, 1);

    s_unpacker_value = Unpacker_alloc(cMessagePack_Unpacker);
    rb_gc_register_address(&s_unpacker_value);
    Data_Get_Struct(s_unpacker_value, msgpack_unpacker_t, s_unpacker);
    /* prefer reference than copying */
    msgpack_buffer_set_write_reference_threshold(UNPACKER_BUFFER_(s_unpacker), 0);

    /* MessagePack.unpack(x) */
    rb_define_module_function(mMessagePack, "load", MessagePack_load_module_method, -1);
    rb_define_module_function(mMessagePack, "unpack", MessagePack_unpack_module_method, -1);
}
Example #9
0
static VALUE
trans_prompt(int argc, VALUE * argv, VALUE obj)
{
    VALUE tidVal = rb_ivar_get(obj, rb_intern("tid"));

    if (TYPE(tidVal) != T_FIXNUM && TYPE(tidVal) != T_BIGNUM) {
        rb_raise(rb_eException, "internal error, incorrect 'tid' ivar");
    } else if (argc != 2) {
        rb_raise(rb_eArgError, "wrong number of arguments");
    } else if (!rb_block_given_p()) {
        rb_raise(rb_eArgError, "block required for prompt method");
    } else if (TYPE(argv[0]) != T_STRING) {
        rb_raise(rb_eException,
                 "transaction.prompt requires a string path argument");
    }
    
    unsigned int tid = NUM2UINT(tidVal);
    std::string path(RSTRING_PTR(argv[0]));
    bp::Object * data = rubyToBPObject(argv[1]);
    const BPElement * e = (data == NULL) ? NULL : data->elemPtr();

    s_lock.lock();
    unsigned int x = g_bpCoreFunctions->prompt(tid, (BPPath) path.c_str(), e,
                                               dummyCB, NULL);

    // grab the passed in block and increment a reference to it
    VALUE val = rb_block_proc();
    s_outstandingPrompts[x] = val;
    rb_gc_register_address(&s_outstandingPrompts[x]);
    s_lock.unlock();

    // now call the block!
    
    if (data != NULL) delete data;

    // return the prompt id!
    return Qnil;
}
Example #10
0
VALUE
strb_InitializeFont(VALUE rb_mStarRuby)
{
  VALUE rb_cFont = rb_define_class_under(rb_mStarRuby, "Font", rb_cObject);
  rb_define_singleton_method(rb_cFont, "exist?", Font_s_exist, 1);
  rb_define_singleton_method(rb_cFont, "new",    Font_s_new,   -1);
  rb_define_alloc_func(rb_cFont, Font_alloc);
  rb_define_private_method(rb_cFont, "initialize", Font_initialize, 5);
  rb_define_method(rb_cFont, "bold?",     Font_bold,     0);
  rb_define_method(rb_cFont, "get_size",  Font_get_size, 1);
  rb_define_method(rb_cFont, "italic?",   Font_italic,   0);
  rb_define_method(rb_cFont, "name",      Font_name,     0);
  rb_define_method(rb_cFont, "size",      Font_size,     0);

  symbol_bold      = ID2SYM(rb_intern("bold"));
  symbol_italic    = ID2SYM(rb_intern("italic"));
  symbol_ttc_index = ID2SYM(rb_intern("ttc_index"));

  rbFontCache = rb_hash_new();
  rb_gc_register_address(&rbFontCache);

  return rb_cFont;
}
Example #11
0
void Map_register(VALUE module) {
  VALUE klass = rb_define_class_under(module, "Map", rb_cObject);
  rb_define_alloc_func(klass, Map_alloc);
  cMap = klass;
  rb_gc_register_address(&cMap);

  rb_define_method(klass, "initialize", Map_init, -1);
  rb_define_method(klass, "each", Map_each, 0);
  rb_define_method(klass, "keys", Map_keys, 0);
  rb_define_method(klass, "values", Map_values, 0);
  rb_define_method(klass, "[]", Map_index, 1);
  rb_define_method(klass, "[]=", Map_index_set, 2);
  rb_define_method(klass, "has_key?", Map_has_key, 1);
  rb_define_method(klass, "delete", Map_delete, 1);
  rb_define_method(klass, "clear", Map_clear, 0);
  rb_define_method(klass, "length", Map_length, 0);
  rb_define_method(klass, "dup", Map_dup, 0);
  rb_define_method(klass, "==", Map_eq, 1);
  rb_define_method(klass, "hash", Map_hash, 0);
  rb_define_method(klass, "inspect", Map_inspect, 0);
  rb_define_method(klass, "merge", Map_merge, 1);
  rb_include_module(klass, rb_mEnumerable);
}
Example #12
0
void Init_rhebok()
{
  request_method_key = rb_obj_freeze(rb_str_new2("REQUEST_METHOD"));
  rb_gc_register_address(&request_method_key);
  request_uri_key = rb_obj_freeze(rb_str_new2("REQUEST_URI"));
  rb_gc_register_address(&request_uri_key);
  script_name_key = rb_obj_freeze(rb_str_new2("SCRIPT_NAME"));
  rb_gc_register_address(&script_name_key);
  server_protocol_key = rb_obj_freeze(rb_str_new2("SERVER_PROTOCOL"));
  rb_gc_register_address(&server_protocol_key);
  query_string_key = rb_obj_freeze(rb_str_new2("QUERY_STRING"));
  rb_gc_register_address(&query_string_key);

  remote_addr_key = rb_obj_freeze(rb_str_new2("REMOTE_ADDR"));
  rb_gc_register_address(&remote_addr_key);
  remote_port_key = rb_obj_freeze(rb_str_new2("REMOTE_PORT"));
  rb_gc_register_address(&remote_port_key);

  set_common_header("ACCEPT",sizeof("ACCEPT") - 1, 0);
  set_common_header("ACCEPT-ENCODING",sizeof("ACCEPT-ENCODING") - 1, 0);
  set_common_header("ACCEPT-LANGUAGE",sizeof("ACCEPT-LANGUAGE") - 1, 0);
  set_common_header("CACHE-CONTROL",sizeof("CACHE-CONTROL") - 1, 0);
  set_common_header("CONNECTION",sizeof("CONNECTION") - 1, 0);
  set_common_header("CONTENT-LENGTH",sizeof("CONTENT-LENGTH") - 1, 1);
  set_common_header("CONTENT-TYPE",sizeof("CONTENT-TYPE") - 1, 1);
  set_common_header("COOKIE",sizeof("COOKIE") - 1, 0);
  set_common_header("HOST",sizeof("HOST") - 1, 0);
  set_common_header("IF-MODIFIED-SINCE",sizeof("IF-MODIFIED-SINCE") - 1, 0);
  set_common_header("REFERER",sizeof("REFERER") - 1, 0);
  set_common_header("USER-AGENT",sizeof("USER-AGENT") - 1, 0);
  set_common_header("X-FORWARDED-FOR",sizeof("X-FORWARDED-FOR") - 1, 0);

  cRhebok = rb_const_get(rb_cObject, rb_intern("Rhebok"));
  rb_define_module_function(cRhebok, "accept_rack", rhe_accept, 4);
  rb_define_module_function(cRhebok, "read_timeout", rhe_read_timeout, 5);
  rb_define_module_function(cRhebok, "write_timeout", rhe_write_timeout, 5);
  rb_define_module_function(cRhebok, "write_all", rhe_write_all, 4);
  rb_define_module_function(cRhebok, "close_rack", rhe_close, 1);
  rb_define_module_function(cRhebok, "write_response", rhe_write_response, 5);
}
void
init_pg_type_map_all_strings()
{
	/*
	 * Document-class: PG::TypeMapAllStrings < PG::TypeMap
	 *
	 * This type map casts all values received from the database server to Strings
	 * and sends all values to the server after conversion to String by +#to_s+ .
	 * That means, it is hard coded to PG::TextEncoder::String for value encoding
	 * and to PG::TextDecoder::String for text format respectivly PG::BinaryDecoder::Bytea
	 * for binary format received from the server.
	 *
	 * It is suitable for type casting query bind parameters, result values and
	 * COPY IN/OUT data.
	 *
	 * This is the default type map for each PG::Connection .
	 *
	 */
	rb_cTypeMapAllStrings = rb_define_class_under( rb_mPG, "TypeMapAllStrings", rb_cTypeMap );
	rb_define_alloc_func( rb_cTypeMapAllStrings, pg_tmas_s_allocate );

	pg_typemap_all_strings = rb_funcall( rb_cTypeMapAllStrings, rb_intern("new"), 0 );
	rb_gc_register_address( &pg_typemap_all_strings );
}
Example #14
0
static
void set_common_header(const char * key, int key_len, const int raw)
{
  char tmp[MAX_HEADER_NAME_LEN + sizeof("HTTP_") - 1];
  const char* name;
  size_t name_len = 0;
  const char * s;
  char* d;
  size_t n;
  VALUE env_key;

  if ( raw == 1) {
    for (s = key, n = key_len, d = tmp;
      n != 0;
      s++, --n, d++) {
      *d = *s == '-' ? '_' : TOU(*s);
      name = tmp;
      name_len = key_len;
    }
  } else {
    strcpy(tmp, "HTTP_");
    for (s = key, n = key_len, d = tmp + 5;
      n != 0;
      s++, --n, d++) {
      *d = *s == '-' ? '_' : TOU(*s);
      name = tmp;
      name_len = key_len + 5;
    }
  }
  env_key = rb_obj_freeze(rb_str_new(name,name_len));
  common_headers[common_headers_num].name = key;
  common_headers[common_headers_num].name_len = key_len;
  common_headers[common_headers_num].key = env_key;
  rb_gc_register_address(&common_headers[common_headers_num].key);
  common_headers_num++;
}
Example #15
0
int
weechat_ruby_load (const char *filename)
{
    char modname[64];
    VALUE curModule, ruby_retcode, err;
    int ruby_error;
    struct stat buf;
    
    if (stat (filename, &buf) != 0)
    {
        weechat_printf (NULL,
                        weechat_gettext ("%s%s: script \"%s\" not found"),
                        weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename);
        return 0;
    }
    
    if ((weechat_ruby_plugin->debug >= 1) || !ruby_quiet)
    {
        weechat_printf (NULL,
                        weechat_gettext ("%s: loading script \"%s\""),
                        RUBY_PLUGIN_NAME, filename);
    }
    
    ruby_current_script = NULL;
    
    snprintf (modname, sizeof(modname), "%s%d", MOD_NAME_PREFIX, ruby_num);
    ruby_num++;

    curModule = rb_define_module(modname);

    ruby_current_script_filename = filename;
    
    ruby_retcode = rb_protect_funcall (curModule, rb_intern("load_eval_file"),
				       &ruby_error, 1, rb_str_new2(filename));
    
    if (ruby_retcode == Qnil)
    {
	err = rb_inspect(rb_gv_get("$!"));
	weechat_printf (NULL,
                        weechat_gettext ("%s%s: error: \"%s\""),
                        weechat_prefix ("error"), RUBY_PLUGIN_NAME,
                        STR2CSTR(err));
	return 0;
    }
    
    if (NUM2INT(ruby_retcode) != 0)
    {
	VALUE ruby_eval_error;
	
	switch (NUM2INT(ruby_retcode))
	{
            case 1:
                weechat_printf (NULL,
                                weechat_gettext ("%s%s: unable to read file "
                                                 "\"%s\""),
                                weechat_prefix ("error"), RUBY_PLUGIN_NAME,
                                filename);
                break;
            case 2:
                weechat_printf (NULL,
                                weechat_gettext ("%s%s: error while loading "
                                                 "file \"%s\""),
                                weechat_prefix ("error"), RUBY_PLUGIN_NAME,
                                filename);
                break;
            case 3:
                weechat_printf (NULL,
                                weechat_gettext ("%s%s: function "
                                                 "\"weechat_init\" is missing "
                                                 "in file \"%s\""),
                                weechat_prefix ("error"), RUBY_PLUGIN_NAME,
                                filename);
                break;
	}
	
	if (NUM2INT(ruby_retcode) == 1 || NUM2INT(ruby_retcode) == 2)
	{
	    ruby_eval_error = rb_iv_get(curModule, "@load_eval_file_error");
	    if (ruby_eval_error)
            {
		weechat_printf (NULL,
                                weechat_gettext ("%s%s: error: %s"),
                                weechat_prefix ("error"), RUBY_PLUGIN_NAME,
                                STR2CSTR(ruby_eval_error));
            }
	}
	
	return 0;
    }
    
    ruby_retcode = rb_protect_funcall (curModule, rb_intern("weechat_init"),
                                       &ruby_error, 0);
    
    if (ruby_error)
    {
	weechat_printf (NULL,
                        weechat_gettext ("%s%s: unable to eval function "
                                         "\"weechat_init\" in file \"%s\""),
                        weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename);
	
	err = rb_inspect(rb_gv_get("$!"));
	weechat_printf (NULL,
                        weechat_gettext ("%s%s: error: \"%s\""),
                        weechat_prefix ("error"), RUBY_PLUGIN_NAME,
                        STR2CSTR(err));
	
	if (ruby_current_script != NULL)
        {
	    script_remove (weechat_ruby_plugin,
                           &ruby_scripts, &last_ruby_script,
                           ruby_current_script);
        }
        
	return 0;
    }
    
    if (ruby_current_script == NULL)
    {
	weechat_printf (NULL,
                        weechat_gettext ("%s%s: function \"register\" not "
                                         "found (or failed) in file \"%s\""),
                        weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename);
        return 0;
    }
    
    ruby_current_script->interpreter = (VALUE *) curModule;
    rb_gc_register_address (ruby_current_script->interpreter);
    
    return 1;
}
Example #16
0
void CRbFont::InitLibrary()
{
	/**
	 *	@classname
	 *		Font
	 *
	 *	@desc
	 *		字体的类。
	 */
	rb_cFont = rb_define_class_under(rb_mSin, "Font", rb_cObject);

	VALUE __argv[3]		= { INT2FIX(255), INT2FIX(255), INT2FIX(255) };

	__default_name__	= rb_str_new2("simhei");
	
	rb_str_freeze(__default_name__);

	__default_size__	= INT2FIX(20);
	__default_bold__	= Qfalse;
	__default_italic__	= Qfalse;
	__default_color__	= rb_class_new_instance(3, __argv, rb_cColor);
	__default_shadow__	= Qtrue;

	rb_gc_register_address(&__default_name__);
	rb_gc_register_address(&__default_color__);

	// special method
	rb_define_alloc_func(rb_cFont, ObjAllocate<CRbFont>);
	rb_define_method(rb_cFont, "initialize", (RbFunc)dm_initialize, -1);

	// object attribute
	rb_define_method(rb_cFont, "name",		(RbFunc)dm_get_name,	0);
	rb_define_method(rb_cFont, "name=",		(RbFunc)dm_set_name,	1);
	rb_define_method(rb_cFont, "size",		(RbFunc)dm_get_size,	0);
	rb_define_method(rb_cFont, "size=",		(RbFunc)dm_set_size,	1);
	rb_define_method(rb_cFont, "bold",		(RbFunc)dm_get_bold,	0);
	rb_define_method(rb_cFont, "bold=",		(RbFunc)dm_set_bold,	1);
	rb_define_method(rb_cFont, "italic",	(RbFunc)dm_get_italic,	0);
	rb_define_method(rb_cFont, "italic=",	(RbFunc)dm_set_italic,	1);
	rb_define_method(rb_cFont, "color",		(RbFunc)dm_get_color,	0);
	rb_define_method(rb_cFont, "color=",	(RbFunc)dm_set_color,	1);
	rb_define_method(rb_cFont, "shadow",	(RbFunc)dm_get_shadow,	0);
	rb_define_method(rb_cFont, "shadow=",	(RbFunc)dm_set_shadow,	1);

	// class attribute
	rb_define_singleton_method(rb_cFont, "exist?",			(RbFunc)dm_is_exist,			1);

	rb_define_singleton_method(rb_cFont, "default_name",	(RbFunc)dm_get_default_name,	0);
	rb_define_singleton_method(rb_cFont, "default_name=",	(RbFunc)dm_set_default_name,	1);
	rb_define_singleton_method(rb_cFont, "default_size",	(RbFunc)dm_get_default_size,	0);
	rb_define_singleton_method(rb_cFont, "default_size=",	(RbFunc)dm_set_default_size,	1);
	rb_define_singleton_method(rb_cFont, "default_bold",	(RbFunc)dm_get_default_bold,	0);
	rb_define_singleton_method(rb_cFont, "default_bold=",	(RbFunc)dm_set_default_bold,	1);
	rb_define_singleton_method(rb_cFont, "default_italic",	(RbFunc)dm_get_default_italic,	0);
	rb_define_singleton_method(rb_cFont, "default_italic=",	(RbFunc)dm_set_default_italic,	1);
	rb_define_singleton_method(rb_cFont, "default_color",	(RbFunc)dm_get_default_color,	0);
	rb_define_singleton_method(rb_cFont, "default_color=",	(RbFunc)dm_set_default_color,	1);
	rb_define_singleton_method(rb_cFont, "default_shadow",	(RbFunc)dm_get_default_shadow,	0);
	rb_define_singleton_method(rb_cFont, "default_shadow=",	(RbFunc)dm_set_default_shadow,	1);

	// supplement
 	rb_define_method(rb_cFont, "to_s",	(RbFunc)dm_to_string,	0);
	rb_define_method(rb_cFont, "clone",	(RbFunc)dm_clone,		0);
}
Example #17
0
void Init_ludicrous_ext()
{
  VALUE rb_mJIT;
  VALUE rb_mLudicrous;

  rb_require("jit");

  rb_mJIT = rb_define_module("JIT");

  rb_cFunction = rb_define_class_under(rb_mJIT, "Function", rb_cObject);
  rb_define_method(rb_cFunction, "set_ruby_source", function_set_ruby_source, 1);
  rb_define_method(rb_cFunction, "ruby_struct_member", function_ruby_struct_member, 3);
  rb_define_method(rb_cFunction, "ruby_struct_member_offset", function_ruby_struct_member_offset, 2);
  rb_define_method(rb_cFunction, "have_ruby_struct_member", function_have_ruby_struct_member, 2);
  rb_define_method(rb_cFunction, "set_ruby_struct_member", function_set_ruby_struct_member, 4);

  rb_cValue = rb_define_class_under(rb_mJIT, "Value", rb_cObject);

  rb_mLudicrous = rb_define_module("Ludicrous");
  rb_define_module_function(rb_mLudicrous, "function_pointer_of", function_pointer_of, 1);

  name_to_function_pointer = rb_hash_new();
  rb_gc_register_address(&name_to_function_pointer);

#define DEFINE_FUNCTION_POINTER(name) \
  rb_hash_aset(name_to_function_pointer, ID2SYM(rb_intern(#name)), ULONG2NUM((unsigned long)name))

  DEFINE_FUNCTION_POINTER(rb_funcall);
  DEFINE_FUNCTION_POINTER(rb_funcall2);
  DEFINE_FUNCTION_POINTER(rb_funcall3);
  DEFINE_FUNCTION_POINTER(rb_call_super);
  // DEFINE_FUNCTION_POINTER(rb_add_method);
  DEFINE_FUNCTION_POINTER(rb_obj_is_kind_of);
  DEFINE_FUNCTION_POINTER(rb_obj_as_string);
  DEFINE_FUNCTION_POINTER(rb_str_dup);
  DEFINE_FUNCTION_POINTER(rb_str_plus);
  DEFINE_FUNCTION_POINTER(rb_str_concat);
  DEFINE_FUNCTION_POINTER(rb_string_value_ptr);
  DEFINE_FUNCTION_POINTER(rb_ary_new);
  DEFINE_FUNCTION_POINTER(rb_ary_new2);
  DEFINE_FUNCTION_POINTER(rb_ary_new3);
  DEFINE_FUNCTION_POINTER(rb_ary_new4);
  DEFINE_FUNCTION_POINTER(rb_ary_push);
  DEFINE_FUNCTION_POINTER(rb_ary_pop);
  DEFINE_FUNCTION_POINTER(rb_ary_store);
  DEFINE_FUNCTION_POINTER(rb_ary_entry);
  DEFINE_FUNCTION_POINTER(rb_ary_concat);
  DEFINE_FUNCTION_POINTER(rb_ary_to_ary);
  DEFINE_FUNCTION_POINTER(rb_ary_dup);
  DEFINE_FUNCTION_POINTER(rb_hash_new);
  DEFINE_FUNCTION_POINTER(rb_hash_aset);
  DEFINE_FUNCTION_POINTER(rb_hash_aref);
  DEFINE_FUNCTION_POINTER(rb_range_new);
  DEFINE_FUNCTION_POINTER(rb_class_of);
  DEFINE_FUNCTION_POINTER(rb_singleton_class);
  DEFINE_FUNCTION_POINTER(rb_extend_object);
  DEFINE_FUNCTION_POINTER(rb_include_module);
  DEFINE_FUNCTION_POINTER(rb_ivar_set);
  DEFINE_FUNCTION_POINTER(rb_ivar_get);
  DEFINE_FUNCTION_POINTER(rb_ivar_defined);
  DEFINE_FUNCTION_POINTER(rb_const_get);
  DEFINE_FUNCTION_POINTER(rb_const_defined);
  DEFINE_FUNCTION_POINTER(rb_const_defined_from);
  DEFINE_FUNCTION_POINTER(rb_yield);
  DEFINE_FUNCTION_POINTER(rb_yield_splat);
  DEFINE_FUNCTION_POINTER(rb_block_given_p);
  DEFINE_FUNCTION_POINTER(rb_block_proc);
  DEFINE_FUNCTION_POINTER(rb_iterate);
  DEFINE_FUNCTION_POINTER(rb_proc_new);
  DEFINE_FUNCTION_POINTER(rb_iter_break);
  DEFINE_FUNCTION_POINTER(rb_ensure);
  DEFINE_FUNCTION_POINTER(rb_rescue);
  DEFINE_FUNCTION_POINTER(rb_rescue2);
  DEFINE_FUNCTION_POINTER(rb_protect);
  DEFINE_FUNCTION_POINTER(rb_jump_tag);
  DEFINE_FUNCTION_POINTER(rb_uint2inum);
  DEFINE_FUNCTION_POINTER(rb_cvar_set);
  DEFINE_FUNCTION_POINTER(rb_cvar_get);
  DEFINE_FUNCTION_POINTER(rb_cvar_defined);
  DEFINE_FUNCTION_POINTER(rb_gv_set);
  DEFINE_FUNCTION_POINTER(rb_gv_get);
  DEFINE_FUNCTION_POINTER(rb_gvar_defined);
  DEFINE_FUNCTION_POINTER(rb_global_entry);
  DEFINE_FUNCTION_POINTER(rb_id2name);
  DEFINE_FUNCTION_POINTER(rb_reg_nth_match);
  DEFINE_FUNCTION_POINTER(rb_reg_match);
  DEFINE_FUNCTION_POINTER(rb_reg_match2);
  DEFINE_FUNCTION_POINTER(rb_data_object_alloc);
  DEFINE_FUNCTION_POINTER(rb_type);
  DEFINE_FUNCTION_POINTER(rb_check_type);
  DEFINE_FUNCTION_POINTER(ruby_xmalloc);
  DEFINE_FUNCTION_POINTER(ruby_xcalloc);
  DEFINE_FUNCTION_POINTER(ruby_xrealloc);
  DEFINE_FUNCTION_POINTER(ruby_xfree);
  DEFINE_FUNCTION_POINTER(rb_gc_mark);
  DEFINE_FUNCTION_POINTER(rb_gc_mark_locations);
  DEFINE_FUNCTION_POINTER(rb_method_boundp);

#ifdef RUBY_VM

  DEFINE_FUNCTION_POINTER(yarv_spp);

#else

  DEFINE_FUNCTION_POINTER(rb_svar);

#define ruby_frame ruby_frame_
  DEFINE_FUNCTION_POINTER(ruby_frame);
#undef ruby_frame

#define ruby_scope ruby_scope_
  DEFINE_FUNCTION_POINTER(ruby_scope);
#undef ruby_scope

  DEFINE_FUNCTION_POINTER(ludicrous_splat_iterate_proc);

#endif

  DEFINE_FUNCTION_POINTER(rb_errinfo);

  DEFINE_FUNCTION_POINTER(block_pass_fcall);
  DEFINE_FUNCTION_POINTER(block_pass_call);

  DEFINE_FUNCTION_POINTER(rb_node_newnode);

  /* From ruby-internal */
  /* TODO: The require lines here do not seem to help for getting the
   * following symbols loaded before they are used.  It appears that
   * using a function pointer causes the function to be resolved at load
   * time rather than at time of use.
   *   - One quick workaround is to require the files before
   *     ludicrous.so is required.
   *   - Another possiblity (which would work also on machines where
   *     RTLD_GLOBAL is unavailable) would be to obtain the function
   *     pointers through a different means, e.g. by calling through
   *     ruby to ask the other module for its function pointers.
   *   - A last possiblity would be to create a local function here
   *     that calls the real function.
   * The third option requires fewer changes than the second, but has
   * negative performance implications.
   */
  rb_require("internal/node");
#ifdef RUBY_VM
  rb_require("internal/thread");
  DEFINE_FUNCTION_POINTER(ruby_current_thread_jmp_buf);
  DEFINE_FUNCTION_POINTER(ruby_current_thread_tag);
  DEFINE_FUNCTION_POINTER(ruby_set_current_thread_tag);
  DEFINE_FUNCTION_POINTER(setjmp);
  DEFINE_FUNCTION_POINTER(_setjmp);
#endif
  DEFINE_FUNCTION_POINTER(wrap_node);
  DEFINE_FUNCTION_POINTER(unwrap_node);
  DEFINE_FUNCTION_POINTER(eval_ruby_node);
  DEFINE_FUNCTION_POINTER(raise);

  struct_name_to_member_name_info = rb_hash_new();
  rb_gc_register_address(&struct_name_to_member_name_info);

#define DEFINE_RUBY_STRUCT_MEMBER(name, member, type) \
  add_member_info(#name, #member, offsetof(struct name, member), type);

  // TODO: might not be right for 64-bit
 
  DEFINE_RUBY_STRUCT_MEMBER(RBasic, flags, jit_type_uint);
  DEFINE_RUBY_STRUCT_MEMBER(RBasic, klass, jit_type_uint);

#ifdef HAVE_ST_ROBJECT_IV_TBL
  DEFINE_RUBY_STRUCT_MEMBER(RObject, iv_tbl, jit_type_void_ptr);
#endif

#ifdef HAVE_ST_RCLASS_IV_TBL
  DEFINE_RUBY_STRUCT_MEMBER(RClass, iv_tbl, jit_type_void_ptr);
#endif

  DEFINE_RUBY_STRUCT_MEMBER(RClass, m_tbl, jit_type_void_ptr);

#ifdef HAVE_ST_RCLASS_SUPER
  DEFINE_RUBY_STRUCT_MEMBER(RClass, super, jit_type_uint);
#endif

#ifdef HAVE_ST_RFLOAT_VALUE
  DEFINE_RUBY_STRUCT_MEMBER(RFloat, value, jit_type_uint);
#endif

#ifdef HAVE_ST_RSTRING_LEN
  DEFINE_RUBY_STRUCT_MEMBER(RString, len, jit_type_uint);
#endif

#ifdef HAVE_ST_RSTRING_PTR
  DEFINE_RUBY_STRUCT_MEMBER(RString, ptr, jit_type_void_ptr);
#endif
  // TODO: capa, shared

#ifdef HAVE_ST_RARRAY_LEN
  DEFINE_RUBY_STRUCT_MEMBER(RArray, len, jit_type_int);
#endif

#ifdef HAVE_ST_RARRAY_PTR
  DEFINE_RUBY_STRUCT_MEMBER(RArray, ptr, jit_type_void_ptr);
#endif

#ifdef HAVE_ST_RARRAY_AS_HEAP_LEN
  DEFINE_RUBY_STRUCT_MEMBER(RArray, as.heap.len, jit_type_int);
#endif

#ifdef HAVE_ST_RARRAY_AS_HEAP_PTR
  DEFINE_RUBY_STRUCT_MEMBER(RArray, as.heap.ptr, jit_type_void_ptr);
#endif

#ifdef HAVE_ST_RARRAY_AS_ARY
  DEFINE_RUBY_STRUCT_MEMBER(RArray, as.ary, jit_type_void_ptr);
#endif

  // TODO: capa, shared

  DEFINE_RUBY_STRUCT_MEMBER(RRegexp, ptr, jit_type_void_ptr);

#ifdef HAVE_ST_RREGEXP_LEN
  DEFINE_RUBY_STRUCT_MEMBER(RRegexp, len, jit_type_uint);
#endif

#ifdef HAVE_ST_RREGEXP_STR
  DEFINE_RUBY_STRUCT_MEMBER(RRegexp, str, jit_type_void_ptr);
#endif

#ifdef HAVE_ST_RHASH_TBL
  DEFINE_RUBY_STRUCT_MEMBER(RHash, tbl, jit_type_void_ptr);
#endif
  DEFINE_RUBY_STRUCT_MEMBER(RHash, iter_lev, jit_type_int);
  DEFINE_RUBY_STRUCT_MEMBER(RHash, ifnone, jit_type_uint);

  DEFINE_RUBY_STRUCT_MEMBER(RFile, fptr, jit_type_void_ptr);

  DEFINE_RUBY_STRUCT_MEMBER(RData, dmark, jit_type_void_ptr); // TODO: function ptr
  DEFINE_RUBY_STRUCT_MEMBER(RData, dfree, jit_type_void_ptr); // TODO: function ptr
  DEFINE_RUBY_STRUCT_MEMBER(RData, data, jit_type_void_ptr);

#ifdef HAVE_TYPE_STRUCT_FRAME
  DEFINE_RUBY_STRUCT_MEMBER(FRAME, self, jit_type_uint);
  DEFINE_RUBY_STRUCT_MEMBER(FRAME, argc, jit_type_int);
  DEFINE_RUBY_STRUCT_MEMBER(FRAME, last_func, jit_type_uint);
  DEFINE_RUBY_STRUCT_MEMBER(FRAME, orig_func, jit_type_uint);
  DEFINE_RUBY_STRUCT_MEMBER(FRAME, last_class, jit_type_uint);
  DEFINE_RUBY_STRUCT_MEMBER(FRAME, prev, jit_type_void_ptr);
  DEFINE_RUBY_STRUCT_MEMBER(FRAME, tmp, jit_type_void_ptr);
  DEFINE_RUBY_STRUCT_MEMBER(FRAME, node, jit_type_void_ptr);
  DEFINE_RUBY_STRUCT_MEMBER(FRAME, iter, jit_type_int);
  DEFINE_RUBY_STRUCT_MEMBER(FRAME, flags, jit_type_int);
  DEFINE_RUBY_STRUCT_MEMBER(FRAME, uniq, jit_type_uint);
#endif

#ifdef HAVE_TYPE_STRUCT_SCOPE
  DEFINE_RUBY_STRUCT_MEMBER(SCOPE, local_tbl, jit_type_void_ptr);
  DEFINE_RUBY_STRUCT_MEMBER(SCOPE, local_vars, jit_type_void_ptr);
  DEFINE_RUBY_STRUCT_MEMBER(SCOPE, flags, jit_type_int);
#endif

#ifdef RUBY_VM
  DEFINE_RUBY_STRUCT_MEMBER(rb_vm_tag, tag, jit_type_VALUE);
  DEFINE_RUBY_STRUCT_MEMBER(rb_vm_tag, retval, jit_type_VALUE);
  DEFINE_RUBY_STRUCT_MEMBER(rb_vm_tag, prev, jit_type_void_ptr);

  rb_require("jit/struct");

  {
    VALUE rb_mJIT = rb_const_get(rb_cObject, rb_intern("JIT"));
    VALUE rb_cJIT_Array = rb_const_get(rb_mJIT, rb_intern("Array"));
    VALUE rb_cJIT_Type = rb_const_get(rb_mJIT, rb_intern("Type"));
    VALUE jit_ubyte_type = rb_const_get(rb_cJIT_Type, rb_intern("UBYTE"));
    VALUE rb_cJmp_Buf = rb_funcall(
        rb_cJIT_Array,
        rb_intern("new"),
        2,
        jit_ubyte_type,
        INT2NUM(sizeof(jmp_buf)));
    VALUE rb_cVMTag;
    ID set_offset_of;

    rb_const_set(rb_mLudicrous, rb_intern("JmpBuf"), rb_cJmp_Buf);
    rb_cVMTag = rb_eval_string(
        "module Ludicrous                      \n"
        "  VMTag = JIT::Struct.new(            \n"
        "      [ :buf, JmpBuf],                \n"
        "      [ :tag, JIT::Type::OBJECT],     \n"
        "      [ :retval, JIT::Type::OBJECT],  \n"
        "      [ :prev, JIT::Type::VOID_PTR]   \n"
        "  )                                   \n"
        " end                                  \n"
        " Ludicrous::VMTag                     \n"
        );
    set_offset_of = rb_intern("set_offset_of");
#define SET_OFFSET(klass, c_type, member) \
    rb_funcall( \
        klass, \
        set_offset_of, \
        2, \
        ID2SYM(rb_intern(#member)), \
        UINT2NUM(offsetof(struct rb_vm_tag, member)));
    SET_OFFSET(rb_cVMTag, rb_vm_tag, buf);
    SET_OFFSET(rb_cVMTag, rb_vm_tag, tag);
    SET_OFFSET(rb_cVMTag, rb_vm_tag, retval);
    SET_OFFSET(rb_cVMTag, rb_vm_tag, prev);
  }
#endif

  rb_define_const(rb_mLudicrous, "Qundef", UINT2NUM(Qundef));
  rb_define_const(rb_mLudicrous, "Qnil", UINT2NUM(Qnil));
  rb_define_const(rb_mLudicrous, "Qtrue", UINT2NUM(Qtrue));
  rb_define_const(rb_mLudicrous, "Qfalse", UINT2NUM(Qfalse));

  rb_define_const(rb_mLudicrous, "T_NONE", UINT2NUM(T_NONE));
  rb_define_const(rb_mLudicrous, "T_NIL", UINT2NUM(T_NIL));
  rb_define_const(rb_mLudicrous, "T_OBJECT", UINT2NUM(T_OBJECT));
  rb_define_const(rb_mLudicrous, "T_CLASS", UINT2NUM(T_CLASS));
  rb_define_const(rb_mLudicrous, "T_ICLASS", UINT2NUM(T_ICLASS));
  rb_define_const(rb_mLudicrous, "T_MODULE", UINT2NUM(T_MODULE));
  rb_define_const(rb_mLudicrous, "T_FLOAT", UINT2NUM(T_FLOAT));
  rb_define_const(rb_mLudicrous, "T_STRING", UINT2NUM(T_STRING));
  rb_define_const(rb_mLudicrous, "T_REGEXP", UINT2NUM(T_REGEXP));
  rb_define_const(rb_mLudicrous, "T_ARRAY", UINT2NUM(T_ARRAY));
  rb_define_const(rb_mLudicrous, "T_FIXNUM", UINT2NUM(T_FIXNUM));
  rb_define_const(rb_mLudicrous, "T_HASH", UINT2NUM(T_HASH));
  rb_define_const(rb_mLudicrous, "T_STRUCT", UINT2NUM(T_STRUCT));
  rb_define_const(rb_mLudicrous, "T_BIGNUM", UINT2NUM(T_BIGNUM));
  rb_define_const(rb_mLudicrous, "T_FILE", UINT2NUM(T_FILE));
  rb_define_const(rb_mLudicrous, "T_TRUE", UINT2NUM(T_TRUE));
  rb_define_const(rb_mLudicrous, "T_FALSE", UINT2NUM(T_FALSE));
  rb_define_const(rb_mLudicrous, "T_DATA", UINT2NUM(T_DATA));
  rb_define_const(rb_mLudicrous, "T_MATCH", UINT2NUM(T_MATCH));
  rb_define_const(rb_mLudicrous, "T_SYMBOL", UINT2NUM(T_SYMBOL));
  rb_define_const(rb_mLudicrous, "T_UNDEF", UINT2NUM(T_UNDEF));

  rb_define_const(rb_mLudicrous, "T_MASK", UINT2NUM(T_MASK));

  rb_define_const(rb_mLudicrous, "TAG_RETURN", UINT2NUM(0x1));
  rb_define_const(rb_mLudicrous, "TAG_BREAK", UINT2NUM(0x2));
  rb_define_const(rb_mLudicrous, "TAG_NEXT", UINT2NUM(0x3));
  rb_define_const(rb_mLudicrous, "TAG_RETRY", UINT2NUM(0x4));
  rb_define_const(rb_mLudicrous, "TAG_REDO", UINT2NUM(0x5));
  rb_define_const(rb_mLudicrous, "TAG_RAISE", UINT2NUM(0x6));
  rb_define_const(rb_mLudicrous, "TAG_THROW", UINT2NUM(0x7));
  rb_define_const(rb_mLudicrous, "TAG_FATAL", UINT2NUM(0x8));
  rb_define_const(rb_mLudicrous, "TAG_MASK", UINT2NUM(0xf));

  rb_define_const(rb_mLudicrous, "YIELD_FUNC_AVALUE", UINT2NUM(1));
  rb_define_const(rb_mLudicrous, "YIELD_FUNC_SVALUE", UINT2NUM(2));

#ifdef RUBY_VM
  rb_define_const(rb_mLudicrous, "RUBY_VM_FROZEN_CORE", rb_mRubyVMFrozenCore);
#endif

#ifdef RARRAY_EMBED_FLAG
  rb_define_const(rb_mLudicrous, "RARRAY_EMBED_FLAG", INT2NUM(RARRAY_EMBED_FLAG));
#endif

#ifdef RARRAY_EMBED_LEN_MASK
  rb_define_const(rb_mLudicrous, "RARRAY_EMBED_LEN_MASK", INT2NUM(RARRAY_EMBED_LEN_MASK));
#endif

#ifdef RARRAY_EMBED_LEN_SHIFT
  rb_define_const(rb_mLudicrous, "RARRAY_EMBED_LEN_SHIFT", INT2NUM(RARRAY_EMBED_LEN_SHIFT));
#endif

#ifdef NEED_MINIMAL_NODE
  Init_ludicrous_minimal_node();
#endif
}
Example #18
0
 KRubyObject::KRubyObject(VALUE object) :
     KObject("Ruby.KRubyObject"),
     object(object)
 {
     rb_gc_register_address(&object);
 }
Example #19
0
int
weechat_ruby_load (const char *filename)
{
    char modname[64];
    VALUE ruby_retcode, err, argv[1];
    int ruby_error;
    struct stat buf;

    if (stat (filename, &buf) != 0)
    {
        weechat_printf (NULL,
                        weechat_gettext ("%s%s: script \"%s\" not found"),
                        weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename);
        return 0;
    }

    if ((weechat_ruby_plugin->debug >= 2) || !ruby_quiet)
    {
        weechat_printf (NULL,
                        weechat_gettext ("%s: loading script \"%s\""),
                        RUBY_PLUGIN_NAME, filename);
    }

    ruby_current_script = NULL;
    ruby_registered_script = NULL;

    snprintf (modname, sizeof(modname), "%s%d", MOD_NAME_PREFIX, ruby_num);
    ruby_num++;

    ruby_current_module = rb_define_module (modname);

    ruby_current_script_filename = filename;

    argv[0] = rb_str_new2 (filename);
    ruby_retcode = rb_protect_funcall (ruby_current_module,
                                       rb_intern ("load_eval_file"),
                                       &ruby_error, 1, argv);

    if (ruby_retcode == Qnil)
    {
        err = rb_gv_get("$!");
        weechat_ruby_print_exception(err);
        return 0;
    }

    if (NUM2INT(ruby_retcode) != 0)
    {
        switch (NUM2INT(ruby_retcode))
        {
            case 1:
                weechat_printf (NULL,
                                weechat_gettext ("%s%s: unable to read file "
                                                 "\"%s\""),
                                weechat_prefix ("error"), RUBY_PLUGIN_NAME,
                                filename);
                break;
            case 2:
                weechat_printf (NULL,
                                weechat_gettext ("%s%s: error while loading "
                                                 "file \"%s\""),
                                weechat_prefix ("error"), RUBY_PLUGIN_NAME,
                                filename);
                break;
            case 3:
                weechat_printf (NULL,
                                weechat_gettext ("%s%s: function "
                                                 "\"weechat_init\" is missing "
                                                 "in file \"%s\""),
                                weechat_prefix ("error"), RUBY_PLUGIN_NAME,
                                filename);
                break;
        }

        if (NUM2INT(ruby_retcode) == 2)
        {
            weechat_ruby_print_exception (rb_iv_get (ruby_current_module,
                                                     "@load_eval_file_error"));
        }

        return 0;
    }

    (void) rb_protect_funcall (ruby_current_module, rb_intern ("weechat_init"),
                               &ruby_error, 0, NULL);

    if (ruby_error)
    {
        weechat_printf (NULL,
                        weechat_gettext ("%s%s: unable to eval function "
                                         "\"weechat_init\" in file \"%s\""),
                        weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename);

        err = rb_gv_get("$!");
        weechat_ruby_print_exception(err);

        if (ruby_current_script != NULL)
        {
            plugin_script_remove (weechat_ruby_plugin,
                                  &ruby_scripts, &last_ruby_script,
                                  ruby_current_script);
        }

        return 0;
    }

    if (!ruby_registered_script)
    {
        weechat_printf (NULL,
                        weechat_gettext ("%s%s: function \"register\" not "
                                         "found (or failed) in file \"%s\""),
                        weechat_prefix ("error"), RUBY_PLUGIN_NAME, filename);
        return 0;
    }
    ruby_current_script = ruby_registered_script;

    rb_gc_register_address (ruby_current_script->interpreter);

    /*
     * set input/close callbacks for buffers created by this script
     * (to restore callbacks after upgrade)
     */
    plugin_script_set_buffer_callbacks (weechat_ruby_plugin,
                                        ruby_scripts,
                                        ruby_current_script,
                                        &weechat_ruby_api_buffer_input_data_cb,
                                        &weechat_ruby_api_buffer_close_cb);

    (void) weechat_hook_signal_send ("ruby_script_loaded",
                                     WEECHAT_HOOK_SIGNAL_STRING,
                                     ruby_current_script->filename);

    return 1;
}
Example #20
0
void
Init_bossan_ext(void)
{
  rb_gc_register_address(&version_key);
  rb_gc_register_address(&version_val);
  rb_gc_register_address(&scheme_key);
  rb_gc_register_address(&scheme_val);
  rb_gc_register_address(&errors_key);
  rb_gc_register_address(&errors_val);
  rb_gc_register_address(&multithread_key);
  rb_gc_register_address(&multithread_val);
  rb_gc_register_address(&multiprocess_key);
  rb_gc_register_address(&multiprocess_val);
  rb_gc_register_address(&run_once_key);
  rb_gc_register_address(&run_once_val);

  rb_gc_register_address(&script_key);
  rb_gc_register_address(&script_val);
  rb_gc_register_address(&server_name_key);
  rb_gc_register_address(&server_name_val);
  rb_gc_register_address(&server_port_key);
  rb_gc_register_address(&server_port_val);

  rb_gc_register_address(&server_protocol);
  rb_gc_register_address(&path_info);
  rb_gc_register_address(&request_uri);
  rb_gc_register_address(&query_string);
  rb_gc_register_address(&http_fragment);
  rb_gc_register_address(&request_method);
  rb_gc_register_address(&rb_remote_addr);
  rb_gc_register_address(&rb_remote_port);
  rb_gc_register_address(&rack_input);
  rb_gc_register_address(&http_connection);

  rb_gc_register_address(&http_user_agent);
  rb_gc_register_address(&http_referer);

  empty_string = rb_obj_freeze(rb_str_new2(""));
  rb_gc_register_address(&empty_string);

  rb_gc_register_address(&i_keys);
  rb_gc_register_address(&i_call);
  rb_gc_register_address(&i_new);
  rb_gc_register_address(&i_key);
  rb_gc_register_address(&i_each);
  rb_gc_register_address(&i_close);

  rb_gc_register_address(&rack_app); //rack app

  i_new = rb_intern("new");
  i_call = rb_intern("call");
  i_keys = rb_intern("keys");
  i_key = rb_intern("key?");
  i_each = rb_intern("each");
  i_close = rb_intern("close");

  server = rb_define_module("Bossan");
  rb_gc_register_address(&server);

  rb_define_module_function(server, "run", bossan_run_loop, -1);
  rb_define_module_function(server, "stop", bossan_stop, 0);

  rb_define_module_function(server, "access_log", bossan_access_log, 1);
  rb_define_module_function(server, "set_max_content_length", bossan_set_max_content_length, 1);
  rb_define_module_function(server, "get_max_content_length", bossan_get_max_content_length, 0);

  rb_require("stringio");
  StringIO = rb_const_get(rb_cObject, rb_intern("StringIO"));
}
Example #21
0
static char* proxenet_ruby_execute_function(VALUE module, ID rFunc, request_t* request)
{
	char *buf, *data;
	int buflen, i, state;
	VALUE rRet;
	char *uri;
        struct proxenet_ruby_args args;

	uri = request->http_infos.uri;
	if (!uri)
		return NULL;

	/* build args */
	args.rVM = module;

        args.rFunc = rFunc;

	args.rArgs[0] = INT2NUM(request->id);
	args.rArgs[1] = rb_str_new(request->data, request->size);
	args.rArgs[2] = rb_str_new2(uri);

	for(i=0; i<3; i++) {
	  rb_gc_register_address(&args.rArgs[i]);
	}

	/* safe function call */
	rRet = rb_protect(proxenet_safe_func_call, (VALUE)&args, &state);

	if (state){
		proxenet_ruby_print_last_exception();
		data = NULL;
		goto call_end;
	}

	if (!rRet) {
		xlog_ruby(LOG_ERROR, "%s\n", "funcall2() failed");
		data = NULL;
		goto call_end;
	}

	rb_check_type(rRet, T_STRING);


	/* copy result to exploitable buffer */
	buf = RSTRING_PTR(rRet);
	buflen = RSTRING_LEN(rRet);

	data = proxenet_xmalloc(buflen + 1);
	data = memcpy(data, buf, buflen);

	request->data = data;
	request->size = buflen;

call_end:

	for(i=0; i<3; i++) {
		rb_gc_unregister_address(&args.rArgs[i]);
        }

	return data;
}
Example #22
0
void
rb_global_variable(VALUE *var)
{
    rb_gc_register_address(var);
}
Example #23
0
void
rb_register_mark_object(VALUE obj)
{
    rb_gc_register_address(&obj);
}
Example #24
0
File: ox.c Project: sriedel/ox
/* call-seq: ox_default_options=(opts)
 *
 * Sets the default options for load and dump.
 * @param [Hash] opts options to change
 * @param [Fixnum] :indent number of spaces to indent each element in an XML document
 * @param [Fixnum] :trace trace level where 0 is silent
 * @param [String] :encoding character encoding for the XML file
 * @param [true|false|nil] :with_dtd include DTD in the dump
 * @param [true|false|nil] :with_instruct include instructions in the dump
 * @param [true|false|nil] :with_xml include XML prolog in the dump
 * @param [true|false|nil] :circular support circular references while dumping
 * @param [true|false|nil] :xsd_date use XSD date format instead of decimal format
 * @param [:object|:generic|:limited|nil] :mode load method to use for XML
 * @param [:strict|:tolerant|:auto_define] :effort set the tolerance level for loading
 * @param [true|false|nil] :symbolize_keys symbolize element attribute keys or leave as Strings
 * @param [:skip_none|:skip_return|:skip_white] determines how to handle white space in text
 * @param [nil|String] :invalid_replace replacement string for invalid XML characters on dump. nil indicates include anyway as hex. A string, limited to 10 characters will replace the invalid character with the replace.
 * @param [nil|String|true|false] :strip_namespace "" or false result in no namespace stripping. A string of "*" or true will strip all namespaces. Any other non-empty string indicates that matching namespaces will be stripped.
 * @return [nil]
 */
static VALUE
set_def_opts(VALUE self, VALUE opts) {
    struct _YesNoOpt	ynos[] = {
	{ with_xml_sym, &ox_default_options.with_xml },
	{ with_dtd_sym, &ox_default_options.with_dtd },
	{ with_instruct_sym, &ox_default_options.with_instruct },
	{ xsd_date_sym, &ox_default_options.xsd_date },
	{ circular_sym, &ox_default_options.circular },
	{ symbolize_keys_sym, &ox_default_options.sym_keys },
	{ smart_sym, &ox_default_options.smart },
	{ Qnil, 0 }
    };
    YesNoOpt	o;
    VALUE	v;
    
    Check_Type(opts, T_HASH);

    v = rb_hash_aref(opts, ox_encoding_sym);
    if (Qnil == v) {
	*ox_default_options.encoding = '\0';
    } else {
	Check_Type(v, T_STRING);
	strncpy(ox_default_options.encoding, StringValuePtr(v), sizeof(ox_default_options.encoding) - 1);
#if HAS_ENCODING_SUPPORT
	ox_default_options.rb_enc = rb_enc_find(ox_default_options.encoding);
#elif HAS_PRIVATE_ENCODING
	ox_default_options.rb_enc = rb_str_new2(ox_default_options.encoding);
	rb_gc_register_address(&ox_default_options.rb_enc);
#endif
    }

    v = rb_hash_aref(opts, indent_sym);
    if (Qnil != v) {
	Check_Type(v, T_FIXNUM);
	ox_default_options.indent = FIX2INT(v);
    }

    v = rb_hash_aref(opts, trace_sym);
    if (Qnil != v) {
	Check_Type(v, T_FIXNUM);
	ox_default_options.trace = FIX2INT(v);
    }

    v = rb_hash_aref(opts, mode_sym);
    if (Qnil == v) {
	ox_default_options.mode = NoMode;
    } else if (object_sym == v) {
	ox_default_options.mode = ObjMode;
    } else if (generic_sym == v) {
	ox_default_options.mode = GenMode;
    } else if (limited_sym == v) {
	ox_default_options.mode = LimMode;
    } else {
	rb_raise(ox_parse_error_class, ":mode must be :object, :generic, :limited, or nil.\n");
    }

    v = rb_hash_aref(opts, effort_sym);
    if (Qnil == v) {
	ox_default_options.effort = NoEffort;
    } else if (strict_sym == v) {
	ox_default_options.effort = StrictEffort;
    } else if (tolerant_sym == v) {
	ox_default_options.effort = TolerantEffort;
    } else if (auto_define_sym == v) {
	ox_default_options.effort = AutoEffort;
    } else {
	rb_raise(ox_parse_error_class, ":effort must be :strict, :tolerant, :auto_define, or nil.\n");
    }

    v = rb_hash_aref(opts, skip_sym);
    if (Qnil == v) {
	ox_default_options.skip = NoSkip;
    } else if (skip_none_sym == v) {
	ox_default_options.skip = NoSkip;
    } else if (skip_return_sym == v) {
	ox_default_options.skip = CrSkip;
    } else if (skip_white_sym == v) {
	ox_default_options.skip = SpcSkip;
    } else {
	rb_raise(ox_parse_error_class, ":skip must be :skip_none, :skip_return, :skip_white, or nil.\n");
    }

    v = rb_hash_lookup(opts, convert_special_sym);
    if (Qnil == v) {
	// no change
    } else if (Qtrue == v) {
	ox_default_options.convert_special = 1;
    } else if (Qfalse == v) {
	ox_default_options.convert_special = 0;
    } else {
	rb_raise(ox_parse_error_class, ":convert_special must be true or false.\n");
    }

    v = rb_hash_aref(opts, invalid_replace_sym);
    if (Qnil == v) {
	ox_default_options.allow_invalid = Yes;
    } else {
	long	slen;

	Check_Type(v, T_STRING);
	slen = RSTRING_LEN(v);
	if (sizeof(ox_default_options.inv_repl) - 2 < slen) {
	    rb_raise(ox_parse_error_class, ":invalid_replace can be no longer than %ld characters.",
		     sizeof(ox_default_options.inv_repl) - 2);
	}
	strncpy(ox_default_options.inv_repl + 1, StringValuePtr(v), sizeof(ox_default_options.inv_repl) - 1);
	ox_default_options.inv_repl[sizeof(ox_default_options.inv_repl) - 1] = '\0';
	*ox_default_options.inv_repl = (char)slen;
	ox_default_options.allow_invalid = No;
    }

    v = rb_hash_aref(opts, strip_namespace_sym);
    if (Qfalse == v) {
	*ox_default_options.strip_ns = '\0';
    } else if (Qtrue == v) {
	*ox_default_options.strip_ns = '*';
	ox_default_options.strip_ns[1] = '\0';
    } else if (Qnil != v) {
	long	slen;

	Check_Type(v, T_STRING);
	slen = RSTRING_LEN(v);
	if (sizeof(ox_default_options.strip_ns) - 1 < slen) {
	    rb_raise(ox_parse_error_class, ":strip_namespace can be no longer than %ld characters.",
		     sizeof(ox_default_options.strip_ns) - 1);
	}
	strncpy(ox_default_options.strip_ns, StringValuePtr(v), sizeof(ox_default_options.strip_ns) - 1);
	ox_default_options.strip_ns[sizeof(ox_default_options.strip_ns) - 1] = '\0';
    }

    for (o = ynos; 0 != o->attr; o++) {
	v = rb_hash_lookup(opts, o->sym);
	if (Qnil == v) {
	    *o->attr = NotSet;
	} else if (Qtrue == v) {
	    *o->attr = Yes;
	} else if (Qfalse == v) {
	    *o->attr = No;
	} else {
	    rb_raise(ox_parse_error_class, "%s must be true or false.\n", rb_id2name(SYM2ID(o->sym)));
	}
    }
    return Qnil;
}
Example #25
0
/* Init */
void
Init_webkit(void)
{
  mWebKit = rb_define_module("WebKit");
  rb_define_singleton_method(mWebKit, "set_web_database_path", WebKit_CLASS_set_web_database_path, 1);
  rb_define_singleton_method(mWebKit, "remove_all_web_databases", WebKit_CLASS_remove_all_web_databases, 0);
  rb_define_singleton_method(mWebKit, "set_default_web_database_quota", WebKit_CLASS_set_default_web_database_quota, 1);
  cJsPtr = rb_define_class_under(mWebKit, "JsPtr", rb_cObject);
  cJavascriptError = rb_define_class_under(mWebKit, "JavascriptError", rb_eStandardError);
  cWebSettings = G_DEF_CLASS(WEBKIT_TYPE_WEB_SETTINGS, "WebSettings", mWebKit);
  rb_define_method(cWebSettings, "initialize", WebSettings_initialize, 0);
  cWebPolicyDecision = G_DEF_CLASS(WEBKIT_TYPE_WEB_POLICY_DECISION, "WebPolicyDecision", mWebKit);
  rb_define_method(cWebPolicyDecision, "download", WebPolicyDecision_download, 0);
  rb_define_method(cWebPolicyDecision, "use", WebPolicyDecision_use, 0);
  rb_define_method(cWebPolicyDecision, "ignore", WebPolicyDecision_ignore, 0);
  cWebFrame = G_DEF_CLASS(WEBKIT_TYPE_WEB_FRAME, "WebFrame", mWebKit);
  rb_define_method(cWebFrame, "exec_js", WebFrame_exec_js, 1);
  rb_define_method(cWebFrame, "add_ruby_class", WebFrame_add_ruby_class, 2);
  rb_define_method(cWebFrame, "add_ruby_eval", WebFrame_add_ruby_eval, 0);
  rb_define_method(cWebFrame, "add_js_api", WebFrame_add_js_api, 1);
  rb_define_method(cWebFrame, "load_string", WebFrame_load_string, 4);
  cWebView = G_DEF_CLASS(WEBKIT_TYPE_WEB_VIEW, "WebView", mWebKit);
  rb_define_method(cWebView, "initialize", WebView_initialize, 0);
  rb_define_method(cWebView, "open", WebView_open, 1);
  rb_define_method(cWebView, "execute_script", WebView_execute_script, 1);
  rb_define_method(cWebView, "set_settings", WebView_set_settings, 1);
  rb_define_method(cWebView, "load_string", WebView_load_string, 4);
  rb_define_method(cWebView, "load_uri", WebView_load_uri, 1);
  rb_define_method(cWebView, "main_frame", WebView_main_frame, 0);
  rb_define_method(cWebView, "focused_frame", WebView_focused_frame, 0);
  rb_define_method(cWebView, "progress", WebView_progress, 0);
  rb_define_method(cWebView, "title", WebView_title, 0);
  rb_define_method(cWebView, "uri", WebView_uri, 0);
  rb_define_method(cWebView, "reload", WebView_reload, 0);
  rb_define_method(cWebView, "reload_bypass_cache", WebView_reload_bypass_cache, 0);
  rb_define_method(cWebView, "set_custom_encoding", WebView_set_custom_encoding, 1);
  rb_define_method(cWebView, "stop_loading", WebView_stop_loading, 0);
  rb_define_method(cWebView, "has_selection?", WebView_has_selection_query, 0);
  rb_define_method(cWebView, "inspector", WebView_inspector, 0);
  cWebInspector = G_DEF_CLASS(WEBKIT_TYPE_WEB_INSPECTOR, "WebInspector", mWebKit);
  rb_define_method(cWebInspector, "inspect_coordinates", WebInspector_inspect_coordinates, 2);
  rb_define_method(cWebInspector, "uri", WebInspector_uri, 0);
  rb_define_method(cWebInspector, "show", WebInspector_show, 0);
  rb_define_method(cWebInspector, "close", WebInspector_close, 0);
  rb_define_method(cWebInspector, "view", WebInspector_view, 0);
  cWebResource = G_DEF_CLASS(WEBKIT_TYPE_WEB_RESOURCE, "WebResource", mWebKit);
  rb_define_method(cWebResource, "encoding", WebResource_encoding, 0);
  rb_define_method(cWebResource, "frame_name", WebResource_frame_name, 0);
  rb_define_method(cWebResource, "mime_type", WebResource_mime_type, 0);
  rb_define_method(cWebResource, "uri", WebResource_uri, 0);
  rb_define_method(cWebResource, "data", WebResource_data, 0);
  rb_define_method(cWebResource, "data=", WebResource_data_equals, 1);
  cWebNetworkRequest = G_DEF_CLASS(WEBKIT_TYPE_NETWORK_REQUEST, "WebNetworkRequest", mWebKit);
  rb_define_method(cWebNetworkRequest, "uri", WebNetworkRequest_uri, 0);
  rb_define_method(cWebNetworkRequest, "uri=", WebNetworkRequest_uri_equals, 1);
  rb_define_method(cWebNetworkRequest, "message", WebNetworkRequest_message, 0);
  cWebNetworkResponse = G_DEF_CLASS(WEBKIT_TYPE_NETWORK_RESPONSE, "WebNetworkResponse", mWebKit);
  rb_define_method(cWebNetworkResponse, "uri", WebNetworkResponse_uri, 0);
  rb_define_method(cWebNetworkResponse, "uri=", WebNetworkResponse_uri_equals, 1);
  rb_define_method(cWebNetworkResponse, "message", WebNetworkResponse_message, 0);
  cDownload = G_DEF_CLASS(WEBKIT_TYPE_DOWNLOAD, "Download", mWebKit);
  rb_define_method(cDownload, "initialize", Download_initialize, 1);
  rb_define_method(cDownload, "start", Download_start, 0);
  rb_define_method(cDownload, "cancel", Download_cancel, 0);
  rb_define_method(cDownload, "progress", Download_progress, 0);
  rb_define_method(cDownload, "current_size", Download_current_size, 0);
  rb_define_method(cDownload, "total_size", Download_total_size, 0);
  rb_define_method(cDownload, "uri", Download_uri, 0);
  rb_define_method(cDownload, "suggested_filename", Download_suggested_filename, 0);
  genumTargetInfo = G_DEF_CLASS(WEBKIT_TYPE_WEB_VIEW_TARGET_INFO, "TargetInfo", mWebKit);
  G_DEF_CONSTANTS(mWebKit, WEBKIT_TYPE_WEB_VIEW_TARGET_INFO, "WEBKIT_");
  genumDownloadStatus = G_DEF_CLASS(WEBKIT_TYPE_DOWNLOAD_STATUS, "DownloadStatus", mWebKit);
  G_DEF_CONSTANTS(mWebKit, WEBKIT_TYPE_DOWNLOAD_STATUS, "WEBKIT_");
  genumDownloadError = G_DEF_CLASS(WEBKIT_TYPE_DOWNLOAD_ERROR, "DownloadError", mWebKit);
  G_DEF_CONSTANTS(mWebKit, WEBKIT_TYPE_DOWNLOAD_ERROR, "WEBKIT_");
  genumNetworkError = G_DEF_CLASS(WEBKIT_TYPE_NETWORK_ERROR, "NetworkError", mWebKit);
  G_DEF_CONSTANTS(mWebKit, WEBKIT_TYPE_NETWORK_ERROR, "WEBKIT_");
  genumPolicyError = G_DEF_CLASS(WEBKIT_TYPE_POLICY_ERROR, "PolicyError", mWebKit);
  G_DEF_CONSTANTS(mWebKit, WEBKIT_TYPE_POLICY_ERROR, "WEBKIT_");
  genumPluginError = G_DEF_CLASS(WEBKIT_TYPE_PLUGIN_ERROR, "PluginError", mWebKit);
  G_DEF_CONSTANTS(mWebKit, WEBKIT_TYPE_PLUGIN_ERROR, "WEBKIT_");
  genumCacheModel = G_DEF_CLASS(WEBKIT_TYPE_CACHE_MODEL, "CacheModel", mWebKit);
  G_DEF_CONSTANTS(mWebKit, WEBKIT_TYPE_CACHE_MODEL, "WEBKIT_");
  genumLoadStatus = G_DEF_CLASS(WEBKIT_TYPE_LOAD_STATUS, "LoadStatus", mWebKit);
  G_DEF_CONSTANTS(mWebKit, WEBKIT_TYPE_LOAD_STATUS, "WEBKIT_");
  genumNavigationReason = G_DEF_CLASS(WEBKIT_TYPE_WEB_NAVIGATION_REASON, "NavigationReason", mWebKit);
  G_DEF_CONSTANTS(mWebKit, WEBKIT_TYPE_WEB_NAVIGATION_REASON, "WEBKIT_");
  genumHitTestResultContext = G_DEF_CLASS(WEBKIT_TYPE_HIT_TEST_RESULT_CONTEXT, "HitTestResultContext", mWebKit);
  G_DEF_CONSTANTS(mWebKit, WEBKIT_TYPE_HIT_TEST_RESULT_CONTEXT, "WEBKIT_");
  genumEditingBehavior = G_DEF_CLASS(WEBKIT_TYPE_EDITING_BEHAVIOR, "EditingBehavior", mWebKit);
  G_DEF_CONSTANTS(mWebKit, WEBKIT_TYPE_EDITING_BEHAVIOR, "WEBKIT_");
  genumNavigationResponse = G_DEF_CLASS(WEBKIT_TYPE_NAVIGATION_RESPONSE, "NavigationResponse", mWebKit);
  G_DEF_CONSTANTS(mWebKit, WEBKIT_TYPE_NAVIGATION_RESPONSE, "WEBKIT_");
rb_gc_register_address(&_gcpool_RubyFunc);
}
Example #26
0
File: ruby.c Project: Shoes3/shoes3
//
// Everything exposed to Ruby is exposed here.
//
void shoes_ruby_init() {
    progname = rb_str_new2("(eval)");
    rb_define_variable("$0", &progname);
    rb_define_variable("$PROGRAM_NAME", &progname);

    instance_eval_proc = rb_eval_string("lambda{|o,b| o.instance_eval(&b)}");
    rb_gc_register_address(&instance_eval_proc);
    ssNestSlot = rb_eval_string("{:height => 1.0}");
    rb_gc_register_address(&ssNestSlot);

    s_aref = rb_intern("[]=");
    s_perc = rb_intern("%");
    s_mult = rb_intern("*");
    SYMBOL_DEFS(SYMBOL_INTERN);

    symAltQuest = ID2SYM(rb_intern("alt_?"));
    symAltSlash = ID2SYM(rb_intern("alt_/"));
    symAltEqual = ID2SYM(rb_intern("alt_="));
    symAltDot = ID2SYM(rb_intern("alt_."));
    symAltSemiColon = ID2SYM(rb_intern("alt_;"));

    //
    // I want all elements to be addressed Shoes::Name, but also available in
    // a separate mixin (cTypes), for inclusion in every Shoes.app block.
    //
    cTypes = rb_define_module("Shoes");
    rb_mod_remove_const(rb_cObject, rb_str_new2("Shoes"));

    cShoesWindow = rb_define_class_under(cTypes, "Window", rb_cObject);
    cMouse = rb_define_class_under(cTypes, "Mouse", rb_cObject);

    cCanvas = rb_define_class_under(cTypes, "Canvas", rb_cObject);
    rb_define_alloc_func(cCanvas, shoes_canvas_alloc);
    rb_define_method(cCanvas, "top", CASTHOOK(shoes_canvas_get_top), 0);
    rb_define_method(cCanvas, "left", CASTHOOK(shoes_canvas_get_left), 0);
    rb_define_method(cCanvas, "width", CASTHOOK(shoes_canvas_get_width), 0);
    rb_define_method(cCanvas, "height", CASTHOOK(shoes_canvas_get_height), 0);
    rb_define_method(cCanvas, "scroll_height", CASTHOOK(shoes_canvas_get_scroll_height), 0);
    rb_define_method(cCanvas, "scroll_max", CASTHOOK(shoes_canvas_get_scroll_max), 0);
    rb_define_method(cCanvas, "scroll_top", CASTHOOK(shoes_canvas_get_scroll_top), 0);
    rb_define_method(cCanvas, "scroll_top=", CASTHOOK(shoes_canvas_set_scroll_top), 1);
    rb_define_method(cCanvas, "displace", CASTHOOK(shoes_canvas_displace), 2);
    rb_define_method(cCanvas, "move", CASTHOOK(shoes_canvas_move), 2);
    rb_define_method(cCanvas, "style", CASTHOOK(shoes_canvas_style), -1);
    rb_define_method(cCanvas, "parent", CASTHOOK(shoes_canvas_get_parent), 0);
    rb_define_method(cCanvas, "contents", CASTHOOK(shoes_canvas_contents), 0);
    rb_define_method(cCanvas, "children", CASTHOOK(shoes_canvas_children), 0);
    rb_define_method(cCanvas, "draw", CASTHOOK(shoes_canvas_draw), 2);
    rb_define_method(cCanvas, "hide", CASTHOOK(shoes_canvas_hide), 0);
    rb_define_method(cCanvas, "show", CASTHOOK(shoes_canvas_show), 0);
    rb_define_method(cCanvas, "toggle", CASTHOOK(shoes_canvas_toggle), 0);
    rb_define_method(cCanvas, "remove", CASTHOOK(shoes_canvas_remove), 0);
    rb_define_method(cCanvas, "refresh_slot", CASTHOOK(shoes_canvas_refresh_slot), 0);
    rb_define_method(cCanvas, "refresh", CASTHOOK(shoes_canvas_refresh_slot), 0);
    rb_define_method(cCanvas, "cursor", CASTHOOK(shoes_canvas_get_cursor), 0);
    rb_define_method(cCanvas, "cursor=", CASTHOOK(shoes_canvas_set_cursor), 1);

    cShoes = rb_define_class("Shoes", cCanvas);
    rb_include_module(cShoes, cTypes);
    rb_const_set(cShoes, rb_intern("Types"), cTypes);

    shoes_version_init();

    // other Shoes:: constants
    rb_const_set(cTypes, rb_intern("RAD2PI"), rb_float_new(SHOES_RAD2PI));
    rb_const_set(cTypes, rb_intern("TWO_PI"), rb_float_new(SHOES_PIM2));
    rb_const_set(cTypes, rb_intern("HALF_PI"), rb_float_new(SHOES_HALFPI));
    rb_const_set(cTypes, rb_intern("PI"), rb_float_new(SHOES_PI));

    cApp = rb_define_class_under(cTypes, "App", rb_cObject);
    rb_define_alloc_func(cApp, shoes_app_alloc);
    rb_define_method(cApp, "fullscreen", CASTHOOK(shoes_app_get_fullscreen), 0);
    rb_define_method(cApp, "fullscreen=", CASTHOOK(shoes_app_set_fullscreen), 1);
    rb_define_method(cApp, "name", CASTHOOK(shoes_app_get_title), 0);
    rb_define_method(cApp, "name=", CASTHOOK(shoes_app_set_title), 1);
    rb_define_method(cApp, "location", CASTHOOK(shoes_app_location), 0);
    rb_define_method(cApp, "started?", CASTHOOK(shoes_app_is_started), 0);
    rb_define_method(cApp, "left", CASTHOOK(shoes_app_get_window_x_position), 0);
    rb_define_method(cApp, "top", CASTHOOK(shoes_app_get_window_y_position), 0);
    rb_define_method(cApp, "move", CASTHOOK(shoes_app_set_window_position), 2);
    rb_define_method(cApp, "width", CASTHOOK(shoes_app_get_width), 0);
    rb_define_method(cApp, "height", CASTHOOK(shoes_app_get_height), 0);
    rb_define_method(cApp, "resize", CASTHOOK(shoes_app_resize_window), 2);
    rb_define_method(cApp, "resizable", CASTHOOK(shoes_app_get_resizable), 0);
    rb_define_method(cApp, "resizable=", CASTHOOK(shoes_app_set_resizable), 1);
    rb_define_method(cApp, "slot", CASTHOOK(shoes_app_slot), 0);
    rb_define_method(cApp, "set_window_icon_path", CASTHOOK(shoes_app_set_icon), 1); // New in 3.2.19
    rb_define_method(cApp, "set_window_title", CASTHOOK(shoes_app_set_wtitle), 1); // New in 3.2.19
    rb_define_method(cApp, "opacity", CASTHOOK(shoes_app_get_opacity), 0);
    rb_define_method(cApp, "opacity=", CASTHOOK(shoes_app_set_opacity), 1);
    rb_define_method(cApp, "decorated", CASTHOOK(shoes_app_get_decoration), 0);
    rb_define_method(cApp, "decorated=", CASTHOOK(shoes_app_set_decoration), 1);
    rb_define_alias(cApp, "decorated?", "decorated");
    rb_define_method(cApp, "cache", CASTHOOK(shoes_app_get_cache), 0);
    rb_define_method(cApp, "cache=", CASTHOOK(shoes_app_set_cache), 1);
    rb_define_method(cApp, "cache_clear", CASTHOOK(shoes_app_clear_cache), 1);
    rb_define_method(cApp, "event=", CASTHOOK(shoes_app_set_event_handler), 1);
    rb_define_method(cApp, "replay_event", CASTHOOK(shoes_app_replay_event), 1);
    rb_define_method(cApp, "monitor", CASTHOOK(shoes_app_monitor_get), 0);
    rb_define_method(cApp, "monitor=", CASTHOOK(shoes_app_monitor_set), 1);
    rb_define_method(cApp, "id", CASTHOOK(shoes_app_id), 0);
    
    /* Settings holds global values, not per app values. Part of shoes_world_t */
    cSettings  = rb_define_class_under(cTypes, "Settings", rb_cObject);
    rb_define_alloc_func(cSettings, shoes_settings_alloc);
    rb_define_method(cSettings, "dbus", CASTHOOK(shoes_settings_dbus),0);
    rb_define_method(cSettings, "app_name", CASTHOOK(shoes_settings_app_name),0);
    rb_define_method(cSettings, "app_name=", CASTHOOK(shoes_settings_set_app_name),1);
    rb_define_method(cSettings, "icon_path", CASTHOOK(shoes_settings_app_icon),0);
    rb_define_method(cSettings, "icon_path=", CASTHOOK(shoes_settings_set_app_icon),1);
    rb_define_method(cSettings, "theme", CASTHOOK(shoes_settings_get_theme),0);
    rb_define_method(cSettings, "theme=", CASTHOOK(shoes_settings_set_theme),1);
    rb_define_method(cSettings, "mdi", CASTHOOK(shoes_settings_mdi),0);
    rb_define_method(cSettings, "use_menus", CASTHOOK(shoes_settings_menu),0);
    rb_define_method(cSettings, "rdomain", CASTHOOK(shoes_settings_rdomain),0);
    rb_define_method(cSettings, "rdomain=", CASTHOOK(shoes_settings_set_rdomain),1);
    rb_define_method(cSettings, "monitor_count", CASTHOOK(shoes_settings_monitor_count),0);
    rb_define_method(cSettings, "monitor_geometry", CASTHOOK(shoes_settings_monitor_geometry),1);
    rb_define_method(cSettings, "monitor_default", CASTHOOK(shoes_settings_monitor_default), 0);
    rb_define_method(cSettings, "extra1", CASTHOOK(shoes_setting_extra1), 0);
    rb_define_method(cSettings, "extra2", CASTHOOK(shoes_setting_extra2), 0);
    rb_define_method(cSettings, "wintmo", CASTHOOK(shoes_setting_get_wintmo), 0);
    rb_define_method(cSettings, "wintmo=", CASTHOOK(shoes_setting_set_wintmo), 1);
    rb_define_method(cSettings, "display_backend", CASTHOOK(shoes_setting_display_backend), 0);

    cDialog = rb_define_class_under(cTypes, "Dialog", cApp);

    eInvMode = rb_define_class_under(cTypes, "InvalidModeError", rb_eStandardError);
    eNotImpl = rb_define_class_under(cTypes, "NotImplementedError", rb_eStandardError);
    eImageError = rb_define_class_under(cTypes, "ImageError", rb_eStandardError);
    C(HEX_SOURCE, "/^(?:0x|#)?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i");
    C(HEX3_SOURCE, "/^(?:0x|#)?([0-9A-F])([0-9A-F])([0-9A-F])$/i");
    C(RGB_SOURCE, "/^rgb\\((\\d+), *(\\d+), *(\\d+)\\)$/i");
    C(RGBA_SOURCE, "/^rgb\\((\\d+), *(\\d+), *(\\d+), *(\\d+)\\)$/i");
    C(GRAY_SOURCE, "/^gray\\((\\d+)\\)$/i");
    C(GRAYA_SOURCE, "/^gray\\((\\d+), *(\\d+)\\)$/i");
    C(LF, "/\\r?\\n/");
    rb_eval_string(
        "def Shoes.escape(string);"
        "string.gsub(/&/n, '&amp;').gsub(/\\\"/n, '&quot;').gsub(/>/n, '&gt;').gsub(/</n, '&lt;');"
        "end"
    );

    rb_define_singleton_method(cShoes, "APPS", CASTHOOK(shoes_apps_get), 0);
    rb_define_singleton_method(cShoes, "app", CASTHOOK(shoes_app_main), -1);
    rb_define_singleton_method(cShoes, "p", CASTHOOK(shoes_p), 1);
    rb_define_singleton_method(cShoes, "log", CASTHOOK(shoes_log), 0);
    rb_define_singleton_method(cShoes, "show_console", CASTHOOK(shoes_app_console), 0); // New in 3.2.23
    rb_define_singleton_method(cShoes, "terminal", CASTHOOK(shoes_app_terminal), -1); // New in 3.3.2 replaces console
    rb_define_singleton_method(cShoes, "quit", CASTHOOK(shoes_app_quit), 0); // Shoes 3.3.2
    rb_define_singleton_method(cShoes, "settings", CASTHOOK(shoes_app_settings), 0); // Shoes 3.3.7 
    //rb_define_singleton_method(cShoes, "exit", CASTHOOK(shoes_app_quit), 0);

    //
    // Canvas methods
    // See ruby.h for the complete list of Canvas method signatures.
    // Macros are used to build App redirection methods, which should be
    // speedier than method_missing.
    //

    CANVAS_DEFS(RUBY_M);

    //
    // Shoes Kernel methods
    //
    //rb_define_method(rb_mKernel, "quit", CASTHOOK(shoes_app_quit), 0);
    //rb_define_method(rb_mKernel, "exit", CASTHOOK(shoes_app_quit), 0);
    rb_define_method(rb_mKernel, "secret_exit_hook", CASTHOOK(shoes_exit_setup),0); //unused?

    rb_define_method(rb_mKernel, "debug", CASTHOOK(shoes_canvas_debug), 1);
    rb_define_method(rb_mKernel, "info", CASTHOOK(shoes_canvas_info), 1);
    rb_define_method(rb_mKernel, "warn", CASTHOOK(shoes_canvas_warn), 1);
    rb_define_method(rb_mKernel, "error", CASTHOOK(shoes_canvas_error), 1);

    cFlow       = rb_define_class_under(cTypes, "Flow", cShoes);
    cStack      = rb_define_class_under(cTypes, "Stack", cShoes);
    cMask       = rb_define_class_under(cTypes, "Mask", cShoes);
    cWidget     = rb_define_class_under(cTypes, "Widget", cShoes);

    rb_define_method(cApp, "method_missing", CASTHOOK(shoes_app_method_missing), -1);

    rb_define_method(rb_mKernel, "alert", CASTHOOK(shoes_dialog_alert), -1);
    rb_define_method(rb_mKernel, "ask", CASTHOOK(shoes_dialog_ask), -1);
    rb_define_method(rb_mKernel, "confirm", CASTHOOK(shoes_dialog_confirm), -1);
    rb_define_method(rb_mKernel, "ask_color", CASTHOOK(shoes_dialog_color), 1);
    rb_define_method(rb_mKernel, "ask_open_file", CASTHOOK(shoes_dialog_open), -1);
    rb_define_method(rb_mKernel, "ask_save_file", CASTHOOK(shoes_dialog_save), -1);
    rb_define_method(rb_mKernel, "ask_open_folder", CASTHOOK(shoes_dialog_open_folder), -1);
    rb_define_method(rb_mKernel, "ask_save_folder", CASTHOOK(shoes_dialog_save_folder), -1);
    rb_define_method(rb_mKernel, "font", CASTHOOK(shoes_font), 1);
    
    SHOES_TYPES_INIT;
}
static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
{
  VALUE xpath_handler = Qnil;
  VALUE result;
  VALUE *argv;
  VALUE doc;
  VALUE node_set = Qnil;
  xmlNodeSetPtr xml_node_set = NULL;
  xmlXPathObjectPtr obj;
  int i;
  nokogiriNodeSetTuple *node_set_tuple;

  assert(ctx);
  assert(ctx->context);
  assert(ctx->context->userData);
  assert(ctx->context->doc);
  assert(DOC_RUBY_OBJECT_TEST(ctx->context->doc));

  xpath_handler = (VALUE)(ctx->context->userData);

  argv = (VALUE *)calloc((size_t)nargs, sizeof(VALUE));
  for (i = 0 ; i < nargs ; ++i) {
    rb_gc_register_address(&argv[i]);
  }

  doc = DOC_RUBY_OBJECT(ctx->context->doc);

  if (nargs > 0) {
    i = nargs - 1;
    do {
      obj = valuePop(ctx);
      switch(obj->type) {
        case XPATH_STRING:
          argv[i] = NOKOGIRI_STR_NEW2(obj->stringval);
          break;
        case XPATH_BOOLEAN:
          argv[i] = obj->boolval == 1 ? Qtrue : Qfalse;
          break;
        case XPATH_NUMBER:
          argv[i] = rb_float_new(obj->floatval);
          break;
        case XPATH_NODESET:
          argv[i] = Nokogiri_wrap_xml_node_set(obj->nodesetval, doc);
          break;
        default:
          argv[i] = NOKOGIRI_STR_NEW2(xmlXPathCastToString(obj));
      }
      xmlXPathFreeNodeSetList(obj);
    } while(i-- > 0);
  }

  result = rb_funcall2(
      xpath_handler,
      rb_intern((const char *)ctx->context->function),
      nargs,
      argv
  );

  for (i = 0 ; i < nargs ; ++i) {
    rb_gc_unregister_address(&argv[i]);
  }
  free(argv);

  switch(TYPE(result)) {
    case T_FLOAT:
    case T_BIGNUM:
    case T_FIXNUM:
      xmlXPathReturnNumber(ctx, NUM2DBL(result));
      break;
    case T_STRING:
      xmlXPathReturnString(
          ctx,
          (xmlChar *)xmlXPathWrapCString(StringValuePtr(result))
      );
      break;
    case T_TRUE:
      xmlXPathReturnTrue(ctx);
      break;
    case T_FALSE:
      xmlXPathReturnFalse(ctx);
      break;
    case T_NIL:
      break;
    case T_ARRAY:
      {
        VALUE args[2];
	args[0] = doc;
	args[1] = result;
        node_set = rb_class_new_instance(2, args, cNokogiriXmlNodeSet);
        Data_Get_Struct(node_set, nokogiriNodeSetTuple, node_set_tuple);
	xml_node_set = node_set_tuple->node_set;
        xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
      }
      break;
    case T_DATA:
      if(rb_obj_is_kind_of(result, cNokogiriXmlNodeSet)) {
        Data_Get_Struct(result, nokogiriNodeSetTuple, node_set_tuple);
	xml_node_set = node_set_tuple->node_set;
        /* Copy the node set, otherwise it will get GC'd. */
        xmlXPathReturnNodeSet(ctx, xmlXPathNodeSetMerge(NULL, xml_node_set));
        break;
      }
    default:
      rb_raise(rb_eRuntimeError, "Invalid return type");
  }
}
Example #28
0
	KRubyObject::KRubyObject(VALUE object) :
		object(object)
	{
		rb_gc_register_address(&object);
	}
Example #29
0
void rubysdl2_init_gl(void)
{
    mGL = rb_define_module_under(mSDL2, "GL");
    cGLContext = rb_define_class_under(mGL, "Context", rb_cObject);

    rb_define_singleton_method(cGLContext, "create", GLContext_s_create, 1);
    rb_define_singleton_method(cGLContext, "current", GLContext_s_current, 0);
    
    rb_define_method(cGLContext, "destroy?", GLContext_destroy_p, 0);
    rb_define_method(cGLContext, "destroy", GLContext_destroy, 0);
    rb_define_method(cGLContext, "make_current", GLContext_make_current, 1);
    
    rb_define_module_function(mGL, "extension_supported?", GL_s_extension_supported_p, 1);
    rb_define_module_function(mGL, "swap_interval", GL_s_swap_interval, 0);
    rb_define_module_function(mGL, "swap_interval=", GL_s_set_swap_interval, 1);
    rb_define_module_function(mGL, "get_attribute", GL_s_get_attribute, 1);
    rb_define_module_function(mGL, "set_attribute", GL_s_set_attribute, 2);

    /*  */
    /* OpenGL attribute - minimal bits of red channel in color buffer, default is 3 */
    rb_define_const(mGL, "RED_SIZE", INT2NUM(SDL_GL_RED_SIZE));
    /* OpenGL attribute - minimal bits of green channel in color buffer, default is 3 */
    rb_define_const(mGL, "GREEN_SIZE", INT2NUM(SDL_GL_GREEN_SIZE));
    /* OpenGL attribute - minimal bits of blue channel in color buffer, default is 2 */
    rb_define_const(mGL, "BLUE_SIZE", INT2NUM(SDL_GL_BLUE_SIZE));
    /* OpenGL attribute - minimal bits of alpha channel in color buffer, default is 0 */
    rb_define_const(mGL, "ALPHA_SIZE", INT2NUM(SDL_GL_ALPHA_SIZE));
    /* OpenGL attribute - minimal bits of framebufer, default is 0 */
    rb_define_const(mGL, "BUFFER_SIZE", INT2NUM(SDL_GL_BUFFER_SIZE));
    /* OpenGL attribute - whether the single buffer (0) or double buffer (1), default
       is double buffer */
    rb_define_const(mGL, "DOUBLEBUFFER", INT2NUM(SDL_GL_DOUBLEBUFFER));
    /* OpenGL attribute - bits of depth buffer, default is 16 */
    rb_define_const(mGL, "DEPTH_SIZE", INT2NUM(SDL_GL_DEPTH_SIZE));
    /* OpenGL attribute - bits of stencil buffer, default is 0 */
    rb_define_const(mGL, "STENCIL_SIZE", INT2NUM(SDL_GL_STENCIL_SIZE));
    /* OpenGL attribute - minimal bits of red channel in accumlation buffer,
       default is 0 */
    rb_define_const(mGL, "ACCUM_RED_SIZE", INT2NUM(SDL_GL_ACCUM_RED_SIZE));
    /* OpenGL attribute - minimal bits of green channel in accumlation buffer,
       default is 0 */
    rb_define_const(mGL, "ACCUM_GREEN_SIZE", INT2NUM(SDL_GL_ACCUM_GREEN_SIZE));
    /* OpenGL attribute - minimal bits of blue channel in accumlation buffer,
       default is 0 */
    rb_define_const(mGL, "ACCUM_BLUE_SIZE", INT2NUM(SDL_GL_ACCUM_BLUE_SIZE));
    /* OpenGL attribute - minimal bits of alpha channel in accumlation buffer,
       default is 0 */
    rb_define_const(mGL, "ACCUM_ALPHA_SIZE", INT2NUM(SDL_GL_ACCUM_ALPHA_SIZE));
    /* OpenGL attribute - whether output is stereo (1) or not (0), default is 0 */
    rb_define_const(mGL, "STEREO", INT2NUM(SDL_GL_STEREO));
    /* OpenGL attribuite - the number of buffers used for multisampe anti-aliasing,
       default is 0 */
    rb_define_const(mGL, "MULTISAMPLEBUFFERS", INT2NUM(SDL_GL_MULTISAMPLEBUFFERS));
    /* OpenGL attribute - the number of samples used around the current pixel
       use for multisample anti-aliasing, default is 0 */
    rb_define_const(mGL, "MULTISAMPLESAMPLES", INT2NUM(SDL_GL_MULTISAMPLESAMPLES));
    /* OpenGL attribute - 1 for requiring hardware acceleration, 0 for software rendering,
       default is allowing either */
    rb_define_const(mGL, "ACCELERATED_VISUAL", INT2NUM(SDL_GL_ACCELERATED_VISUAL));
    /* OpenGL attribute - not used (deprecated) */
    rb_define_const(mGL, "RETAINED_BACKING", INT2NUM(SDL_GL_RETAINED_BACKING));
    /* OpenGL attribute - OpenGL context major version */
    rb_define_const(mGL, "CONTEXT_MAJOR_VERSION", INT2NUM(SDL_GL_CONTEXT_MAJOR_VERSION));
    /* OpenGL attribute - OpenGL context minor version */
    rb_define_const(mGL, "CONTEXT_MINOR_VERSION", INT2NUM(SDL_GL_CONTEXT_MINOR_VERSION));
    /*
     * INT2NUM(SDL_GL_CONTEXT_FLAGS):
     * 
     * OpenGL attribute - the bit combination of following constants, or 0.
     * default is 0
     *
     * * {SDL2::GL::CONTEXT_DEBUG_FLAG}
     * * {SDL2::GL::CONTEXT_FORWARD_COMPATIBLE_FLAG}
     * * {SDL2::GL::CONTEXT_ROBUST_ACCESS_FLAG}
     * * {SDL2::GL::CONTEXT_RESET_ISOLATION_FLAG}
     *
     * These flags are mapped to some OpenGL extensions. Please see
     * the documentation of each constant for more details.
     *
     * https://wiki.libsdl.org/SDL_GLcontextFlag
     */
    rb_define_const(mGL, "CONTEXT_FLAGS", INT2NUM(SDL_GL_CONTEXT_FLAGS));
    /* INT2NUM(SDL_GL_CONTEXT_PROFILE_MASK):
     *
     * OpenGL attribute - type of GL context, one of the following constants,
     * defaults depends on platform
     *
     * * {CONTEXT_PROFILE_CORE}
     * * {CONTEXT_PROFILE_COMPATIBILITY}
     * * {CONTEXT_PROFILE_ES}
     *
     * https://wiki.libsdl.org/SDL_GLprofile
     */
    rb_define_const(mGL, "CONTEXT_PROFILE_MASK", INT2NUM(SDL_GL_CONTEXT_PROFILE_MASK));
    /* OpenGL attribute - OpenGL context sharing, default is 0 */
    rb_define_const(mGL, "SHARE_WITH_CURRENT_CONTEXT", INT2NUM(SDL_GL_SHARE_WITH_CURRENT_CONTEXT));
#if SDL_VERSION_ATLEAST(2,0,1)
    /* OpenGL attribute - 1 for requesting sRGB capable visual, default to 0 */
    rb_define_const(mGL, "FRAMEBUFFER_SRGB_CAPABLE", INT2NUM(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE));
#endif
    /* OpenGL attribute - not used (deprecated) */
    rb_define_const(mGL, "CONTEXT_EGL", INT2NUM(SDL_GL_CONTEXT_EGL));

    /*  */

    /* This flag maps to GLX_CONTEXT_DEBUG_BIT_ARB in
     * the GLX_ARB_create_context extension for X11
     * and WGL_CONTEXT_DEBUG_BIT_ARB in the WGL_ARB_create_context
     * extension for Windows.
     */
    rb_define_const(mGL, "CONTEXT_DEBUG_FLAG", INT2NUM(SDL_GL_CONTEXT_DEBUG_FLAG));
    /*
     * This flag maps to GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB in the
     * GLX_ARB_create_context extension for X11 and
     * WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB in the WGL_ARB_create_context
     * extension for Windows.
     */
    rb_define_const(mGL, "CONTEXT_FORWARD_COMPATIBLE_FLAG", INT2NUM(SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG));
    /*
     * This flag maps to GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB in the
     * GLX_ARB_create_context_robustness extension for X11 and
     * WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB in the WGL_ARB_create_context_robustness
     * extension for Windows. 
     */
    rb_define_const(mGL, "CONTEXT_ROBUST_ACCESS_FLAG", INT2NUM(SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG));
    /*
     * This flag maps to GLX_CONTEXT_RESET_ISOLATION_BIT_ARB in the
     * GLX_ARB_robustness_isolation extension for X11 and
     * WGL_CONTEXT_RESET_ISOLATION_BIT_ARB in the WGL_ARB_create_context_robustness
     * extension for Windows.
     */
    rb_define_const(mGL, "CONTEXT_RESET_ISOLATION_FLAG", INT2NUM(SDL_GL_CONTEXT_RESET_ISOLATION_FLAG));

    /*
     * OpenGL core profile - deprecated
     * functions are disabled
     */
    rb_define_const(mGL, "CONTEXT_PROFILE_CORE", INT2NUM(SDL_GL_CONTEXT_PROFILE_CORE));
    /*
     * OpenGL compatibility profile -
     * deprecated functions are allowed
     */
    rb_define_const(mGL, "CONTEXT_PROFILE_COMPATIBILITY", INT2NUM(SDL_GL_CONTEXT_PROFILE_COMPATIBILITY));
    /*
     * OpenGL ES profile - only a subset of the
     * base OpenGL functionality is available
     */
    rb_define_const(mGL, "CONTEXT_PROFILE_ES", INT2NUM(SDL_GL_CONTEXT_PROFILE_ES));
    
    rb_gc_register_address(&current_context);
}
Example #30
0
Objects::Objects()
{
    objects = rb_ary_new();
    rb_gc_register_address(&objects);
}