@@ -77,44 +77,6 @@ Value encodeString(const void *buffer, size_t length, enum encoding encoding) {
return String(static_cast<const char*>(buffer), length);
}

/*struct SlowBuffer {
typedef void (*freeCallback)(uint8_t *data, void *hint);
//SlowBuffer();
static void replace(Value &_this, uint8_t *data, size_t length, freeCallback callback, void *hint) {
BUFFER(_this);
if(buffer->m_pCallback)
buffer->m_pCallback(buffer->m_pData, buffer->m_pCallbackHint);
else if(buffer->m_nLength) {
delete [] buffer->m_pData;
v8::V8::AdjustAmountOfExternalAllocatedMemory(-(sizeof(SlowBuffer) + buffer->m_nLength));
}
buffer->m_nLength = length;
buffer->m_pCallback = callback;
buffer->m_pCallbackHint = hint;
if(buffer->m_pCallback) // If it's got a callback, use provided data.
buffer->m_pData = data;
else if(length) {
buffer->m_pData = new uint8_t [buffer->m_nLength];
if(data)
memcpy(buffer->m_pData, data, buffer->m_nLength);
v8::V8::AdjustAmountOfExternalAllocatedMemory(sizeof(SlowBuffer) + buffer->m_nLength);
} else
buffer->m_pData = 0;
_this.to<v8::Handle<v8::Object>>()->SetIndexedPropertiesToExternalArrayData(buffer->m_pData, v8::kExternalUnsignedByteArray, buffer->m_nLength);
_this["length"] = buffer->m_nLength;
}
size_t m_nLength;
uint8_t *m_pData;
freeCallback m_pCallback;
void *m_pCallbackHint;
};*/

