Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Apr 30, 2018. It is now read-only.

Commit6d8b941

Browse files
committed
Well, this escalated quickly. Time to commit.
0 parents  commit6d8b941

21 files changed

+1843
-0
lines changed

‎.babelrc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"stage":0,
3+
"loose": ["es6.forOf","es6.classes"],
4+
"optional": ["runtime","validation.undeclaredVariableCheck"]
5+
}

‎.editorconfig

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
root =true
2+
3+
[*]
4+
charset =utf-8
5+
trim_trailing_whitespace =true
6+
indent_style =tab
7+
indent_size =4
8+
insert_final_newline =true
9+
10+
[*.{json,babelrc,eslintrc}]
11+
indent_style =space
12+
indent_size =2

‎.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
node_modules
2+
*.log
3+
lib

‎.npmignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
node_modules
2+
*.log
3+
src

‎README.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#babel-plugin-flow-asm-js
2+
3+
Compile Flow annotated functions into asm.js
4+
5+
##Installation
6+
7+
```sh
8+
$ npm install babel-plugin-flow-asm-js
9+
```
10+
11+
##Usage
12+
13+
###Via`.babelrc` (Recommended)
14+
15+
**.babelrc**
16+
17+
```json
18+
{
19+
"plugins": ["flow-asm-js"]
20+
}
21+
```
22+
23+
###Via CLI
24+
25+
```sh
26+
$ babel --plugins flow-asm-js script.js
27+
```
28+
29+
###Via Node API
30+
31+
```javascript
32+
require("babel-core").transform("code", {
33+
plugins: ["flow-asm-js"]
34+
});
35+
```

