ObjFW  Diff

Differences From Artifact [ee4d5662a9]:

  • File src/OFPlugin.m — part of check-in [179174571e] at 2009-04-19 17:06:46 on branch trunk — Don't use forwarding for OFPlugin.

    This is faster and we don't rely on forwarding which is broken in
    both, the GNU and the Apple runtime. Eventually, there will be an
    implementation for forwarding that does work around the runtime bugs,
    but still, an implementation of OFPlugin without forwarding makes more
    sense. (user: js, size: 1562) [annotate] [blame] [check-ins using]

To Artifact [b72d21c5c5]:


22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
+ pluginFromFile: (const char*)path
{
	char *file;
	size_t pathlen, suffixlen;
	void *handle;
	OFPlugin *(*init_plugin)();
	OFPlugin *plugin;
	Class c;

	if ((self = [super init])) {
		pathlen = strlen(path);
		suffixlen = strlen(PLUGIN_SUFFIX);

		if ((file = malloc(pathlen + suffixlen + 1)) == NULL) {
			c = [self class];
			[super free];
			@throw [OFNoMemException newWithClass: c
						      andSize: pathlen +
							       suffixlen + 1];
		}
		memcpy(file, path, pathlen);
		memcpy(file + pathlen, PLUGIN_SUFFIX, suffixlen);
		file[pathlen + suffixlen] = 0;

		if ((handle = dlopen(file, RTLD_NOW)) == NULL) {
			free(file);
			c = [self class];
			[super free];
			@throw [OFInitializationFailedException
			    newWithClass: c];
		}
		free(file);

		if ((init_plugin = dlsym(handle, "init_plugin")) == NULL ||
		    (plugin = init_plugin()) == nil) {
			dlclose(handle);
			c = [self class];
			[super free];
			@throw [OFInitializationFailedException
			    newWithClass: c];
		}

		plugin->handle = handle;
		return plugin;
	}

	return self;







<






<
<
|









<
<

|






<
<

|







22
23
24
25
26
27
28

29
30
31
32
33
34


35
36
37
38
39
40
41
42
43
44


45
46
47
48
49
50
51
52


53
54
55
56
57
58
59
60
61
+ pluginFromFile: (const char*)path
{
	char *file;
	size_t pathlen, suffixlen;
	void *handle;
	OFPlugin *(*init_plugin)();
	OFPlugin *plugin;


	if ((self = [super init])) {
		pathlen = strlen(path);
		suffixlen = strlen(PLUGIN_SUFFIX);

		if ((file = malloc(pathlen + suffixlen + 1)) == NULL) {


			@throw [OFNoMemException newWithClass: self
						      andSize: pathlen +
							       suffixlen + 1];
		}
		memcpy(file, path, pathlen);
		memcpy(file + pathlen, PLUGIN_SUFFIX, suffixlen);
		file[pathlen + suffixlen] = 0;

		if ((handle = dlopen(file, RTLD_NOW)) == NULL) {
			free(file);


			@throw [OFInitializationFailedException
			    newWithClass: self];
		}
		free(file);

		if ((init_plugin = dlsym(handle, "init_plugin")) == NULL ||
		    (plugin = init_plugin()) == nil) {
			dlclose(handle);


			@throw [OFInitializationFailedException
			    newWithClass: self];
		}

		plugin->handle = handle;
		return plugin;
	}

	return self;