// Returns number of bytes written.
ssize_t decodeWrite(uint8_t *_buffer, size_t length, Value val, enum encoding encoding) {
// XXX
@@ -245,7 +207,7 @@ struct _buffer_binding_SlowBuffer_wrap /*: public Value::DtorWrap*/ {
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_SlowBuffer(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This(), new _buffer_binding_SlowBuffer_wrap);
if(args.Length() >= 1) {
#line 255 "src/modules/buffer.gear"
#line 217 "src/modules/buffer.gear"
Value length(args[0]);
This.nLength = length;
if(This.nLength) {
@@ -264,7 +226,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_SlowBuffer(const v8::Arg
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_binarySlice(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This());
if(args.Length() >= 2) {
#line 267 "src/modules/buffer.gear"
#line 229 "src/modules/buffer.gear"
Value _start(args[0]), _end(args[1]);
SLICE_ARGS
return encodeString(This.pData + start, end - start, BINARY);
@@ -275,7 +237,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_binarySlice(const v8::Ar
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_asciiSlice(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This());
if(args.Length() >= 2) {
#line 270 "src/modules/buffer.gear"
#line 232 "src/modules/buffer.gear"
Value _start(args[0]), _end(args[1]);
SLICE_ARGS
return String(This.pData + start, end - start);
@@ -286,7 +248,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_asciiSlice(const v8::Arg
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_utf8Slice(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This());
if(args.Length() >= 2) {
#line 273 "src/modules/buffer.gear"
#line 235 "src/modules/buffer.gear"
Value _start(args[0]), _end(args[1]);
SLICE_ARGS
return String(This.pData + start, end - start);
@@ -297,7 +259,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_utf8Slice(const v8::Argu
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_ucs2Slice(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This());
if(args.Length() >= 2) {
#line 276 "src/modules/buffer.gear"
#line 238 "src/modules/buffer.gear"
Value _start(args[0]), _end(args[1]);
SLICE_ARGS
return v8::String::New(reinterpret_cast<uint16_t*>(This.pData + start), (end - start) / 2);
@@ -308,7 +270,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_ucs2Slice(const v8::Argu
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_base64Slice(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This());
if(args.Length() >= 2) {
#line 279 "src/modules/buffer.gear"
#line 241 "src/modules/buffer.gear"
Value _start(args[0]), _end(args[1]);
SLICE_ARGS
int n = end - start;
@@ -381,7 +343,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_base64Slice(const v8::Ar
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_fill(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This());
if(args.Length() >= 3) {
#line 345 "src/modules/buffer.gear"
#line 307 "src/modules/buffer.gear"
Value value(args[0]), _start(args[1]), _end(args[2]);
SLICE_ARGS
memset(This.pData + start, value.to<uint8_t>(), end - start);
@@ -393,7 +355,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_fill(const v8::Arguments
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_copy(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This());
if(args.Length() >= 3) {
#line 349 "src/modules/buffer.gear"
#line 311 "src/modules/buffer.gear"
Value target(args[0]), _targetStart(args[1]), _sourceStart(args[2]);
if(!target.is<Buffer>())
THROW_TYPE_ERROR("Target should be a Buffer");
@@ -433,7 +395,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_copy(const v8::Arguments
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_binaryWrite(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This());
if(args.Length() >= 2) {
#line 383 "src/modules/buffer.gear"
#line 345 "src/modules/buffer.gear"
Value string(args[0]), _offset(args[1]);
size_t length = string.length(), offset = _offset;

@@ -450,7 +412,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_binaryWrite(const v8::Ar
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_asciiWrite(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This());
if(args.Length() >= 2) {
#line 393 "src/modules/buffer.gear"
#line 355 "src/modules/buffer.gear"
Value string(args[0]), _offset(args[1]);
v8::Handle<v8::String> s = string;
size_t length = string.length(), offset = _offset;
@@ -469,7 +431,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_asciiWrite(const v8::Arg
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_utf8Write(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This());
if(args.Length() >= 2) {
#line 405 "src/modules/buffer.gear"
#line 367 "src/modules/buffer.gear"
Value string(args[0]), _offset(args[1]);
v8::Handle<v8::String> s = string;

@@ -493,7 +455,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_utf8Write(const v8::Argu
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_ucs2Write(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This());
if(args.Length() >= 2) {
#line 422 "src/modules/buffer.gear"
#line 384 "src/modules/buffer.gear"
Value string(args[0]), _offset(args[1]);
v8::Handle<v8::String> s = string;
size_t length = string.length(), offset = _offset;
@@ -516,7 +478,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_ucs2Write(const v8::Argu
static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_base64Write(const v8::Arguments &args) {
_buffer_binding_SlowBuffer_wrap::This This(args.This());
if(args.Length() >= 2) {
#line 438 "src/modules/buffer.gear"
#line 400 "src/modules/buffer.gear"
Value _string(args[0]), _offset(args[1]);
assert(unbase64('/') == 63);
assert(unbase64('+') == 62);
@@ -585,7 +547,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_base64Write(const v8::Ar

static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_byteLength(const v8::Arguments &args) {
if(args.Length() >= 2) {
#line 502 "src/modules/buffer.gear"
#line 464 "src/modules/buffer.gear"
Value string(args[0]), _enc(args[1]);
enum encoding enc = parseEncoding(_enc, UTF8);

@@ -604,7 +566,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_byteLength(const v8::Arg

static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_makeFastBuffer(const v8::Arguments &args) {
if(args.Length() >= 4) {
#line 516 "src/modules/buffer.gear"
#line 478 "src/modules/buffer.gear"
Value _buffer(args[0]), fastBuffer(args[1]), offset(args[2]), length(args[3]);
if(!_buffer.is<Buffer>())
THROW_TYPE_ERROR("First argument must be a Buffer");
@@ -619,7 +581,7 @@ static v8::Handle<v8::Value> _buffer_binding_SlowBuffer_makeFastBuffer(const v8:
}


#line 622 "src/modules/buffer.cc"
#line 584 "src/modules/buffer.cc"
static void _setup_buffer(Value exports, Value require, Value module) {
var binding = Object();
v8::Handle<v8::FunctionTemplate> _buffer_binding_SlowBuffer = v8::FunctionTemplate::New(_buffer_binding_SlowBuffer_SlowBuffer);
@@ -94,44 +94,6 @@ top {
// utf-8 or ascii encoding
return String(static_cast<const char*>(buffer), length);
}

/*struct SlowBuffer {
typedef void (*freeCallback)(uint8_t *data, void *hint);

//SlowBuffer();

static void replace(Value &_this, uint8_t *data, size_t length, freeCallback callback, void *hint) {
BUFFER(_this);
if(buffer->m_pCallback)
buffer->m_pCallback(buffer->m_pData, buffer->m_pCallbackHint);
else if(buffer->m_nLength) {
delete [] buffer->m_pData;
v8::V8::AdjustAmountOfExternalAllocatedMemory(-(sizeof(SlowBuffer) + buffer->m_nLength));
}

buffer->m_nLength = length;
buffer->m_pCallback = callback;
buffer->m_pCallbackHint = hint;

if(buffer->m_pCallback) // If it's got a callback, use provided data.
buffer->m_pData = data;
else if(length) {
buffer->m_pData = new uint8_t [buffer->m_nLength];
if(data)
memcpy(buffer->m_pData, data, buffer->m_nLength);
v8::V8::AdjustAmountOfExternalAllocatedMemory(sizeof(SlowBuffer) + buffer->m_nLength);
} else
buffer->m_pData = 0;

_this.to<v8::Handle<v8::Object>>()->SetIndexedPropertiesToExternalArrayData(buffer->m_pData, v8::kExternalUnsignedByteArray, buffer->m_nLength);
_this["length"] = buffer->m_nLength;
}

size_t m_nLength;
uint8_t *m_pData;
freeCallback m_pCallback;
void *m_pCallbackHint;
};*/

// Returns number of bytes written.
ssize_t decodeWrite(uint8_t *_buffer, size_t length, Value val, enum encoding encoding) {

Large diffs are not rendered by default.

@@ -22,6 +22,11 @@ license {
// USE OR OTHER DEALINGS IN THE SOFTWARE.
}

top {
#include <fcntl.h>
#include <signal.h>
}

module constants {
postSetup {
#define NODE_DEFINE_CONSTANT(target, constant) exports[#constant] = constant;
@@ -28,26 +28,31 @@ using namespace Gearbox;

#line 1 "src/modules/fs.gear"
#include <uv.h>
#include <errno.h>

#include "buffer.h"

// hack alert! copy of ErrnoException in node.cc, tuned for uv errors
Value ThrowFsError(int errorNo, const char *syscall=0, const char *msg=0, const char *path=0) {
if(!msg || !msg[0])
msg = /*errno_message(errorNo)*/"";
Value FsError(int errorNo, String syscall, String msg, String path) {
uv_err_t uvErr;
memset(&uvErr, 0, sizeof(uv_err_t));
uvErr.code = uv_err_code(errorNo);

if(!msg.length())
msg = uv_err_name(uvErr);

String errCode = /*errno_string(errorNo)*/"", errString = errCode + ", " + msg;
String errCode = uv_strerror(uvErr), errString = errCode + ", " + msg;

var err = Error(path ? errString + " '" + path + "'" : errString);

// TODO errno should probably go
err["errno"] = errorNo;
err["code"] = errCode;
if(path)
if(path.length())
err["path"] = path;
if(syscall)
if(syscall.length())
err["syscall"] = syscall;
return Throw(err);
return err;
}

#define FS_CALL(func, cb, path, ...) \
@@ -57,31 +62,31 @@ uv_fs_t req; \
int result = uv_fs_##func(uv_default_loop(), &req, __VA_ARGS__, NULL); \
if(result < 0) { \
int code = uv_last_error(uv_default_loop()).code; \
return ThrowFsError(code, #func, "", path); \
return Throw(FsError(code, #func, "", path)); \
}

#define GET_OFFSET(a) ((a)->IsNumber() ? (a)->IntegerValue() : -1) //FIXME optArgs

static v8::Handle<v8::Value> _fs_binding_Stats_Stats(const v8::Arguments &args) {
Value This(args.This());
#line 66 "src/modules/fs.gear"
#line 71 "src/modules/fs.gear"

return undefined;
}

static v8::Handle<v8::Value> _fs_binding_close(const v8::Arguments &args) {
if(args.Length() >= 1) {
#line 67 "src/modules/fs.gear"
#line 72 "src/modules/fs.gear"
Value fd(args[0]);
FS_CALL(close, 0, 0, fd);
FS_CALL(close, 0, "", fd);
return undefined;
}
THROW_ERROR("Invalid call to fs.binding.close");
}

static v8::Handle<v8::Value> _fs_binding_open(const v8::Arguments &args) {
if(args.Length() >= 3) {
#line 71 "src/modules/fs.gear"
#line 76 "src/modules/fs.gear"
Value path(args[0]), flags(args[1]), mode(args[2]);
FS_CALL(open, 3, path, path.to<String>(), flags, mode);
return Integer(result);
@@ -91,7 +96,7 @@ static v8::Handle<v8::Value> _fs_binding_open(const v8::Arguments &args) {

static v8::Handle<v8::Value> _fs_binding_read(const v8::Arguments &args) {
if(args.Length() >= 4) {
#line 76 "src/modules/fs.gear"
#line 81 "src/modules/fs.gear"
Value fd(args[0]), buffer(args[1]), _offset(args[2]), _length(args[3]);
if(!buffer.is<Buffer>())
THROW_TYPE_ERROR("Second argument needs to be a buffer");
@@ -105,15 +110,15 @@ static v8::Handle<v8::Value> _fs_binding_read(const v8::Arguments &args) {
THROW_ERROR("Length extends beyond buffer");

off_t position = GET_OFFSET(args[4]);
FS_CALL(read, 5, 0, fd, Buffer::data(buffer) + offset, length, position);
FS_CALL(read, 5, "", fd, Buffer::data(buffer) + offset, length, position);
return Integer(result);
}
THROW_ERROR("Invalid call to fs.binding.read");
}

static v8::Handle<v8::Value> _fs_binding_write(const v8::Arguments &args) {
if(args.Length() >= 4) {
#line 93 "src/modules/fs.gear"
#line 98 "src/modules/fs.gear"
Value fd(args[0]), buffer(args[1]), _offset(args[2]), _length(args[3]);
if(!buffer.is<Buffer>())
THROW_TYPE_ERROR("Second argument needs to be a buffer");
@@ -127,14 +132,14 @@ static v8::Handle<v8::Value> _fs_binding_write(const v8::Arguments &args) {
THROW_ERROR("Length extends beyond buffer");

off_t position = GET_OFFSET(args[4]);
FS_CALL(write, 5, 0, fd, Buffer::data(buffer) + offset, length, position);
FS_CALL(write, 5, "", fd, Buffer::data(buffer) + offset, length, position);
return Integer(result);
}
THROW_ERROR("Invalid call to fs.binding.write");
}


#line 137 "src/modules/fs.cc"
#line 142 "src/modules/fs.cc"
static void _setup_fs(Value exports, Value require, Value module) {
var binding = Object();
v8::Handle<v8::FunctionTemplate> _fs_binding_Stats = v8::FunctionTemplate::New(_fs_binding_Stats_Stats);
@@ -24,27 +24,32 @@ license {

top {

#include <uv.h>
#include <uv.h>
#include <errno.h>

#include "buffer.h"
#include "buffer.h"

// hack alert! copy of ErrnoException in node.cc, tuned for uv errors
Value ThrowFsError(int errorNo, const char *syscall=0, const char *msg=0, const char *path=0) {
if(!msg || !msg[0])
msg = /*errno_message(errorNo)*/"";
Value FsError(int errorNo, String syscall, String msg, String path) {
uv_err_t uvErr;
memset(&uvErr, 0, sizeof(uv_err_t));
uvErr.code = uv_err_code(errorNo);

if(!msg.length())
msg = uv_err_name(uvErr);

String errCode = /*errno_string(errorNo)*/"", errString = errCode + ", " + msg;
String errCode = uv_strerror(uvErr), errString = errCode + ", " + msg;

var err = Error(path ? errString + " '" + path + "'" : errString);

// TODO errno should probably go
err["errno"] = errorNo;
err["code"] = errCode;
if(path)
if(path.length())
err["path"] = path;
if(syscall)
if(syscall.length())
err["syscall"] = syscall;
return Throw(err);
return err;
}

#define FS_CALL(func, cb, path, ...) \
@@ -54,7 +59,7 @@ top {
int result = uv_fs_##func(uv_default_loop(), &req, __VA_ARGS__, NULL); \
if(result < 0) { \
int code = uv_last_error(uv_default_loop()).code; \
return ThrowFsError(code, #func, "", path); \
return Throw(FsError(code, #func, "", path)); \
}

#define GET_OFFSET(a) ((a)->IsNumber() ? (a)->IntegerValue() : -1) //FIXME optArgs
@@ -65,7 +70,7 @@ module fs {
class Stats {}

close(fd) {
FS_CALL(close, 0, 0, fd);
FS_CALL(close, 0, "", fd);
}

open(path, flags, mode) {
@@ -86,7 +91,7 @@ module fs {
THROW_ERROR("Length extends beyond buffer");

off_t position = GET_OFFSET(args[4]);
FS_CALL(read, 5, 0, fd, Buffer::data(buffer) + offset, length, position);
FS_CALL(read, 5, "", fd, Buffer::data(buffer) + offset, length, position);
return Integer(result);
}

@@ -103,7 +108,7 @@ module fs {
THROW_ERROR("Length extends beyond buffer");

off_t position = GET_OFFSET(args[4]);
FS_CALL(write, 5, 0, fd, Buffer::data(buffer) + offset, length, position);
FS_CALL(write, 5, "", fd, Buffer::data(buffer) + offset, length, position);
return Integer(result);
}
}
@@ -1,10 +1,13 @@
if(!global.arguments)
arguments = process.argv.slice(1);

if(arguments.length <= 2)
exit(print('Usage: '+arguments[0]+' <Codeaze source file> <JavaScript output file>'));

var sourceFile = arguments[1], outputFile = arguments[2];

var Io = require('Io');
var source = Io.read(sourceFile), output = 'try {var codeaze = load("Codeaze.js");}catch(e){var codeaze = load("tools/gear2cc/Codeaze.js");} /** @todo require("./Codeaze.js") */\nvar $aze = new codeaze.Codeaze();\n\n';
var fs = require('fs');
var source = fs.readFileSync(sourceFile, 'utf8'), output = 'var codeaze = eval(require("fs").readFileSync("'+sourceFile.replace(/[^/]*$/,'')+'Codeaze.js", "utf8")); /** @todo require("./Codeaze.js") */\nvar $aze = new codeaze.Codeaze();\n\n';

function scanRegExp(flags) {
var regexp = '/';
@@ -160,5 +163,4 @@ for(var i = 0; i < source.length; i++) {
}*/
throw new Error('Unrecognized token \'' + c + '\' in "' + source + '"');
}

Io.write(outputFile, output);
fs.writeFileSync(outputFile, output);
@@ -298,8 +298,8 @@ main: `( +|module|nativeBlock)*` {$$=$0.map(function(x){return x[0]}).filter(fun
for(objectName in object.objects)
generateObjectCode(object.objects[objectName], objectName, prefix, path, code);

if(object.postSetup)
code.init += object.postSetup;
if(object.nativeBlocks.postSetup)
code.init += object.nativeBlocks.postSetup;
}

function generateCode(gear, global) {
@@ -369,25 +369,27 @@ static void _setup_' + moduleName + '(Value exports, Value require, Value module
static NativeModule _module_' + moduleName + '("'+moduleName+'", _setup_' + moduleName + ');';
}
ccCode = ccCode.replace(/\t/g, ' ');
io.write(gear.cc, ccCode);
fs.writeFileSync(gear.cc, ccCode);

if(global.nativeBlocks.header) {
var hCode = license+'\
#ifndef GEARBOX_MODULES_'+baseName.replace(/^([^/]*\/)+/,'').toUpperCase()+'_H\n\
#define GEARBOX_MODULES_'+baseName.replace(/^([^/]*\/)+/,'').toUpperCase()+'_H\n\n\
#include <gearbox.h>\n\n'+header+'#endif\n';
io.write(gear.h, hCode);
fs.writeFileSync(gear.h, hCode);
}
}

$aze.spaceIgnore = false;
var io = require('Io');
var fs = require('fs');
if(!global.arguments)
arguments = process.argv.slice(1);
if(arguments.length > 1) {
for(var i = 1; i < arguments.length; i++) {
l = 1;
var lastDot = arguments[i].lastIndexOf('.'), lastSlash = arguments[i].lastIndexOf('/')+1, baseName = arguments[i].substr(0, lastDot), ext = arguments[i].substr(lastDot+1);
var gear = {src:arguments[i], baseName:baseName, cc:baseName+'.cc', h:baseName+'.h'};
var src = io.read(arguments[i]);
var src = fs.readFileSync(arguments[i], 'utf8');
if(ext == 'gear')
generateCode(gear, createObject('', $aze.parse(src), 1));
else if(ext == 'js') {
@@ -404,5 +406,5 @@ static NativeModule _module_' + moduleName + '("'+moduleName+'", _setup_' + modu
}
} else
print('Usage: ' + arguments[0] + ' <files>');
exit(); // Just in case gearbox-node is a (bit) broken
(global.exit || process.exit)(); // Just in case gearbox-node is a (bit) broken
}
@@ -1,4 +1,4 @@
try {var codeaze = load("Codeaze.js");}catch(e){var codeaze = load("tools/gear2cc/Codeaze.js");} /** @todo require("./Codeaze.js") */
var codeaze = eval(require("fs").readFileSync("tools/gear2cc/Codeaze.js", "utf8")); /** @todo require("./Codeaze.js") */
var $aze = new codeaze.Codeaze();


@@ -293,8 +293,8 @@ function generateModuleCode(object, name, parentPrefix, parentPath, code) {
for(objectName in object.objects)
generateObjectCode(object.objects[objectName], objectName, prefix, path, code);

if(object.postSetup)
code.init += object.postSetup;
if(object.nativeBlocks.postSetup)
code.init += object.nativeBlocks.postSetup;
}

function generateCode(gear, global) {
@@ -323,7 +323,7 @@ function generateCode(gear, global) {
this.init += '\t' + parentObjName + '->InstanceTemplate()->SetInternalFieldCount(' + value + ');\n';
},
addJS: function(name, js, args) {
args = args.join(', ');
args = args.join(', ');
js = '(function('+args+'){'+js+'})'; // TODO minify
this.init += '\tContext::getCurrent()->runScript(' + JSON.stringify(js) + ', "' + name + '")('+args+');\n';
},
@@ -364,25 +364,27 @@ static void _setup_' + moduleName + '(Value exports, Value require, Value module
static NativeModule _module_' + moduleName + '("'+moduleName+'", _setup_' + moduleName + ');';
}
ccCode = ccCode.replace(/\t/g, ' ');
io.write(gear.cc, ccCode);
fs.writeFileSync(gear.cc, ccCode);

if(global.nativeBlocks.header) {
var hCode = license+'\
#ifndef GEARBOX_MODULES_'+baseName.replace(/^([^/]*\/)+/,'').toUpperCase()+'_H\n\
#define GEARBOX_MODULES_'+baseName.replace(/^([^/]*\/)+/,'').toUpperCase()+'_H\n\n\
#include <gearbox.h>\n\n'+header+'#endif\n';
io.write(gear.h, hCode);
fs.writeFileSync(gear.h, hCode);
}
}

$aze.spaceIgnore = false;
var io = require('Io');
var fs = require('fs');
if(!global.arguments)
arguments = process.argv.slice(1);
if(arguments.length > 1) {
for(var i = 1; i < arguments.length; i++) {
l = 1;
var lastDot = arguments[i].lastIndexOf('.'), lastSlash = arguments[i].lastIndexOf('/')+1, baseName = arguments[i].substr(0, lastDot), ext = arguments[i].substr(lastDot+1);
var gear = {src:arguments[i], baseName:baseName, cc:baseName+'.cc', h:baseName+'.h'};
var src = io.read(arguments[i]);
var src = fs.readFileSync(arguments[i], 'utf8');
if(ext == 'gear')
generateCode(gear, createObject('', $aze.parse(src), 1));
else if(ext == 'js') {
@@ -399,4 +401,4 @@ if(arguments.length > 1) {
}
} else
print('Usage: ' + arguments[0] + ' <files>');
exit(); // Just in case gearbox-node is a (bit) broken
(global.exit || process.exit)(); // Just in case gearbox-node is a (bit) broken