‎dist/func.js

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
'use strict';
2+
3+
var_classCallCheck=require('babel-runtime/helpers/class-call-check')['default'];
4+
5+
var_getIterator=require('babel-runtime/core-js/get-iterator')['default'];
6+
7+
Object.defineProperty(exports,'__esModule',{
8+
value:true
9+
});
10+
exports['default']=visit;
11+
12+
var_util=require('./util');
13+
14+
var_types=require('./types');
15+
16+
var_tables=require('./tables');
17+
18+
varLIMIT_FIXNUM=1<<31>>>0;
19+
varLIMIT_UNSIGNED=Math.pow(2,32);
20+
21+
varfuncVisitor={
22+
SequenceExpression:{
23+
exit:functionSequenceExpression(node,parent,scope,state){
24+
varexpressions=this.get('expressions');
25+
this.setData('asmType',(0,_util.validateType)(expressions[expressions.length-1],state.type));
26+
}
27+
},
28+
29+
UnaryExpression:{
30+
exit:functionUnaryExpression(node,parent,scope,state){
31+
varopTypes=_tables.UNOPS.get(node.operator).alts;
32+
varargType=this.get('argument').getData('asmType');
33+
for(var_iterator=opTypes,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray ?_iterator :_getIterator(_iterator);;){
34+
var_ref;
35+
36+
if(_isArray){
37+
if(_i>=_iterator.length)break;
38+
_ref=_iterator[_i++];
39+
}else{
40+
_i=_iterator.next();
41+
if(_i.done)break;
42+
_ref=_i.value;
43+
}
44+
45+
vartype=_ref;
46+
47+
if(argType.subtype(type.params[0])){
48+
this.setData('asmType',type.result);
49+
return;
50+
}
51+
}
52+
_util.typeError.call(this,'Unsupported operation: '+node.operator+' '+argType);
53+
}
54+
},
55+
56+
BinaryExpression:{
57+
exit:functionBinaryExpression(node,parent,scope,state){
58+
varopTypes=_tables.BINOPS.get(node.operator).alts;
59+
varleftType=this.get('left').getData('asmType');
60+
varrightType=this.get('right').getData('asmType');
61+
for(var_iterator2=opTypes,_isArray2=Array.isArray(_iterator2),_i2=0,_iterator2=_isArray2 ?_iterator2 :_getIterator(_iterator2);;){
62+
var_ref2;
63+
64+
if(_isArray2){
65+
if(_i2>=_iterator2.length)break;
66+
_ref2=_iterator2[_i2++];
67+
}else{
68+
_i2=_iterator2.next();
69+
if(_i2.done)break;
70+
_ref2=_i2.value;
71+
}
72+
73+
vartype=_ref2;
74+
75+
if(leftType.subtype(type.params[0])&&rightType.subtype(type.params[1])){
76+
this.setData('asmType',type.result);
77+
return;
78+
}
79+
}
80+
_util.typeError.call(this,'Unsupported operation: '+leftType+' '+node.operator+' '+rightType);
81+
}
82+
},
83+
84+
Literal:functionLiteral(node){
85+
varvalue=node.value;
86+
87+
_util.assert.call(this,typeofvalue==='number','only numeric literals are supported');
88+
if(node.raw.indexOf('.')<0){
89+
if(value<LIMIT_FIXNUM){
90+
this.setData('asmType',_types.Fixnum);
91+
return;
92+
}
93+
if(value<LIMIT_UNSIGNED){
94+
this.setData('asmType',_types.Unsigned);
95+
return;
96+
}
97+
node.raw+='.0';
98+
}
99+
this.setData('asmType',_types.Double);
100+
},
101+
102+
ReferencedIdentifier:functionReferencedIdentifier(node,parent,scope,state){
103+
varbinding=scope.getBinding(node.name);
104+
if(binding){
105+
this.setData('asmType',binding.path.getData('asmType'));
106+
}else{
107+
state.program['import'](this);
108+
}
109+
},
110+
111+
MemberExpression:functionMemberExpression(node,parent,scope,state){
112+
if(state.program['import'](this)){
113+
this.skip();
114+
}
115+
},
116+
117+
ReturnStatement:{
118+
exit:functionReturnStatement(node,parent,scope,state){
119+
var_context;
120+
121+
if(state.returnType==='void'){
122+
vararg=node.argument;
123+
if(arg===null){
124+
return;
125+
}
126+
return[{type:'ExpressionStatement',expression:arg},node];
127+
}
128+
node.argument=(_context=this.get('argument'),_util.wrap).call(_context,state.returnType,true);
129+
}
130+
},
131+
132+
VariableDeclarator:{
133+
exit:functionVariableDeclarator(node,parent,scope,state){
134+
varinit=this.get('init');
135+
varasmType=init.getData('asmType');
136+
this.setData('asmType',asmType);
137+
state.vars.push(node);
138+
if(node.init.type==='Literal'&&node.init.value===0){
139+
returnthis.dangerouslyRemove();
140+
}
141+
node.init={type:'Literal',value:0,raw:asmType.subtype(_types.Intish) ?'0' :'0.0'};
142+
return{
143+
type:'AssignmentExpression',
144+
left:node.id,
145+
operator:'=',
146+
right:init.node
147+
};
148+
}
149+
},
150+
151+
VariableDeclaration:{
152+
exit:functionVariableDeclaration(node,parent,scope,state){
153+
varexpr={
154+
type:'SequenceExpression',
155+
expressions:node.declarations
156+
};
157+
if(parent.type==='ForStatement'){
158+
returnexpr;
159+
}
160+
return{
161+
type:'ExpressionStatement',
162+
expression:expr
163+
};
164+
}
165+
},
166+
167+
AssignmentExpression:{
168+
exit:functionAssignmentExpression(node,parent,scope,state){
169+
varasmType=scope.getBinding(node.left.name).path.getData('asmType');
170+
varright=this.get('right');
171+
right.replaceWith(_util.wrap.call(right,asmType));
172+
}
173+
},
174+
175+
CallExpression:{
176+
exit:functionCallExpression(node,parent,scope,state){
177+
varcallee=this.get('callee');
178+
_util.assert.call(callee,callee.node.type==='Identifier','only calls to direct identifiers are possible');
179+
varresultType=callee.getData('asmType').result;
180+
this.setData('asmType',resultType);
181+
this.replaceWith(_util.wrap.call(this,resultType,true));
182+
}
183+
}
184+
};
185+
186+
varFuncState=functionFuncState(programState,returnType){
187+
_classCallCheck(this,FuncState);
188+
189+
this.program=programState;
190+
this.returnType=returnType;
191+
this.vars=[];
192+
};
193+
194+
functionvisit(programState){
195+
var_context3;
196+
197+
varparamTypes=[];
198+
varwrappedParams=this.get('params').map(function(param){
199+
var_context2;
200+
201+
varasmType=(_context2=param.get('typeAnnotation'),_util.flowToAsm).call(_context2);
202+
param.setData('asmType',asmType);
203+
paramTypes.push(asmType);
204+
varnode=param.node;
205+
206+
return{
207+
type:'ExpressionStatement',
208+
expression:{
209+
type:'AssignmentExpression',
210+
left:node,
211+
operator:'=',
212+
right:_util.wrap.call(param,asmType,true)
213+
}
214+
};
215+
});
216+
varreturnType=(_context3=this.get('returnType'),_util.flowToAsm).call(_context3);
217+
this.setData('asmType',new_types.Arrow(paramTypes,returnType));
218+
varfuncState=newFuncState(programState,returnType);
219+
this.get('body').traverse(funcVisitor,funcState);
220+
this.get('body.body.0').insertBefore({
221+
type:'VariableDeclaration',
222+
kind:'var',
223+
declarations:funcState.vars
224+
});
225+
this.get('body.body.0').insertBefore(wrappedParams);
226+
programState.funcs.push(this.node);
227+
}
228+
229+
module.exports=exports['default'];

