Skip to content

Commit cf3327c

Browse files
committed
Utils function class
1 parent a196265 commit cf3327c

5 files changed

Lines changed: 126 additions & 104 deletions

File tree

gulpfile.js

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ var uglify = require('gulp-uglify');
55
var gutil = require('gulp-util');
66

77
gulp.task('build', function() {
8-
return gulp.src([
8+
return gulp.src([
99
'src/wrapper/prefix.js',
1010
'src/parser.js',
1111
'src/texture.js',
12+
'src/backend/gpu_utils.js',
1213
'src/gpu.js',
1314
'src/backend/functionNode_webgl.js',
1415
'src/backend/functionNode.js',
@@ -17,18 +18,18 @@ gulp.task('build', function() {
1718
'src/backend/glsl.js',
1819
'src/wrapper/suffix.js'
1920
])
20-
.pipe(concat('gpu.js'))
21-
.pipe(gulp.dest('bin'));
21+
.pipe(concat('gpu.js'))
22+
.pipe(gulp.dest('bin'));
2223
});
2324

2425
gulp.task('minify', ['build'], function() {
25-
return gulp.src(['bin/gpu.js'])
26-
.pipe(rename('gpu.min.js'))
27-
.pipe(uglify({
28-
mangle: false,
29-
preserveComments: "license"
30-
}).on('error', gutil.log))
31-
.pipe(gulp.dest('bin'));
26+
return gulp.src(['bin/gpu.js'])
27+
.pipe(rename('gpu.min.js'))
28+
.pipe(uglify({
29+
mangle: false,
30+
preserveComments: "license"
31+
}).on('error', gutil.log))
32+
.pipe(gulp.dest('bin'));
3233
});
3334

3435
gulp.task('default', ['minify']);

src/backend/functionNode.js

Lines changed: 7 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ var functionNode = (function() {
6060
// Setup jsFunction and its string property + validate them
6161
//
6262
this.jsFunctionString = jsFunction.toString();
63-
if( !validateStringIsFunction(this.jsFunctionString) ) {
63+
if( !gpu_utils.isFunctionString(this.jsFunctionString) ) {
6464
console.error("jsFunction, to string conversion check falied: not a function?", this.jsFunctionString);
6565
throw "jsFunction, to string conversion check falied: not a function?";
6666
}
6767

68-
if( !isFunction(jsFunction) ) {
68+
if( !gpu_utils.isFunction(jsFunction) ) {
6969
//throw "jsFunction, is not a valid JS Function";
7070
this.jsFunction = null;
7171
} else {
@@ -75,15 +75,18 @@ var functionNode = (function() {
7575
//
7676
// Setup the function name property
7777
//
78-
this.functionName = functionName || (jsFunction && jsFunction.name) || FUNCTION_NAME.exec(this.jsFunctionString)[1];
78+
this.functionName = functionName ||
79+
(jsFunction && jsFunction.name) ||
80+
gpu_utils.getFunctionName_fromString(this.jsFunctionString);
81+
7982
if( !(this.functionName) ) {
8083
throw "jsFunction, missing name argument or value";
8184
}
8285

8386
//
8487
// Extract parameter name, and its argument types
8588
//
86-
this.paramNames = getParamNames(this.jsFunctionString);
89+
this.paramNames = gpu_utils.getParamNames_fromString(this.jsFunctionString);
8790
if( paramTypeArray != null ) {
8891
if( paramTypeArray.length != this.paramNames.length ) {
8992
throw "Invalid argument type array length, against function length -> ("+
@@ -105,78 +108,6 @@ var functionNode = (function() {
105108
this.returnType = returnType || "float";
106109
}
107110

108-
//
109-
// Utility functions
110-
//----------------------------------------------------------------------------------------------------
111-
112-
///
113-
/// Function: isFunction
114-
///
115-
/// [static] Return TRUE, on a JS function
116-
///
117-
/// This is 'static' function, not a class function functionNode.isFunction(...)
118-
///
119-
/// Parameters:
120-
/// funcObj - {JS Function} Object to validate if its a function
121-
///
122-
/// Returns:
123-
/// {Boolean} TRUE if the object is a JS function
124-
///
125-
function isFunction( funcObj ) {
126-
return typeof(funcObj) === 'function';
127-
}
128-
129-
///
130-
/// Function: validateStringIsFunction
131-
///
132-
/// [static] Return TRUE, on a valid JS function string
133-
///
134-
/// This is 'static' function, not a class function functionNode.validateStringIsFunction(...)
135-
///
136-
/// Parameters:
137-
/// funcStr - {String} String of JS function to validate
138-
///
139-
/// Returns:
140-
/// {Boolean} TRUE if the string passes basic validation
141-
///
142-
function validateStringIsFunction( funcStr ) {
143-
if( funcStr !== null ) {
144-
return (funcStr.slice(0, "function".length).toLowerCase() == "function");
145-
}
146-
return false;
147-
}
148-
149-
var FUNCTION_NAME = /function ([^(]*)/;
150-
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
151-
var ARGUMENT_NAMES = /([^\s,]+)/g;
152-
153-
///
154-
/// Function: getParamNames
155-
///
156-
/// [static] Return list of parameter names extracted from the JS function string
157-
///
158-
/// This is 'static' function, not a class function: functionNode.getParamNames(...)
159-
///
160-
/// Parameters:
161-
/// funcStr - {String} String of JS function to validate
162-
///
163-
/// Returns:
164-
/// {[String, ...]} Array representing all the parameter names
165-
///
166-
function getParamNames(func) {
167-
var fnStr = func.toString().replace(STRIP_COMMENTS, '');
168-
var result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(ARGUMENT_NAMES);
169-
if(result === null)
170-
result = [];
171-
return result;
172-
}
173-
174-
// Passing it to the class object, in case it is needed elsewhere
175-
// Note, support for this is not guranteed across versions.
176-
functionNode.isFunction = isFunction;
177-
functionNode.validateStringIsFunction = validateStringIsFunction;
178-
functionNode.getParamNames = getParamNames;
179-
180111
//
181112
// Core function
182113
//----------------------------------------------------------------------------------------------------

src/backend/gpu_utils.js

Lines changed: 87 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
///
22
/// Class: gpu_utils
33
///
4-
/// Various utility functions / snippets of code that GPU.JS uses internally.
4+
/// Various utility functions / snippets of code that GPU.JS uses internally.\
5+
/// This covers various snippets of code that is NOT gpu.js specific
56
///
67
/// Note that all moethods in this class is "static" by nature `gpu_utils.functionName()`
78
///
@@ -19,6 +20,9 @@ var gpu_utils = (function() {
1920
///
2021
/// Gets the system endianness, and cache it
2122
///
23+
/// Returns:
24+
/// {String} "LE" or "BE" depending on system settings
25+
///
2226
/// Credit: https://gist.github.com/TooTallNate/4750953
2327
function system_endianness() {
2428
if( system_endianness_memoizer !== null ) {
@@ -33,8 +37,89 @@ var gpu_utils = (function() {
3337
if (c[0] == 0xde) return system_endianness_memoizer = 'BE';
3438
throw new Error('unknown endianness');
3539
}
36-
3740
gpu_utils.system_endianness = system_endianness;
3841

42+
///
43+
/// Function: isFunction
44+
///
45+
/// Return TRUE, on a JS function
46+
///
47+
/// Parameters:
48+
/// funcObj - {JS Function} Object to validate if its a function
49+
///
50+
/// Returns:
51+
/// {Boolean} TRUE if the object is a JS function
52+
///
53+
function isFunction( funcObj ) {
54+
return typeof(funcObj) === 'function';
55+
}
56+
gpu_utils.isFunction = isFunction;
57+
58+
///
59+
/// Function: isFunctionString
60+
///
61+
/// Return TRUE, on a valid JS function string
62+
///
63+
/// Note: This does just a VERY simply sanity check. And may give false positives.
64+
///
65+
/// Parameters:
66+
/// funcStr - {String} String of JS function to validate
67+
///
68+
/// Returns:
69+
/// {Boolean} TRUE if the string passes basic validation
70+
///
71+
function isFunctionString( funcStr ) {
72+
if( funcStr !== null ) {
73+
return (funcStr.toString().slice(0, "function".length).toLowerCase() == "function");
74+
}
75+
return false;
76+
}
77+
gpu_utils.isFunctionString = isFunctionString;
78+
79+
// FUNCTION_NAME regex
80+
var FUNCTION_NAME = /function ([^(]*)/;
81+
82+
///
83+
/// Function: getFunctionName_fromString
84+
///
85+
/// Return the function name from a JS function string
86+
///
87+
/// Parameters:
88+
/// funcStr - {String} String of JS function to validate
89+
///
90+
/// Returns:
91+
/// {String} Function name string (if found)
92+
///
93+
function getFunctionName_fromString( funcStr ) {
94+
return FUNCTION_NAME.exec(funcStr)[1];
95+
}
96+
gpu_utils.getFunctionName_fromString = getFunctionName_fromString;
97+
98+
// STRIP COMMENTS regex
99+
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
100+
101+
// ARGUMENT NAMES regex
102+
var ARGUMENT_NAMES = /([^\s,]+)/g;
103+
104+
///
105+
/// Function: getParamNames_fromString
106+
///
107+
/// Return list of parameter names extracted from the JS function string
108+
///
109+
/// Parameters:
110+
/// funcStr - {String} String of JS function to validate
111+
///
112+
/// Returns:
113+
/// {[String, ...]} Array representing all the parameter names
114+
///
115+
function getParamNames_fromString(func) {
116+
var fnStr = func.toString().replace(STRIP_COMMENTS, '');
117+
var result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(ARGUMENT_NAMES);
118+
if(result === null)
119+
result = [];
120+
return result;
121+
}
122+
gpu_utils.getParamNames_fromString = getParamNames_fromString;
123+
39124
return gpu_utils;
40125
})();

src/gpu.js

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,7 @@
44
/// GPU.JS core class =D
55
///
66
var GPU = (function() {
7-
// https://gist.github.com/TooTallNate/4750953
8-
function endianness() {
9-
var b = new ArrayBuffer(4);
10-
var a = new Uint32Array(b);
11-
var c = new Uint8Array(b);
12-
a[0] = 0xdeadbeef;
13-
if (c[0] == 0xef) return 'LE';
14-
if (c[0] == 0xde) return 'BE';
15-
throw new Error('unknown endianness');
16-
}
17-
7+
188
function GPU(ctx) {
199
var gl, canvas, canvasCpu;
2010

@@ -31,9 +21,6 @@ var GPU = (function() {
3121
};
3222

3323
gl = canvas.getContext("experimental-webgl", glOpt) || canvas.getContext("webgl", glOpt);
34-
} else {
35-
canvas = ctx.canvas;
36-
canvasCpu = document.createElement('canvas');
3724
}
3825

3926
gl.getExtension('OES_texture_float');
@@ -44,7 +31,7 @@ var GPU = (function() {
4431
this.canvas = canvas;
4532
this.canvasCpu = canvasCpu;
4633
this.programCache = {};
47-
this.endianness = endianness();
34+
this.endianness = gpu_utils.system_endianness();
4835

4936
this.functionBuilder = new functionBuilder(this);
5037
this.functionBuilder.polyfillStandardFunctions();
Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,26 @@
11
///
2-
/// Test the various basic functionality of functionNode
2+
/// Test the gpu_utils functions
33
///
44

55
QUnit.test( "gpu_utils: system_endianness not null", function( assert ) {
66
assert.ok( gpu_utils.system_endianness() != null, "not null check" );
77
assert.ok( gpu_utils.system_endianness() == "LE" || gpu_utils.system_endianness() == "BE", "value = "+gpu_utils.system_endianness() );
88
});
9+
10+
QUnit.test( "gpu_utils: isFunction", function( assert ) {
11+
assert.ok( gpu_utils.isFunction( function() { } ) );
12+
assert.notOk( gpu_utils.isFunction( {} ) );
13+
});
14+
15+
QUnit.test( "gpu_utils: isFunctionString", function( assert ) {
16+
assert.ok( gpu_utils.isFunctionString( "function() { }" ) );
17+
assert.notOk( gpu_utils.isFunctionString( {} ) );
18+
});
19+
20+
QUnit.test( "gpu_utils: getFunctionName_fromString", function( assert ) {
21+
assert.equal( "test", gpu_utils.getFunctionName_fromString( "function test() { }" ) );
22+
});
23+
24+
QUnit.test( "gpu_utils: getParamNames_fromString", function( assert ) {
25+
assert.deepEqual( ["a","b","c"], gpu_utils.getParamNames_fromString( "function test(a,b,c) { }" ) );
26+
});

0 commit comments

Comments
 (0)