summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/Setup1
-rw-r--r--ext/Setup.dj4
-rw-r--r--ext/aix_mksym.rb2
-rw-r--r--ext/gdbm/MANIFEST10
-rw-r--r--ext/socket/addrinfo.h5
-rw-r--r--ext/socket/getaddrinfo.c12
-rw-r--r--ext/socket/getnameinfo.c10
-rw-r--r--ext/socket/socket.c219
-rw-r--r--ext/tcltklib/tcltklib.c173
-rw-r--r--ext/tk/lib/tk.rb3
-rw-r--r--ext/tk/lib/tktext.rb4
-rw-r--r--ext/tk/tkutil.c2
12 files changed, 237 insertions, 208 deletions
diff --git a/ext/Setup b/ext/Setup
index 957e9105e3..830a5095ca 100644
--- a/ext/Setup
+++ b/ext/Setup
@@ -1,6 +1,5 @@
#option nodynamic
-interbase
#GD
#curses
#dbm
diff --git a/ext/Setup.dj b/ext/Setup.dj
index 25adea2035..cf25c07e6b 100644
--- a/ext/Setup.dj
+++ b/ext/Setup.dj
@@ -3,10 +3,12 @@ option nodynamic
#GD
#curses
dbm
+gdbm
#etc
fcntl
-kconv
+nkf
marshal
md5
+sdbm
#socket
#tkutil
diff --git a/ext/aix_mksym.rb b/ext/aix_mksym.rb
index 2d5ad1ae9e..7e1af283dc 100644
--- a/ext/aix_mksym.rb
+++ b/ext/aix_mksym.rb
@@ -30,4 +30,4 @@ def extract(nm, out)
exp.close
nm.close
end
-extract(open("|/usr/ccs/bin/nm -p ../*.o"), "../ruby.imp")
+extract(open("|/usr/ccs/bin/nm -p ../libruby.a"), "../ruby.imp")
diff --git a/ext/gdbm/MANIFEST b/ext/gdbm/MANIFEST
index c0f7b2cb7c..f4a8796d18 100644
--- a/ext/gdbm/MANIFEST
+++ b/ext/gdbm/MANIFEST
@@ -1,5 +1,5 @@
-MANIFEST
-README
-depend
-extconf.rb
-gdbm.c
+MANIFEST
+README
+depend
+extconf.rb
+gdbm.c
diff --git a/ext/socket/addrinfo.h b/ext/socket/addrinfo.h
index 6ea4a823f6..724f800c79 100644
--- a/ext/socket/addrinfo.h
+++ b/ext/socket/addrinfo.h
@@ -125,6 +125,11 @@
#define NI_NUMERICSERV 0x00000008
#define NI_DGRAM 0x00000010
+#ifdef NT
+#define IN_EXPERIMENTAL(x) 0
+#define IN_LOOPBACKNET 0
+#endif
+
struct addrinfo {
int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
int ai_family; /* PF_xxx */
diff --git a/ext/socket/getaddrinfo.c b/ext/socket/getaddrinfo.c
index e9ff9235e1..7ae41e6030 100644
--- a/ext/socket/getaddrinfo.c
+++ b/ext/socket/getaddrinfo.c
@@ -39,22 +39,28 @@
*/
#include <sys/types.h>
+#ifndef NT
#include <sys/param.h>
+#endif
#ifdef HAVE_SYSCTL_H
#include <sys/sysctl.h>
#endif
+#ifndef NT
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <netdb.h>
#include <resolv.h>
+#include <unistd.h>
+#else
+#include <winsock2.h>
+#endif
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <ctype.h>
-#include <unistd.h>
#include "config.h"
#include "addrinfo.h"
@@ -355,7 +361,7 @@ getaddrinfo(hostname, servname, hints, res)
pai->ai_socktype = SOCK_DGRAM;
pai->ai_protocol = IPPROTO_UDP;
}
- port = htons(atoi(servname));
+ port = htons((unsigned short)atoi(servname));
} else {
struct servent *sp;
char *proto;
@@ -561,8 +567,10 @@ get_addr(hostname, af, res, pai, port0)
int i, error = 0, h_error;
char *ap;
#ifndef INET6
+#ifndef NT
extern int h_errno;
#endif
+#endif
top = NULL;
sentinel.ai_next = NULL;
diff --git a/ext/socket/getnameinfo.c b/ext/socket/getnameinfo.c
index d4d6bcf595..f4da5bbf7a 100644
--- a/ext/socket/getnameinfo.c
+++ b/ext/socket/getnameinfo.c
@@ -35,12 +35,20 @@
*/
#include <sys/types.h>
+#ifndef NT
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <netdb.h>
#include <resolv.h>
+#endif
+#ifdef NT
+#include <winsock2.h>
+#include <stdio.h>
+#define snprintf _snprintf
+#endif
+
#include <string.h>
#include <stddef.h>
@@ -125,7 +133,9 @@ getnameinfo(sa, salen, host, hostlen, serv, servlen, flags)
int h_error;
char numserv[512];
char numaddr[512];
+#ifndef NT
extern int h_errno;
+#endif
if (sa == NULL)
return ENI_NOSOCKET;
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 980c00bb01..538a7ac7dc 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -84,12 +84,16 @@ sock_finalize(fptr)
OpenFile *fptr;
{
SOCKET s;
+ extern int errno;
if (!fptr->f) return;
- s = fileno(fptr->f);
- free(fptr->f);
- if (fptr->f2) free(fptr->f2);
+
+ myfdclose(fptr->f);
+ if(fptr->f2) myfdclose(fptr->f);
+/*
+ s = get_osfhandle(fileno(fptr->f));
closesocket(s);
+*/
}
#endif
@@ -423,19 +427,110 @@ bsock_recv(argc, argv, sock)
return s_recv(sock, argc, argv, RECV_RECV);
}
+static void
+mkipaddr0(addr, buf, len)
+ struct sockaddr *addr;
+ char *buf;
+ size_t len;
+{
+ int error;
+
+ error = getnameinfo(addr, SA_LEN(addr), buf, len, NULL, 0,
+ NI_NUMERICHOST);
+ if (error) {
+ rb_raise(rb_eSocket, "%s", gai_strerror(error));
+ }
+}
+
static VALUE
mkipaddr(addr)
struct sockaddr *addr;
{
char buf[1024];
+
+ mkipaddr0(addr, buf, sizeof(buf));
+ return rb_str_new2(buf);
+}
+
+static void
+mkinetaddr(host, buf, len)
+ long host;
+ char *buf;
+ size_t len;
+{
+ struct sockaddr_in sin;
+
+ MEMZERO(&sin, struct sockaddr_in, 1);
+ sin.sin_family = AF_INET;
+ SET_SIN_LEN(&sin, sizeof(sin));
+ sin.sin_addr.s_addr = host;
+ mkipaddr0((struct sockaddr *)&sin, buf, len);
+}
+
+static struct addrinfo*
+ip_addrsetup(host, port)
+ VALUE host, port;
+{
+ struct addrinfo hints, *res;
+ char *hostp, *portp;
int error;
+ char hbuf[1024], pbuf[16];
- error = getnameinfo(addr, SA_LEN(addr), buf, sizeof(buf), NULL, 0,
- NI_NUMERICHOST);
+ if (NIL_P(host)) {
+ hostp = NULL;
+ }
+ else if (rb_obj_is_kind_of(host, rb_cInteger)) {
+ struct sockaddr_in sin;
+ long i = NUM2LONG(host);
+
+ mkinetaddr(htonl(i), hbuf, sizeof(hbuf));
+ }
+ else {
+ char *name = STR2CSTR(host);
+
+ if (*name == 0) {
+ mkinetaddr(INADDR_ANY, hbuf, sizeof(hbuf));
+ }
+ if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
+ mkinetaddr(INADDR_BROADCAST, hbuf, sizeof(hbuf));
+ }
+ else {
+ strcpy(hbuf, name);
+ }
+ }
+ hostp = hbuf;
+ if (NIL_P(port)) {
+ portp = 0;
+ }
+ else if (FIXNUM_P(port)) {
+ snprintf(pbuf, sizeof(pbuf), "%d", FIX2INT(port));
+ portp = pbuf;
+ }
+ else {
+ portp = STR2CSTR(port);
+ }
+
+ MEMZERO(&hints, struct addrinfo, 1);
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_socktype = SOCK_DGRAM;
+ error = getaddrinfo(hostp, portp, &hints, &res);
if (error) {
rb_raise(rb_eSocket, "%s", gai_strerror(error));
}
- return rb_str_new2(buf);
+
+ return res;
+}
+
+static void
+setipaddr(name, addr)
+ VALUE name;
+ struct sockaddr *addr;
+{
+ struct addrinfo *res = ip_addrsetup(name, Qnil);
+
+ /* just take the first one */
+ memcpy(addr, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
}
static VALUE
@@ -480,40 +575,6 @@ ipaddr(sockaddr)
}
static void
-setipaddr(name, addr)
- char *name;
- struct sockaddr *addr;
-{
- struct addrinfo hints, *res;
- struct sockaddr_in *sin;
- int error;
-
- sin = (struct sockaddr_in *)addr;
- if (name[0] == 0) {
- MEMZERO(sin, struct sockaddr_in, 1);
- sin->sin_family = AF_INET;
- SET_SIN_LEN(sin, sizeof(*sin));
- sin->sin_addr.s_addr = INADDR_ANY;
- }
- else if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {
- sin->sin_family = AF_INET;
- SET_SIN_LEN(sin, sizeof(*sin));
- sin->sin_addr.s_addr = INADDR_BROADCAST;
- }
- else {
- MEMZERO(&hints, struct addrinfo, 1);
- hints.ai_family = PF_UNSPEC;
- error = getaddrinfo(name, NULL, &hints, &res);
- if (error) {
- rb_raise(rb_eSocket, "%s", gai_strerror(error));
- }
- /* just take the first one */
- memcpy(addr, res->ai_addr, res->ai_addrlen);
- freeaddrinfo(res);
- }
-}
-
-static void
thread_write_select(fd)
int fd;
{
@@ -632,8 +693,8 @@ open_inet(class, h, serv, type)
continue;
if (type == INET_SERVER) {
status = 1;
- setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&status,
- sizeof(status));
+ setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
+ (char*)&status, sizeof(status));
status = bind(fd, res->ai_addr, res->ai_addrlen);
syscall = "bind(2)";
}
@@ -713,7 +774,7 @@ tcp_s_gethostbyname(obj, host)
sin->sin_addr.s_addr = htonl(i);
}
else {
- setipaddr(STR2CSTR(host), (struct sockaddr *)&addr);
+ setipaddr(host, &addr);
}
switch (addr.ss_family) {
case AF_INET:
@@ -947,19 +1008,7 @@ ip_s_getaddress(obj, host)
{
struct sockaddr_storage addr;
- if (rb_obj_is_kind_of(host, rb_cInteger)) {
- long i = NUM2LONG(host);
- struct sockaddr_in *sin;
- sin = (struct sockaddr_in *)&addr;
- MEMZERO(sin, struct sockaddr_in, 1);
- sin->sin_family = AF_INET;
- SET_SIN_LEN(sin, sizeof(*sin));
- sin->sin_addr.s_addr = htonl(i);
- }
- else {
- setipaddr(STR2CSTR(host), (struct sockaddr *)&addr);
- }
-
+ setipaddr(host, &addr);
return mkipaddr((struct sockaddr *)&addr);
}
@@ -978,56 +1027,6 @@ udp_s_open(argc, argv, class)
return sock_new(class, socket(socktype, SOCK_DGRAM, 0));
}
-static struct addrinfo *
-udp_addrsetup(fptr, host, port)
- OpenFile *fptr; /* use for AF check? */
- VALUE host, port;
-{
- struct addrinfo hints, *res;
- int error;
- char *hostp, *portp;
- char hbuf[1024], pbuf[1024];
-
- if (NIL_P(host)) {
- hostp = NULL;
- }
- else if (rb_obj_is_kind_of(host, rb_cInteger)) {
- struct sockaddr_in sin;
- long i = NUM2LONG(host);
- MEMZERO(&sin, struct sockaddr_in, 1);
- sin.sin_family = AF_INET;
- SET_SIN_LEN(&sin, sizeof(sin));
- sin.sin_addr.s_addr = htonl(i);
- error = getnameinfo((struct sockaddr *)&sin, SIN_LEN(&sin),
- hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST);
- if (error) {
- rb_raise(rb_eSocket, "%s", gai_strerror(error));
- }
- hostp = hbuf;
- }
- else {
- strcpy(hbuf, STR2CSTR(host));
- hostp = hbuf;
- }
- if (FIXNUM_P(port)) {
- snprintf(pbuf, sizeof(pbuf), "%d", FIX2INT(port));
- portp = pbuf;
- }
- else {
- portp = STR2CSTR(port);
- }
-
- MEMZERO(&hints, struct addrinfo, 1);
- hints.ai_family = PF_UNSPEC;
- hints.ai_socktype = SOCK_DGRAM;
- error = getaddrinfo(hostp, portp, &hints, &res);
- if (error) {
- rb_raise(rb_eSocket, "%s", gai_strerror(error));
- }
-
- return res;
-}
-
static VALUE
udp_connect(sock, host, port)
VALUE sock, host, port;
@@ -1038,7 +1037,7 @@ udp_connect(sock, host, port)
GetOpenFile(sock, fptr);
fd = fileno(fptr->f);
- res0 = udp_addrsetup(fptr, host, port);
+ res0 = ip_addrsetup(host, port);
for (res = res0; res; res = res->ai_next) {
if (ruby_connect(fd, res->ai_addr, res->ai_addrlen, 0) >= 0) {
freeaddrinfo(res0);
@@ -1059,7 +1058,7 @@ udp_bind(sock, host, port)
struct addrinfo *res0, *res;
GetOpenFile(sock, fptr);
- res0 = udp_addrsetup(fptr, host, port);
+ res0 = ip_addrsetup(host, port);
for (res = res0; res; res = res->ai_next) {
if (bind(fileno(fptr->f), res->ai_addr, res->ai_addrlen) < 0) {
continue;
@@ -1092,7 +1091,7 @@ udp_send(argc, argv, sock)
rb_scan_args(argc, argv, "4", &mesg, &flags, &host, &port);
GetOpenFile(sock, fptr);
- res0 = udp_addrsetup(fptr, host, port);
+ res0 = ip_addrsetup(host, port);
f = GetWriteFile(fptr);
m = rb_str2cstr(mesg, &mlen);
for (res = res0; res; res = res->ai_next) {
@@ -1532,7 +1531,7 @@ sock_s_gethostbyname(obj, host)
sin->sin_addr.s_addr = htonl(i);
}
else {
- setipaddr(STR2CSTR(host), (struct sockaddr *)&addr);
+ setipaddr(host, (struct sockaddr *)&addr);
}
switch (addr.ss_family) {
case AF_INET:
diff --git a/ext/tcltklib/tcltklib.c b/ext/tcltklib/tcltklib.c
index ffc6f2f57c..5f6f9a0c02 100644
--- a/ext/tcltklib/tcltklib.c
+++ b/ext/tcltklib/tcltklib.c
@@ -27,8 +27,8 @@ fprintf(stderr, ARG1, ARG2); fprintf(stderr, "\n"); }
*/
/* for callback break & continue */
-VALUE eTkCallbackBreak;
-VALUE eTkCallbackContinue;
+static VALUE eTkCallbackBreak;
+static VALUE eTkCallbackContinue;
/* from tkAppInit.c */
@@ -49,15 +49,18 @@ typedef struct {
} Tk_TimerData;
/* timer callback */
-void _timer_for_tcl(clientData)
+static void
+_timer_for_tcl(clientData)
ClientData clientData;
{
Tk_TimerData *timer = (Tk_TimerData*)clientData;
timer->flag = 0;
CHECK_INTS;
- if (!rb_thread_critical) rb_thread_schedule();
+ if (timer->flag) {
+ Tk_DeleteTimerHandler(timer->token);
+ }
timer->token = Tk_CreateTimerHandler(200, _timer_for_tcl,
(ClientData)timer);
timer->flag = 1;
@@ -70,7 +73,7 @@ lib_mainloop(self)
{
Tk_TimerData *timer;
- timer = (Tk_TimerData *) ckalloc(sizeof(Tk_TimerData));
+ timer = (Tk_TimerData *)ALLOC(Tk_TimerData);
timer->flag = 0;
timer->token = Tk_CreateTimerHandler(200, _timer_for_tcl,
(ClientData)timer);
@@ -79,12 +82,14 @@ lib_mainloop(self)
DUMP1("start Tk_Mainloop");
while (Tk_GetNumMainWindows() > 0) {
Tcl_DoOneEvent(0);
+ CHECK_INTS;
}
DUMP1("stop Tk_Mainloop");
if (timer->flag) {
- Tk_DeleteTimerHandler(timer->token);
+ Tk_DeleteTimerHandler(timer->token);
}
+ free(timer);
return Qnil;
}
@@ -150,11 +155,11 @@ ip_ruby(clientData, interp, argc, argv)
VALUE eclass = CLASS_OF(failed);
Tcl_AppendResult(interp, STR2CSTR(failed), (char*)NULL);
if (eclass == eTkCallbackBreak) {
- return TCL_BREAK;
+ return TCL_BREAK;
} else if (eclass == eTkCallbackContinue) {
- return TCL_CONTINUE;
+ return TCL_CONTINUE;
} else {
- return TCL_ERROR;
+ return TCL_ERROR;
}
}
@@ -245,7 +250,7 @@ ip_eval(self, str)
DUMP2("Tcl_Eval(%s)", buf);
ptr->return_value = Tcl_Eval(ptr->ip, buf);
if (ptr->return_value == TCL_ERROR) {
- rb_raise(rb_eRuntimeError, ptr->ip->result);
+ rb_raise(rb_eRuntimeError, "%s", ptr->ip->result);
}
DUMP2("(TCL_Eval result) %d", ptr->return_value);
@@ -260,33 +265,29 @@ ip_toUTF8(self, str, encodename)
VALUE str;
VALUE encodename;
{
-#ifndef TCL_UTF_MAX
- return str;
-#else
- Tcl_Interp *interp;
- Tcl_Encoding encoding;
- Tcl_DString dstr;
- struct tcltkip *ptr;
- char *buff1,*buff2;
-
- Data_Get_Struct(self,struct tcltkip, ptr);
- interp = ptr->ip;
+#ifdef TCL_UTF_MAX
+ Tcl_Interp *interp;
+ Tcl_Encoding encoding;
+ Tcl_DString dstr;
+ struct tcltkip *ptr;
+ char *buf;
- encoding = Tcl_GetEncoding(interp,STR2CSTR(encodename));
- buff1 = ALLOCA_N(char,strlen(STR2CSTR(str))+1);
- strcpy(buff1,STR2CSTR(str));
+ Data_Get_Struct(self,struct tcltkip, ptr);
+ interp = ptr->ip;
- Tcl_DStringInit(&dstr);
- Tcl_DStringFree(&dstr);
- Tcl_ExternalToUtfDString(encoding,buff1,strlen(buff1),&dstr);
- buff2 = ALLOCA_N(char,Tcl_DStringLength(&dstr)+1);
- strcpy(buff2,Tcl_DStringValue(&dstr));
+ encoding = Tcl_GetEncoding(interp,STR2CSTR(encodename));
+ buf = ALLOCA_N(char,strlen(STR2CSTR(str))+1);
+ strcpy(buf,STR2CSTR(str));
- Tcl_FreeEncoding(encoding);
- Tcl_DStringFree(&dstr);
+ Tcl_DStringInit(&dstr);
+ Tcl_DStringFree(&dstr);
+ Tcl_ExternalToUtfDString(encoding,buf,strlen(buf),&dstr);
+ str = rb_str_new2(Tcl_DStringValue(&dstr));
- return rb_str_new2(buff2);
+ Tcl_FreeEncoding(encoding);
+ Tcl_DStringFree(&dstr);
#endif
+ return str;
}
static VALUE
@@ -295,33 +296,30 @@ ip_fromUTF8(self, str, encodename)
VALUE str;
VALUE encodename;
{
-#ifndef TCL_UTF_MAX
- return str;
-#else
- Tcl_Interp *interp;
- Tcl_Encoding encoding;
- Tcl_DString dstr;
- struct tcltkip *ptr;
- char *buff1,*buff2;
+#ifdef TCL_UTF_MAX
+ Tcl_Interp *interp;
+ Tcl_Encoding encoding;
+ Tcl_DString dstr;
+ struct tcltkip *ptr;
+ char *buf;
- Data_Get_Struct(self,struct tcltkip, ptr);
- interp = ptr->ip;
+ Data_Get_Struct(self,struct tcltkip, ptr);
+ interp = ptr->ip;
- encoding = Tcl_GetEncoding(interp,STR2CSTR(encodename));
- buff1 = ALLOCA_N(char,strlen(STR2CSTR(str))+1);
- strcpy(buff1,STR2CSTR(str));
+ encoding = Tcl_GetEncoding(interp,STR2CSTR(encodename));
+ buf = ALLOCA_N(char,strlen(STR2CSTR(str))+1);
+ strcpy(buf,STR2CSTR(str));
- Tcl_DStringInit(&dstr);
- Tcl_DStringFree(&dstr);
- Tcl_UtfToExternalDString(encoding,buff1,strlen(buff1),&dstr);
- buff2 = ALLOCA_N(char,Tcl_DStringLength(&dstr)+1);
- strcpy(buff2,Tcl_DStringValue(&dstr));
+ Tcl_DStringInit(&dstr);
+ Tcl_DStringFree(&dstr);
+ Tcl_UtfToExternalDString(encoding,buf,strlen(buf),&dstr);
+ str = rb_str_new2(Tcl_DStringValue(&dstr));
- Tcl_FreeEncoding(encoding);
- Tcl_DStringFree(&dstr);
+ Tcl_FreeEncoding(encoding);
+ Tcl_DStringFree(&dstr);
- return rb_str_new2(buff2);
#endif
+ return str;
}
@@ -359,24 +357,25 @@ ip_invoke(argc, argv, obj)
/* memory allocation for arguments of this command */
if (object) {
#if TCL_MAJOR_VERSION >= 8
- /* object interface */
- ov = (Tcl_Obj **)ALLOCA_N(Tcl_Obj *, argc+1);
- for (i = 0; i < argc; ++i) {
- char *s = STR2CSTR(argv[i]);
- ov[i] = Tcl_NewStringObj(s, strlen(s));
- }
- ov[argc] = (Tcl_Obj *)NULL;
+ /* object interface */
+ ov = (Tcl_Obj **)ALLOCA_N(Tcl_Obj *, argc+1);
+ for (i = 0; i < argc; ++i) {
+ char *s = STR2CSTR(argv[i]);
+ ov[i] = Tcl_NewStringObj(s, strlen(s));
+ Tcl_IncrRefCount(ov[i]);
+ }
+ ov[argc] = (Tcl_Obj *)NULL;
#endif
} else {
/* string interface */
- av = (char **)ALLOCA_N(char *, argc+1);
- for (i = 0; i < argc; ++i) {
- char *s = STR2CSTR(argv[i]);
-
- av[i] = ALLOCA_N(char, strlen(s)+1);
- strcpy(av[i], s);
- }
- av[argc] = (char *)NULL;
+ av = (char **)ALLOCA_N(char *, argc+1);
+ for (i = 0; i < argc; ++i) {
+ char *s = STR2CSTR(argv[i]);
+
+ av[i] = ALLOCA_N(char, strlen(s)+1);
+ strcpy(av[i], s);
+ }
+ av[argc] = (char *)NULL;
}
Tcl_ResetResult(ptr->ip);
@@ -384,26 +383,31 @@ ip_invoke(argc, argv, obj)
/* Invoke the C procedure */
if (object) {
#if TCL_MAJOR_VERSION >= 8
- int dummy;
- ptr->return_value = (*info.objProc)(info.objClientData,
- ptr->ip, argc, ov);
-
- /* get the string value from the result object */
- resultPtr = Tcl_GetObjResult(ptr->ip);
- Tcl_SetResult(ptr->ip, Tcl_GetStringFromObj(resultPtr, &dummy),
- TCL_VOLATILE);
+ int dummy;
+ ptr->return_value = (*info.objProc)(info.objClientData,
+ ptr->ip, argc, ov);
+
+ /* get the string value from the result object */
+ resultPtr = Tcl_GetObjResult(ptr->ip);
+ Tcl_SetResult(ptr->ip, Tcl_GetStringFromObj(resultPtr, &dummy),
+ TCL_VOLATILE);
+
+ for (i=0; i<argc; i++) {
+ Tcl_DecrRefCount(ov[i]);
+ }
#endif
- } else {
- ptr->return_value = (*info.proc)(info.clientData,
- ptr->ip, argc, av);
+ }
+ else {
+ ptr->return_value = (*info.proc)(info.clientData,
+ ptr->ip, argc, av);
}
if (ptr->return_value == TCL_ERROR) {
- rb_raise(rb_eRuntimeError, ptr->ip->result);
+ rb_raise(rb_eRuntimeError, "%s", ptr->ip->result);
}
/* pass back the result (as string) */
- return(rb_str_new2(ptr->ip->result));
+ return rb_str_new2(ptr->ip->result);
}
/* get return code from Tcl_Eval() */
@@ -423,13 +427,14 @@ ip_retval(self)
static void
_macinit()
{
- tcl_macQdPtr = &qd; /* setup QuickDraw globals */
- Tcl_MacSetEventProc(TkMacConvertEvent); /* setup event handler */
+ tcl_macQdPtr = &qd; /* setup QuickDraw globals */
+ Tcl_MacSetEventProc(TkMacConvertEvent); /* setup event handler */
}
#endif
/*---- initialization ----*/
-void Init_tcltklib()
+void
+Init_tcltklib()
{
extern VALUE rb_argv0; /* the argv[0] */
diff --git a/ext/tk/lib/tk.rb b/ext/tk/lib/tk.rb
index 2aa49879fd..dae2aeb0d8 100644
--- a/ext/tk/lib/tk.rb
+++ b/ext/tk/lib/tk.rb
@@ -233,6 +233,7 @@ module TkComm
return format("rb_out %s", id);
end
def uninstall_cmd(id)
+ id = $1 if /rb_out (c\d+)/
Tk_CMDTBL[id] = nil
end
private :install_cmd, :uninstall_cmd
@@ -2116,7 +2117,7 @@ class TkScrollbar<TkWindow
end
def get
- ary1 = tk_send('get', path).split
+ ary1 = tk_send('get').split
ary2 = []
for i in ary1
ary2.push number(i)
diff --git a/ext/tk/lib/tktext.rb b/ext/tk/lib/tktext.rb
index 281435ef69..3dde30d60d 100644
--- a/ext/tk/lib/tktext.rb
+++ b/ext/tk/lib/tktext.rb
@@ -272,7 +272,7 @@ class TkText<TkTextWin
end
def tag_cget(tag, key)
- tk_tcl2ruby tk_call @t.path, 'tag', 'cget', tag, "-#{key}"
+ tk_tcl2ruby tk_call @path, 'tag', 'cget', tag, "-#{key}"
end
def tag_configure(tag, key, val=None)
@@ -289,7 +289,7 @@ class TkText<TkTextWin
|| key == 'latinfont' || key == 'asciifont' )
tagfont_configure({key=>val})
else
- tk_call 'tag', 'configure', tag, "-#{key}", val
+ tk_send 'tag', 'configure', tag, "-#{key}", val
end
end
end
diff --git a/ext/tk/tkutil.c b/ext/tk/tkutil.c
index e93733bb67..990c81d724 100644
--- a/ext/tk/tkutil.c
+++ b/ext/tk/tkutil.c
@@ -29,7 +29,7 @@ tk_s_new(argc, argv, class)
{
VALUE obj = rb_obj_alloc(class);
- rb_funcall2(obj, rb_intern("initialize"), argc, argv);
+ rb_obj_call_init(obj, argc, argv);
if (rb_iterator_p()) rb_obj_instance_eval(0, 0, obj);
return obj;
}