‎dist/index.js

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
'use strict';
2+
3+
var_Array$from=require('babel-runtime/core-js/array/from')['default'];
4+
5+
var_interopRequireDefault=require('babel-runtime/helpers/interop-require-default')['default'];
6+
7+
require('better-log/install');
8+
9+
var_estemplate=require('estemplate');
10+
11+
var_program=require('./program');
12+
13+
var_program2=_interopRequireDefault(_program);
14+
15+
vartmplAsm=(0,_estemplate.compile)('%= outside %;\nvar exports = (function asm(stdlib, foreign, heap) {\n\t"use asm";\n\t%= stdlibImports.declarations.length ? stdlibImports : { type: \'EmptyStatement\' } %;\n\t%= foreignImports.declarations.length ? foreignImports : { type: \'EmptyStatement\' } %;\n\t%= varDecls %;\n\t%= funcs %;\n\t%= funcTables %;\n\treturn <%= exports %>;\n})(typeof self !== "undefined" ? self : global, <%= foreign %>, new ArrayBuffer(0x10000));\n%= exportOutside %;');
16+
17+
module.exports=function(_ref){
18+
varTransformer=_ref.Transformer;
19+
vart=_ref.types;
20+
varparse=_ref.parse;
21+
22+
functionreattach(member,newRoot){
23+
if(t.isIdentifier(member)){
24+
returnt.memberExpression(newRoot,member);
25+
}
26+
returnt.memberExpression(reattach(member.object,newRoot),member.property);
27+
}
28+
29+
returnnewTransformer('asm-js',{
30+
Program:functionProgram(){
31+
this.skip();
32+
vardirective=this.get('body.0');
33+
if(!directive.isExpressionStatement())return;
34+
directive=directive.get('expression');
35+
if(!directive.isLiteral({value:'use asm'}))return;
36+
varstate=new_program.ProgramState();
37+
_program2['default'].call(this,state);
38+
vartmpl=tmplAsm({
39+
outside:state.outside,
40+
stdlibImports:t.variableDeclaration('var',_Array$from(state.stdlibImports.values(),function(_ref2){
41+
varuid=_ref2.uid;
42+
varexpr=_ref2.expr;
43+
returnt.variableDeclarator(uid,reattach(expr,t.identifier('stdlib')));
44+
})),
45+
foreignImports:t.variableDeclaration('var',_Array$from(state.foreignImports.values(),function(_ref3){
46+
varuid=_ref3.uid;
47+
returnt.variableDeclarator(uid,t.memberExpression(t.identifier('foreign'),uid));
48+
})),
49+
varDecls:state.varDecls,
50+
funcs:state.funcs,
51+
funcTables:state.funcTables,
52+
exports:t.objectExpression(_Array$from(state.exports.values(),function(_ref4){
53+
varexported=_ref4.exported;
54+
varlocal=_ref4.local;
55+
returnt.property('init',exported,local);
56+
})),
57+
foreign:t.objectExpression(_Array$from(state.foreignImports.values(),function(_ref5){
58+
varuid=_ref5.uid;
59+
varexpr=_ref5.expr;
60+
returnt.property('init',uid,expr);
61+
})),
62+
exportOutside:[t.variableDeclaration('var',[t.variableDeclarator(t.objectPattern(_Array$from(state.exports.values(),function(_ref6){
63+
varexported=_ref6.exported;
64+
varuid=_ref6.uid;
65+
returnt.property('init',exported,uid);
66+
})),t.identifier('exports'))]),t.exportNamedDeclaration(null,_Array$from(state.exports.values(),function(_ref7){
67+
varuid=_ref7.uid;
68+
varexported=_ref7.exported;
69+
returnt.exportSpecifier(uid,exported);
70+
}))]
71+
});
72+
this.node.body=tmpl.body;
73+
}
74+
});
75+
};

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp