candle 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE.txt +20 -0
- data/README.md +4 -0
- data/VERSION +1 -0
- data/bin/candle +21 -0
- data/lib/candle.rb +68 -0
- data/lib/candle/command.rb +27 -0
- data/lib/candle/generators/actions.rb +183 -0
- data/lib/candle/generators/blank.rb +127 -0
- data/lib/candle/generators/cli.rb +55 -0
- data/lib/candle/generators/help.rb +47 -0
- data/lib/candle/generators/jam.rb +80 -0
- data/lib/candle/generators/lua/scripts/AppDelegate.lua +36 -0
- data/lib/candle/generators/lua/scripts/tests/init.lua +6 -0
- data/lib/candle/generators/lua/scripts/tests/someTest.lua +12 -0
- data/lib/candle/generators/lua/wax/ProtocolLoader.h +12 -0
- data/lib/candle/generators/lua/wax/bin/hammer +157 -0
- data/lib/candle/generators/lua/wax/bin/update-xibs +131 -0
- data/lib/candle/generators/lua/wax/bin/waxsim +0 -0
- data/lib/candle/generators/lua/wax/lib/build-scripts/compile-stdlib.sh +14 -0
- data/lib/candle/generators/lua/wax/lib/build-scripts/copy-scripts.sh +58 -0
- data/lib/candle/generators/lua/wax/lib/build-scripts/luac.lua +80 -0
- data/lib/candle/generators/lua/wax/lib/extensions/CGAffine/wax_CGTransform.h +12 -0
- data/lib/candle/generators/lua/wax/lib/extensions/CGAffine/wax_CGTransform.m +85 -0
- data/lib/candle/generators/lua/wax/lib/extensions/CGContext/wax_CGContext.h +12 -0
- data/lib/candle/generators/lua/wax/lib/extensions/CGContext/wax_CGContext.m +251 -0
- data/lib/candle/generators/lua/wax/lib/extensions/HTTP/wax_http.h +14 -0
- data/lib/candle/generators/lua/wax/lib/extensions/HTTP/wax_http.m +240 -0
- data/lib/candle/generators/lua/wax/lib/extensions/HTTP/wax_http_connection.h +54 -0
- data/lib/candle/generators/lua/wax/lib/extensions/HTTP/wax_http_connection.m +304 -0
- data/lib/candle/generators/lua/wax/lib/extensions/filesystem/wax_filesystem.h +9 -0
- data/lib/candle/generators/lua/wax/lib/extensions/filesystem/wax_filesystem.m +273 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/Rakefile +10 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/wax_json.c +304 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/wax_json.h +11 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl-1.0.9.tar.gz +0 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/api/yajl_common.h +85 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/api/yajl_gen.h +159 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/api/yajl_parse.h +193 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl.c +159 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_alloc.c +65 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_alloc.h +50 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_buf.c +119 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_buf.h +73 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_bytestack.h +85 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_common.h +85 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_encode.c +188 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_encode.h +50 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_gen.c +322 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_gen.h +159 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_lex.c +737 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_lex.h +133 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_parse.h +193 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_parser.c +448 -0
- data/lib/candle/generators/lua/wax/lib/extensions/json/yajl/yajl_parser.h +82 -0
- data/lib/candle/generators/lua/wax/lib/lua/lapi.c +1087 -0
- data/lib/candle/generators/lua/wax/lib/lua/lapi.h +16 -0
- data/lib/candle/generators/lua/wax/lib/lua/lauxlib.c +652 -0
- data/lib/candle/generators/lua/wax/lib/lua/lauxlib.h +174 -0
- data/lib/candle/generators/lua/wax/lib/lua/lbaselib.c +653 -0
- data/lib/candle/generators/lua/wax/lib/lua/lcode.c +839 -0
- data/lib/candle/generators/lua/wax/lib/lua/lcode.h +76 -0
- data/lib/candle/generators/lua/wax/lib/lua/ldblib.c +397 -0
- data/lib/candle/generators/lua/wax/lib/lua/ldebug.c +638 -0
- data/lib/candle/generators/lua/wax/lib/lua/ldebug.h +33 -0
- data/lib/candle/generators/lua/wax/lib/lua/ldo.c +518 -0
- data/lib/candle/generators/lua/wax/lib/lua/ldo.h +57 -0
- data/lib/candle/generators/lua/wax/lib/lua/ldump.c +164 -0
- data/lib/candle/generators/lua/wax/lib/lua/lfunc.c +174 -0
- data/lib/candle/generators/lua/wax/lib/lua/lfunc.h +34 -0
- data/lib/candle/generators/lua/wax/lib/lua/lgc.c +711 -0
- data/lib/candle/generators/lua/wax/lib/lua/lgc.h +110 -0
- data/lib/candle/generators/lua/wax/lib/lua/linit.c +38 -0
- data/lib/candle/generators/lua/wax/lib/lua/liolib.c +553 -0
- data/lib/candle/generators/lua/wax/lib/lua/llex.c +461 -0
- data/lib/candle/generators/lua/wax/lib/lua/llex.h +81 -0
- data/lib/candle/generators/lua/wax/lib/lua/llimits.h +128 -0
- data/lib/candle/generators/lua/wax/lib/lua/lmathlib.c +263 -0
- data/lib/candle/generators/lua/wax/lib/lua/lmem.c +86 -0
- data/lib/candle/generators/lua/wax/lib/lua/lmem.h +49 -0
- data/lib/candle/generators/lua/wax/lib/lua/loadlib.c +666 -0
- data/lib/candle/generators/lua/wax/lib/lua/lobject.c +214 -0
- data/lib/candle/generators/lua/wax/lib/lua/lobject.h +381 -0
- data/lib/candle/generators/lua/wax/lib/lua/lopcodes.c +102 -0
- data/lib/candle/generators/lua/wax/lib/lua/lopcodes.h +268 -0
- data/lib/candle/generators/lua/wax/lib/lua/loslib.c +243 -0
- data/lib/candle/generators/lua/wax/lib/lua/lparser.c +1339 -0
- data/lib/candle/generators/lua/wax/lib/lua/lparser.h +82 -0
- data/lib/candle/generators/lua/wax/lib/lua/lstate.c +214 -0
- data/lib/candle/generators/lua/wax/lib/lua/lstate.h +169 -0
- data/lib/candle/generators/lua/wax/lib/lua/lstring.c +111 -0
- data/lib/candle/generators/lua/wax/lib/lua/lstring.h +31 -0
- data/lib/candle/generators/lua/wax/lib/lua/lstrlib.c +869 -0
- data/lib/candle/generators/lua/wax/lib/lua/ltable.c +588 -0
- data/lib/candle/generators/lua/wax/lib/lua/ltable.h +40 -0
- data/lib/candle/generators/lua/wax/lib/lua/ltablib.c +287 -0
- data/lib/candle/generators/lua/wax/lib/lua/ltm.c +75 -0
- data/lib/candle/generators/lua/wax/lib/lua/ltm.h +54 -0
- data/lib/candle/generators/lua/wax/lib/lua/lua.h +388 -0
- data/lib/candle/generators/lua/wax/lib/lua/luaconf.h +753 -0
- data/lib/candle/generators/lua/wax/lib/lua/lualib.h +53 -0
- data/lib/candle/generators/lua/wax/lib/lua/lundump.c +227 -0
- data/lib/candle/generators/lua/wax/lib/lua/lundump.h +36 -0
- data/lib/candle/generators/lua/wax/lib/lua/lvm.c +763 -0
- data/lib/candle/generators/lua/wax/lib/lua/lvm.h +36 -0
- data/lib/candle/generators/lua/wax/lib/lua/lzio.c +82 -0
- data/lib/candle/generators/lua/wax/lib/lua/lzio.h +67 -0
- data/lib/candle/generators/lua/wax/lib/lua/print.c +227 -0
- data/lib/candle/generators/lua/wax/lib/project.rake +159 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/enums.lua +396 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/ext/http.lua +43 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/ext/init.lua +4 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/ext/number.lua +21 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/ext/string.lua +97 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/ext/table.lua +165 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/helpers/WaxServer.lua +49 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/helpers/autoload.lua +10 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/helpers/base64.lua +64 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/helpers/bit.lua +274 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/helpers/cache.lua +73 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/helpers/callback.lua +22 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/helpers/frame.lua +76 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/helpers/init.lua +78 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/helpers/pickView.lua +54 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/helpers/time.lua +102 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/init.lua +18 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/luaspec/init.lua +2 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/luaspec/luamock.lua +84 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/luaspec/luaspec.lua +377 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/repl.lua +9 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/structs.lua +11 -0
- data/lib/candle/generators/lua/wax/lib/stdlib/waxClass.lua +42 -0
- data/lib/candle/generators/lua/wax/lib/wax.h +16 -0
- data/lib/candle/generators/lua/wax/lib/wax.m +260 -0
- data/lib/candle/generators/lua/wax/lib/wax_class.h +18 -0
- data/lib/candle/generators/lua/wax/lib/wax_class.m +190 -0
- data/lib/candle/generators/lua/wax/lib/wax_gc.h +20 -0
- data/lib/candle/generators/lua/wax/lib/wax_gc.m +56 -0
- data/lib/candle/generators/lua/wax/lib/wax_helpers.h +102 -0
- data/lib/candle/generators/lua/wax/lib/wax_helpers.m +870 -0
- data/lib/candle/generators/lua/wax/lib/wax_instance.h +34 -0
- data/lib/candle/generators/lua/wax/lib/wax_instance.m +810 -0
- data/lib/candle/generators/lua/wax/lib/wax_server.h +47 -0
- data/lib/candle/generators/lua/wax/lib/wax_server.m +252 -0
- data/lib/candle/generators/lua/wax/lib/wax_stdlib.h +3 -0
- data/lib/candle/generators/lua/wax/lib/wax_struct.h +26 -0
- data/lib/candle/generators/lua/wax/lib/wax_struct.m +335 -0
- data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/project.pbxproj +836 -0
- data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/project.xcworkspace/xcuserdata/eiffel.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/xcuserdata/eiffel.xcuserdatad/xcschemes/WaxApplication.xcscheme +86 -0
- data/lib/candle/generators/templates/blank/WaxApplication.xcodeproj/xcuserdata/eiffel.xcuserdatad/xcschemes/xcschememanagement.plist +22 -0
- data/lib/candle/generators/templates/blank/WaxApplication/Default-568h@2x.png +0 -0
- data/lib/candle/generators/templates/blank/WaxApplication/Default.png +0 -0
- data/lib/candle/generators/templates/blank/WaxApplication/Default@2x.png +0 -0
- data/lib/candle/generators/templates/blank/WaxApplication/ProtocolLoader.h +12 -0
- data/lib/candle/generators/templates/blank/WaxApplication/WaxApplication-Info.plist.tt +38 -0
- data/lib/candle/generators/templates/blank/WaxApplication/WaxApplication-Prefix.pch.tt +14 -0
- data/lib/candle/generators/templates/blank/WaxApplication/en.lproj/InfoPlist.strings +2 -0
- data/lib/candle/generators/templates/blank/WaxApplication/main.m.tt +20 -0
- data/lib/candle/tasks.rb +22 -0
- data/lib/candle/utility.rb +30 -0
- data/lib/candle/version.rb +9 -0
- data/lib/candle/view.rb +48 -0
- metadata +582 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ObjLua.m
|
|
3
|
+
// Lua
|
|
4
|
+
//
|
|
5
|
+
// Created by ProbablyInteractive on 5/27/09.
|
|
6
|
+
// Copyright 2009 Probably Interactive. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import "ProtocolLoader.h"
|
|
10
|
+
|
|
11
|
+
#import "wax.h"
|
|
12
|
+
#import "wax_class.h"
|
|
13
|
+
#import "wax_instance.h"
|
|
14
|
+
#import "wax_struct.h"
|
|
15
|
+
#import "wax_helpers.h"
|
|
16
|
+
#import "wax_gc.h"
|
|
17
|
+
#import "wax_server.h"
|
|
18
|
+
#import "wax_stdlib.h"
|
|
19
|
+
|
|
20
|
+
#import "lauxlib.h"
|
|
21
|
+
#import "lobject.h"
|
|
22
|
+
#import "lualib.h"
|
|
23
|
+
|
|
24
|
+
static void addGlobals(lua_State *L);
|
|
25
|
+
static int waxRoot(lua_State *L);
|
|
26
|
+
static int waxPrint(lua_State *L);
|
|
27
|
+
static int tolua(lua_State *L);
|
|
28
|
+
static int toobjc(lua_State *L);
|
|
29
|
+
static int exitApp(lua_State *L);
|
|
30
|
+
static int objcDebug(lua_State *L);
|
|
31
|
+
|
|
32
|
+
static lua_State *currentL;
|
|
33
|
+
lua_State *wax_currentLuaState() {
|
|
34
|
+
|
|
35
|
+
if (!currentL)
|
|
36
|
+
currentL = lua_open();
|
|
37
|
+
|
|
38
|
+
return currentL;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
void uncaughtExceptionHandler(NSException *e) {
|
|
42
|
+
NSLog(@"ERROR: Uncaught exception %@", [e description]);
|
|
43
|
+
lua_State *L = wax_currentLuaState();
|
|
44
|
+
|
|
45
|
+
if (L) {
|
|
46
|
+
wax_getStackTrace(L);
|
|
47
|
+
const char *stackTrace = luaL_checkstring(L, -1);
|
|
48
|
+
NSLog(@"%s", stackTrace);
|
|
49
|
+
lua_pop(L, -1); // remove the stackTrace
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
int wax_panic(lua_State *L) {
|
|
54
|
+
printf("Lua panicked and quit: %s\n", luaL_checkstring(L, -1));
|
|
55
|
+
exit(EXIT_FAILURE);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf);
|
|
59
|
+
|
|
60
|
+
void wax_setup() {
|
|
61
|
+
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
|
|
62
|
+
|
|
63
|
+
NSFileManager *fileManager = [NSFileManager defaultManager];
|
|
64
|
+
[fileManager changeCurrentDirectoryPath:[[NSBundle mainBundle] bundlePath]];
|
|
65
|
+
|
|
66
|
+
lua_State *L = wax_currentLuaState();
|
|
67
|
+
lua_atpanic(L, &wax_panic);
|
|
68
|
+
|
|
69
|
+
luaL_openlibs(L);
|
|
70
|
+
|
|
71
|
+
luaopen_wax_class(L);
|
|
72
|
+
luaopen_wax_instance(L);
|
|
73
|
+
luaopen_wax_struct(L);
|
|
74
|
+
|
|
75
|
+
addGlobals(L);
|
|
76
|
+
|
|
77
|
+
[wax_gc start];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
void wax_start(char* initScript, lua_CFunction extensionFunction, ...) {
|
|
81
|
+
wax_setup();
|
|
82
|
+
|
|
83
|
+
lua_State *L = wax_currentLuaState();
|
|
84
|
+
|
|
85
|
+
// Load extentions
|
|
86
|
+
// ---------------
|
|
87
|
+
if (extensionFunction) {
|
|
88
|
+
extensionFunction(L);
|
|
89
|
+
|
|
90
|
+
va_list ap;
|
|
91
|
+
va_start(ap, extensionFunction);
|
|
92
|
+
while((extensionFunction = va_arg(ap, lua_CFunction))) extensionFunction(L);
|
|
93
|
+
|
|
94
|
+
va_end(ap);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Load stdlib
|
|
98
|
+
// ---------------
|
|
99
|
+
#ifdef WAX_STDLIB
|
|
100
|
+
// If the stdlib was autogenerated and included in the source, load
|
|
101
|
+
char stdlib[] = WAX_STDLIB;
|
|
102
|
+
size_t stdlibSize = sizeof(stdlib);
|
|
103
|
+
#else
|
|
104
|
+
char stdlib[] = "require 'wax'";
|
|
105
|
+
size_t stdlibSize = strlen(stdlib);
|
|
106
|
+
#endif
|
|
107
|
+
|
|
108
|
+
if (luaL_loadbuffer(L, stdlib, stdlibSize, "loading wax stdlib") || lua_pcall(L, 0, LUA_MULTRET, 0)) {
|
|
109
|
+
fprintf(stderr,"Error opening wax scripts: %s\n", lua_tostring(L,-1));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Run Tests or the REPL?
|
|
113
|
+
// ----------------------
|
|
114
|
+
NSDictionary *env = [[NSProcessInfo processInfo] environment];
|
|
115
|
+
if ([[env objectForKey:@"WAX_TEST"] isEqual:@"YES"]) {
|
|
116
|
+
printf("Running Tests\n");
|
|
117
|
+
if (luaL_dostring(L, "require 'tests'") != 0) {
|
|
118
|
+
fprintf(stderr,"Fatal error running tests: %s\n", lua_tostring(L,-1));
|
|
119
|
+
}
|
|
120
|
+
exit(1);
|
|
121
|
+
}
|
|
122
|
+
else if ([[env objectForKey:@"WAX_REPL"] isEqual:@"YES"]) {
|
|
123
|
+
printf("Starting REPL\n");
|
|
124
|
+
if (luaL_dostring(L, "require 'wax.repl'") != 0) {
|
|
125
|
+
fprintf(stderr,"Fatal error starting the REPL: %s\n", lua_tostring(L,-1));
|
|
126
|
+
}
|
|
127
|
+
exit(1);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// Load app
|
|
131
|
+
char appLoadString[512];
|
|
132
|
+
snprintf(appLoadString, sizeof(appLoadString), "local f = '%s' require(f:gsub('%%.[^.]*$', ''))", initScript); // Strip the extension off the file.
|
|
133
|
+
if (luaL_dostring(L, appLoadString) != 0) {
|
|
134
|
+
fprintf(stderr,"Error opening wax scripts: %s\n", lua_tostring(L,-1));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
void wax_startWithServer() {
|
|
141
|
+
wax_setup();
|
|
142
|
+
[wax_server class]; // You need to load the class somehow via the wax.framework
|
|
143
|
+
lua_State *L = wax_currentLuaState();
|
|
144
|
+
|
|
145
|
+
// Load all the wax lua scripts
|
|
146
|
+
if (luaL_dofile(L, WAX_SCRIPTS_DIR "/scripts/wax/init.lua") != 0) {
|
|
147
|
+
fprintf(stderr,"Fatal error opening wax scripts: %s\n", lua_tostring(L,-1));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
Class WaxServer = objc_getClass("WaxServer");
|
|
151
|
+
if (!WaxServer) [NSException raise:@"Wax Server Error" format:@"Could load Wax Server"];
|
|
152
|
+
|
|
153
|
+
[WaxServer start];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
void wax_end() {
|
|
157
|
+
[wax_gc stop];
|
|
158
|
+
lua_close(wax_currentLuaState());
|
|
159
|
+
currentL = 0;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
static void addGlobals(lua_State *L) {
|
|
163
|
+
lua_getglobal(L, "wax");
|
|
164
|
+
if (lua_isnil(L, -1)) {
|
|
165
|
+
lua_pop(L, 1); // Get rid of the nil
|
|
166
|
+
lua_newtable(L);
|
|
167
|
+
lua_pushvalue(L, -1);
|
|
168
|
+
lua_setglobal(L, "wax");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
lua_pushnumber(L, WAX_VERSION);
|
|
172
|
+
lua_setfield(L, -2, "version");
|
|
173
|
+
|
|
174
|
+
lua_pushstring(L, [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"] UTF8String]);
|
|
175
|
+
lua_setfield(L, -2, "appVersion");
|
|
176
|
+
|
|
177
|
+
lua_pushcfunction(L, waxRoot);
|
|
178
|
+
lua_setfield(L, -2, "root");
|
|
179
|
+
|
|
180
|
+
lua_pushcfunction(L, waxPrint);
|
|
181
|
+
lua_setfield(L, -2, "print");
|
|
182
|
+
|
|
183
|
+
#ifdef DEBUG
|
|
184
|
+
lua_pushboolean(L, YES);
|
|
185
|
+
lua_setfield(L, -2, "isDebug");
|
|
186
|
+
#endif
|
|
187
|
+
|
|
188
|
+
lua_pop(L, 1); // pop the wax global off
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
lua_pushcfunction(L, tolua);
|
|
192
|
+
lua_setglobal(L, "tolua");
|
|
193
|
+
|
|
194
|
+
lua_pushcfunction(L, toobjc);
|
|
195
|
+
lua_setglobal(L, "toobjc");
|
|
196
|
+
|
|
197
|
+
lua_pushcfunction(L, exitApp);
|
|
198
|
+
lua_setglobal(L, "exitApp");
|
|
199
|
+
|
|
200
|
+
lua_pushstring(L, [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] UTF8String]);
|
|
201
|
+
lua_setglobal(L, "NSDocumentDirectory");
|
|
202
|
+
|
|
203
|
+
lua_pushstring(L, [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0] UTF8String]);
|
|
204
|
+
lua_setglobal(L, "NSLibraryDirectory");
|
|
205
|
+
|
|
206
|
+
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
|
|
207
|
+
lua_pushstring(L, [cachePath UTF8String]);
|
|
208
|
+
lua_setglobal(L, "NSCacheDirectory");
|
|
209
|
+
|
|
210
|
+
NSError *error = nil;
|
|
211
|
+
[[NSFileManager defaultManager] createDirectoryAtPath:cachePath withIntermediateDirectories:YES attributes: nil error:&error];
|
|
212
|
+
if (error) {
|
|
213
|
+
wax_log(LOG_DEBUG, @"Error creating cache path. %@", [error localizedDescription]);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
static int waxPrint(lua_State *L) {
|
|
218
|
+
NSLog(@"%s", luaL_checkstring(L, 1));
|
|
219
|
+
return 0;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
static int waxRoot(lua_State *L) {
|
|
223
|
+
luaL_Buffer b;
|
|
224
|
+
luaL_buffinit(L, &b);
|
|
225
|
+
luaL_addstring(&b, WAX_SCRIPTS_DIR);
|
|
226
|
+
|
|
227
|
+
for (int i = 1; i <= lua_gettop(L); i++) {
|
|
228
|
+
luaL_addstring(&b, "/");
|
|
229
|
+
luaL_addstring(&b, luaL_checkstring(L, i));
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
luaL_pushresult(&b);
|
|
233
|
+
|
|
234
|
+
return 1;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
static int tolua(lua_State *L) {
|
|
238
|
+
if (lua_isuserdata(L, 1)) { // If it's not userdata... it's already lua!
|
|
239
|
+
wax_instance_userdata *instanceUserdata = (wax_instance_userdata *)luaL_checkudata(L, 1, WAX_INSTANCE_METATABLE_NAME);
|
|
240
|
+
wax_fromInstance(L, instanceUserdata->instance);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return 1;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
static int toobjc(lua_State *L) {
|
|
247
|
+
id *instancePointer = wax_copyToObjc(L, "@", 1, nil);
|
|
248
|
+
id instance = *(id *)instancePointer;
|
|
249
|
+
|
|
250
|
+
wax_instance_create(L, instance, NO);
|
|
251
|
+
|
|
252
|
+
if (instancePointer) free(instancePointer);
|
|
253
|
+
|
|
254
|
+
return 1;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
static int exitApp(lua_State *L) {
|
|
258
|
+
exit(0);
|
|
259
|
+
return 0;
|
|
260
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//
|
|
2
|
+
// wax_class.h
|
|
3
|
+
// Lua
|
|
4
|
+
//
|
|
5
|
+
// Created by ProbablyInteractive on 5/20/09.
|
|
6
|
+
// Copyright 2009 Probably Interactive. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import <Foundation/Foundation.h>
|
|
10
|
+
#import <objc/runtime.h>
|
|
11
|
+
#import <objc/message.h>
|
|
12
|
+
|
|
13
|
+
#import "lua.h"
|
|
14
|
+
|
|
15
|
+
#define WAX_CLASS_METATABLE_NAME "wax.class"
|
|
16
|
+
#define WAX_CLASS_INSTANCE_USERDATA_IVAR_NAME "wax_instance_userdata"
|
|
17
|
+
|
|
18
|
+
int luaopen_wax_class(lua_State *L);
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
//
|
|
2
|
+
// wax_class.m
|
|
3
|
+
// Lua
|
|
4
|
+
//
|
|
5
|
+
// Created by ProbablyInteractive on 5/20/09.
|
|
6
|
+
// Copyright 2009 Probably Interactive. All rights reserved.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
#import "wax_class.h"
|
|
10
|
+
|
|
11
|
+
#import "wax.h"
|
|
12
|
+
#import "wax_instance.h"
|
|
13
|
+
#import "wax_helpers.h"
|
|
14
|
+
|
|
15
|
+
#import "lua.h"
|
|
16
|
+
#import "lauxlib.h"
|
|
17
|
+
|
|
18
|
+
static int __index(lua_State *L);
|
|
19
|
+
static int __call(lua_State *L);
|
|
20
|
+
|
|
21
|
+
static int addProtocols(lua_State *L);
|
|
22
|
+
static int name(lua_State *L);
|
|
23
|
+
static id alloc(id self, SEL _cmd);
|
|
24
|
+
static id allocWithZone(id self, SEL _cmd, NSZone *);
|
|
25
|
+
static id valueForUndefinedKey(id self, SEL cmd, NSString *key);
|
|
26
|
+
static void setValueForUndefinedKey(id self, SEL cmd, id value, NSString *key);
|
|
27
|
+
|
|
28
|
+
static const struct luaL_Reg MetaMethods[] = {
|
|
29
|
+
{"__index", __index},
|
|
30
|
+
{"__call", __call},
|
|
31
|
+
{NULL, NULL}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
static const struct luaL_Reg Methods[] = {
|
|
35
|
+
{"addProtocols", addProtocols},
|
|
36
|
+
{"name", name},
|
|
37
|
+
{NULL, NULL}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
int luaopen_wax_class(lua_State *L) {
|
|
41
|
+
BEGIN_STACK_MODIFY(L);
|
|
42
|
+
|
|
43
|
+
luaL_newmetatable(L, WAX_CLASS_METATABLE_NAME);
|
|
44
|
+
luaL_register(L, NULL, MetaMethods);
|
|
45
|
+
luaL_register(L, WAX_CLASS_METATABLE_NAME, Methods);
|
|
46
|
+
|
|
47
|
+
// Set the metatable for the module
|
|
48
|
+
luaL_getmetatable(L, WAX_CLASS_METATABLE_NAME);
|
|
49
|
+
lua_setmetatable(L, -2);
|
|
50
|
+
|
|
51
|
+
END_STACK_MODIFY(L, 0)
|
|
52
|
+
|
|
53
|
+
return 1;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
// Finds an ObjC class
|
|
58
|
+
static int __index(lua_State *L) {
|
|
59
|
+
const char *className = luaL_checkstring(L, 2);
|
|
60
|
+
Class klass = objc_getClass(className);
|
|
61
|
+
if (klass) {
|
|
62
|
+
wax_instance_create(L, klass, YES);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
lua_pushnil(L);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return 1;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Creates a new ObjC class
|
|
72
|
+
static int __call(lua_State *L) {
|
|
73
|
+
const char *className = luaL_checkstring(L, 2);
|
|
74
|
+
Class klass = objc_getClass(className);
|
|
75
|
+
|
|
76
|
+
if (!klass) {
|
|
77
|
+
Class superClass;
|
|
78
|
+
if (lua_isuserdata(L, 3)) {
|
|
79
|
+
wax_instance_userdata *instanceUserdata = (wax_instance_userdata *)luaL_checkudata(L, 3, WAX_INSTANCE_METATABLE_NAME);
|
|
80
|
+
superClass = instanceUserdata->instance;
|
|
81
|
+
}
|
|
82
|
+
else if (lua_isnoneornil(L, 3)) {
|
|
83
|
+
superClass = [NSObject class];
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const char *superClassName = luaL_checkstring(L, 3);
|
|
87
|
+
superClass = objc_getClass(superClassName);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (!superClass) {
|
|
91
|
+
luaL_error(L, "Failed to create '%s'. Unknown superclass \"%s\" received.", className, luaL_checkstring(L, 3));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
klass = objc_allocateClassPair(superClass, className, 0);
|
|
95
|
+
NSUInteger size;
|
|
96
|
+
NSUInteger alignment;
|
|
97
|
+
NSGetSizeAndAlignment("*", &size, &alignment);
|
|
98
|
+
class_addIvar(klass, WAX_CLASS_INSTANCE_USERDATA_IVAR_NAME, size, alignment, "*"); // Holds a reference to the lua userdata
|
|
99
|
+
objc_registerClassPair(klass);
|
|
100
|
+
|
|
101
|
+
// Make Key-Value complient
|
|
102
|
+
class_addMethod(klass, @selector(setValue:forUndefinedKey:), (IMP)setValueForUndefinedKey, "v@:@@");
|
|
103
|
+
class_addMethod(klass, @selector(valueForUndefinedKey:), (IMP)valueForUndefinedKey, "@@:@");
|
|
104
|
+
|
|
105
|
+
id metaclass = object_getClass(klass);
|
|
106
|
+
|
|
107
|
+
// So objects created in ObjC will get an associated lua object
|
|
108
|
+
// Store the original allocWithZone implementation in case something secret goes on in there.
|
|
109
|
+
// Calls to `alloc` always are end up calling `allocWithZone:` so we don't bother handling alloc here.
|
|
110
|
+
Method m = class_getInstanceMethod(metaclass, @selector(allocWithZone:));
|
|
111
|
+
|
|
112
|
+
// If we the method has already been swizzled (by the class's super, then
|
|
113
|
+
// just leave it up to the super!
|
|
114
|
+
if (method_getImplementation(m) != (IMP)allocWithZone) {
|
|
115
|
+
class_addMethod(metaclass, @selector(wax_originalAllocWithZone:), method_getImplementation(m), method_getTypeEncoding(m));
|
|
116
|
+
class_addMethod(metaclass, @selector(allocWithZone:), (IMP)allocWithZone, "@@:^{_NSZone=}");
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
wax_instance_create(L, klass, YES);
|
|
121
|
+
|
|
122
|
+
return 1;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
static int addProtocols(lua_State *L) {
|
|
126
|
+
wax_instance_userdata *instanceUserdata = (wax_instance_userdata *)luaL_checkudata(L, 1, WAX_INSTANCE_METATABLE_NAME);
|
|
127
|
+
|
|
128
|
+
if (!instanceUserdata->isClass) {
|
|
129
|
+
luaL_error(L, "ERROR: Can only set a protocol on a class (You are trying to set one on an instance)");
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
for (int i = 2; i <= lua_gettop(L); i++) {
|
|
134
|
+
const char *protocolName = luaL_checkstring(L, i);
|
|
135
|
+
Protocol *protocol = objc_getProtocol(protocolName);
|
|
136
|
+
if (!protocol) luaL_error(L, "Could not find protocol named '%s'\nHint: Sometimes the runtime cannot automatically find a protocol. Try adding it (via xCode) to the file ProtocolLoader.h", protocolName);
|
|
137
|
+
class_addProtocol(instanceUserdata->instance, protocol);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
static int name(lua_State *L) {
|
|
144
|
+
wax_instance_userdata *instanceUserdata = (wax_instance_userdata *)luaL_checkudata(L, 1, WAX_INSTANCE_METATABLE_NAME);
|
|
145
|
+
lua_pushstring(L, [NSStringFromClass([instanceUserdata->instance class]) UTF8String]);
|
|
146
|
+
return 1;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
static id allocWithZone(id self, SEL _cmd, NSZone *zone) {
|
|
150
|
+
lua_State *L = wax_currentLuaState();
|
|
151
|
+
BEGIN_STACK_MODIFY(L);
|
|
152
|
+
|
|
153
|
+
id instance = [self wax_originalAllocWithZone:zone];
|
|
154
|
+
object_setInstanceVariable(instance, WAX_CLASS_INSTANCE_USERDATA_IVAR_NAME, @"YEAP");
|
|
155
|
+
|
|
156
|
+
END_STACK_MODIFY(L, 0);
|
|
157
|
+
|
|
158
|
+
return instance;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
static void setValueForUndefinedKey(id self, SEL cmd, id value, NSString *key) {
|
|
163
|
+
lua_State *L = wax_currentLuaState();
|
|
164
|
+
|
|
165
|
+
BEGIN_STACK_MODIFY(L);
|
|
166
|
+
|
|
167
|
+
wax_instance_pushUserdata(L, self);
|
|
168
|
+
wax_fromObjc(L, "@", &value);
|
|
169
|
+
lua_setfield(L, -2, [key UTF8String]);
|
|
170
|
+
|
|
171
|
+
END_STACK_MODIFY(L, 0);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
static id valueForUndefinedKey(id self, SEL cmd, NSString *key) {
|
|
175
|
+
lua_State *L = wax_currentLuaState();
|
|
176
|
+
id result = nil;
|
|
177
|
+
|
|
178
|
+
BEGIN_STACK_MODIFY(L);
|
|
179
|
+
|
|
180
|
+
wax_instance_pushUserdata(L, self);
|
|
181
|
+
lua_getfield(L, -1, [key UTF8String]);
|
|
182
|
+
|
|
183
|
+
id *keyValue = wax_copyToObjc(L, "@", -1, nil);
|
|
184
|
+
result = *keyValue;
|
|
185
|
+
free(keyValue);
|
|
186
|
+
|
|
187
|
+
END_STACK_MODIFY(L, 0);
|
|
188
|
+
|
|
189
|
+
return result;
|
|
190
|
+
}
|